요새 Github 릴리스 노트를 누가 수동으로 만드나요!? 🤮

Yessen
Riiid Teamblog KR
Published in
6 min readMay 3, 2023

iOS 개발자로서, 저는 원활하고 효율적인 릴리스 프로세스가 얼마나 중요한지 잘 알고 있습니다. 이 프로세스에서 가장 중요한 부분 중 하나는 GitHub 저장소에 있는 각 새 릴리스에 대한 버전 태그와 릴리스 노트를 생성하는 것입니다. 이 작업은 시간이 많이 걸리고 오류가 발생하기 쉬운 작업일 수 있지만, GitHub 워크플로우를 사용하면 이 프로세스를 자동화하고 각 새 릴리스에 태그가 올바르게 지정되고 문서화되도록 할 수 있습니다.

Riiid에서는 항상 프로덕션에 사용할 수 있는 메인 브랜치가 있고, 새 릴리스 작업이 준비되면 이 메인 브랜치에서 릴리스 브랜치를 생성하는 Git 브랜치 전략을 따릅니다. 각 릴리스 브랜치는 다음 릴리스에 포함될 새로운 기능, 버그 수정 및 기타 변경 사항을 개발 및 테스트하는 데 사용됩니다.

GitHub 저장소의 새 업데이트마다 버전 태그와 릴리스 노트를 생성하는 프로세스를 자동화하기 위해 Riiid의 iOS 팀은 GitHub 워크플로우를 사용하는 아이디어를 생각해냈습니다. 워크플로우는 변경 사항이 저장소의 메인 브랜치에 병합될 때마다 트리거됩니다. 이 워크플로우는 자동으로 iOS 프로젝트의 최신 버전을 가져오고, 릴리스 브랜치 이름에서 버전 번호를 추출하고, 새 릴리스에 대한 새 버전 태그와 릴리스 노트를 생성합니다.

이 워크플로우가 어떻게 작동하는지 단계별로 자세히 살펴보겠습니다.

1단계 : 워크플로우 트리거

워크플로우는 코드 변경 사항이 메인 브랜치에 병합될 때마다 자동으로 실행되도록 설정되어 있습니다. 이렇게 하면 워크플로우가 필요할 때만 실행되므로 오류 발생 가능성을 줄이고 개발자의 시간을 절약할 수 있습니다. 이 단계는 다음 코드를 사용하여 수행됩니다.

on:
pull_request:
branches:
- "main"
types:
- closed

2단계 : 릴리스 브랜치 확인 다음으로 워크플로우에서는 풀 리퀘스트 헤드 브랜치에 접두사 “release/v”가 포함되어 있는지, 그리고 병합되었는지 확인합니다. 다음 코드를 사용하여 이 작업을 수행합니다.

if: contains(github.event.pull_request.head.ref, 'release/v') && github.event.pull_request.merged == true

이 단계는 버전 명명 규칙을 따르는 릴리스 브랜치에서 변경 사항이 병합될 때만 워크플로우가 실행되도록 합니다.

3단계 : 코드 체크 아웃 및 버전 가져오기 워크플로우에서 태그 및 릴리즈 노트 생성을 위한 조건이 충족되었다고 판단되면 다음 코드를 사용하여 최신 코드 변경 사항을 체크아웃하고 풀 리퀘스트 헤드 브랜치에서 버전 번호를 가져옵니다.

steps:
- name: Checkout Code
uses: actions/checkout@v2
- name: Fetch version
run: |
VERSION=$(echo "${GITHUB_HEAD_REF}" | sed "s/release\\\\/v//")
echo "version=${VERSION}" >> $GITHUB_OUTPUT
id: fetch-version

이 단계에서는 나중에 사용할 수 있도록 버전 번호를 출력 변수로 저장합니다.

4단계 : 릴리스 노트 생성 및 태그 만들기 마지막으로, 워크플로우에서는 “softprops/action-gh-release” 액션을 사용하여 버전 번호가 포함된 새 태그를 생성하고 다음 코드를 사용하여 릴리스 노트를 자동으로 생성합니다.

- name: Generate release notes
uses: softprops/action-gh-release@v1
with:
token: "your github access token"
tag_name: v${{ steps.fetch-version.outputs.version }}
generate_release_notes: true

이 단계에서는 릴리스 브랜치에서 메인 브랜치로 코드 변경 사항을 병합할 때마다 버전 태그와 릴리스 노트를 자동으로 생성하여 릴리스 프로세스를 간소화합니다.

GitHub 액세스 토큰에는 저장소에 대한 읽기 및 쓰기 권한이 모두 포함되어야 한다는 점에 유의하세요.

워크플로우의 최종 코드는 다음과 같습니다.

name: Tag Release
on:
pull_request:
branches:
- "main"
types:
- closed
jobs:
generate_release:
name: Release
if: contains(github.event.pull_request.head.ref, 'release/v') && github.event.pull_request.merged == true
runs-on: ubuntu-latest
steps:
- name: Checkout Code
uses: actions/checkout@v2
- name: Fetch version
run: |
VERSION=$(echo "${GITHUB_HEAD_REF}" | sed "s/release\\\\/v//")
echo "version=${VERSION}" >> $GITHUB_OUTPUT
id: fetch-version
- name: Generate release notes
uses: softprops/action-gh-release@v1
with:
token: ${{ secrets.IOS_ACCESS_TOKEN }}
tag_name: v${{ steps.fetch-version.outputs.version }}
generate_release_notes: true

단위 테스트부터 앱스토어에 앱을 게시하는 작업까지 지루하고 시간이 많이 걸리는 작업이 많다는 것을 잘 알고 계실 것입니다. 그렇기 때문에 Riiid에서는 일상적인 개발 시간을 절약하기 위해 워크플로우를 최대한 자동화하는 것을 중요하게 생각합니다.

이 설명이 도움이 되었기를 바랍니다. 읽어주셔서 감사합니다.

You can find English version here

--

--