저번에 만든 Dockerfile 을 사용하여 github actions를 사용해 ci/cd 파이프라인을 구성해보자.
전체 yml 파일
name: Docker Build & Push to Amazon ECR
on:
push:
branches: [ "develop" ]
env:
AWS_REGION: ap-northeast-2
ECR_REPOSITORY: yuppie-ecs-back-dev
jobs:
deploy:
name: Deploy
runs-on: ubuntu-latest
environment: production
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Configure AWS credentials
uses: aws-actions/configure-aws-credentials@v4
with:
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
aws-region: ${{ env.AWS_REGION }}
- name: Login to Amazon ECR
id: login-ecr
uses: aws-actions/amazon-ecr-login@v2
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Build and push
uses: docker/build-push-action@v5
env:
ECR_REGISTRY: ${{ steps.login-ecr.outputs.registry }}
IMAGE_TAG: ${{ github.sha }}
with:
context: .
platforms: linux/amd64
push: true
tags: ${{ env.ECR_REGISTRY }}/${{ env.ECR_REPOSITORY }}:${{ env.IMAGE_TAG }}
cache-from: type=gha
cache-to: type=gha,mode=max
각 라인이 무슨 역할을 하는지 알아보자.
on:
push:
branches: [ "develop" ]
env:
AWS_REGION: ap-northeast-2
ECR_REPOSITORY: yuppie-ecs-back-dev
develop 브랜치에 push 이벤트가 감지되면 해당 yml 파일로 github actions 가 동작한다.
github actions 에서 사용할 변수들을 env를 이용하여 미리 설정해둔다.
jobs:
deploy:
name: Deploy
runs-on: ubuntu-latest
environment: production
steps:
- name: Checkout
uses: actions/checkout@v4
deploy job 을 정의한다.
ubuntu-latest 환경에서 실행되며, actions/checkout 을 통해 repository 파일들을 가져온다.
- name: Configure AWS credentials
uses: aws-actions/configure-aws-credentials@v4
with:
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
aws-region: ${{ env.AWS_REGION }}
ECR 에 도커 이미지를 push 하기 위해서 먼저 AWS 로그인이 필요하다. 로그인에 사용할 값들을 미리 넣어 설정해준다.
- name: Login to Amazon ECR
id: login-ecr
uses: aws-actions/amazon-ecr-login@v2
앞에서 설정한 값들을 통해 ECR 서비스에 접근할 수 있도록 로그인을 진행한다.
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
Docker 에서 제공하는 CLI 플러그인이다.
다양한 기능을 제공하는데, 여기에서는 도커 레이어 캐시를 위해 사용한다.
도커 캐시는 로컬에서는 정상적으로 동작하지만 github actions 는 매번 새로운 가상환경에서 실행되어 도커 캐시가 동작하지 않기 때문에 별도의 플러그인이 필요했다.
- name: Build and push
uses: docker/build-push-action@v5
env:
ECR_REGISTRY: ${{ steps.login-ecr.outputs.registry }}
IMAGE_TAG: ${{ github.sha }}
with:
context: .
platforms: linux/amd64
push: true
tags: ${{ env.ECR_REGISTRY }}/${{ env.ECR_REPOSITORY }}:${{ env.IMAGE_TAG }}
cache-from: type=gha
cache-to: type=gha,mode=max
docker build 와 push 를 수행한다.
env
ECR_REGISTRY: 이전 단계에서 ecr login 수행 후 ecr registry 를 output 으로 얻는데, 이를 이미지 이름에 사용하기 때문에 가져온다.
IMAGE_TAG: docker/build-push-action@v2 사용시 별도의 태그가 필요하여 워크플로우 내에서 사용할 변수를 지정한다.
with
context: docker build에 사용할 파일 경로 (. 은 현재 폴더 전부를 의미)
platforms: image 가 실행될 환경에 맞추어 빌드되도록 설정
push: 빌드 후 push 할지 말지 설정
tags: docker image 이름
cache-from: 어떤 캐시를 가져와 사용할 것인지 (gha 는 Github actions 의 약자)
cache-to: 어디에 캐시를 저장할 것인지 (mode max 는 docker 내부적으로 github actions 환경에서 min caching 을 사용하는데 최대한 캐싱할 수 있도록 max 로 설정)
In
min
cache mode (the default), only layers that are exported into the resulting image are cached, while inmax
cache mode, all layers are cached, even those of intermediate steps. (https://docs.docker.com/build/cache/backends/#cache-mode)
빌드해보자.
캐시를 적용했지만 처음 실행이므로 캐시가 존재하지 않아 일단 모두 실행한다.
정상적으로 캐시가 작동한다.
참고.
https://fe-developers.kakaoent.com/2022/220414-docker-cache/