새소식

기술/AWS

Jenkins Pipeline을 이용하여 Docker Image를 ECR로 Push

  • -

안녕하세요. 오늘 글은 지난 시간에 이어서 Jenkins Pipeline을 이용하여 Docker Image Build 후 AWS ECR로 Push 하는 방법에 대해서 다뤄볼까 합니다.

 

준비물 : AWS Accesss Key, AWS IAM(ECR PermissionAmazonEC2ContainerRegistryPowerUser), AWS ECR

 

ECR의 권한은 꼭 PowerUser이거나 Full Access가 필요합니다.

 

ECR 권한 관련 백서

 

https://docs.aws.amazon.com/ko_kr/AmazonECS/latest/developerguide/ecr_managed_policies.html#AmazonEC2ContainerRegistryPowerUser

Amazon ECR 관리형 정책

docs.aws.amazon.com

AWS ECR은 Elastic Container Registry의 약자로, Docker Image를 Private 하게 보관할 수 있는 Registry를 제공하여 줍니다.

 

AWS에 저장하는 것이기 때문에 Docker Hub에 저장할 때보다 EC2나 ECS, EKS등에서 더 빠르게 이미지를 불러올 수 있습니다. (개인적인 생각입니다. 아주 개인적인...)

 

먼저 ECR부터 하나 생성하겠습니다.

 

AWS 로그인 후 ECR 서비스로 이동한 후 우측의 리포지토리 생성을 누릅니다.

 

 

리포지토리 이름을 입력 후 태그 변경 불가능 옵션과 푸시할 때 스캔 설정을 합니다.

 

전 불필요해서 하지 않았습니다. 필요하시면 하세요.

리포지토리 생성 후 아래 빨간 박스의 URI를 잘 기억하셔야 합니다.

이제 이미지를 저장할 리포지토리의 생성을 마쳤습니다.

 

다음으로 Jenkins에서 사용할 인증정보를 등록합니다.

 

AWS IAM에서 Access Key를 생성 후 다음 메뉴로 이동합니다.

 

Jenkins->Credentials->global->Add Credentials

Kind를 AWS Credentials로 변경합니다. 혹시나 없으신 분들은 AWS Global Configuration 플러그인을 꼭 설치해주세요.

 

저는 이렇게 설정했습니다.

이제 ECR에 Docker Image를 업로드하기 위한 인증정보 설정은 마무리 되었습니다.

 

이제 Pipeline의 Stage를 추가하기 위해 Jenkinsfile을 수정해야 합니다.

 

Jenkins ECR Plugin

 

Amazon ECR

This plugin generates Docker authentication token from Amazon Credentials to access Amazon ECR.

plugins.jenkins.io

공식 문서를 읽어보았을 때 우리가 필요한 부분은 요기입니다.

//cleanup current user docker credentials
sh 'rm  ~/.dockercfg || true'
sh 'rm ~/.docker/config.json || true'

//configure registry
docker.withRegistry('https://ID.ecr.eu-west-1.amazonaws.com', 'ecr:eu-west-1:86c8f5ec-1ce1-4e94-80c2-18e23bbd724a')

여기서 우리가 주로 수정할 내용은  docker.withRegistry 이겠죠?

 

아까 잘 기억해야 한다고 한 URI를 저기에 입력합니다.

덧붙여 이미지 업로드가 저쪽으로 되어야 하니 이참에 이미지 빌드시 생성되는 이름도 변경합니다.

#이미지 빌드시 이름을 ECR 쪽으로 변경
app = docker.build("********.dkr.ecr.ap-northeast-2.amazonaws.com/teichae")

# ECR에서 생성한 Repository URI로 변경 및 Jenkins AWS Credential으로 변경
docker.withRegistry('https://********.dkr.ecr.ap-northeast-2.amazonaws.com', 'ecr:ap-northeast-2:teichae-ecr-credentials')

# Full Code
  
node {
     stage('Clone repository') {
         checkout scm
     }

     stage('Build image') {
         app = docker.build("********.dkr.ecr.ap-northeast-2.amazonaws.com/teichae")
     }

     stage('Push image') {
         sh 'rm  ~/.dockercfg || true'
         sh 'rm ~/.docker/config.json || true'
         
         docker.withRegistry('https://********.dkr.ecr.ap-northeast-2.amazonaws.com', 'ecr:ap-northeast-2:teichae-ecr-credentials') {
             app.push("${env.BUILD_NUMBER}")
             app.push("latest")
     }
  }
}

이제 기본적인 Pipeline 구성은 끝났습니다.

 

해당 파일은 jenkinsfile-aws란 이름으로 github에 저장해두겠습니다.

 

지난번과 마찬가지로 Script path가 변경되었기 때문에 구성에서 변경된 jenkinsfile을 지정합니다.

이제 실제로 빌드를 해볼까요?

 

Build 실행 후 Console Output 내용입니다.

제가 의도한 대로 ECR로 Push가 된 내용이 확인됩니다.

 

이제 ECR에서도 확인해볼까요?

마찬가지로 ECR에서도 정상적으로 업로드된 모습을 확인할 수 있습니다.

 

이상으로 Jenkins Pipeline 시리즈를 마치겠습니다. :)

Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.