production
브랜치에 PR 및 merge가 트리거가 되어 AWS CodeDeploy가 작동되는 구조다.
빈스톡에 배포되는 과정 중간에 CodeBuild 스테이지를 추가했다.
아래와 같이 소스코드 최상단에 buildspec.yml파일을 생성했다.
우선 사전에 아래의 항목이 필요하다.
AmazonEC2ContainerRegistryFullAccess
를 attach해야 한다.# buildspec.yml
version: 0.2
env:
variables:
REPO: "계정번호.dkr.ecr.ap-northeast-2.amazonaws.com/레포지토리 이름"
phases:
pre_build:
commands:
- echo docker image build test!
- echo $CODEBUILD_SOURCE_VERSION
- TAG=$(echo $CODEBUILD_RESOLVED_SOURCE_VERSION | head -c 8)
- echo Logging in to Amazon ECR...
- $(aws ecr get-login --no-include-email --region ap-northeast-2)
build:
commands:
- echo Build start
- echo Building the Docker image...
- echo $TAG
- echo $REPO
- docker build --tag $REPO:$TAG --tag $REPO:latest .
post_build:
commands:
- echo Build completed
- docker push $REPO:$TAG
- docker push $REPO:latest
모든 이미지의 태그명을 latest
로 되는 경우, untagged 되는 문제가 발생한다.(dangling)
따라서, 이미지 빌드 시 커밋의 SHA와 latest 라는 두 개의 이중 태그로 지정하여 ECR에 푸시한다.
아래와 같이 latest 태그가 최신화 되는 것을 볼 수 있다.
물론, 레포지토리 설정이 아래와 같이 돼 있어야 한다.
ECS Fargate 혹은 Beanstalk등 어떤 서비스를 사용하든, ECR에서 항상 latest
태그가 부착된 이미지를 사용하면 된다. 또한, 이전 이미지들 역시 커밋 SHA 기반으로 태그됐기에 추적과 관리에 용이하다.
https://stackoverflow.com/questions/52760651/git-sha-in-codebuild
https://stackoverflow.com/questions/31963525/is-it-possible-for-image-to-have-multiple-tags
https://stackoverflow.com/questions/38587325/aws-ecr-getauthorizationtoken