[GitHub Actions] Release Drafterを使ってGitHubのRelease noteの自動化をする

[GitHub Actions] Release Drafterを使ってGitHubのRelease noteの自動化をする

2023-05-25 hit count image

GitHub ActionsのRelease Drafterを使ってPull requestのタイトルでRelease noteを自動で作成する方法について説明します。

概要

GitHubでオープンソースを管理したり、バージョンを管理する時、Release noteを作成するようにします。

GitHub Actions release-drafter: GitHub release note

しかし、毎回、Pull requestを作ってRelease noteを作成したり、リリースする前にGitのヒストリを見ながらRelease noteを作成することは辛いです。

今回のブログポストではGitHub ActionsRelease Drafterを使ってPull requestのタイトルでRelease noteを自動で作成する方法について説明します。

ブログシリーズ

このブログはシリーズで作成しております。下記のリンクを参考して他のブログポストも確認してみてください。

Release Drafterの設定ファイル

Release Drafterを使ってRelease noteを自動で作成するためには、Release Drafterの設定ファイルがmain(master)ブランチに存在する必要があります。

Release Drafterの設定ファイルを作るため、.github/release-drafter.ymlファイルを生成して次のように修正します。

name-template: "v$RESOLVED_VERSION"
tag-template: "v$RESOLVED_VERSION"
version-resolver:
  major:
    labels:
      - 'major'
  minor:
    labels:
      - 'minor'
  patch:
    labels:
      - 'patch'
  default: patch
categories:
  - title: '⚠️ Breaking changes'
    labels:
      - 'breaking change'
  - title: '🚀 Features'
    labels:
      - 'feature'
  - title: '🐛 Bug Fixes'
    labels:
      - 'bug'
  - title: '📃 Documents'
    labels:
      - 'docs'
  - title: '🧩 Dependency Updates'
    labels:
      - 'deps'
      - 'dependencies'
      - 'bump'
      - 'chore'
    collapse-after: 5
  - title: '🔬 Others'
    labels:
      - 'style'
      - 'refactor'
      - 'test'
      - 'ci'
    collapse-after: 5
autolabeler:
  - label: 'breaking change'
    title:
      - '/!:/i'
  - label: 'feature'
    title:
      - '/feat:/i'
  - label: 'bug'
    title:
      - '/fix:/i'
  - label: 'style'
    title:
      - '/style:/i'
  - label: 'refactor'
    title:
      - '/refactor:/i'
  - label: 'test'
    title:
      - '/test:/i'
  - label: 'chore'
    title:
      - '/chore:/i'
  - label: 'docs'
    title:
      - '/docs:/i'
  - label: 'ci'
    title:
      - '/ci:/i'
  - label: 'dependencies'
    title:
      - '/deps:/i'
      - '/dependencies:/i'
      - '/bump:/i'
commitish: main
change-template: '- $TITLE @$AUTHOR (#$NUMBER)'
change-title-escapes: '\<*_&'
template: |
  $CHANGES

Release Drafterの設定ファイルをもっと詳しく見てみましょう。

バージョン

Release Drafterは基本的にPull requestのラベルを使って動作します。Release Drafterは以前にリリースしたRelease noteのバージョンを見てRelease noteDraftを作成します。

name-template: "v$RESOLVED_VERSION"
tag-template: "v$RESOLVED_VERSION"
version-resolver:
  major:
    labels:
      - 'major'
  minor:
    labels:
      - 'minor'
  patch:
    labels:
      - 'patch'
  default: patch
...

この時、以前のバージョンより上のバージョンのDraftを作成ますが、以前より上のバージョンのDraftを作成するためversion-resolverを使います。

Pull requestのラベルにpatchminormajorを設定すると、Release Drafterがこれを認識してDraftのバージョンを上げます。もし、Pull requestのラベルが設定されない場合、defaultの値が設定されることになります。この例題ではpatchを基本値で設定したので、ラベルが設定されない場合、patchのバージョンが上がるようになります。

Pull requestごとバージョンが上がるわけではなく、最後にマージ(Merge)されたPull requestのラベルによってRelease noteのバージョンが決定されます。

このブログポストではこのバージョンではなく、GitTagを使って最終バージョンを決める予定です。

categories

categoriesオプションを使うと、Release noteに作成される内容を分類して作成することができます。

...
categories:
  - title: '⚠️ Breaking changes'
    labels:
      - 'breaking change'
  - title: '🚀 Features'
    labels:
      - 'feature'
  - title: '🐛 Bug Fixes'
    labels:
      - 'bug'
  - title: '📃 Documents'
    labels:
      - 'docs'
  - title: '🧩 Dependency Updates'
    labels:
      - 'deps'
      - 'dependencies'
      - 'bump'
      - 'chore'
    collapse-after: 5
  - title: '🔬 Others'
    labels:
      - 'style'
      - 'refactor'
      - 'test'
      - 'ci'
    collapse-after: 5
