CircleCIでデプロイした後にGitHub Actionsでタグとリリースノートを作成する方法


これはなに

元々、CircleCI でデプロイした後に、手動でタグを作成して GitHub に push していたのですが、タグ作成部分を GitHub Actions で自動化したので、本記事でまとめておこうと思います。(リリースノートはついで・・)

事前準備

  1. GitHubの個人アクセストークンを作成するrepo権限が必要なので、権限を選択する際にチェックを入れてください)

  2. 取得したトークンをCircleCI側に設定する(本記事では、GITHUB_TOKENという名前で設定していることを前提で進めます)

git tagについて

git tag については、本筋ではないのでさらっと。git tag を使うことによって、特定のコミットに対してタグをつけることができるので、バージョン(v1.0.0のようなもの)を管理したい時に便利です。詳細な使い方については下記を参照ください。
https://git-scm.com/book/ja/v2/Git-%E3%81%AE%E5%9F%BA%E6%9C%AC-%E3%82%BF%E3%82%B0

設定していく!

GitHub Actionsでタグとリリースノートを作成するワークフローを追加

タグを作成できるアクションがないか探していたところ、GitHub Tagというアクションを見つけました。GitHub Tag を使うと、簡単にタグを作成できるようになるので、こちらを使用していきます。この後少し説明しますが、タグの他にリリースノートも自動で作成してくれます。(ありがたい・・)
https://github.com/marketplace/actions/github-tag

設定方法

ほとんどサンプル通りですが、下記のように設定しました。

.github/workflows/create_tag.yml
jobs:
  create_tag:
    runs-on: ubuntu-latest

    steps:
      - name: Checkout
        uses: actions/checkout@v2
      - name: Bump version and push tag
        id: tag_version
        uses: mathieudutour/github-tag-action@v5
        with:
          github_token: ${{ secrets.GITHUB_TOKEN }}
          default_bump: "minor"
      - name: Publish release
        uses: actions/create-release@v1
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        with:
          tag_name: ${{ steps.tag_version.outputs.new_tag }}
          release_name: Release ${{ steps.tag_version.outputs.new_tag }}
          body: ${{ steps.tag_version.outputs.changelog }}

CircleCIでデプロイが終わった後に、GitHub Actionsのワークフローを実行できるようにする

CircleCI と GitHub Actions の連携部分です。

GitHub Actions側

まずは、GitHub Actions 側から設定していきます。

repository_dispatch

GitHub Actions で外部イベントをトリガーにワークフローを実行するには、repository_dispatch を使用します。GitHubリポジトリのエンドポイントに対して、POSTすることでワークフローを実行することができます。更にワークフロー側、POSTする側でevent_typeを指定することで、特定のワークフローのみ実行することが可能になります。

repository_dispatchの設定をワークフローに追記する

先ほど作成したワークフローを以下のように修正しました。
これにより、create_tagというevent_typeを含むリクエストがあったときのみ、ワークフローを実行できるようになりました。

.github/workflows/create_tag.yml
# 追加
name: Create Tag
on:
  repository_dispatch:
    types: [create_tag]

jobs:
  create_tag:
    runs-on: ubuntu-latest

    steps:
      - name: Checkout
        uses: actions/checkout@v2
      - name: Bump version and push tag
        id: tag_version
        uses: mathieudutour/github-tag-action@v5
        with:
          github_token: ${{ secrets.GITHUB_TOKEN }}
          default_bump: "minor"
      - name: Publish release
        uses: actions/create-release@v1
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        with:
          tag_name: ${{ steps.tag_version.outputs.new_tag }}
          release_name: Release ${{ steps.tag_version.outputs.new_tag }}
          body: ${{ steps.tag_version.outputs.changelog }}

CircleCI側

次に CircleCI 側の設定です。

GitHub リポジトリのエンドポイントに対して、POSTできるようにする

POST する際、気にする必要があるのは、以下の3点です。
1. 事前準備で取得しておいた $GITHUB_TOKEN
2. 対象のリポジトリのURL
3. event_type

.circleci/config.ymlに追記

自分は下記のようにデプロイ周りの設定の下に追記しました。

.circleci/config.yml
# 既存のデプロイ周りの設定
...
- run:
    name: Create Tag
    command: |
      curl -X POST -H  "Authorization: token $GITHUB_TOKEN" -H "Accept: application/vnd.github.everest-preview+json" --data '{"event_type": "create_tag"}' <リポジトリのURL>/dispatches

以上で設定周りは終わりになります。

使い方

次に使い方について説明します。
詳しくは GitHub Tag のドキュメントを見てほしいのですが、ざっくり説明すると、コミットメッセージに特定のプレフィックスをつけておくと、良い感じにバージョンを振ってくれます。

下記は対応しているプレフィックスの一部です。
コミットメッセージに以下のプレフィックスを設定すると、タグのバージョンを良い感じに更新してくれます。(Xの部分がインクリメントされる)

  • BREAKING CHANGE: 〇〇 → X.0.0
  • feat: 〇〇 → 1.X.0
  • fix: 〇〇 → 1.0.X

また、上記のプレフィックスをつけることで、以下のような簡易的なリリースノートも作成してくれます。(下記はテスト用に作成してみたもの)

まとめ

今回は GitHub Actions のワークフローで、タグとリリースノートの作成を行いました。現状、コミットを元にリリースノートを作成する形になっていますが、コミット単位だと細かすぎるので、できればプルリク単位でリリースノートをまとめたいなーという気持ちがあります。もし、プルリク単位でまとめることができたら、別途記事を書こうと思います。もし、良い方法をご存知の方がいたら、コメントいただけると嬉しいです!

参考