Search

Release note를 템플릿으로 만들고 Release drafter 생성 자동화 시키기

 들어가며

두 번째 릴리즈 프로젝트였던 애니또: Aenitto에서 어쩌다가 릴리즈 노트를 작성하게 되었습니다. 항상 Github에서 자동으로 만들어주었던 릴리즈 노트 템플릿만 사용했던터라 이번에는 릴리즈 노트를 제대로 써보고 싶다는 생각에 개발자의 시점에서 이번 릴리즈에 새로 추가된 기능이 뭔지 + PR들을 카테고리별로 나눠서 작성해보자 이 두 가지 측면을 고려하면서 릴리즈 노트를 직접 작성했습니다.
문제 발생
직접 작성을 하다보니 릴리즈 노트를 쓰는데에도 시간이 많이 걸렸습니다. 그리고 일일이 카테고리를 분류하다보니 제목에 의존해서 카테고리를 분류하고 도저히 모르겠는 PR은 들어가서 내용도 확인해보고 하는 시간이 걸리더라구요. 더는 안되겠다 싶어서 템플릿을 찾아봤습니다.

 Automatically generated release notes

Github는 .github폴더에 Pull request, Issue 템플릿을 생성할 수 있습니다. 그렇다면 Release Note는 템플릿이 없는걸까요?
Github Docs를 찾아보니 release note 내용을 자동으로 생성해주는 방법이 있었습니다. Pull Request, Issue 템플릿과 동일하게 .github폴더 하위에 파일을 생성하는 방식이었습니다.
Github Docs에 써있는 과정에 맞춰서 release.yml 를 작성해보았습니다.
1.
프로젝트 / .github 폴더 하위 파일로 release.yml를 만들어줍니다.
2.
release.yml 파일의 내용을 작성해줍니다.
# .github/release.yml changelog: exclude: labels: - Main authors: - octocat categories: - title: 🆕 새로운 기능이 추가되었어요! labels: - ✨ Feature - title: 🐞 자잘한 버그를 수정했습니다. labels: - 🐞 Bugfix - title: 🫶🏻 앱 사용성 개선에 힘썼습니다. labels: - 🫶🏻 Improvement - title: 🛠️ 더 나은 코드를 위해 노력하고 있습니다. labels: - 🔨 Refactor - ⚙️ Setting - title: Others labels: - "*"
YAML
복사
각각의 Configuration options를 설명해보자면:
changelog.exclude.labels, changelog.exclude.authors
이름 그대로 change log를 적을 시에 제외할 label과 author를 설정하는 부분입니다. 저는 Main이라는 label, octocat이라는 author를 exclude 시키고 싶어서 exclude Parameter에 해당 값을 추가해두었습니다.
changelog.categories.title
change log에 적힐 카테고리의 Title 입니다. 위의 release note를 예시로 들면 해당 노트에서 헤더 형식으로 적히는 부분이라고 보시면 됩니다.
changelog.categories.labels
change log의 각 카테고리에 속하게 될 label 입니다. 각 카테고리마다 내용으로 넣을 PR들을 해당 labels가 붙은 PR들로 구성하게 됩니다. labels에 적힌 label를 모두 포함한 PR이 아니라 각각을 가지고 있는 PR이라면 해당 카테고리 밑으로 적힌다고 보시면 됩니다.
labels 에 적힌 *은 모든 Pull Request 라고 보시면 되는데, 위의 카테고리에 포함되지 않는 모든 Pull Request 입니다.
제가 적은 Option 말고도 여러 가지가 존재합니다.
이제 release note의 템플릿으로 쓸만한 파일을 완성했습니다. 하지만, 아직 귀찮은 점이 한 두가지가 아닙니다. 우리는 main 브랜치에 머지를 진행하고 나서 release 버튼을 누르고 draft a new release 버튼까지 직접 눌러줘야 합니다.
저는 main 브랜치로 머지를 진행했을 때 알아서 new release가 생성되길 원합니다.

 Release Drafter

