PR を作成して main(または master) にマージした際に、自動的にタグ付けする仕組みについて考えていました。
ここでは手動で main にマージされることを想定して、リリースノートの作成とタグ付けをします。
二番煎じの可能性もありますが、書き起こしておきます。
また、サードパーティのものになるべく頼らず実現できないかを検討します。
出来たもの
作った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 がマージされたときのみ動かす
典型的な対応なので公式ドキュメントに載っています。これを参考にしました。
タグ情報を取り出す
今回は grep で頑張って取り出します。
PR のボディの情報は github.event.pull_request.body
で取り出せますが、今回は環境変数の形で渡すようにしました。
GitHub CLI を動かす
こちらも公式ドキュメントに乗っています。
ただし GitHub 上で secrets な環境変数を宣言する場合、 GITHUB_
から始まるものが定義できません。
そのため、今回は GH_TOKEN
という名前で定義しました。
GitHub CLI で release を作成する
公式ドキュメントを見ます。
このうち、 --generate-notes
を使うと自動的にリリースノートが作成されます。
結構いい感じにできるので、個人的には気に入っています。
具体的には PR 単位でテキストをまとめてくれる形かな? と思います。
release を作成する際に tag も自動的に作成されるので、 tag がなくても安心です。
ただし tag に残っている情報は自分が試している限りは微妙だったので、少し工夫が必要かもしれません(伸びしろ)
感想
久々に GitHub Actions を使ったらフックする event を間違えるなど思ったより時間がかかってしまいました。
いい感じに動いたので個人的には満足しているし、小さく GitHub Actions を入れてみるのであればちょうどいいタスクなのかな? と思いました。
タグについているメッセージを良い感じにすることは暇なときにでも考えてみようかと思います。
今回試験的にZennとマルチポストしてみましたが、今後も記事をどうしていくかは考えながらやっていきたいです。
https://zenn.dev/yumechi/articles/a4274e0625b8b8