4. Jenkins pipeline 구성
앞장까지 젠킨스 프로젝트 구성을 마쳤다.
이제 젠킨스가 실제로 일을 할 수 있는 파이프라인 스크립트 구성을 해야 한다.
여기서 해야하는 일이 무엇인지 잊지 말자
"백앤드(프론트앤드) 프로젝트를 빌드해서 Docker image 를 만들고, 이를 ECR 에 Push 하는 것" 이다.
이를 위해서는 총 3단계 작업이 필요하다.
1. Docker image build
2. AWS Login (from jenkins)
3. push to ECR
필자는 순서를 바꾸어서 2번 로그인 단계를 제일먼저 작성했다.
1> AWS Login from jenkins
지금 하는 모든것은 자동 배포를 위한 작업이므로 사람이 수작업으로 AWS 에 로그인해서 작업을 하는것이 아니라 젠킨스가 모든일을 해야 한다.
따라서 젠킨스 명의(?)로 AWS 에 로그인을 해서 젠킨스가 이후 일들을 할 수 있어야 한다.
이를 위해서는 젠킨스에서 AWS 에 접근(접속)할 수 있는 id/passwd 가 필요하다.
하지만 ssh 조차도 공개키,비공개키로 접속을 하는것처럼 AWS 역시 id/passwd 방식이 아닌 미리 발급된 key 로 로그인이 가능하다.
이를 AWS credential 이라고 부르고 젠킨스에서는 특별히 AWS credential 을 위한 플러그인도 제공하고 있다.
젠킨스에서 AWS credential 을 생성하는 자세한 방법은 이미 다루었으니 패스한다. (9. Jenkins AWS Credential)
aws credential 이 있으니 이제 이걸 이용해 aws login 을 하면 된다.
environment {
ECR_URL = 'xxxxxxxxxx.dkr.ecr.ap-southeast-1.amazonaws.com'
}
stage('Login to AWS ECR') {
steps {
script {
withCredentials([[$class: 'AmazonWebServicesCredentialsBinding',
credentialsId: 'XXXX_AWS_ECR_CREDENTIAL']]) {
sh 'aws ecr get-login-password --region ap-southeast-1 |
docker login --username AWS --password-stdin ${ECR_URL}'
}
}
}
}
1) ECR_URL 이라고 전체 환경변수를 선언해서 코드에서 사용할 수 있게 해줌
2) withCredentials : 자격증명컨텍스트 -> 이 안에 자격증명 관련 내용을 기술해서 접속하게 한다.
3) $class: 'AmazonWebServicesCredentialsBinding' : Jenkins 에서 AWS 자격 증명을 바인딩 (고정된 플러그인 클래스 이름이므로 그냥 복붙해서 사용하면 된다)
4) credentialsId: 'XXXX_AWS_ECR_CREDENTIAL' : [9. Jenkins AWS Credential] 에서 설정한 Credential ID
5) sh 이하 : 젠킨스 파이프라인에서 쉘 명령어 실행 부분 => aws cli 명령어로 지정된 리전에 있는 AWS ECR 에 login 한다. (이 부분 역시 고정된 명령어로 복붙해서 사용하면 된다)
2> Docker image build
파이프라인 스크립트
stage('Build Docker image') {
steps {
script {
echo "Docker image build step!!";
sh 'chmod +x ./jenkins/production/jenkins_build.prod.sh';
sh './jenkins/production/jenkins_build.prod.sh';
}
}
}
-> 별거 없다. 물론 사전에 해당 프로젝트가 docker build 가 되도록 작업이 되어 있어야 한다.
production/jenkins_build.prod.sh
#!/usr/bin/env bash
set -x
# clean docker cache
docker system prune -a -f
# remove previous images
docker images | grep 'backend' | awk '{print $3}' | xargs -r docker rmi -f
# docker build
docker-compose -f ./docker-compose-prod.yml build backend
docker-compose -f ./docker-compose-prod.yml build nginx
# tag docgker image
docker tag backend_tag_name ${ECR_URL}/backend:${BUILD_NUMBER}
docker tag nginx_tag_name ${ECR_URL}/nginx:${BUILD_NUMBER}
-> 다른거는 그냥 docker 내용이고 마지막 tag 가 중요하다.
필자는 docker image 의 이름을 가지고 젠킨스의 빌드 이력을 추적할 수 있도록 docker tag 의 마지막에 젠킨스 build_number 를 기록하도록 했다.
그러면 후에 문제가 발생했을때 docker image tag 만으로도 손쉽게 젠킨스 빌드를 추적할 수 있고 , 이는 연쇄적으로 gerrit(git) history 까지도 추적할 수 있어 문제 해결에 큰 도움이 된다.
BUILD_NUMBER 는 젠킨스가 제공하는 기본 환경변수이다. 별도의 선언,작업없이 그냥 가져다 사용할 수 있다.
3> Push to ECR
이제 다 왔다.
AWS ECR 에 로그인 했고, Docker image 까지 만들어 놓았다.
이제 이를 푸쉬하기만 하면 된다.
stage('Push to ECR') {
steps {
script {
echo "Docker image push step!!";
sh 'docker push ${ECR_URL}/backend:${BUILD_NUMBER}'
sh 'docker push ${ECR_URL}/nginx:${BUILD_NUMBER}'
}
}
}
=> 앞서 docker tag 의 내용으로 push 명령어만 수행해주면 된다.
명령어 : docker push [tag]
간단하다.
위 명령어만 수행하면 docker 이미지가 ECR 에 push 된다.
(docker hub 에 올리는것과 동일)
이제 해아할 모든일은 끝났다.
실제로 젠킨스 형님이 일을 잘했는지 확인해보자.
위 과정을 전담하는 젠킨스 형님은 일을 하고 나면 아래와 같다.
당연히 AWS ECR 에서도 확인해봐야겠지?
aws home 에서 ecr 서비스 접속
내가 설정한 repository 확인 > 이미지들이 들어와 있음을 확인할 수 있다. 각각을 눌러서 들어가 보자.
backend 이미지를 확인해 보면 저렇게 젠킨스 빌드 번호 (31, 32, 33 ) 가 image tag 로 붙어서 들어와 있음을 확인할 수 있다.
2줄 요약
1. 젠킨스 파이프라인 구성
2. 파이프라인은 AWS Login / docker image build / Push to ECR 로 구성된다.
끝!!
Prev << 1. ECR에 Docker image push (2/3) Next >> 2. EC2에서 Pull & Run (1/3)
'자동배포 (Auto deploy)' 카테고리의 다른 글
1. ECR에 Docker image push (1/3) (1) | 2024.10.31 |
---|---|
1. ECR에 Docker image push (2/3) (0) | 2024.10.31 |
2. EC2에서 Pull & Run (1/3) (1) | 2024.10.31 |
2. EC2에서 Pull & Run (2/3) (0) | 2024.10.31 |
2. EC2에서 Pull & Run (3/3) (2) | 2024.10.31 |