이번 시간에는 Github action으로 ECR에 push할 때, unique한 tag를 자동으로 설정하는 방법에 대해 알아보겠다.
1. AWS ECR 공식 문서
- tags are not automatically assigned to your resources
- 태그는 자동 할당이 안 되고 직접 입력해야 된다고 나와있다.
2. Github Action + ECR 공식문서 tag 추천 방법
1) github.sha
- 워크플로우를 트리거한 git commit의 해쉬값
- 즉, 이 값으로 접근하면 항상 git head 값이 접근을 한다.
3. deploy.yaml
jobs:
build_deploy:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v3
- name: Set up JDK 8
uses: actions/setup-java@v3
with:
java-version: '8'
distribution: 'temurin'
cache: gradle
- name: Validate Gradle wrapper
uses: gradle/wrapper-validation-action@e6e38bacfdf1a337459f332974bb2327a31aaf4b
- name: Build with Gradle
uses: gradle/gradle-build-action@67421db6bd0bf253fb4bd25b31ebb98943c375e1
with:
arguments: bootjar
- name: Set up QEMU #Dockerfile에서 arm64v8 이미지를 사용하기 때문에 설정
uses: docker/setup-qemu-action@v2
- name: Configure AWS credentials
uses: aws-actions/configure-aws-credentials@v1
with:
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
aws-region: ${{ secrets.AWS_EB_REGION }}
- name: Login to Amazon ECR
id: login-ecr
uses: aws-actions/amazon-ecr-login@v1
# 추가 된 내용!!
- name: Set Environment Variable
run: |
echo "REPOSITORY_NAME=$(echo '${{ github.repository }}' | awk -F '/' '{print $2}')" >> $GITHUB_ENV
echo "IMAGE_TAG=$(git rev-parse --short HEAD)" >> $GITHUB_ENV
shell: bash
- name: Build, tag, and push image to Amazon ECR
id: build-image
env:
ECR_REGISTRY: ${{ steps.login-ecr.outputs.registry }}
#EC2 인스턴스 타입이 ARM이기 때문에 --platform=linux/arm64v8 사용
run: |
docker buildx build --platform=linux/arm64v8 -t $ECR_REGISTRY/${{ env.REPOSITORY_NAME }}:${{ env.IMAGE_TAG }} .
docker push $ECR_REGISTRY/${{ env.REPOSITORY_NAME }}:${{ env.IMAGE_TAG }}
echo "::set-output name=image::$ECR_REGISTRY/${{ env.REPOSITORY_NAME }}:${{ env.IMAGE_TAG }}"
- name: Get current time
uses: 1466587594/get-current-time@v2
id: current-time
with:
format: YYYY-MM-DDTHH-mm-ss
utcOffset: "+09:00"
# 추가 된 내용!!
- name: Generate deployment package
run: |
mkdir -p deploy
cp -r .ebextensions deploy/.ebextensions
cp -r .platform deploy/.platform
cp Dockerrun.aws.json deploy/Dockerrun.aws.json
sed -i "s/{ECR_REGISTRY}/${{ steps.login-ecr.outputs.registry }}/" deploy/Dockerrun.aws.json
sed -i "s/{REPOSITORY_NAME}/${{ env.REPOSITORY_NAME }}/" deploy/Dockerrun.aws.json
sed -i "s/{TAG}/${{ env.IMAGE_TAG }}/" deploy/Dockerrun.aws.json
cd deploy && zip -r deploy.zip .
4. GITHUB_ENV 에 git head 해쉬값을 이미지 태그로 할당
- name: Set Environment Variable
run: |
echo "REPOSITORY_NAME=$(echo '${{ github.repository }}' | awk -F '/' '{print $2}')" >> $GITHUB_ENV
echo "IMAGE_TAG=$(git rev-parse --short HEAD)" >> $GITHUB_ENV
shell: bash
- ecr repo를 git repo 이름과 동일하게 만든다. 그래서 REPOSITORY_NAME을 두 군데서 사용할 수 있도록 설계
- 이미지 태그(IMAGE_TAG)에 git head 해쉬값을 할당한 후 GITHUB_ENV 에 적용
5. repo와 tag를 Dockerrun.aws.json에 할당
sed -i "s/{ECR_REGISTRY}/${{ steps.login-ecr.outputs.registry }}/" deploy/Dockerrun.aws.json
sed -i "s/{REPOSITORY_NAME}/${{ env.REPOSITORY_NAME }}/" deploy/Dockerrun.aws.json
sed -i "s/{TAG}/${{ env.IMAGE_TAG }}/" deploy/Dockerrun.aws.json
- sed는 문자열을 replace해주는 명령어
- Use -i to edit files in-place instead of printing to standard output(공식 문서)
- -i 옵션은 해당하는 변수를 그 자리에서 replace를 해줌
6. Dockerrun.aws.json
{
"AWSEBDockerrunVersion": "1",
"Image": {
"Name": "{ECR_REGISTRY}/{REPOSITORY_NAME}:{TAG}",
"Update": "true"
},
"Ports": [
{
"ContainerPort": 5000,
"HostPort": 5000
}
]
}
7. 결론
이렇게 설정을 해주면 ECR 이미지 태그에 git head 해쉬값이 들어간다.
references
1) aws ecr reference
https://docs.aws.amazon.com/AmazonECR/latest/userguide/ecr-using-tags.html
https://docs.aws.amazon.com/ko_kr/AmazonECR/latest/userguide/ecr-using-tags.html
2) set env variable in github action
https://docs.github.com/en/actions/learn-github-actions/environment-variables
3) tag 자동화 in docker hub
4) github action + ecr
https://github.com/aws-actions/amazon-ecr-login
https://monadical.com/posts/set-up-ci-workflow.html
5) git hash 값 짧게 쓰기
https://stackoverflow.com/questions/59810838/how-to-get-the-short-sha-for-the-github-workflow
6) Dockerrun.aws.json 파일 세팅
https://gist.github.com/sebnyberg/c699674a5e037db2a95c4b4b414c4dc1
7) sed reference