Github Actions로 배포 자동화 및 특정 브랜치에 자동 병합하기

2022. 4. 1

저번 글에서는 기능 개발시 자동으로 Canary 배포가 되는 workflow를 개발해보았었다.

이번에는 본격적으로 실제로 사용될 버전을 배포하기 위해 또 Github Actions를 활용하여 개발하기로 하였다.

기본적으로 Git Flow 전략을 따라가기 때문에 여기서 꼭 필요한 부분들에 대해 자동화를 진행하였으며 순서는 release -> main -> develop 순으로 배포 이후 develop 브랜치가 최신화가 되는 형태를 띄고있다.

위 순서에 대한 배포 자동화를 개발하며 알아낸 개념들과 추가적으로 함께 진행되면 좋았던 workflow를 개발한 경험을 공유하려 한다.

Github Actions

github actions는 github에서 제공하는 workflow 자동화 도구다.

예로부터 CI/CD를 운용하기 위해서는 다른 저장소를 활용하여 서버를 구축하거나, 기타 툴을 이용하여 진행했는데 github에서는 이런 부분들을 자동화 할 수 있도록 자체 서비스로 제공해주고 있다.

기본적으로 yaml 확장자를 사용하여 구성하며 workflow를 구성하는 문법들이 존재한다.

한 번 어떤 문법들을 활용하여 만들었는지 살펴보자

./github/workflow/cd.yaml

name: CD # Workflow 이름

on: # 필수로 들어가야하며 특정 이벤트를 명시한다. (push, pull_request 등)
  push: # push 이벤트를 수행한다.
    branches: # 특정 브랜치를 대상으로 수행한다. 여러 브랜치들을 명시할 수 있다.
      - 'main'

env: # 사용될 환경변수들을 정의한다.
  NODE_VERSION: '16.x'
  NPM_REGISTRY_URL: 'https://registry.npmjs.org'
  NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}

jobs: # 필수로 하나 이상의 job을 가지고 있어야 하며 병렬적으로 처리된다.
  deploy: # job id로서 job에 대한 주제
    runs-on: ubuntu-latest # 필수이며, ubuntu 최신 환경에서 실행한다.

    steps: # job에 해당되는 과정을 명시한다.
      - uses: actions/checkout@v2 # 지정된 action을 수행한다.

      - name: Use Node.js ${{ env.NODE_VERSION }} # Github에 명시되는 이름
        uses: actions/setup-node@v2
        with:
          node-version: ${{ env.NODE_VERSION }}
          registry-url: ${{ env.NPM_REGISTRY_URL }}

      - run: npm ci # 커맨드라인 명령어를 실행한다.

      - name: release deploy
        run: npm run deploy:all

말은 뻔지르르하게 했지만 실상 많은 양의 코드는 아니다.

현재 Git Flow 전략을 사용 중이기 때문에 release 브랜치에서 main 브랜치로 push시 최종적으로 전체의 패키지들이 배포가 되도록 처리했다.

이걸 실행하면 아래와 같이 main 브랜치로 push 했을 때 이벤트가 발생하여 workflow가 실행된다.

github deploy

여기서 끝낼 수도 있었지만 Git Flow 특성상 배포된 버전의 코드들을 다음 개발을 진행할 develop 브랜치에 최신화 하여 작업을 이어가야한다. 기존에는 수동으로 했었는데 안그래도 불편함을 느끼고 있어서 이번 기회에 싸그리 자동화를 해봐야겠다는 의지가 불타올랐다. 🔥

그래서 여러 방법들을 찾아보다가 devmasx 아저씨의 merge-branch 라는 action이 눈에 들어왔다.

merge-branch action은 특정 브랜치를 타겟을 두어 그 브랜치에 auto merge 시켜주는 action이다.

어떻게 사용하는지 한 번 살펴보자!

./github/workflow/auto-merge.yaml

name: auto-merge

on:
  workflow_run: # workflow 실행 이벤트
    workflows: [CD] # 특정 workflow name 명시
    types: # completed, requested
      - completed

env:
  NODE_VERSION: '16.x'

jobs:
  sync-branch:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@master

      - name: auto merge to develop
        uses: devmasx/merge-branch@master
        with:
          type: now
          from_branch: main # 최신화된 브랜치
          target_branch: develop # 최신화할 브랜치
          github_token: ${{ secrets.GITHUB_TOKEN }}

cd.yaml 와 크게 다른 것은 on 이벤트가 다르다.

main 브랜치에 push가 되어 최종 배포가 된 이후 최신화된 코드를 develop에 최신화 해주어야 하기 때문에 workflow_run 이벤트를 사용했다.

release 브랜치에서 main 브랜치에 push 이후 CD workflow가 정상적으로 완료되면 그 이후 auto merge workflow가 작동되기 때문에 순서가 보장되게 된다.

작동한 화면을 보면 아래와 같다.

github develop branch merged

비록 간단하지만 이렇게 두 가지의 workflow를 만들어 보면서 github workflow의 문법에 대해 알게 되었다.

물론 여기서 더 보완할 점들이 많지만 차차 하나씩 고도화 해보면서 더욱 안정적인 자동화를 구축할 수 있도록 노력해야겠다. 💪