[GitHub Actions] GitHub의 Release note API를 사용하여 Release note 자동화하기

[GitHub Actions] GitHub의 Release note API를 사용하여 Release note 자동화하기

2023-09-13 hit count image

GitHub Actions에서 GitHub의 Release note API를 사용하여 간단한 Release note를 자동으로 작성하는 방법에 대해서 알아보도록 하겠습니다.

개요

GitHub에서 오픈 소스를 관리하거나, 버전을 관리할 때, Release note를 작성하게 됩니다.

GitHub Actions release note API: GitHub release note

하지만, 매번, Pull request를 만들고 Release note를 작성하거나, 배포전에 Git의 히스토리를 보면서 Release note를 작성할 수 없습니다.

이전 블로그 포스트에서는 Release Drafter를 사용하여 Pull request의 제목에 따라 Release note를 자동으로 작성하는 방법에 대해서 알아보았습니다.

이번 블로그 포스트에서는 GitHub Actions에서 Release note API를 사용하여 보다 간단한 Release note를 자동으로 작성하는 방법에 대해서 알아보도록 하겠습니다.

GitHub personal access token

이번 블로그 포스트에서 소개할 방법은 GitHubPersonal access token을 필요로 합니다. Personal access token을 생성하기 위해 다음과 같이 GitHub의 설정으로 이동한 후, Developer settings를 선택합니다.

GitHub Actions release note API: Developer settings

그런 다음 Personal access token을 생성하기 위해 Personal access token (classic)을 선택합니다.

GitHub Actions release note API: Personal access token (classic)

그런 다음 repo 권한(permission)을 선택하여 Personal access token을 생성합니다.

GitHub Actions release note API: Repo permission

이렇게 생성한 Personal access tokenRelease note의 자동화를 하고 싶은 저장소의 Settings > Secrets and variables > Repository secretAPI_KEY라는 이름으로 저장합니다.

GitHub Actions release note API: api key variable

GitHub Actions

이제 GitHubAPI를 사용하여 Release note를 자동화해 봅시다. Release note 자동화를 위해 .github/workflows/release_note.yml 파일을 생성하고 다음과 같이 수정합니다.


name: Create release tag and release note

on:
  push:
    tags:
      - 'v[0-9]+.[0-9]+.[0-9]+'

jobs:
  create-release-note:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2

      - name: Get previous tag
        id: pre_tag
        run: |
          echo "version=$(curl -L -H "Accept: application/vnd.github+json" \
            -H "Authorization: Bearer ${{ secrets.API_KEY }}" \
            -H "X-GitHub-Api-Version: 2022-11-28" \
            https://api.github.com/repos/${{ github.repository }}/releases/latest \
            | jq .tag_name \
            | sed 's/"//g')" >> $GITHUB_OUTPUT

      - name: Generate release tag
        id: release_tag
        run: echo "version=${GITHUB_REF#refs/*/}" >> $GITHUB_OUTPUT

      - name: Generate release note
        id: release_note
        run: |
          echo "note=$(curl -L \
            -X POST \
            -H "Accept: application/vnd.github+json" \
            -H "Authorization: Bearer ${{ secrets.API_KEY }}" \
            -H "X-GitHub-Api-Version: 2022-11-28" \
            https://api.github.com/repos/${{ github.repository }}/releases/generate-notes \
            -d '{"tag_name":"${{ steps.release_tag.outputs.version }}","target_commitish":"main","previous_tag_name":"${{ steps.pre_tag.outputs.version }}"}' \
            | jq .body \
            | sed 's/"//g')" >> $GITHUB_OUTPUT

      - name: Create Release
        run: |
          curl -X POST \
            -H "Authorization: token ${{ secrets.API_KEY }}" \
            -d "{ \"tag_name\": \"${{ steps.release_tag.outputs.version }}\", \"name\": \"${{ steps.release_tag.outputs.version }}\", \"body\": \"${{ steps.release_note.outputs.note }}\"}" \
            https://api.github.com/repos/${{ github.repository }}/releases

코드를 좀 더 자세히 살펴봅시다.


...
on:
  push:
    tags:
      - 'v[0-9]+.[0-9]+.[0-9]+'
...

GitHub ActionsGitHubSemantic Versioning 형식의 tag가 추가되면 실행됩니다.


...
- name: Get previous tag
  id: pre_tag
  run: |
    echo "version=$(curl -L -H "Accept: application/vnd.github+json" \
      -H "Authorization: Bearer ${{ secrets.API_KEY }}" \
      -H "X-GitHub-Api-Version: 2022-11-28" \
      https://api.github.com/repos/${{ github.repository }}/releases/latest \
      | jq .tag_name \
      | sed 's/"//g')" >> $GITHUB_OUTPUT
...

다음으로, 자동으로 Release note를 생성하기 위해 /releases/latest API를 사용하여 이전 tag를 가져옵니다.