자동으로 release 노트를 published 직전까지 만들어주는 Release Drafter를 발견했습니다. Release Drafter를 사용해서 제가 원하는 기능을 구현한 미디엄을 찾게 되어서 쉽게 기능을 구현했습니다.
Release Drafter는 Github Marketplace에 올라가 있는 Actions App입니다. 사용 방법은 페이지 내부에 상세하게 설명이 되어 있어서 구현하는데에는 어려움이 없을 겁니다.
저도 Release Drafter Usage를 따라서 release note draft 자동화를 구현해보았습니다.
1.
release-drafter.yml 파일을 프로젝트 > .github > workflows 폴더 내부에 생성합니다.
2.
release-drafter.yml 에 내용을 채웁니다.
저는 Release Drafter에 써있는 example를 토대로 필요한 부분만 사용했습니다.
name: Release Drafter on: push: branches: - main permissions: contents: read jobs: update_release_draft: permissions: contents: write runs-on: ubuntu-latest steps: - uses: release-drafter/release-drafter@v5 with: config-name: release.yml env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
YAML
복사
코드를 설명해보자면:
on.push.branches
push가 발생했을 때 action이 돌아갈 branch를 적는 곳입니다. 즉, 해당 브랜치에 commit이 들어오거나 머지가 발생하면 action이 돌아갈겁니다. 저는 main 브랜치에 머지를 했을 때 release drafter가 생성되길 원하기 때문에 branches에 main를 적어뒀습니다.
jobs.update_release_draft.permissions.contents
github release를 생성하기 위해서 write permission이 필요합니다.
jobs.update_release_draft.steps.with.config-name
특정한 Config name를 사용할 경우에 config-name에 넣어줍니다. 해당 옵션은 Optional 합니다. config-name에 값이 없을 경우에는 config-name를 release-drafter.yml로 생각합니다. 만약 release-drafter.yml로 파일 이름을 설정하지 않았다면 이 부분에 해당 파일 이름을 넣어주시면 됩니다.
.github 폴더를 기준으로 생각해주시면 됩니다. 저는 .github / release.yml 이기 때문에 release.yml 로 config-name를 적었습니다.
3.
release.yml 파일을 프로젝트 > .github 폴더 내부에 생성합니다.
저는 아까 release.yml를 생성하면서 이미 만들었기 때문에 이 과정은 생략했습니다.
4.
release.yml 에 내용을 채웁니다.
아까 Github Docs에 있던 내용이랑은 비슷하면서 다릅니다. 따라서 Release Drafter에 맞게끔 내용을 수정해주어야 합니다.
name-template: '애니또 v$RESOLVED_VERSION' tag-template: 'v$RESOLVED_VERSION' categories: - title: '🆕 새로운 기능이 추가되었어요!' label: '✨ Feature' - title: '🐞 자잘한 버그를 수정했습니다.' label: '🐞 Bugfix' - title: '🫶🏻 앱 사용성 개선에 힘썼습니다.' label: '🫶🏻 Improvement' - title: '🛠️ 더 나은 코드를 위해 노력하고 있습니다.' labels: - '🔨 Refactor' - '⚙️ Setting' - title: 'ETC' labels: - "*" change-template: '* $TITLE (#$NUMBER) by @$AUTHOR' change-title-escapes: '\<*_&#@`' exclude-labels: - 'Main' version-resolver: major: labels: - 'Major' minor: labels: - 'Minor' patch: labels: - 'Patch' default: patch template: | $CHANGES
YAML
복사
4번에 있는 release.yml 코드를 하나씩 뜯어보면서 설명해볼게요.
name-template
제목 템플릿입니다. 말 그대로 해당 new release의 제목이 될 부분이라는 뜻입니다. 저희 프로젝트에서는 “애니또 v1.2” 이렇게 제목을 붙여왔습니다. 제목을 그대로 따라서 템플릿을 설정했습니다.
템플릿 사이에 있는 $RESOLVED_VERSION은 Github labels를 기준으로 정해진 다음 resolved 버전의 숫자입니다. 하단에 있는 version-resolver에 따라서 RESOLVED_VERSION이 정해지게 됩니다.
tag-template
태그 템플릿입니다. 태그로 들어갈 부분의 템플릿입니다. 저희 프로젝트에서는 “v1.2” 이렇게 태그를 붙였기 때문에 이를 그대로 따라서 템플릿을 정했습니다.
categories.title, categories.label
release.yml에 있던 changelog.categories.title, changelog.categories.labels와 같은 의미를 가집니다.
change-template
change log에 적힐 PR들에 대한 템플릿입니다. Default는 "* $TITLE (#$NUMBER) @$AUTHOR” 형식을 가집니다. 저는 '* $TITLE (#$NUMBER) by @$AUTHOR' 형식으로 적혔으면 해서 템플릿을 따로 적어두었습니다.
change-title-escapes
PR 제목에 적힌 글자 중 무시할 character를 적는 부분입니다. release note는 마크 다운 형태이기 때문에 문자에 영향을 받아서 원하는대로 글이 적히지 않을 수 있습니다. 따라서 미리 영향을 받지 않을 character를 option으로 따로 적어둡니다.
exclude-labels
release.yml에 있던 changelog.exclude.labels와 같은 의미를 가집니다.
version-resolver
각각에 속한 label를 가진 PR이 있다면 해당 release note의 RESOLVED_VERSION를 생성할 때 반영합니다. 만약 PR들이 version-resolver 라벨을 아무도 가지고 있지 않는다면 Patch version를 올립니다.
MAJOR : 맨 앞 자리 수 +1
MINOR : 가운데 자리 수 +1
PATCH : 맨 뒷 자리 수 +1
template
적혀질 템플릿의 형태입니다. 저는 위의 changed log 내용말곤 따로 추가할 내용이 없었기 때문에 $CHANGES만 적어두었습니다.
추가적으로 알고 싶은 Configuration Options가 있다면 하단 북마크를 참고하시면 됩니다.

 결과

release-drafter가 제대로 작동할지는 이번 업데이트를 main 브랜치에 머지하면서 확인해봐야할 것 같습니다. 결과가 나오는대로 내용 업데이트 시켜두겠습니다.
제발 성공하길..
[02. 28(화)]
단단히 실패했습니다. develop(default branch)에 해당 파일을 올리지 않아서 그렇다고 합니다. main 브랜치에서 develop 브랜치로 PR를 날려둔 상태입니다. develop 브랜치에 올리고 나선 잘 실행되었으면 좋겠네요..
[03. 16(목)]
 성공! 하지만 내부에 쓰여지는 내용이 내가 원하는대로 쓰이진 않았네요.. 내용 수정만 더 봐야겠습니다!

 참고자료