All about

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"로 변경하여 사용할 수 있다.

공유하기

facebook twitter kakaoTalk kakaostory naver band
loading