Closed8

プロダクションリリース時にタグとリリースノートを作成する(Github actions)

shosho

やりたいこと

Github actionsにて、mainブランチへのマージのタイミングでCI/CDが起動し、リリースを行なっている。
そこに加えて、タグ付け及びリリースノートを作成したい。

結論

とりあえずこれでなんとかなる。(こちらを参考。)
https://dev.classmethod.jp/articles/howto-use-github-tag/

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 }}
shosho

リリースノート作成

実際にmainへのpushを行うと、以下のようなリリースノートが作成され、タグも作成される。

この時、コミットメッセージの内容により、リリースノートへの記載内容及びバージョンアップ内容が異なる。

commit prefix リリースノート バージョンアップ
feat Features マイナーバージョン
fix Bug Fixes パッチバージョン
perf Performance Improvements パッチバージョン

feat, fix, perf の3種類がコミットに含まれている場合

以下のようになる。この時、Featuresによるマイナーバージョンアップが行われているため、fixperfによるパッチバージョンアップは適用されない。(マイナーバージョンアップにより、パッチバージョンは0にリセットされる)

shosho

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!

shosho

リリースノートを独自のものにしたい

とりあえず、上記までのメモで基本的なことはできるものの、問題がひとつ。それはコミットメッセージが全てリリースノートに出てしまうことである。

弊チームの運用方法として、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 }} # ここをなおす
shosho

プルリクエストのタイトルをリリースノートに含める

理想は、マージされたプルリクエストの番号(リンク)とタイトルがリリースノートに含まれていること。

前回のタグと今回作成されたタグの間にあるプルリクエスト(マージコミット)をなんとか整形すればできるんじゃなかろうか。(こちらの記事を参考)

      - 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へのプルリクエストなので、できればこれも排除したい。

shosho

1行目は除外する

これでいける。

sed -e '1d' $grep_result

これを先程のworkflowファイルに追加すれば良い。

shosho

Github CLIを使うのは?

Github CLIにそれっぽいコマンドがあるので、それを試してみることにする。

# クローズ済も含めて全てのプルリクエストを表示
$ gh pr list -s all
workflowファイルに追記
      - name: show all pull request
        env:
          GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        run: gh pr list -s all

結果が以下となる。(Github Actionsの結果画面)

これをどうにかすればリリースノートに含めることもできるだろうか

shosho

実験)一度作成したタグを消した後にタグ作成ワークフローを行うと

# 消す
$ git tag -d v1.14.0
$ git push origin --delete v1.14.0

tagは消える。

ReleaseノートはDraftになる。

この状態で再度v1.14.0タグが作成されるように、Featureリリースを行う。

タグはv1.14.0が作成される。

DraftとなったReleaseノートはそこに上書きがされるのではなく、新たにRleaseノートが作成される模様。

このスクラップは2022/05/19にクローズされました