github action 을 통해서 pr, merge, push 등의 이벤트가 발생했을 때 특정 동작을 수행할 수 있다. unit test, linting 같은 기능들을 push, pr 같은 이벤트에 사용해서 자동화하는 경우가 많다.
내 경우 개발 상황과 개발 테스트용 서버의 docker image 간에 sync 가 맞지 않는 것을 방지하기 위해 github action 을 통해서 docker image 를 자동으로 build, push 하도록 하였다.
github action 을 추가하는 방법은 두가지가 있는데,
첫번째는 github repo 의 Actions 메뉴에서 New workflow를 클릭하여 docker, aws 등이 제공하는 workflow 스크립트를 가져와 수정하여 사용하는 방법이 있고,
나처럼 .github/workflows 디렉토리를 생성하고 그 밑에 workflow 스크립트를 yml 파일로 작성하여 추가하는 방법이 있다.
(첫번째 방법을 사용해도 .github/workflows 디렉토리는 생긴다.)
전체 스크립트는 아래와 같다.
name: Docker Build Develop
on:
# develop branch에 push event가 발생할 경우 github action이 동작한다.
push:
branches: [ "develop" ]
# develop branch에 push event가 발생할 경우 github action이 동작한다.
pull_request:
branches: [ "develop" ]
env:
# docker hub의 organization 이름
REGISTRY: {Docker hub registry name}
# build and push 할 docker image 이름
IMAGE_NAME: {Docker image name}
# build and push 할 docker image의 tag
TAG: latest
# docker push 명령어를 사용할 경우 login 이 필요합니다. 이를 구분하고 필요시에만 로그인하는 습관을 들이는 것이 보안상 좋다.
IS_PUSH: ${{ github.event_name != 'pull_request' }}
jobs:
build:
# 사용할 github action runner(github에서 제공하는 가상머신이라고 이해하면 될거 같다.)
runs-on: ubuntu-latest
steps:
- name: Checkout submodules
uses: actions/checkout@v3
with:
# 내 경우 submodule repo가 포함되어 있고, 해당 repo가 private이라 github access token이 추가로 필요했다.
submodules: recursive
# 여기서 사용되는 token은 github account settings에서 생성하고 github repo settings에서 설정한다.
token: ${{ secrets.ACTION_TOKEN }}
- name: Login to DockerHub
if: ${{ env.IS_PUSH }}
uses: docker/login-action@v1
with:
# docker hub login을 위해서 계정 정보를 github repo settings에 설정해 두었다.
username: ${{ secrets.DEV_DOCKER_ID }}
password: ${{ secrets.DEV_DOCKER_PW }}
# 여기서 docker에서 제공하는 action이 있지만, 아래처럼 cli 명령어를 사용하는 것이 간편하여 그냥 사용하였다.
- uses: actions/checkout@v3
- name: Build the Docker image
run: docker build . --file Dockerfile --tag ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${{ env.TAG }}
- name: Push the Docker image
run: docker push ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${{ env.TAG }}
Production service를 위한 image 또한 마찬가지로 "branches" 의 branch name만 "master"로 변경하여 사용할 수 있다.