본문 바로가기

AWS

[CI/CD] Github Dev Repo + Github Action + ECR tag + Dockerrun.aws.json 자동 할당 설정

이번 시간에는 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/using-workflows/workflow-commands-for-github-actions#setting-an-environment-variable

https://docs.github.com/en/actions/learn-github-actions/environment-variables

 

3) tag 자동화 in docker hub

https://www.wake-up-neo.com/ko/docker/docker-hub-%EC%9E%90%EB%8F%99-%EB%B9%8C%EB%93%9C%ED%83%9C%EA%B9%85/1047996486/

 

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

https://www.gnu.org/software/sed/manual/sed.html