github repository release 반쯤 자동화하기

Hyemi Noh
deprecated-pozalabs
7 min readFeb 27, 2020

안녕하세요. 포자랩스에서 devops를 담당하고 있는 노혜미입니다. 이번 포스팅에서는 특정 브랜치에 merge될 때 PR 제목을 자동으로 쌓아주는 github action release drafter에 대해 다뤄보려고 합니다.

들어가기 전에

product를 관리하는 데 있어 repository의 versioning은 중요한 역할을 합니다. build 혹은 build 후 deploy를 했을 때, version을 보고 이번 version에 어떤 feature가 추가됐는지 어떤 오류가 fix 됐는지를 추적할 수 있습니다. deploy 되지 않고 package로 사용되는 repository 또한 포함됩니다.

포자랩스에서는 backend repository에서 두 개의 engine repository를 package로 사용하고 있습니다. 즉 관리해야할 repository가 3개가 됩니다. 처음에는 PR 제목을 모두 복붙해서 release note를 작성했습니다… master에 merge된 PR이 별로 없을 때는 상관이 없었지만 PR이 많을 때는 작성이 번거로웠습니다. 하지만 번거롭다고 release note를 작성하지 않을 수는 없죠…! (f̵i̵r̵e̵d̵)

그래서 release 자동화를 찾아보던 도중 release drafter를 발견하게 됐습니다. 큰 장점은 github action으로 이미 market에 제공돼있어 별도의 api, app 없이도 사용가능하다는 점이었습니다. 즉 아주 간단하게 사용할 수 있다는 겁니다! 그렇다면 어떻게 이용하지 한 번 알아봅시다 :)

필요한 파일

  • action을 이전에 사용하지 않았다면 일단 repository의 root에 .github directory를 추가해줍니다. 그리고.githubworkflow directory도 추가해줍니다.
  • workflowsrelease-drafter.yml 를 추가해주고 .github 에 release drafter에 대한 config file을 추가해줍니다. config file은 이름을 뭐로 하든 중요하지 않습니다. release-drafter-config.yml 라고 해보겠습니다.
  • 위의 과정을 모두 거치면 아래와 같은 구조를 지니게 됩니다.
repository
⎿ .github
⎿ workflows
release-drafter.yml
release-drafter-config.yml

release-drafter.yml

name: Release Drafteron:
push:
branches:
- master
jobs:
update_release_draft:
runs-on: ubuntu-latest
steps:
- uses: release-drafter/release-drafter@v5
with:
config-name: release-drafter-config.yml
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
  • 위의 예시에서는 master branch에 commit이 push될 때 action이 실행됩니다. master에 곧바로 push 하는 게 아닌 이상 master에 특정 브랜치가merge 됨을 의미할 겁니다.
  • ubuntu os에서 실행되고 release-drafter의 v5를 이용합니다.
  • config-name.github을 기준으로 생각해야합니다. 그래서 위와 같이 작성할 경우 .github/release-drafter-config.yml에 위치해야 합니다. 설정하지 않으면 release-drafter.yml이지만 workflows에 있는 yml과 헷갈리므로 명시적으로 config라고 설정해줍시다 :)
  • GITHUB_TOKEN을 통해 release-drafter에 repository에 쓸 수 있는 권한을 부여합니다. 아마 소스 코드를 보면 이 토큰을 이용할 겁니다.

release-drafter-config.yml

name-template: 'v$NEXT_MINOR_VERSION'
tag-template: 'v$NEXT_MINOR_VERSION'
categories:
- title: '🚀 Features'
label: 'enhancement'
- title: '🐛 Hotfixes'
label: 'bug'
- title: 'ETC'
label: 'documentation'
change-template: '- $TITLE #$NUMBER @$AUTHOR '
template: |
## Uncategorized
$CHANGES
### Bump setup.py version must be included here!
  • release-drafter의 공식 documentation을 참고했을 때 많이 사용할 만한 설정들을 나열해봤습니다.
  • name-templatetag-templatemajor.minor.patch 중 어떤 version을 올릴지 선택할 수 있습니다. 문서에서는 patch version을 올리는 게 가장 흔하다고 했지만 포자랩스의 release 양상을 보면 minor 즉 feature 추가로 인해 version을 올리는 게 흔해 v$NEXT_MINOR_VERSION 을 선택했습니다.
  • categories 는 github에서 pull request를 열 때 우측에서 설정하는 Labels 를 어떤 것으로 설정하냐에 따라 각 label 에 맞는 title 로 PR을 분류해줍니다. (labels 로 여러 개의 label을 설정할 수도 있는데 공식 다큐멘테이션을 참고 했을 때는 and 조건이 아니라 or 조건인 것 같습니다.)
  • change-template 은 PR의 내용이 release note에 적힐 때 어떤 format으로 적힐 지를 정합니다.
  • template 은 release note의 전체적인 format을 정의합니다. categories 에 의해 분류되지 않은 PR은 $CHANGES 의 제일 위에 위치하게 됩니다. 따라서 위쪽에 ## Uncategorized 를 적어주었습니다. 그리고 패키지처럼 사용하는 repository의 경우, setup.py 의 version을 올려줘야 다른 repository에서 어떤 version이 사용됐는지 파악할 수 있으므로 setup.py 의 version을 bump한 것이 위치해야 된다는 문구도 추가해줬습니다.

주의할 점

결과

  • PR이 master에 merge될 때마다 위에서 설정한 대로 차곡차곡 쌓이게 됩니다.
  • Edit 을 눌러 Publish release만 해준다면…바로 release를 할 수 있습니다 😌

결론

  • PR 제목을 ctrl c + ctrl v 해서 release note를 작성하던 번거로움을 해결하게 됐습니다!
  • 대신 그 만큼 PR title을 더 가독성있게 작성하는 게 중요해지는 것 같습니다.
  • release-drafter를 통해 contributor 혹은 maintainer의 삶의 만족도를 올려보시길 추천드립니다 :)

--

--