SY 개발일지
article thumbnail

이번 포스팅에서는 깃허브에 있는 스프링부트 코드를 Webhooks를 이용해 배포해보도록 하겠습니다.

 

젠킨스 안에 도커 인 도커 설치

젠킨스를 설치할 때 해당 옵션을 추가하였습니다. 이는 도커 인 도커를 가능하게 해주는 옵션입니다.

만약 하지 않았다면 젠킨스를 삭제한 후, 다시 올려주어야 합니다.

-v /var/run/docker.sock:/var/run/docker.sock

 

1️⃣ Jenkins 컨테이너에 접속합니다.

docker exec -it jenkins-server /bin/bash

 

2️⃣ sudo 를 사용하기 위해 관리자 모드로 들어갑니다.

su -

 

3️⃣ Jenkins 안에 Docker를 설치합니다.

# Docker 설치
## - Old Version Remove
apt-get remove docker docker-engine docker.io containerd runc
## - Setup Repo
apt-get update
apt-get install \
    ca-certificates \
    curl \
    gnupg \
    lsb-release
mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/debian/gpg | gpg --dearmor -o /etc/apt/keyrings/docker.gpg
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/debian \
  $(lsb_release -cs) stable" | tee /etc/apt/sources.list.d/docker.list > /dev/null
## - Install Docker Engine
apt-get update
apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin

 

4️⃣ docker sudo 설정

도커에 sudo 명령어 없이 접근하기 위해 권한을 부여해줍니다.

chmod 666 /var/run/docker.sock

 

젠킨스에서 사용할 깃허브 토큰 발급

먼저, 젠킨스에서 제 깃허브에 접근할 수 있도록 하기 위해 깃허브 토큰을 발급받아보도록 하겠습니다.

1️⃣ 깃허브 > 프로필 클릭 > Settings 클릭

2️⃣ 가장 하단에 있는 Developer settings 클릭

3️⃣ Personal access tokens > Tokens(classic) > Generate new token > Generate new token(classic)

4️⃣ 토큰명 입력 후 기간 선택

저는 No expiration을 선택해주었습니다.

 

5️⃣ scope 선택

레포지토리에 접근하기 위해 repo를, 웹 훅을 이용하기 위해 admin:repo_hook을 선택해주겠습니다.

6️⃣ 생성된 토큰 값 확인

생성된 토큰은 한번만 보여주니 메모장 등에 저장해둡니다.

 

Spring 도커 파일 생성

저는 다음과 같이 Dockerfile을 생성해주었습니다.

프로젝트 최상단 폴더에 작성해주세요

# 이미지 지정
FROM openjdk:17

