🦔

release-drafter: Github Ationsでバージョン番号を入力するだけでバージョンニングを行う仕組みの実装

2024/06/21に公開

個人開発のプロジェクトではこれまでバージョンタグおよびリリースノートの作成をGithubのコンソール上から手動で行なっていたが、リリースの度に毎回手入力して作成するのは正直面倒でしかない。

任意のバージョン番号を入力してあとは作成ボタンを押すだけで、バージョンタグやリリースノートを自動的に作成してくれる仕組みがあれば理想的だが、これはGithub Actionsのworkflow_dispatchを使用したワークフローとrelease-drafterによって実現出来る。

以下ではこの仕組みを実現するための手順をなるべく手短に説明したいと思う。

導入手順

release-drafter.yml

release-drafterを一刻も早く導入したいのであれば、とりあえず以下の内容で.githubディレクトリ配下にrelease-drafter.ymlという名前で設定ファイルを作成すればよい。

(拡張子が.yamlではなく.ymlにしなければいけない点に注意)

# Github Actions用のディレクトリを作成
# (ついでにworkflowsディレクトリもここで作成)
$ mkdir -p /path/to/your-project/.github/workflows

$ vi /path/to/your-project/.github/release-drafter.yml
name-template: "v$RESOLVED_VERSION"
change-title-escapes: '\<*_&'
exclude-labels:
  - "skip-changelog"
template: |
  ## What’s Changed

  以下を対応。

  ## PR

  $CHANGES

この設定から生成されるリリースノートを一足飛びに紹介すると以下のようになる。

templateの設定をベースとして、バージョンを構成するPRが列挙されているリリースノートが作成されることが分かる。

ちなみに原理は分からないが、列挙されるPRは前回バージョニング地点からの差分PRのみが列挙されるようになっている。

また既に開発が進行しているプロジェクトに導入する場合でも、違和感なくPRの列挙を行うことが出来るのは確認済みである。

上記release-drafter.ymlの各設定をざっくり説明すると以下のようになる。

設定 意味
name-template "v$RESOLVED_VERSION" リリースノートのタイトルフォーマット
この設定がないとマージコミットのメッセージがタイトルに含まれてしまう
change-title-escapes '<*_&' PRタイトルに特殊記号が含まれていた場合にエスケープして出力するための設定
release-drafterのREADME.mdに記載されている設定を参考にした
exclude-labels - "skip-changelog" PRにここで設定されているラベルを付与することでリリースノートからそのPRを除外することが出来る
template 上述 リリースノートの出力テンプレート

GHA Workflow

release-drafter.ymlの作成が完了したら、次はGithub Actionsのワークフローファイルを以下の設定で作成する。

$ vi /path/to/your-project/.github/workflows/release.yaml
name: release

on:
  workflow_dispatch:
    inputs:
      release_version:
        description: "release version"
        required: true

permissions:
  contents: write

jobs:
  main:
    runs-on: ubuntu-22.04
    steps:
      - name: checkout project
        uses: actions/checkout@v4.1.7

      - name: generate a release note and a version tag
        uses: release-drafter/release-drafter@v6.0.0
        with:
          tag: v${{ inputs.release_version }}
          publish: true
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

トリガーがworkflow_dispatch、かつ入力としてバージョン文字列を受け取るようになっていて、この設定によってGCPコンソール上に以下のようなバージョニング用UIが出現するようになる。

permissionsの設定ではcontents: writeのみを設定しているが、release-drafterのlabelベースのバージョニングやリリースノート作成機能を使用する場合は更にpull-requests: writeが必要になる点には注意。

ワークフロージョブではプロジェクトのcheckoutを行なったのち、release-drafterを実行しているが、実行時引数のtagに入力バージョン文字列を渡すことでそのバージョンのタグとリリースノートが作成されるようになる。

あとpublish:trueは下書き状態を経由せずにそのまま新バージョンを公開するという意味の設定になる。

なおリリースノートにリリースの詳細を追記してから手動でpublishを行う運用にする場合は、falseに設定することになるかと思う。

以上の2ファイルのPRを作成&マージしたのち、上記UIからリリースバージョン(先頭vなしセマンティックバージョン)を入力してワークフロー実行することで、プロジェクトのバージョニングを開始することが出来る。

おまけ

上記release-drafterの設定はインフラプロジェクト、アプリケーションプロジェクトどちらでも使用可能となっている。

なおアプリケーションプロジェクトの場合、パッケージ管理ツールの設定ファイルにプロジェクト自体のバージョン番号が記述されていることがほとんどであるため、このバージョンについても同時に更新していく必要が出てくる。

例として、Java+Mavenを使用したプロジェクトのバージョニングを行いたい場合、release-drafter実行前にmaven-release-plugin等を使用してpom.xmlに記載されているプロジェクト自体のバージョンを更新することになるが、この設定方法について知りたい方は個人プロジェクトで使用している設定が参考になるかと思う。

ただし自分の設定はjarやwar、Dockerイメージといった成果物をArtifact Registry等にデプロイを行う設定を行っていなかったり、mainブランチのマージ保護設定が難しいといった課題を抱えているため、利用の際には各自のユースケースに対応した設定を追加で行う必要が出てくるかと思う。

Discussion