개발놀이터

CI / CD 자동화 (3) : Jenkins 파이프라인 작성하기 본문

배포/CI , CD

CI / CD 자동화 (3) : Jenkins 파이프라인 작성하기

마늘냄새폴폴 2023. 6. 14. 17:25

이전 포스팅과 이어집니다. 

https://coding-review.tistory.com/414

 

CI / CD 자동화 (2) : Jenkins 시작하기

앞선 포스팅과 이어지는 내용입니다. https://coding-review.tistory.com/413 CI / CD 자동화 (1) : Jenkins vs Github Action 이전 포스팅을 보고 오시면 더 이해하기 쉽습니다! https://coding-review.tistory.com/410 Docker + Ngin

coding-review.tistory.com

 

이제 본격적으로 파이프라인을 만들어보겠습니다. 

 

Github project를 클릭하시고 아래에 자신의 github 리포지토리 주소를 입력합니다. 

 

주의해야하는 점은 맨 마지막에 / (슬래쉬) 반드시 넣으셔야 오류가 안납니다. 

 

그리고 오래된 빌드 삭제를 누르시는데 이건 해도 되고 안해도 됩니다만 예전 로그까지 볼 필요는 없을 것 같아서 선택했습니다. 

 

저는 그 숫자가 10개가 적당해보여서 10개로 입력했습니다. 

 

Definition을 Pipeline script로 선택해주시고 맨 아래 Use Groovy Sandbox를 선택 해제합니다. 

 

그리고 이제 Script안에 파이프라인을 적어야합니다. 

 

pipeline {
    agent any
    stages {
        stage('Github') {
            steps {
                git branch: 'master',
                url: 'https://github.com/garlicpollpoll/capston.git'
            }
        }
        stage('Build') {
            steps {
                sh '''
                    chmod 777 ./gradlew
                    ./gradlew build
                '''
            }
        }
        stage('DownloadDockerAndDockerCompose') {
            steps {
                sh '''
                    apt-get update
                    apt-get install docker -y
                    apt-get install docker-compose -y
                    usermod -aG docker jenkins
                '''
            }
        }
        stage('MakeDockerImage') {
            steps {
                sh '''
                    cp /var/jenkins_home/workspace/capston-pipline/build/libs/capston-0.0.1-SNAPSHOT.jar /var/jenkins_home/project/deploy
                    cd /var/jenkins_home/project/deploy
                    chmod 777 ./make-docker-image.sh
                    ./make-docker-image.sh
                '''
            }
        }
        stage('Deplolyment') {
            steps {
                sh'''
                    cd /var/jenkins_home/project/deploy
                    chmod 777 ./deploy.sh
                    ./deploy.sh
                '''
            }
        }
    }
}

문법은 대충 어떤 느낌인지 감이 오실거라고 생각합니다. 

 

제 파이프라인을 설명해보자면

 

  1. Github : 제 리포지토리 url의 master branch를 가져옵니다. 이 말은 git pulling을 하겠다는 의미입니다. 
  2. Build : gradlew 파일의 권한을 슈퍼권한을 준 다음 gradlew를 빌드합니다. 한번 슈퍼 권한을 주면 다음엔 안줘도 되는데 혹여 Jenkins 컨테이너가 죽는다던가 새로 올린다던가 하는 상황에서 언제든지 같은 동작을 하게끔 멱등성을 유지하고싶어서 넣었습니다. 
  3. DownloadDockerAndDockerCompose : 이것도 위의 Build 스텝이랑 비슷한 느낌인데 컨테이너가 다시 끼워지더라도 같은 동작을 하기 위해서 넣은 파이프라인입니다. 참고로 apt-get 명령어는 이미 패키지가 존재하면 다운로드를 하지 않는다는 특징이 있습니다. 
  4. MakeDockerImage : Github 스텝에서 git pulling이 잘 되었다면 pulling한 파일들은 /var/jenkins_home/workspace/${pipeline 이름} 에 저장됩니다. 이 디렉토리에 있는 build/libs/capston-0.0.1-SNAPSHOT.jar를 /var/jenkins_home/project/deploy 에 복사합니다. 

    그리고 이 복사한 JAR파일을 기반으로 Docker Image를 만드는데 make-docker-image.sh 의 로직은 

    1. blue 버전의 컨테이너가 띄워져있는지 확인합니다. 
    2. 띄워져 있다면 garlicpollpoll-capston-green 이라는 이름의 이미지를 만듭니다. 
    3. 띄워져 있지 않다면 garlicpollpoll-capston-blue 라는 이름의 이미지를 만듭니다. 
  5. Deployment : 이 스텝에선 deploy.sh 가 실행됩니다. 제가 적은 deploy.sh에 대해 궁금하신 분은 아래의 링크를 확인해주세요!

https://coding-review.tistory.com/408

 

Docker + Nginx 를 이용해 스프링 프로젝트 무중단 배포하기 : 방법

이번 포스팅에선 Docker + Nginx를 이용해 무중단 배포에 대해 포스팅해보도록 하겠습니다. 무중단 배포는 CI / CD를 통틀어 웹 서비스에 모두 적용되어 있는 가장 기본이라고 할 수 있습니다. 도커

coding-review.tistory.com

 

그리고 이제 한번 확인해봐야겠죠? 

 

 

 

잘 동작합니다. 

 

 

마치며

Jenkins가 유지보수 극악이라고 얘기해서 살짝 겁먹었는데 역시 저처럼 헬로월드 수준의 CI / CD는 문제없네요. 

 

이렇게 Jenkins를 이용해서 CI / CD 자동화를 알아봤습니다. 저는 단계적으로 배포를 진행해서 그런가 더 뿌듯했습니다. 

 

  1. Cafe 24로 WAR 파일 배포
  2. AWS EC2 배포
  3. EC2 + Docker 배포
  4. EC2 + Docker + Nginx 무중단 배포
  5. EC2 + Docker + Nginx + Jenkins 무중단 배포 자동화

정말 뿌듯한 프로젝트였습니다. 한 주동안 정말 행복했구요 제 생각에 신입이 할 수 있는 가장 마지막 단계가 CI / CD 자동화가 아닌가 생각합니다. 마지막을 장식하는데 이정도면 충분해보입니다. 

 

여러분도 마지막 대미를 장식하는데 Jenkins를 이용해 자동화를 진행해보면 좋겠습니다. 

 

긴 글 읽어주셔서 감사합니다. 오늘도 즐거운 하루 되세요~