Spring Boot Application Image ECR에 push(CI)

@Wonyu· December 07, 2024 · 2 min read

이전 기록에서 Spring Boot Application을 Dockerfile을 활용해 docker iamge로 빌드했다.

이제 소스 코드가 push되면 해당 소스 코드를 image로 빌드하고, ECR에 push하는 과정을 github Actions 스크립트를 통해 자동화해보자.

image build & ECR push 자동화

ECR repository 생성

먼저 AWS 콘솔에 들어가 ECR Repository를 생성한다.

생성한 repository 정보 github secret에 등록

생성한 Repository에 Github Actions가 image를 push하기 위해선 해당 Repository의 정보를 알고 있어야 한다. 하지만 외부에 repository에 대한 정보가 공개되면 안되기 때문에 github secrets에 등록해보자.

Github Repository의 "Settings">"Secrets and variables">"Actions"에서 repository secrets를 등록해주면, 외부에 ECR repository 정보를 공개하지 않으면서 Github Actions가 그 값들을 사용할 수 있다.

ECR push 권한 부여

ECR에 image를 push하기 위해선 Github Actions에게 그에 대한 권한을 부여해야 한다. 따라서 AWS 콘솔에서 IAM에 들어가 사용자를 생성하고, 해당 사용자의 ACCESSID와 ACCESSKEY도 github repository secrets에 등록해주자.

Github Actions 스크립트 생성

name: CI/CD  
  
on:  
  push:  
    branches:  
      - master  
  
env:  
  ECR_REGISTRY: ${{ secrets.AWS_ECR_REGISTRY }}  
  ECR_REPOSITORY: ${{ secrets.AWS_PROD_ECR_REPOSITORY }}  
jobs:  
  build-and-push:  
    runs-on: ubuntu-latest  
  
    steps:  
      - name: Checkout repository  
        uses: actions/checkout@v3  
  
      - name: Configure AWS CLI  
        uses: aws-actions/configure-aws-credentials@v2  
        with:  
          aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}  
          aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}  
          aws-region: ap-northeast-2  
  
      - name: Log in to Amazon ECR  
        id: login-ecr  
        uses: aws-actions/amazon-ecr-login@v1  
  
      - name: Build and Push Docker Image  
        env:  
          IMAGE_TAG: ${{ github.sha }}-${{ github.run_number }}  
        run: |  
          docker build -t $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG .  
          docker push $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG

위 스크립트는 등록된 repository secrets를 이용해 image를 ECRd에 push하는 스크립트다. 위 과정을 도식화하면, 다음과 같다. ecr architecture 이제 소스코드를 master branch에 push하면, 생성된 ECR repository에 이미지가 정상적으로 push 되는 것을 확인할 수 있다.

@Wonyu
Hello :) I'm Wonyu