API는 직전의 Release note에 사용된 tag를 가져오므로, 이 GitHub Actions를 사용하기 위해서는 최소한 한 개 이상의 Release note가 존재해야 합니다. 만약, Release note가 작성되지 않았고 여러 tag가 있는 경우 최신 tag를 사용한 Releate note를 작성해 두는 것이 좋습니다.


...
 - name: Generate release tag
  id: release_tag
  run: echo "version=${GITHUB_REF#refs/*/}" >> $GITHUB_OUTPUT
...

그런 다음 현재 tagRelease note에서 사용할 수 있도록 변수에 할당합니다.


...
 - name: Generate release note
  id: release_note
  run: |
    echo "note=$(curl -L \
      -X POST \
      -H "Accept: application/vnd.github+json" \
      -H "Authorization: Bearer ${{ secrets.API_KEY }}" \
      -H "X-GitHub-Api-Version: 2022-11-28" \
      https://api.github.com/repos/${{ github.repository }}/releases/generate-notes \
      -d '{"tag_name":"${{ steps.release_tag.outputs.version }}","target_commitish":"main","previous_tag_name":"${{ steps.pre_tag.outputs.version }}"}' \
      | jq .body \
      | sed 's/"//g')" >> $GITHUB_OUTPUT
...

이렇게 준비한 tag/releases/generate-notes API를 사용하여 Release note 내용을 생성합니다.

API를 사용하면 다음과 같이 단순한 Release note가 생성됩니다.

**Full Changelog**: https://github.com/dev-yakuza/release-note-test/compare/v0.0.1...v0.0.2

만약, 해당 API로 생성되는 Release note의 내용을 변경하고 싶다면, .github/release.yml 파일을 생성하고 다음과 같이 수정합니다.

changelog:
  exclude:
    labels:
      - ignore-for-release
    authors:
      - octocat
  categories:
    - title: Breaking Changes 🛠
      labels:
        - Semver-Major
        - breaking-change
    - title: Exciting New Features 🎉
      labels:
        - Semver-Minor
        - enhancement
    - title: Other Changes
      labels:
        - "*"

자세한 내용은 아래의 공식 문서를 참고하시기 바랍니다.

이번 블로그 포스트에서는 단순한 Release note만을 생성하기 위해 .github/release.yml는 생성하지 않고 진행하였습니다.

마지막으로 /releases API를 사용하여 Release ntoe를 생성합니다.


...
- name: Create Release
  run: |
    curl -X POST \
      -H "Authorization: token ${{ secrets.API_KEY }}" \
      -d "{ \"tag_name\": \"${{ steps.release_tag.outputs.version }}\", \"name\": \"${{ steps.release_tag.outputs.version }}\", \"body\": \"${{ steps.release_note.outputs.note }}\"}" \
      https://api.github.com/repos/${{ github.repository }}/releases

이것으로 GitHub API를 사용하여 간단한 Release note를 생성할 준비가 끝났습니다.

실행

이렇게 작성한 GitHub Actions는 다음과 같이 Gittag를 추가하면 실행이 됩니다.

git tag v0.0.2
git push origin v0.0.2

이렇게 GitHubtag를 추가하면 앞서 만든 GitHub Actions가 실행되고 다음과 같이 Release note가 자동으로 생성되는 것을 확인할 수 있습니다.

GitHub Actions release note API: release note is generated

클릭하면 다음과 같이 상세 내용을 확인할 수 있습니다.

GitHub Actions release note API: release note detail

완료

이것으로 GitHub Actions에서 GitHub API를 사용하여 간단한 Release note를 자동으로 생성하는 방법에 대해서 알아보았습니다. 여러분도 간단한 Release note 생성을 생각중이시라면 이번 블로그 포스트를 참고하시기 바랍니다.

만약, 좀 더 체계적으로 Release note를 관리하고 싶으시다면 아래의 블로그 포스트를 참고해 주시기 바랍니다.

제 블로그가 도움이 되셨나요? 하단의 댓글을 달아주시면 저에게 큰 힘이 됩니다!

앱 홍보

책 홍보

스무디 한 잔 마시며 끝내는 React Native 책을 출판한지 벌써 2년이 다되었네요.
이번에도 좋은 기회가 있어서 스무디 한 잔 마시며 끝내는 리액트 + TDD 책을 출판하게 되었습니다.

아래 링크를 통해 제가 쓴 책을 구매하실 수 있습니다.
많은 분들에게 도움이 되면 좋겠네요.

스무디 한 잔 마시며 끝내는 React Native, 비제이퍼블릭
스무디 한 잔 마시며 끝내는 리액트 + TDD, 비제이퍼블릭
[심통]현장에서 바로 써먹는 리액트 with 타입스크립트 : 리액트와 스토리북으로 배우는 컴포넌트 주도 개발, 심통
Posts