Jenkins CI/CD 파이프라인 구축에서 핵심은 pipeline 스크립트를 효과적으로 작성하는 데 있다.
이번 포스트는 Jenkins로 도커 이미지 Build & Push 자동화하는 방법을 적어볼 것이다.
Sections 로 구성된다.
본격적인 pipeline script 작성에 앞서, 만약 연동하려는 Github가 private인 경우는 홈 > Jenkins 관리 > System > GitHub > Name적고 API URL은 냅둠 > credentials add 클릭 > kind: secret text > secret에 본인 Github의 settings에서 생성한 엑세스 키 토큰을 입력 > id는 아무거나 을 차례로 입력해 credentials에 본인 깃헙 계정을 연결시킨다.
반대로 public repo일 경우, 이 과정은 생략한다.
새로운 Item > Pipeline에 들어간다.
General의 Github project에 연동할 깃허브 repo주소를 입력한다.
Build Triggers에 GitHub hook trigger for GITScm polling을 체크한다.
Build Triggers 항목들 간단 설명
Pipeline script에 pipeline 작성
먼저 프로젝트에서 사용된 환경변수를 입력해야한다.
기존 Node.js프로젝트에서는 front와 back폴더 각각에 .env파일을 생성하여 각종 엑세스키, 포트번호, URL등을 입력하였는데 이번에는 .env파일을 생성하는 대신 environment옵션에 환경변수를 넣어주겠다.
https://www.educative.io/answers/how-to-set-environment-variables-in-jenkins
위 링크를 참고했다.
홈 > Jenkins 관리 > system > Global properties에 다음과 같이 환경변수들 모두 작성
비번, 키 같은 공개하기 어려운 값들은
홈 > Jenkins 관리 > credentials > Stores scoped to Jenkins > Global credentials (unrestricted) > Add > secret text 선택한 다음 작성하면 된다.
그런 다음 아래와 같이 작성해준다.
pipeline{
agent any
environment {
GOOGLE_CLIENT_ID = credentials('google_client_id') # Global credentials
SMTP_PASSWORD = credentials('smtp_password')
SMTP_SERVICE = 'gmail' # Global properties
...
}
}
첫번째 stage는 git clone이다.
맨 아래 pipeline syntax > Sample step > checkout: Checkout from version control 선택 > repository URL에 연동할 github repo url을 입력 > (optional) private repo인 경우 credentials 추가 > branches to build에 클론할 브랜치 입력 > generate pipeline script클릭하면 아래와 같이 깃 클론해줄 명령어 script가 나온다.
복사해서 아래와 같이 추가해준다.
pipeline{
agent any
environment {
GOOGLE_CLIENT_ID = credentials('google_client_id') # Global credentials
SMTP_PASSWORD = credentials('smtp_password')
SMTP_SERVICE = 'gmail' # Global properties
}
stages{
stage('clone') {
steps{
checkout scmGit(branches: [[name: '*/master']], extensions: [], userRemoteConfigs: [[url: 'https://github.com/snghyun331/elice-damchae-upgrade']])
}
}
}
}
두번째 stage는 도커 빌드이다.
도커 컴포즈로 빌드하기 위해 아래와 같이 작성했다.
(위 코드 생략)
...
stage('Build Docker images') {
steps{
echo "Building docker images............."
script{
// elice-damchae-upgrade 폴더로 이동
dir('elice-damchae-upgrade') {
// 도커 컴포즈 빌드
sh 'docker-compose build'
}
}
}
}
깃 클론을 해서 elice-damchae-upgrade폴더가 생겼고, 그 폴더 안에 바로 docker-compose.yml파일이 있다. 이 docker-compose.yml파일을 빌드하면 한번에 4개의 서비스(이미지)가 빌드된다.
세번째 stage는 빌드한 이미지를 도커 허브에 푸쉬하는 것이다.
본인의 도커 허브에 푸쉬하기 위해서는 먼저 도커 로그인을 해야한다.
pipeline syntax > Sample Step > withCredentials: Bind credentials to variables선택 > Bindings의 Add에서 Secret Text 선택 > Variable에 pipeline script에 쓸 pwd명 아무거나 쓰고 add credentials 클릭 > secret text > Secret에는 도커 허브 비밀번호, ID는 새로 지정할 credentials명 아무거나 입력 > Add 클릭 > credentials에서 방금 지정한 credential선택 > Generate Pipeline Script 클릭 후 복사
복사한 script을 아래와 같이 붙여넣기
// 맨 처음에 빌드할 서비스명 정의
def services = [
'backapp',
'frontapp'
]
....
....
stage('Tag and Push to Hub') {
steps{
echo "Tagging and pushing to hub.................."
script{
services.each { service ->
stage ("${service} Push") {
echo "${service} Pushing..."
withCredentials([string(credentialsId: 'docker_pwd', variable: 'docker_hub_pwd')]) {
def imageName = "damchae1_${service.toLowerCase()}:latest"
def imageTag = "snghyun/damchae_pipeline_${service.toLowerCase()}:${BUILD_NUMBER}"
// 이미지 태깅
sh "docker tag ${imageName} ${imageTag}"
// Hub에 로그인
sh "docker login -u 도커허브 아이디 -p ${docker_hub_pwd}"
// 이미지를 허브로 푸쉬
sh "docker push ${imageTag}"
}
}
}
}
}
}
docker images
입력하면 알 수 있다.
결과↓
지금까지는 Pipeline script에 Pipeline을 작성하고 ▷지금 빌드
버튼을 누르면서 테스트해보았다면, 이제는 이런식으로 하지 않고 소스코드폴더에 Jenkinsfile 파일을 생성하고 그 안에 파이프라인을 옮겨 적을 것이다.
▲ Jenkinsfile 작성
GitHub Webhook 설정
Definition을 Pipeline Script → Pipeline Script from SCM으로 변경
확인
⚠
master로 푸쉬하기 전, 깃허브의 webhooks에 들어가더니 아래와 같은 에러 메시지가 나왔다. 몇분 전 다른 브래치로 푸쉬한 적이 있는데 webhooks에 입력한 호스트 주소와의 연결이 실패했다는 에러 메시지였다.
원인은 AWS EC2 보안 인바운드 규칙에 Jenkins 접속 포트를 내 IP주소로만 접속하도록 설정해서 생긴 오류였다!
이제 master로 푸쉬해봤더니 ▷지금 빌드
버튼을 누르지 않아도 자동으로 빌드/푸쉬가 되었다.
성공~
※ 참고:
[Jenkins 파일 작성법]
[Jenkins를 github에 연동하기] https://dev2-jay.tistory.com/47 👍