본문 바로가기

Server

Docker + jenkins 로 spring boot CI/CD 구축하기 - 2

https://soyeon-story.tistory.com/46

 

Docker + jenkins 로 spring boot CI/CD 구축하기 - 1

Ubuntu - Jenkins Docker 컨테이너 구축하기1. Jenkins Docker 이미지 다운로드 및 실행sudo docker run -d --name jenkins -p 8080:8080 jenkins/jenkins 2. ip:8080으로 젠킨스 접속 3. 패스워드 등록- 아래 명령어를 입력 후

soyeon-story.tistory.com


1. CD 구축하기

1) SSH 플러그인 설치

- 젠킨스 관리 > plugins > ssh agnet 설치

 

2. SSH key 생성 및 등록

1) jenkins 컨테이너 내에서 키를 생성한다.

// key 생성
ssh-keygen -t rsa -b 4096

// key 생성
cat ~/.ssh/id_rsa  // 개인키
cat ~/.ssh/id_rsa.pub  // 공개키

 

 

2) New credentials 등록

- Dashboard > jenkins 관리 > Credentials > Add Credentials 

- Kind를 SSH Username with private key를 선택하고  ID, Username(인스턴스 os명), Private Key 를 적어준다.

- Private Key 는 -----BEGIN OPENSSH PRIVATE KEY----- ~ -----END OPENSSH PRIVATE KEY----- 까지 전부 적어준다.

 

3) 호스트 서버(리모트 서버)에 Public key 등록

- 젠킨스 컨테이너 내에서 발급받은 Public key를 복사한다.

- 호스트 서버 .ssh 경로의 authorized_keys 파일에 복사한 Public key를 붙여넣기한다.

 

3. Pipeline script 수정

- ssh : ssh 를 사용하여 원격 서버에 접속하는 명령어

- 172.17.0.1 :

  도커 호스트(현재 CentOS)를 말한다.

    => 도커를 설치하면 자동으로 생성되는 IP 

    => 도커 안에 각각의 컨테이너는 172.17.0.2, 172.17.0.3 와 같은 IP를 가지게 된다.

    =>  보통 127.0.0.1 하면 자신의 OS를 가르키는데 도커 호스트에서는 자기 자신을 가르치기 때문에 172.17.0.1을 사용하여 바깥쪽에

           감싸는 호스트에 접근한다.

* 원격서버의 IP를 적으면 접근이 불가능하다. 

pipeline {
    agent any
    tools {
        gradle 'gradle'
    }
    stages {
        stage('저장소 복제') {
            steps {
                git branch: 'main', credentialsId: '[git 연결 위한 credentialsID]', url: '[저장소명]'
            }
        }
        stage('권한 설정') {  // 실행 권한 부여 단계 추가
            steps {
                sh 'chmod +x ./gradlew'
            }
        }
        stage('빌드') {
            steps {
                sh "./gradlew clean build"
            }
        }
        stage('배포') {
            steps {
                sshagent(credentials: ['instance-key']) {
                    sh '''
                        ssh -o StrictHostKeyChecking=no [사용자계정명]@172.17.0.1 uptime
                        scp build/libs/[프로젝트 jar파일명] soyeon@172.17.0.1:[jar파일을 복사할 원격서버의 디렉토리경로]
                        // 원격서버에서 실행시킬 스크립트 경로
                        ssh -t soyeon@172.17.0.1 /home/soyeon/project/backend-server/backend-server.sh 
                    '''
                }
            }
        }
    }
}

 

 

4. 원격서버에 셸 스크립트 작성

// backend-server.sh 생성

echo "jar mv"
# 젠킨스 서버에서 받아온 .jar 파일을 프로젝트 디렉토리로 이동시킨다.
mv /home/soyeon/project/jenkins/backend-0.0.1-SNAPSHOT.jar /home/soyeon/project/backend-server/

echo "page mv"
# 프로젝트 디렉토리로 이동한다.
cd /home/soyeon/project/backend-server/

echo "docker stop & remove"
# 실행중인 docker container를 중지 + 삭제한다. (이미 중지되어 있거나 존재하지 않는다면 무시한다)
docker stop backend-container || true
docker rm backend-container || true

echo "docker start"
# 현재 디렉토리에서 Docker 이미지를 빌드한다.
docker build -t backend .

# backend라는 태그가 붙은 Docker 이미지를 기반으로 backend-container라는 이름의 새로운 컨테이너를 시작한다.
docker run -d --name backend-container -p 8080:8080 backend

 

// 프로젝트 디렉토리에 Dockerfile 생성

FROM openjdk:17-jdk-alpine

# 작업 디렉토리 생성
WORKDIR /app

# 현재 디렉토리의 .jar 파일을 컨테이너 내부로 복사
COPY backend-0.0.1-SNAPSHOT.jar /app/backend.jar

EXPOSE 8080

# 애플리케이션 실행
ENTRYPOINT ["java", "-jar", "/app/backend.jar"]

 

 

5. 젠킨스 실행

- console을 확인하며 테스트한다.