Jenkins를 활용한 CI/CD 입문 (with.AWS)
what-is-aws-ecr-private-repository-jenkins
✅ 1. ECR이란 무엇일까?
- ECR은 Elastic Container Registry의 약자이다.
- ECR은 쉽게 말해서 AWS가 운영하는 비공개 도커 이미지 저장소라고 생각하면 된다.
✅ 2. 비공개 리포지토리 생성하기
- 리포지토리 이름은 우리의 APP_NAME과 동일하게 입력한다.
pipeline {
// 전역 에이전트를 사용하지 않음으로써 컨테이너 중첩 방지
agent none
environment {
REACT_APP_VERSION = "1.0.$BUILD_ID"
APP_NAME = 'myjenkinsapp'
AWS_DEFAULT_REGION = 'ap-northeast-2'
AWS_DOCKER_REGISTRY = '리포지토리 URI 주소'
AWS_ECS_CLUSTER = 'punctual-crocodile-2buaov'
AWS_ECS_SERVICE_PROD = 'LearnJenkinsApp-Service-Prod'
AWS_ECS_TD_PROD = 'LearnJenkinsApp-TaskDefinition-Prod'
}
stages {
stage('Build') {
... 중략
}
stage('Build Docker image') {
agent {
docker {
image 'amazon/aws-cli'
reuseNode true
args "-u root --entrypoint='' -v /var/run/docker.sock:/var/run/docker.sock"
}
}
steps {
withCredentials([usernamePassword(credentialsId: 'my-aws', passwordVariable: 'AWS_SECRET_ACCESS_KEY', usernameVariable: 'AWS_ACCESS_KEY_ID')]) {
sh '''
yum install -y docker
# 애플 실리콘칩(M1,M2 등) 사용자는 해당 옵션 붙이기
docker build --platform linux/amd64 -t $APP_NAME:$REACT_APP_VERSION .
# docker build -t $APP_NAME:$REACT_APP_VERSION .
docker push $AWS_DOCKER_REGISTRY/$APP_NAME:$REACT_APP_VERSION
'''
}
}
}
stage('Deploy to AWS') {
... 중략
}
}
}
- 우리가 AWS 자격증명을 Jenkins에 등록했다고 하더라도, ECR에 도커 이미지를 업로드하려면 로그인 인증을 진행해야 한다.
aws ecr get-login-password | docker login --username AWS --password-stdin $AWS_DOCKER_REGISTRY
- 해당 명령문을 통해 로그인을 진행할 수 있다.
- 해당 구문을
docker push 전에 추가해준다.
- 해당 구문까지 추가하여 빌드를 진행해보면, 오류가 나는 것을 확인할 수 있다. 왜 그럴까?
- IAM 권한이 없기 때문이다. IAM 권한을 부여해보자.(스스로)
✅ 3. IAM 권한 부여
- 권한명 : AmazoneEC2ContainerRegistryFullAccess
- 권한 부여 후 확인 해보면 로그인이 성공적으로 된 것을 확인 할 수 있다.
- ECR 에서도 해당 도커 이미지가 잘 올라와 있는 것을 확인할 수 있다.
✅ 4. Tag명 변경
# docker build -t $AWS_DOCKER_REGISTRY/$APP_NAME:$REACT_APP_VERSION .
- Docker ECR은 같은 원격 저장소에 Push 할 때, 반드시 로컬에 있는 이미지 태그명이 원격주소랑 100% 똑같아야 한다.