ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Docker와 Jenkins를 사용하여 CI/CD 구축 <2>
    인프라/젠킨스 2024. 1. 13. 20:26

    학습 내용

    젠킨스 사용을 위해서 이런 저런 책과 유뷰브 영상을 찾아보고 직접 적용을 해보겠습니다.

    깃에 push가 발생하면 젠킨스가 작동해서 도커 hub에 새로운 이미지를 업로드합니다.

    또 작업내용을 slack에서 메세지로 받아봅니다.

    step1:
    웹서버 및 젠킨스 서버 배포
    
    step2:
    깃 코드 변경 > 새로운 이미지 빌드 > 도커 허브 갱신 > 신규 이미지로 서버 재배포

     

     

    이전 글에서 이어지는 내용입니다.

     

     


     

    6.  Github 연결

     

    첫 진입시 모달에서 파이프라인 생성 버튼을 눌러줍니다.

     

     

    깃헙 레포와 연결해서 사용할 것이기 때문에 github 선택해주고, token을 생성해서 넣어줍니다.

     

    "Create an access token here" 누르면 필요한 권한이 세팅된 화면을 볼 수 있습니다.

     

    이후에 연결하려는 repository까지 설정완료하면 다음과 같은 화면을 볼 수 있습니다.

     

     


     

    7.  파이프라인 구성

    깃 연동, 테스트, 빌드 순으로 파이프라인을 구성해보겠습니다.

     

    step1. Git 연동

    깃 연동을 하기 전에 jenkins worksapce를 먼저 방문해보겠습니다.

    $ docker exec -it jenkins bash
    $ cd /var/jenkins_home/workspace

     

    해당 경로에 workspaces.txt만 존재하는 것을 확인하였습니다.

    이제 젠킨스 파이프 라인에 소드코드 가져오는 step을 추가해보겠습니다.

     

     

     

    젠킨스 blue ocean 페이지로 돌아옵니다.

    step에서 Git을 고르고 repository 주소와 원하는 브랜치를 선택해줍니다.

     

    save 버튼을 통해서 pipeline을 추가해보겠습니다.

    이 액션은 깃헙의 repository에 Jenkinsfile을 생성하거나 변경하는 커밋을 생성합니다.

     

     

    해당 스텝이 성공적으로 진행되었다면 다음과 같은 페이지를 확인할 수 있습니다.

     

     

    터미널에서 워크스페이스에 무엇이 있는지 다시 한번 확인해보겠습니다.

     

     

    해당 step이 작동하면서 repository가 clone 되어서 _youtube-jenkins_main 폴더가 생긴것이 확인가능합니다.

    또 깃헙 repo에도 다음과 같은 commit이 추가 되었습니다.

     

     

     

     

    step2. 테스트 & 빌드

    클론된 소스코드에 문제가 없는지 검증한은 테스트 step을 추가해보겠습다.

    위의 edit 버튼을 누르면 pipeline을 수정하는 화면으로 이동합니다.

     

     

    이번에는 Shell Script를 사용한 step을 선택하고 테스트를 위한 스크립트를 작성합니다.

     

    저장 후 pipeline이 잘 작동하는지 확인합니다.

     

    저는 gradlew를 사용해서 소스 코드를 빌드하고, 해당 빌드파일을 docker로 이미지화해서 docker-hub에 업데이트 하는 방법을 사용하고 있습니다. 먼저 소스 코드를 빌드하겠습니다.

     

    빌드까지 잘 성공한 모습입니다.

    젠킨스의 workspace에서 build 폴더를 확인할 수 있습니다.

     

     

    step3. 도커 빌드 & Push

    생성한 빌드 파일을 빌드해서 도커 허브에 push 해보겠습니다. 

    이 과정은 컨테이너에서 cli 사용권한 추가 -> 도커 허브 접근 권한 추가 -> 빌드 성공 의 순서로 진행됩니다.

     

    도커 컨테이너에서 도커 명령어를 실행하는 방식으로 진행하고 있습니다.

    이를 위해서 컨테이너에 docker.sock이 마운트 되어 있어야합니다. (컨테이너에서 도커CLI 사용하기)

     

    제 작업환경은 arm 아키텍쳐를 사용하고 서버 실행환경은 amd64 를 사용하기 때문에 buildx를 사용해서 이미지를 생성합니다.

    아래의 스크립트를 사용하는 새로운 step을 추가합니다.

    $ docker buildx build --platform linux/amd64 --push -t <도커 허브 유저ID>/<저장소이름> .

     

    저장소에 push할 권한이 없다는 이유로 실패를 하게 됩니다.

    도커 허브에 접속할 수 있는 credential을 젠킨스에 저장해서 사용해야합니다.

    젠킨스의 Credential 페이지를 먼저 찾아갑니다.

     

    도메인을 추가해줍니다.

    저는 Oauth를 사용해서 도커허브에 로그인 하고 있습니다. 그래서 password를 입력하는 곳에 token을 사용합니다.

    도커 허브의 security 탭을 살펴보면 github과 비슷하게 token을 생성할 수 있습니다.  ( 링크 )

    Username은 도커 허브의 닉네임을 넣고, password는 발급받은 토큰을 넣습니다.

    이제 위에 설정한 Credential을 불러와서 컨테이너에서 사용하기 위해서 Jenkinsfile을 수정해주어야합니다.

    credentialsId 부분에 위 단계에서 만든 credential의 id를 입력합니다.

    credential을 사용해서 docker login을 실행합니다.

    pipeline {
      agent any
      stages {
        stage('Git') {
          steps {
            git(url: '저장소 깃 주소', branch: 'main')
          }
        }
    
        stage('Code Test') {
          steps {
            sh './gradlew test'
          }
        }
    
        stage('Code Build') {
          steps {
            sh './gradlew build'
          }
        }
    
        stage('Docker-Push') {
          withCredentials([usernamePassword(credentialsId: 'Docker_Hub_ID', usernameVariable: 'DOCKER_HUB_USERNAME', passwordVariable: 'DOCKER_HUB_ACCESS_TOKEN')]) {
              sh 'docker login -u $DOCKER_HUB_USERNAME -p $DOCKER_HUB_ACCESS_TOKEN'
              sh 'docker buildx build --platform linux/amd64 --push -t <도커허브유저ID>/<Repo이름> .'
          }
        }
    
      }
    }

     

     

    Docker-push 스텝에서 credential을 사용하게 변경 -> 커밋 -> 깃헙에 푸시를 진행합니다.

    이후 젠킨스로 돌아와서 다시 실행을 시켜봅니다.

    도커 이미지가 갱신된 것을 확인할 수 있습니다.

     

     

     

    step4. 컨테이너 재실행

    이 과정은 프로덕션에서는 수동으로하는 것이 좋을 수도 있겠다는 생각이 듭니다.

    또 이번에 진행할 때는 컨테이너 종료 및 제거와 새로운 이미지 Pull 그리고 새로운 컨테이너 실행을 한개의 Pipeline에 묶어서 실행하지만

    개별 step으로 나눠서 진행하는 것이 더 좋을 것 같다고 생각이 듭니다.

     

     

    아래와 같이 스크립트를 추가해서 Step을 추가합니다.

    docker pull <도커허브유저ID>/<레포이름>:latest
    docker stop <컨테이너이름> || true
    docker rm <컨테이너이름> || true
    docker run -d --name spring_server -p 8070:8080 <도커허브유저ID>/<레포이름>:latest

     

    재배포가 완료되는 것을 확인할 수 있습니다.

     

     

    8. 코드 변경 후 서버에 반영하기

     

    변경 전 브라우저에서 보이는 모습입니다.

     

     

    새로운 코드들을 추가해서 git repository를 업데이트 해줍니다.

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Jenkins</title>
    </head>
    <body>
        <div>젠킨스 테스트</div>
        <div>새로 업데이트된 문구 입니다.</div>
        <div>다음 단계에서는 해당 브랜치에 Push가 있을 때 다시 빌드 되게 하는 것과</div>
        <div>빌드 성공 실패 여부를 슬랙으로 알림 받는 기능을 추가해봐야겠습니다.</div>
    </body>
    </html>

     

    Blue Ocean이 아닌 젠킨스 자체 ui에서도 pipeline을 확인할 수 있습니다.

    오른쪽의 화살표 버튼으로 실행 가능합니다.

    마지막 스케쥴의 모든 step이 통과한 것을 확인할 수 있습니다.

     

    서버가 정상적으로 업데이트 되었습니다!

     

     

     

     

    다음 글에서는 git repository에 변경이 생기면 다시 빌드하는 것과

    빌드 결과를 slack으로 알려주는 기능을 알아보겠습니다.

     


    [참고]

    https://www.youtube.com/watch?v=f4idgaq2VqA&ab_channel=freeCodeCamp.org

     

     

     

     

     

    '인프라 > 젠킨스' 카테고리의 다른 글

    Docker와 Jenkins를 사용하여 CI/CD 구축 <1>  (1) 2024.01.08
Designed by Tistory.