GitHub Actionsでバージョンをバンプしつつタグを打ち、リリースノートにPRベースのchangelogを記載したい

tl;dr

https://github.com/shrkw/sandbox/blob/master/.github/workflows/create_release_tag.yml

このワークフローを実行すると、こんなリリースタグが生成されて便利。

f:id:shrkw:20210310122951p:plain

Release Release v0.4.0 · shrkw/sandbox · GitHub

なぜやりたいのか

  • 手動でリリースタグを作成しているとバージョンナンバーをたまに間違えたりして面倒
  • ローカルでタグを打ってプッシュするやり方もできるけど、ローカルにリモートの最新を取ってくるのも面倒なので、GitHubのWeb UI上で完結させたい
  • 今はActionsの手動実行でやるフローにしているけど、mainやreleaseへのコミットで起動させるようにしてもいいと思う
  • リリースノートにはコミットではなくプルリクエストを列挙したかった

どうやるか

やるべき要素は以下。

できたワークフローは以下。

sandbox/create_release_tag.yml

on:
  workflow_dispatch:
    inputs:
      bumping_part:
        description: 'major, minor or patch'
        default: 'minor'
        required: true

workflow_dispatchがあると Run workflow のメニューが出てくる。

f:id:shrkw:20210310122932p:plain

semverのどのパートを更新するかを選べるようにしていて、github-tag-actiondefault_bump でパートを指定できるので渡している。

yarn run の結果を全部出してるから余計な箇所もあるので、きれいにしたい場合はsedとかでがんばって。

リリースノート記載内容をどう集めるか

リリースノート、チェンジログを自動で生成したいのでlerna-changelogを使った - Bouldering & Com. に書いた、 @shrkw/lerna-changelog を使う。

      - uses: actions/checkout@v2
        with:
          fetch-depth: 0 # 履歴を全て見たい
      - name: Install dependencies
        run: yarn install
      - name: run lerna-changelog
        id: run_changelog
        run: |
          yarn run lerna-changelog | tee /tmp/changelog.txt
          changelog=$(cat /tmp/changelog.txt)
          echo "::set-output name=changelog::${changelog//$'\n'/'%0A'}";

これだと毎回インストールが実行されるのでお好みでキャッシュを利用すると良いです。