これはなに
元々、CircleCI でデプロイした後に、手動でタグを作成して GitHub に push していたのですが、タグ作成部分を GitHub Actions で自動化したので、本記事でまとめておこうと思います。(リリースノートはついで・・)
事前準備
-
GitHubの個人アクセストークンを作成する(
repo権限
が必要なので、権限を選択する際にチェックを入れてください) -
取得したトークンを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
設定方法
ほとんどサンプル通りですが、下記のように設定しました。
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
を含むリクエストがあったときのみ、ワークフローを実行できるようになりました。
# 追加
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点です。
- 事前準備で取得しておいた $GITHUB_TOKEN
- 対象のリポジトリのURL
- event_type
.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 のワークフローで、タグとリリースノートの作成を行いました。現状、コミットを元にリリースノートを作成する形になっていますが、コミット単位だと細かすぎるので、できればプルリク単位でリリースノートをまとめたいなーという気持ちがあります。もし、プルリク単位でまとめることができたら、別途記事を書こうと思います。もし、良い方法をご存知の方がいたら、コメントいただけると嬉しいです!
参考
- https://git-scm.com/book/ja/v2/Git-%E3%81%AE%E5%9F%BA%E6%9C%AC-%E3%82%BF%E3%82%B0
- https://docs.github.com/en/actions/reference/events-that-trigger-workflows
- https://docs.github.com/ja/github/authenticating-to-github/keeping-your-account-and-data-secure/creating-a-personal-access-token
- https://circleci.com/docs/ja/2.0/env-vars/#setting-an-environment-variable-in-a-project