プロダクションリリース時にタグとリリースノートを作成する(Github actions)
やりたいこと
Github actions
にて、main
ブランチへのマージのタイミングでCI/CDが起動し、リリースを行なっている。
そこに加えて、タグ付け及びリリースノートを作成したい。
結論
とりあえずこれでなんとかなる。(こちらを参考。)
name: Bump version
on:
push:
branches:
- main
jobs:
build:
name: Bump version
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Bump version and push tag
id: tag_version
uses: mathieudutour/github-tag-action@v6.0
with:
github_token: ${{ secrets.GITHUB_TOKEN }}
- name: Create a GitHub release
uses: ncipollo/release-action@v1
with:
tag: ${{ steps.tag_version.outputs.new_tag }}
name: Release ${{ steps.tag_version.outputs.new_tag }}
body: ${{ steps.tag_version.outputs.changelog }}
リリースノート作成
実際にmain
へのpush
を行うと、以下のようなリリースノートが作成され、タグも作成される。
この時、コミットメッセージの内容により、リリースノートへの記載内容及びバージョンアップ内容が異なる。
commit prefix | リリースノート | バージョンアップ |
---|---|---|
feat | Features | マイナーバージョン |
fix | Bug Fixes | パッチバージョン |
perf | Performance Improvements | パッチバージョン |
feat, fix, perf の3種類がコミットに含まれている場合
以下のようになる。この時、Features
によるマイナーバージョンアップが行われているため、fix
とperf
によるパッチバージョンアップは適用されない。(マイナーバージョンアップにより、パッチバージョンは0にリセットされる)
Breaking change(メジャーバージョンアップ)
コミットメッセージの末尾にBREAKING CHANGE
を入れると、メジャーバージョンアップとなる。
commit 35ad3b1b14eda417bd2a7b0dcd0e35d484a61903 (HEAD -> main, tag: v1.0.0, origin/main)
Author: Sho Ochiai <ochiai_s@welmo.co.jp>
Date: Thu Apr 14 16:56:52 2022 +0900
feat: add new_file.txt
BREAKING CHANGE: breaking change!
リリースノートを独自のものにしたい
とりあえず、上記までのメモで基本的なことはできるものの、問題がひとつ。それはコミットメッセージが全てリリースノートに出てしまうことである。
弊チームの運用方法として、topic
ブランチ→develop
ブランチ→main
ブランチという具合にブランチを上位ブランチへマージしている。その際、squash
マージなどを行なっていないため、最終的にmain
ブランチへのマージでtopic
ブランチの開発時点のコミットログが残ってしまうのである。リリースノートとしては粒度が細かすぎるため、これを修正したい。
結論を言ってしまえば、以下のbody
の内容を書き換える。
- name: Create a GitHub release
uses: ncipollo/release-action@v1
with:
tag: ${{ steps.tag_version.outputs.new_tag }}
name: Release ${{ steps.tag_version.outputs.new_tag }}
body: ${{ steps.tag_version.outputs.changelog }} # ここをなおす
プルリクエストのタイトルをリリースノートに含める
理想は、マージされたプルリクエストの番号(リンク)とタイトルがリリースノートに含まれていること。
前回のタグと今回作成されたタグの間にあるプルリクエスト(マージコミット)をなんとか整形すればできるんじゃなかろうか。(こちらの記事を参考)
- name: Get the version
id: get_version
run: echo ::set-output name=VERSION::${GITHUB_REF#refs/tags/}
- name: Get commit summary
id: get_commit_summary
run: |
PREVIOUS_TAG=$(git tag --sort=-creatordate | sed -n 2p)
echo "PREVIOUS_TAG: $PREVIOUS_TAG"
COMMIT_SUMMARY="$(git log --oneline --pretty=tformat:"%h %s" $PREVIOUS_TAG..${{ github.ref }} | grep 'Merge' | awk '{print $5}') "
COMMIT_SUMMARY="${COMMIT_SUMMARY//$'\n'/'%0A'}"
echo ::set-output name=COMMIT_SUMMARY::$COMMIT_SUMMARY
さらに、bodyを書き換える。
body: ${{ steps.get_commit_summary.outputs.COMMIT_SUMMARY }}
最終的にはこう。
result
name: Bump version
on:
push:
branches:
- main
jobs:
build:
name: Bump version
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v2
with:
fetch-depth: 0
- name: Get the version
id: get_version
run: echo ::set-output name=VERSION::${GITHUB_REF#refs/tags/}
- name: Get commit summary
id: get_commit_summary
run: |
PREVIOUS_TAG=$(git tag --sort=-creatordate | sed -n 1p)
echo "PREVIOUS_TAG: $PREVIOUS_TAG"
COMMIT_SUMMARY="$(git log --oneline --pretty=tformat:"%h %s" $PREVIOUS_TAG..HEAD | grep 'Merge' | awk '{print $5}') "
COMMIT_SUMMARY="${COMMIT_SUMMARY//$'\n'/'%0A'}"
echo ::set-output name=COMMIT_SUMMARY::$COMMIT_SUMMARY
- name: Bump version and push tag
id: tag_version
uses: mathieudutour/github-tag-action@v6.0
with:
github_token: ${{ secrets.GITHUB_TOKEN }}
- name: Create a GitHub release
uses: ncipollo/release-action@v1
with:
tag: ${{ steps.tag_version.outputs.new_tag }}
name: Release ${{ steps.tag_version.outputs.new_tag }}
body: ${{ steps.get_commit_summary.outputs.COMMIT_SUMMARY }}
ただし、上記の通り、プルリクエストの番号のみが表示される。ただし、直近のマージプルリクエストはdevelop
からmain
へのプルリクエストなので、できればこれも排除したい。
1行目は除外する
これでいける。
sed -e '1d' $grep_result
これを先程のworkflowファイルに追加すれば良い。
Github CLIを使うのは?
Github CLIにそれっぽいコマンドがあるので、それを試してみることにする。
# クローズ済も含めて全てのプルリクエストを表示
$ gh pr list -s all
- name: show all pull request
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: gh pr list -s all
結果が以下となる。(Github Actionsの結果画面)
これをどうにかすればリリースノートに含めることもできるだろうか
実験)一度作成したタグを消した後にタグ作成ワークフローを行うと
# 消す
$ git tag -d v1.14.0
$ git push origin --delete v1.14.0
tagは消える。
ReleaseノートはDraftになる。
v1.14.0
タグが作成されるように、Feature
リリースを行う。
この状態で再度タグはv1.14.0
が作成される。