少し前の話になりますが、[2023-11-14-1]github-nippou という Golang 製ツールのリリースを自動化しました。

  1. 自動的に作られた Release PR1 をマージする
  2. タグが自動で振られ、Releases ページに新しいリリースが作られる
  3. macOS, Linux, Windows 用のバイナリがビルドされ、2 の新しいリリースにアップロードされる

今回はさらに、Homebrew の formula ファイル2もアップデートするようにしました。

準備したもの

今回は goreleaser の仕組みを使って、github-nippou のリリース時に masutaka/homebrew-tap の formula ファイルを更新します。そのためには何らかの GitHub Access Token が必要です。

Personal Access Token でも出来ますが、有効期限を設定するにせよ、生存期間の長い Token を使うことになります。それは避けたいので、今回は GitHub App を作成し、使用時に Access Token を作るようにしました。

やったこと

1. GitHub App を作成してインストールした

https://github.com/settings/apps から、以下の設定で GitHub App を作成しました。

  • WebHook は使わないので Active のチェックを外す
  • 以下の Repository permission を有効にする
    • Contents: Read and Write
    • Metadata: Read
  • Only on this account はそのまま選択する

private key を作るように促されるので作成し、ローカルにダウンロードしました。App ID も控えておきました。

サイドバーの Install App から masutaka/homebrew-tap にインストールしました。

2. 作成した GitHub App の情報を Actions secrets and variables に登録した

https://github.com/masutaka/github-nippou/settings/secrets/actions から以下を登録しました。

  • CI_APP_PRIVATE_KEY という名前の secret
    • 値は private key を設定する
  • CI_APP_ID という名前の variable
    • 値は App ID を設定する
    • 秘匿情報ではないため variable にした

3. GitHub Actions の workflow ファイルを変更した

リリースを実行する .github/workflows/release.yml を以下のように変更しました。

  • 2 で設定した CI_APP_PRIVATE_KEYCI_APP_IDactions/create-github-app-token に渡すことで、Access Token を生成する
  • 生成した Access Token を環境変数 TAP_GITHUB_TOKEN に設定し、$ make release に渡す
diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
index c23d3be..1d4ed3e 100644
--- a/.github/workflows/release.yml
+++ b/.github/workflows/release.yml
@@ -53,10 +53,18 @@ jobs:
         uses: goreleaser/goreleaser-action@v6
         with:
           install-only: true
+      - uses: actions/create-github-app-token@v1
+        id: app-token
+        with:
+          app-id: ${{ vars.RELEASE_APP_ID }}
+          private-key: ${{ secrets.RELEASE_APP_PRIVATE_KEY }}
+          owner: 'masutaka'
+          repositories: 'homebrew-tap'
       - name: Release
         run: make release
         env:
           GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+          TAP_GITHUB_TOKEN: ${{ steps.app-token.outputs.token }}
   pushover:
     name: pushover if failure
     if: failure()

変更後のファイルです。
https://github.com/masutaka/github-nippou/blob/v4.2.29/.github/workflows/release.yml#L39-L71

4. .goreleaser.yaml を変更した

.goreleaser.yaml に以下の設定を追加しました。formula ファイルの種を設定しつつ、更新対象先である formula ファイル2を指定しています。

3 で設定した環境変数 TAP_GITHUB_TOKEN が使われているのも分かると思います。

🔗 https://github.com/masutaka/github-nippou/blob/v4.2.29/.goreleaser.yaml#L57-L84

brews:
  - name: github-nippou
    repository:
      owner: masutaka
      name: homebrew-tap
      token: "{{ .Env.TAP_GITHUB_TOKEN }}"
    commit_author:
      name: "github-actions[bot]"
      email: "github-actions[bot]@users.noreply.github.com"
    homepage: "https://github.com/masutaka/github-nippou"
    description: "Print today's your GitHub activity for issues and pull requests"
    license: "MIT"
    install: |
      bin.install 'github-nippou'

      # Install bash completion
      output = Utils.safe_popen_read("#{bin}/github-nippou", 'completion', 'bash')
      (bash_completion/'github-nippou').write output

      # Install fish completion
      output = Utils.safe_popen_read("#{bin}/github-nippou", 'completion', 'fish')
      (fish_completion/'github-nippou.fish').write output

      # Install zsh completion
      output = Utils.safe_popen_read("#{bin}/github-nippou", 'completion', 'zsh')
      (zsh_completion/'_github-nippou').write output      
    test: |
      system 'github-nippou', 'version'      

リリース後に更新された formula ファイル

リリース後にこのような formula ファイルに更新されました。
🔗 https://github.com/masutaka/homebrew-tap/blob/38e9c24327b98c19239756ddf1f20e72f5616c56/github-nippou.rb

今までの formula ファイルの中身は無視して、.goreleaser.yaml の設定を種とした formula ファイルで完全に上書きする形でした。

まとめ

下記リリースフロー 4 を追加しました。github-nippou のリリースが完全に自動化されて、本当に楽になりました。

  1. 自動的に作られた Release PR1 をマージする
  2. タグが自動で振られ、Releases ページに新しいリリースが作られる
  3. macOS, Linux, Windows 用のバイナリがビルドされ、リリースページにアップロードされる
  4. Homebrew の formula ファイル2もアップデートされる 🆕

参考