Github Action으로 협업하기

Github Action

Featured image

@

혼자 개발할 땐, 크게 신경쓰지 않지만 협업을 하다 보면 이런 거 있었으면 좋겠다 ~ 를 해결하기 위한 자동화 툴인 Github Action에 대해 이야기해본다.

  1. PR이 오면 Slack으로 메시지가 왔으면 좋겠어.
  2. master나 main으로 PR이 머지가 된다면 자동으로 Release와 Tag를 만들고 성공하면 Slack으로 메시지가 오면 좋겠어.

사소한 것이지만 내가 하려고 하면 굉장히 귀찮은 일들이다. 그래서 Github Action으로 자동화해볼 것이다.

Github Action

깃헙 사이트에서 프로젝트 저장소 상단에 Actions에 위치해 있다. 처음한다면 나와있는 설명대로 진행하다보면 저장소안에 .github/workflows 파일이 생성될 것이다. 파일을 열어보고 아래의 소스를 넣어보자.

  1. PR이 오면 Slack으로 메시지가 왔으면 좋겠어.
name: Slack Notification

on: [ pull_request_target ]

jobs:
  build:
    if: "!contains(github.event.pull_request.title, 'skip ci')"
    runs-on: ubuntu-latest
    steps:
    - name: Notify slack pr open
      env:
        SLACK_WEBHOOK_URL : $
        PULL_REQUEST_NUMBER : $
        PULL_REQUEST_TITLE : $
        PULL_REQUEST_AUTHOR_NAME : $
        PULL_REQUEST_AUTHOR_ICON_URL : $
        PULL_REQUEST_URL : $
        PULL_REQUEST_BODY : $
        PULL_REQUEST_COMPARE_BRANCH_NAME : $
        PULL_REQUEST_BASE_BRANCH_NAME : $
        IS_SEND_HERE_MENTION : true
      uses: jun3453/slack-pr-open-notification-action@v1.0.2

무언가 어려워 보이지만 차근차근 읽어보면 복잡하지 않다. on: 은 yml이 실행되는 조건이다. 여러 조건이 있지만 우리는 PR이 왔을 때를 체크해야 하므로 pull_request_target으로 지정하면 된다. 검색하다보면 pull_request도 있는 데, 둘은 차이가 존재한다. 우리 팀에서 협업하는 방식은 master 저장소가 존재하고 개발자들은 master 저장소를 fork따서 PR을 전달하는 방식으로 개발한다. 그래서 외부 Fork가 된 저장소에서 master 저장소로 PR을 전달 시, pull_request의 트리거가 작동하지 않는다. pull_request_target을 추적하면 트리거가 작동한다.

jobs는 어떤 작업을 할 것인가 인데, Notify slack pr open을 한다는 이야기이다. env는 설정이고, uses는 Action의 저장소 주소이다. 끝! 간단하다.

하지만 그냥 실행하면 작동하지 않는다… 몇가지가 빠졌다.

  1. secrets.SLACK_WEBHOOK 가 없다. 이건 슬랙에서 어떤 채널로 메시지를 전달할지에 대한 정보이다. 구글링하면 바로 나온다. 그리고 저장소에서 Settings에 secrets로 가서 변수를 SLACK_WEBHOOK이라는 이름으로 만들어주고 저장하면 된다.
  2. if: “!contains(github.event.pull_request.title, ‘skip ci’)”은 무엇인가?, 구문을 읽어보면 pull_request_title에 ‘skip ci’가 있는지 없는지 체크한다는 말이다. 따라서 Notification을 전달하기 싫으면 PR명에 skip ci를 작성해주면 전달되지 않는다.

  3. master나 main으로 PR이 머지가 된다면 자동으로 Release와 Tag를 만들고 성공하면 Slack으로 메시지가 오면 좋겠어.
name: Create release

on:
  push:
    branches: [master]

jobs:
  build:
    if: "!contains(github.event.head_commit.message, 'skip ci')"
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v2
        with:
          fetch-depth: 0

      - name: Fetch all tags
        run: git fetch --depth=1 origin +refs/tags/*:refs/tags/*

      - name: Bump version
        run: |
          git config --global user.name ${이름을 넣어주세요}
          git config --global user.email ${이메일 주소를 넣어주세요}
          npx standard-version
          echo "RELEASE_VERSION=$(git describe --abbrev=0 | tr -d '\n')" >> $GITHUB_ENV

      - name: Push changes
        uses: ad-m/github-push-action@master
        with:
          github_token: $
          branch: $

      - name: Create Release
        id: create_release
        uses: actions/create-release@v1
        env:
          GITHUB_TOKEN: $
        with:
          tag_name: $
          release_name: $
          body: $
          draft: false
          prerelease: false

      - name: Slack notification
        env:
          SLACK_WEBHOOK: $
          SLACK_USERNAME: ReleaseBot
        uses: Ilshidur/action-slack@2.0.2
        with:
          args: "[$] $"

위와 크게 다르지 않다. 전체적인 로직은 같고 안에 어떤 일들을 할지만 정하면 되는 거라서 어렵지 않다. 위에서 SLACK_WEBHOOK을 잘 지정했다면 별 문제없이 작동할 것이다.

master로 push되어 변경이 되었다면 현재 태그의 값을 보고 다음 태그를 만들어서 릴리즈한다. 릴리즈 내용은 PR의 타이틀과 같다. 이 정도로 정리가 될 것 같다.

이렇게 2개의 파일으로 팀원들과 협업을 진행한다. 다소 귀찮은 작업을 자동으로 해주니 행복하다 ^^