😺

Github ActionsでPull Requestをマージしたときに自動的にリリースノート作成・タグ付けしたい

2023/07/07に公開

PR を作成して main(または master) にマージした際に、自動的にタグ付けする仕組みについて考えていました。

ここでは手動で main にマージされることを想定して、リリースノートの作成とタグ付けをします。

二番煎じの可能性もありますが、書き起こしておきます。
また、サードパーティのものになるべく頼らず実現できないかを検討します。

出来たもの

https://github.com/yumechi/github-actions-add-tag

作ったaction

name: My Workflow

on:
  pull_request:
    branches:
      - main
      - master
    types:
      - closed

jobs:
  build:
    if: github.event.pull_request.merged == true
    runs-on: ubuntu-latest
    steps:
      - name: Checkout code
        uses: actions/checkout@v3

      - name: Extract PR Comment
        id: pr_comment
        run: |
          TAG=$(echo "$PULL_REQUEST_BODY" | grep -Po '(?<=tag: )v\d+\.\d+\.\d+')
          if [ -n "$TAG" ]; then
            gh release create $TAG --generate-notes
          fi
        env:
          GITHUB_TOKEN: "${{ secrets.GH_TOKEN }}"
          PULL_REQUEST_BODY: "${{ github.event.pull_request.body }}"

想定されるPR

PR のボディにタグ名が入っていることを想定しています。複数入っている場合はどう動くか知りません。

以下がサンプルになります。

プルリク作成

tag: v1.0.0

変更箇所は以上です

何をしたか?

pull request がマージされたときのみ動かす

典型的な対応なので公式ドキュメントに載っています。これを参考にしました。

https://docs.github.com/en/actions/using-workflows/events-that-trigger-workflows#running-your-pull_request-workflow-when-a-pull-request-merges

タグ情報を取り出す

今回は grep で頑張って取り出します。
PR のボディの情報は github.event.pull_request.body で取り出せますが、今回は環境変数の形で渡すようにしました。

GitHub CLI を動かす

こちらも公式ドキュメントに乗っています。

https://docs.github.com/en/actions/using-workflows/using-github-cli-in-workflows

ただし GitHub 上で secrets な環境変数を宣言する場合、 GITHUB_ から始まるものが定義できません。

そのため、今回は GH_TOKEN という名前で定義しました。

GitHub CLI で release を作成する

公式ドキュメントを見ます。

https://cli.github.com/manual/gh_release_create

このうち、 --generate-notes を使うと自動的にリリースノートが作成されます。
結構いい感じにできるので、個人的には気に入っています。

具体的には PR 単位でテキストをまとめてくれる形かな? と思います。

release を作成する際に tag も自動的に作成されるので、 tag がなくても安心です。

ただし tag に残っている情報は自分が試している限りは微妙だったので、少し工夫が必要かもしれません(伸びしろ)

感想

久々に GitHub Actions を使ったらフックする event を間違えるなど思ったより時間がかかってしまいました。
いい感じに動いたので個人的には満足しているし、小さく GitHub Actions を入れてみるのであればちょうどいいタスクなのかな? と思いました。

タグについているメッセージを良い感じにすることは暇なときにでも考えてみようかと思います。

Discussion