이번에는 AWS의 ECR에 도커파일을 이용하여 이미지파일을 배포해보는 작업을 해보았다.
작업 시작 전, 작성된 dockerfile과 aws ecr을 필요로한다.
깃허브 레포지토리에 시크릿 변수를 등록을 먼저 해주어야한다.
Setting -> Secrets -> Actions Secrets -> New repository secret
순으로 들어가서 시크릿키를 등록해주자.
AWS_ACCESS_KEY_ID // AWS 사용자 Access key
AWS_SECRET_ACCESS_KEY // AWS 사용자 Secret Access key
ECR_REPOSITORY_NAME // ECR Repository 이름
이제 깃허브 액션 준비는 끝났다.
.github/workflows/deploy.yml
파일을 생성해준다.
깃허브액션 코드를 작성해준다.
이전에 CI / CD 관련 블로그를 작성한 적이 있다.
해당 블로그를 참고하여 yml파일을 작성해준다.
name: ECR Development Deployment
on:
push:
branches:
- main
jobs:
deploy:
name: Deploy
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@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: ap-northeast-2
- name: Login to Amazon ECR
id: login-ecr
uses: aws-actions/amazon-ecr-login@v1
- name: Build, tag, and push image to Amazon ECR
id: build-image
env:
ECR_REGISTRY: ${{ steps.login-ecr.outputs.registry }}
ECR_REPOSITORY: ${{ secrets.ECR_REPOSITORY_NAME }}
IMAGE_TAG: ${{ github.sha }}
run: |
docker build -t $ECR_REGISTRY/$ECR_REPOSITORY:${IMAGE_TAG} .
docker push $ECR_REGISTRY/$ECR_REPOSITORY:${IMAGE_TAG}
위와 같이 작성해주었다.
깃허브 액션에서 환경변수는 secrets를 이용하여 접근할 수 있다.
github.sha가 무엇일까 ?
IMAGE_TAG로 gitgub.sha를 작성해주었는데, 이 부분은 깃허브 커밋 해쉬를 말한다.
main에 push 되면서, ECR REPOSITORY에 커밋 해시의 이름을 가진 이미지 파일이 생긴 것을 확인할 수 있었다.
해당 yml파일로 변경하면서, push에 트리거 되는 액션으로 작성하여 코드리뷰를 받았다.
.env 내용 수정만으로 실제 commit과는 별개로 수정할 수 있는 상황에서 무조건 push 액션을 해주어야만 했고, workflow_dispatch를 이용하여 분기를 트리거로 걸어주는 방법에 대해 알아보았다.
워크플로 트리거 이벤트
https://docs.github.com/ko/actions/using-workflows/events-that-trigger-workflows
공식문서에 따르면
on: workflow_dispatch
위 코드를 통해 워크플로를 수동으로 트리거할 수 있다.
해당 코드를 추가하면 깃허브 액션에 버튼이 추가되는 것을 확인할 수 있다.
해당 버튼은 workflow_dispatch를 추가하지 않으면 뜨지 않는다.
공식문서에 들어가면, workflow_dispatch 에 사용할 수 있는 추가 작업들이 있어 참고하는 것도 좋은 것 같다.
input의 who를 통해 누가 수동으로 트리거했는지 추가해보았다.
최종 yml파일은 다음과 같다.
name: ECR Development Deployment
on:
workflow_dispatch:
branches: [main]
inputs:
name:
description: 'Who'
required: true
push:
branches:
- main
env:
NEXT_PUBLIC_API_SERVER: ${{ secrets.NEXT_PUBLIC_API_SERVER }}
jobs:
deploy:
name: Deploy
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v2
- name: Create env file
run: |
touch .env
echo "NEXT_PUBLIC_API_SERVER=$NEXT_PUBLIC_API_SERVER">> .env
- 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: ap-northeast-2
- name: Login to Amazon ECR
id: login-ecr
uses: aws-actions/amazon-ecr-login@v1
- name: Build, tag, and push image to Amazon ECR
id: build-image
env:
ECR_REGISTRY: ${{ steps.login-ecr.outputs.registry }}
ECR_REPOSITORY: ${{ secrets.ECR_REPOSITORY_NAME }}
run: |
docker build -t $ECR_REGISTRY/$ECR_REPOSITORY:prod .
docker push $ECR_REGISTRY/$ECR_REPOSITORY:prod
참고문서