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

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

# 事前準備
1. [GitHubの個人アクセストークンを作成する](https://docs.github.com/ja/github/authenticating-to-github/keeping-your-account-and-data-secure/creating-a-personal-access-token)（`repo権限`が必要なので、権限を選択する際にチェックを入れてください）

1. 取得したトークンを[CircleCI側に設定する](https://circleci.com/docs/ja/2.0/env-vars/#setting-an-environment-variable-in-a-project)（本記事では、`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


### 設定方法

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

```yml:.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](https://docs.github.com/en/actions/reference/events-that-trigger-workflows#repository_dispatch) を使用します。GitHubリポジトリのエンドポイントに対して、POSTすることでワークフローを実行することができます。更にワークフロー側、POSTする側で`event_type`を指定することで、特定のワークフローのみ実行することが可能になります。

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

```yml:.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に追記

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

```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 のドキュメント](https://github.com/marketplace/actions/github-tag#customize-the-conventional-commit-messages--titles-of-changelog-sections)を見てほしいのですが、ざっくり説明すると、コミットメッセージに特定のプレフィックスをつけておくと、良い感じにバージョンを振ってくれます。

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

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

また、上記のプレフィックスをつけることで、以下のような簡易的なリリースノートも作成してくれます。（下記はテスト用に作成してみたもの）
![簡易版リリースノート](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201112/6c76f691-e5bd-fc5c-00cf-910b9693685b.png)

# まとめ
今回は 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