O hirunewani blog

GitHub Actionsを利用してリリースノートの生成を自動化する

Created at

GitHub CLIを利用してリリースノートを生成する方法とGitHub Actionsでの使用例の紹介

GitHub CLIによるリリースノートの生成

GitHub CLIのgh release createコマンドで--generate-notesオプションを指定すると、コミットログから自動的にGitHubのリリースノートが生成される。

gh release create v3.1.4 --generate-notes

参考:gh release create

GitHub Actions上でリリースノートを生成する

GitHub Actions上でGitHub CLIを利用してリリースノートを生成するには、permissionsセクションでcontentswriteに設定する必要がある。

permissions:
  contents: write

また、過去からのコミットログが必要なため、checkoutする際にfetch-depth0に設定する。

steps:
  - uses: actions/checkout@v4
    with:
      fetch-depth: 0

GitHub CLIは、GitHub Actionsにプリインストールされているため、最小構成は次のようになる。

permissions:
  contents: write

jobs:
  create-release:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
        with:
          fetch-depth: 0
      - name: Create Release
        run: |
          gh release create v1.0.0 --generate-notes
        env:
          GITHUB_TOKEN: ${{secrets.GITHUB_TOKEN}}

後はバージョンを何らかの方法で受け取れば良い。

例:タグを打つとリリースノートが生成されるようにする

タグのプッシュをトリガーにすると、github.ref_nameでタグ名を受け取ることができる。

name: Tag Release

on: 
  push:
    tags:
      - 'v*'

permissions:
  contents: write

jobs:
  create-release:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
        with:
          fetch-depth: 0
      - name: Create Release
        run: |
          gh release create ${{github.ref_name}} --generate-notes
        env:
          GITHUB_TOKEN: ${{secrets.GITHUB_TOKEN}}

例:ファイルのバージョン情報を元にリリースノートを生成する

タグではなく何らかのファイルによりバージョンが管理されているケースを考える。 今回は.versionというファイルでバージョンが管理されている想定で、このファイルに記載されたバージョンが更新されるとタグのプッシュとリリースノートの生成がされるようにする。

name: Create Release Tag

on:
  push:
    branches:
      - main
    paths:
      - ".version"

permissions:
  contents: write

jobs:
  create-tag:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
        with:
          fetch-depth: 0

      - name: Get version
        id: version
        run: |
          VERSION=$(cat .version)
          echo "version=$VERSION" >> $GITHUB_OUTPUT
      - name: Create and push tag
        run: |
          git config --local user.email "action@github.com"
          git config --local user.name "GitHub Action"
          git tag -a "v${{ steps.version.outputs.version }}" -m "Release v${{ steps.version.outputs.version }}"
          git push origin "v${{ steps.version.outputs.version }}"
      - name: Create GitHub Release
        run: |
          gh release create "v${{ steps.version.outputs.version }}" --generate-notes
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}