...

このcategoriesオプションを使うと、Release noteの内容を次のように分類することができます。

GitHub Actions release-drafter: categories

このカテゴリもPull requestのラベルによって決定されます。labelsオプションに設定されたラベルがtitleカテゴリの下に作成されます。また、collapse-afterオプションを使って作成される内容が多い場合、折り畳んで表示することができます。

autolabeler

categoriesを使ってRelease noteに作成される内容を分類することができますが、これはPull requestのラベルによって決定されます。従って、誤ってラベルを作成しながったら、その内容はRelease noteに表示されないです。

これを防ぐためにRelease Drafterautolabelerを提供します。

...
autolabeler:
  - label: 'breaking change'
    title:
      - '/!:/i'
  - label: 'feature'
    title:
      - '/feat:/i'
  - label: 'bug'
    title:
      - '/fix:/i'
  - label: 'style'
    title:
      - '/style:/i'
  - label: 'refactor'
    title:
      - '/refactor:/i'
  - label: 'test'
    title:
      - '/test:/i'
  - label: 'chore'
    title:
      - '/chore:/i'
  - label: 'docs'
    title:
      - '/docs:/i'
  - label: 'ci'
    title:
      - '/ci:/i'
  - label: 'dependencies'
    title:
      - '/deps:/i'
      - '/dependencies:/i'
      - '/bump:/i'
...

autolabelerを使うとPull requestのタイトル、本文、ファイル、ブランチでPull requestのラベルを自動で設定することができます。

commitish

Release Drafterは基本的refs/heads/masterを基準で動作します。従って、私ようにmainブランチを使う方はcommitishmainを設定して基本ブランチがmasterではなくmainであることをRelease Drafterに知らせる必要があります。

...
commitish: main
...

作成内容

Release noteの作成内容を決定するオプションです。change-templateの方にで変更の内容が作成されるし、templateのオプションで変更した内容以外の内容を追加して表示することができます。

...
change-template: '- $TITLE @$AUTHOR (#$NUMBER)'
change-title-escapes: '\<*_&'
template: |
  $CHANGES

また、change-title-escapesオプションを使ってPull requestのタイトルから除外したい文字を追加することができます。

GitHub Actions

Release Drafterを使う準備が終わりました。今からRelease Drafterを実行するGitHub Actionsを作成してみましょう。

.github/workflows/release-drafter.ymlファイルを生成して、次のように修正します。

name: Release Drafter

on:
  push:
    branches:
      - main
  pull_request:
    types:
      - opened
      - reopened
      - edited
      - synchronize

permissions:
  contents: read

jobs:
  update_release_draft:
    permissions:
      contents: write
      pull-requests: write
      checks: write
    runs-on: ubuntu-latest
    steps:
      - uses: release-drafter/[email protected]
        env:
          GITHUB_TOKEN: $

このようにGitHub Actionsを追加すると、Pull requestが生成される時Pull requestのタイトルによってラベルが自動で生成されることが確認できます。また、マージ(Merge)されると自動でRelease noteがアップデートされることが確認できます。

Git tagを使ってRelease noteをリリースする

Release Drafterを使って作成したRelease notedraftでまだリリースされてない状態です。このように作成されたRelease noteRelease Drafterを使ってリリースすることができます。

draftの状態であるRelease noteをリリースするため.github/workflows/release.ymlファイルを作って次のように修正します。

name: Release

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

jobs:
  release:
    permissions:
      contents: write
      pull-requests: write
    runs-on: ubuntu-latest
    steps:
      - name: Get semantic version
        id: semver
        run: echo "::set-output name=version::${GITHUB_REF#refs/tags/v}"
      - uses: release-drafter/[email protected]
        with:
          tag: $
          name: $
          version: $
          publish: true
        env:
          GITHUB_TOKEN: $

次のようにGit tagを作成すると、このGitHub Actionsを使うことができます。

# git checkout main
git tag v1.0.0
git push origin v1.0.0

Conventional PR Title Action

このブログポストではRelease DrafterautolabelerPull requestのタイトルで自動でラベルを貼るようにしました。従って、Pull requestを作る時、自動でラベルを追加するためPull requestのタイトルを検査する必要があります。

この時、使えるGitHub ActionsConventional PR Title Actionです。

Conventional PR Title Actionを設定する方法については下記のリンクを参考してください。

完了

これでGitHub ActionsRelease Drafterを使ってPull requestのタイトルでRelease noteを自動で作成する方法について見てみました。オープンソースを運用したり、Release noteをうまく管理したい場合はRelease Drafterの導入をお勧めします。

もし、CHANGELOG.mdファイルを管理するプロジェクトの場合、GitHub Actionsを使ってRelease note内容を自動でCHANGELOG.mdファイルに記録することができます。CHANGELOG.mdファイルを自動でアップデートする方法については下記のリンクを参考してください。

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

アプリ広報

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

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

Posts