#ARG : docker build 명렁어를 사용할 때 입력받을 수 있는 인자 선언
ARG JAR_FILE=build/libs/*.jar

# copy 이미지에 파일이나 폴더 추가
COPY ${JAR_FILE} app.jar

# EntryPoint 컨테이너를실행할 때, 실행할 명령어를 지정해준다.
ENTRYPOINT [ "java" ,"-jar", "app.jar"]

 

젠킨스에서 깃허브 설정

다음으로 젠킨스에 방금 발급받은 토큰을 추가해주도록 하겠습니다.

1️⃣ Dashboard > Jenkins 관리 > System(시스템 설정) 클릭

 

2️⃣ Github > Add GitHub Server > GitHub Server

스크롤을 내리다보면 Github가 존재합니다. GitHub 서버를 추가해주도록 하겠습니다.

3️⃣ 서버 생성(1)

먼저 이름을 입력하고, API URL은 그대로 둡니다.

+Add 를 선택하여 Jenkins를 선택해주도록 하겠습니다.

 

4️⃣ 서버 생성(2)

젠킨스를 추가하려면, 먼저 Kind에서 Secret text를 선택한 후, github token과 깃허브 아이디를 입력합니다

Description에는 원하는 설명을 입력해줍니다.

 

그런 후 Add를 누르면, Credentials에 방금 등록한 토큰이 Description 이름으로 존재함을 확인할 수 있습니다. 

이 토큰을 선택해줍니다.

 

테스트 해보았을 때 이렇게 뜨면 성공입니다.

 

Pipeline 생성

이제 본격적으로 파이프라인을 생성해주도록 하겠습니다.

1️⃣ 새로운 Item 클릭

2️⃣ 새로운 아이템을 생성합니다.

그리고 타입을 Pipeline으로 해주세요.

 

3️⃣ Pipeline 설정

1. 먼저 Do not allow the pipeline to resume if the controller restarts 에 체크해주세요.

2. 파이프라인 스크립트 작성

pipeline {
    agent any

    environment {
        BE_IMAGE_NAME = "restagram_api"
        BE_CONTAINER_NAME = "restagram_api"
        GIT_REPO = "https://github.com/soyeonnnb/restagram-api.git"
        GIT_BRANCH = "master"
    }

    stages {
        stage('Checkout') {
            steps {
                git url: "${GIT_REPO}", branch: "${GIT_BRANCH}"
            }
        }
        
        stage('Build') {
            steps {
                // 기존 빌드 결과물 삭제
                sh 'rm -rf build || true'
           
                
                echo '깃허브 BackEnd 빌드 Start'
            
                // application.yml을 복사한다.
                dir('/var/jenkins_home/restagram/api') {
                    sh '''
                        mkdir -p ${WORKSPACE}/src/main/resources/
                        cp application.yml ${WORKSPACE}/src/main/resources/
                    '''
                }
                
                // 권한을 변경하고 빌드 시작
                sh '''
                    chmod +x gradlew
                    ./gradlew clean bootJar
                '''
            }
            post {
                success {
                    echo 'gradle build success'
                }
                failure {
                    echo 'gradle build failed'
                }
            }
        }
        
        stage('Dockerization') {
            steps {
                echo "BackEnd Image Build Start"
                // 도커 이미지를 삭제합니다.
                sh '''
                    docker rmi ${BE_IMAGE_NAME} || true
                '''
                // 도커 이미지를 빌드합니다.
                sh '''
                    docker build -t ${BE_IMAGE_NAME}:latest .
                '''
            }
            post {
                success {
                    echo "build Docker BE Image Success"
                }
                failure {
                    echo "build Docker BE Image Fail"
                }
            }
        }     
        
        stage('Deploy') {
            steps {
                script {
                    // 컨테이너가 실행 중인 경우 중지 및 삭제
                    sh '''
                        docker stop ${BE_CONTAINER_NAME} || true
                        docker rm ${BE_CONTAINER_NAME} || true
                    '''
                    // 새 컨테이너 시작
                    sh '''
                        docker run --name ${BE_CONTAINER_NAME} -d -p 8080:8080 ${BE_IMAGE_NAME}:latest
                    '''
                }
            }
        }
    }
}

 

이를 빌드하기 위해서는 application.yml이 /var/jenkins_home 경로에 위치해 있어야 합니다.

만약, application.yml이 없다면 추가하거나 해당 명령어를 삭제해주세요.

 

/var/jenkins_home 경로에 application.yml 추가하는 법을 보시려면 하단 더보기를 눌러주세요

더보기

등록하는 건 간단합니다.

 

1. jenkins 이름 확인

docker ps

 

2. jenkins 컨테이너로 들어가기

저의 경우에는 jenkins 이름이 jenkins-server 였습니다. 알맞는 이름을 입력해주세요.

docker exec -it jenkins-server /bin/bash

 

vi 설치 (만약 vi가 이미 있으시다면 10번으로 이동해주세요)

3. sudo 설치 여부 확인

dpkg -l sudo

 

4-1. (아직 root 계정에 대한 비밀번호가 없는 경우) root 계정으로 jenkins 컨테이너 재접속

docker exec -it --user root jenkins-server /bin/bash

 

4-2. (아직 root 계정에 대한 비밀번호가 없는 경우) 비밀번호 설정

passwd
New password: 
Retype new password:

 

5. root 계정으로 진입하기

su -

 

6. apt-get update

apt-get update

 

7. sudo 설치하기

apt-get install sudo -y

 

8. sudo apt-get update

 sudo apt-get update

 

9. vi 설치

sudo apt-get install vim

 

10. application.yml 등록

vi /var/jenkins_home/application.yml

 vi 사용법은 넘어가겠습니다 ㅎㅎ

간단히 설명드리자면 i 를 통해 입력 모드로 진입 가능하고 esc + :wq! 를 통해 저장하실 수 있습니다.

 

3️⃣ 빌드 확인

Dashboard > pipeline 명 > 지금 빌드

 

참고

 

[리눅스] sudo 설치 안될 때

apt-get install sudo 라 리면 되는데, 이 때 E: Unable to locate package sudo가 나오는 경우가 있다. 단순하게 apt-get을 업데이트 해주면 된다. apt-get update 이후 다시 apt-get install sudo 하면 정상적으로 설치가 된

oculus.tistory.com

 

도커와 젠킨스로 스프링부트+그래들 프로젝트 배포(3/4) - 젠킨스와 깃허브 연동 및 배포

이 게시글은 도커와 젠킨스로 스프링부트+그래들 프로젝트 배포의 세번째 글입니다 이번엔 젠킨스에서 깃허브 레파지토리를 연동해보고 자신의 프로젝트를 배포 해보겠습니다. 최종적으로는

pilming.tistory.com

 

[Setting | Docker] jenkins 설치 내부에서 docker 실행 | Opendocs Blog

젠킨스를 도커로 설치하고 내부에서 도커를 실행하기 위한(Docker In Docker) 방법을 정리한다. 작성일 : 2022-05-30 1> 젠킨스 설치시 옵션추가 젠킨스 설치시 아래 옵션을 추가해 도커의 소켓 파일 마

blog.opendocs.co.kr

 

 

profile

SY 개발일지

@SY 키키

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!