[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 ActionsRelease note APIを使ってより簡単なRelease noteを自動で作成する方法について説明します。

  • GitHub公式ドキュメント: Releases

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を使うためには少なくとも1つ以上の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 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 ActionsGitHub APIを使って簡単なRelease noteを自動で生成する方法について見てみました。皆さんも簡単なRelease note生成を考えている場合はこのブログポストを参考にしてください。

もし、もっと体系的にRelease noteを管理したい場合は下記のブログポストを参考してください。

私のブログが役に立ちましたか?下にコメントを残してください。それは私にとって大きな大きな力になります!

アプリ広報

今見てるブログを作成たDekuが開発したアプリを使ってみてください。
Dekuが開発したアプリはFlutterで開発されています。

興味がある方はアプリをダウンロードしてアプリを使ってくれると本当に助かります。

Posts