개발놀이터
CI / CD 자동화 (3) : Jenkins 파이프라인 작성하기 본문
이전 포스팅과 이어집니다.
https://coding-review.tistory.com/414
이제 본격적으로 파이프라인을 만들어보겠습니다.
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
'''
}
}
}
}
문법은 대충 어떤 느낌인지 감이 오실거라고 생각합니다.
제 파이프라인을 설명해보자면
- Github : 제 리포지토리 url의 master branch를 가져옵니다. 이 말은 git pulling을 하겠다는 의미입니다.
- Build : gradlew 파일의 권한을 슈퍼권한을 준 다음 gradlew를 빌드합니다. 한번 슈퍼 권한을 주면 다음엔 안줘도 되는데 혹여 Jenkins 컨테이너가 죽는다던가 새로 올린다던가 하는 상황에서 언제든지 같은 동작을 하게끔 멱등성을 유지하고싶어서 넣었습니다.
- DownloadDockerAndDockerCompose : 이것도 위의 Build 스텝이랑 비슷한 느낌인데 컨테이너가 다시 끼워지더라도 같은 동작을 하기 위해서 넣은 파이프라인입니다. 참고로 apt-get 명령어는 이미 패키지가 존재하면 다운로드를 하지 않는다는 특징이 있습니다.
- 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 라는 이름의 이미지를 만듭니다. - Deployment : 이 스텝에선 deploy.sh 가 실행됩니다. 제가 적은 deploy.sh에 대해 궁금하신 분은 아래의 링크를 확인해주세요!
https://coding-review.tistory.com/408
그리고 이제 한번 확인해봐야겠죠?
잘 동작합니다.
마치며
Jenkins가 유지보수 극악이라고 얘기해서 살짝 겁먹었는데 역시 저처럼 헬로월드 수준의 CI / CD는 문제없네요.
이렇게 Jenkins를 이용해서 CI / CD 자동화를 알아봤습니다. 저는 단계적으로 배포를 진행해서 그런가 더 뿌듯했습니다.
- Cafe 24로 WAR 파일 배포
- AWS EC2 배포
- EC2 + Docker 배포
- EC2 + Docker + Nginx 무중단 배포
- EC2 + Docker + Nginx + Jenkins 무중단 배포 자동화
정말 뿌듯한 프로젝트였습니다. 한 주동안 정말 행복했구요 제 생각에 신입이 할 수 있는 가장 마지막 단계가 CI / CD 자동화가 아닌가 생각합니다. 마지막을 장식하는데 이정도면 충분해보입니다.
여러분도 마지막 대미를 장식하는데 Jenkins를 이용해 자동화를 진행해보면 좋겠습니다.
긴 글 읽어주셔서 감사합니다. 오늘도 즐거운 하루 되세요~
'배포 > CI , CD' 카테고리의 다른 글
클래스 로더 warm up / JIT 컴파일러 warm up (0) | 2023.07.07 |
---|---|
Graceful Shutdown (feat. Hard Shutdown) (0) | 2023.07.07 |
CI / CD 자동화 (2) : Jenkins 시작하기 (0) | 2023.06.14 |
CI / CD 자동화 (1) : Jenkins vs Github Action (0) | 2023.06.14 |