Lento con forza

大学生気分のIT系エンジニアが色々書いてく何か。ブログ名決めました。

GitHub Actionsで次のリリースにどんな変更が含まれるかを可視化する

この記事は はてなエンジニア Advent Calendar 2021 の16日目の記事です。昨日は id:masayosuはてなにおけるCloudNative推進会の活動について でした。 サブ会という仕組みで専門領域における情報共有や深い議論ができるようになっていて、僕もスマート会*1に所属しています

はてなではリリースブランチへのマージPRの管理にgit-pr-releaseをよく使っています。 git-pr-releaseは現在のリリースブランチのheadとの差分にあるPull Requestを一覧して、リリース前にチェックできます。このgit-pr-releaseはとても便利で、git-flowのようなブランチ戦略に非常にマッチしています。

一方、リリースブランチのないGitHub Flowのようなブランチ戦略を取った場合、リリースブランチが作られないため、マージ先のブランチがなく、PRも作れません。リリースブランチがなくてもgit-pr-releaseのようなリリース管理をしたい!と思ったので、同じようなリリース差分をGitHub Actionsを使ってIssueに可視化できるようにしてみました。

Issueで管理するのでgit-issue-releaseです。

github.com

PRをマージすると、GitHubのAutomatically generated release notesのAPIを使い、直近リリースからの差分をIssueに記録します。GitHubのReleaseがPublishされると、Issueはクローズされます。全体のフローを動画に短くまとめました。

youtu.be

使い方

GitHub Actionsで動作します。以下のYAMLを .github/workflows以下に配置することで使えます。

name: git-issue-release

on:
  pull_request: # PRがマージされた時にIssueを更新するために使います。
    types: [closed]
  release: # ReleaseがPublishされた時にIssueをクローズするために使います。
    types: [published]

jobs:
  action:
    runs-on: ubuntu-latest
    steps:
      - name: git-issue-release
        uses: kouki-dan/git-issue-release@v1
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        with:
          release-tag-pattern: ^v  # 最新のリリースを探すために使います。
          release-label: "release"  # リリースIssueを管理するために使います。ラベルは自動で作られないので事前に作成してください。

git-issue-releaseでは、リリースのIssueを管理するためにラベルを使います。ラベルは自動で作られないので、先に作成しておきます。(この例では、releaseという名前のラベルを作成しておきます)

このYAMLを配置後にPRをマージすると、このようなIssueが作られます。

f:id:kouki_dan:20211214214330p:plain

最近のリリースから release-tag-pattern にマッチする最新リリースタグを取得します。そのタグからの差分PRをGitHubのAutomatically generated release notes APIを使って生成し、IssueのBodyとします。

別のPRがマージされると、IssueのBodyも追従して更新され、常に最新リリースからの差分をIssueで確認することができます。

また、新しいリリースをGitHubに公開すると、Issueも自動でクローズされ、タイトルもリリース後のタグを含んだものに変更されます。GitHub Releaseへのリンクがコメントされ、リリースに簡単に遷移できます。

f:id:kouki_dan:20211214214710p:plain

リリースがIssueに残るため、過去のリリースを検索しやすかったり、GitHubが作るバックリンクでPRがどのバージョンでリリースされたかを確認できるようにもなります。

リポジトリにYAMLを置くだけでいい感じにコンピューティングしてくれるのはとてもいい時代になりましたね。GitHub Releasesでリリースの管理をしている方は、Issueでリリースを管理してみませんか?こちらからお試しください!

github.com

明日は id:dekokun です!

*1:スマートフォンアプリエンジニアが集まっているサブ会