少し前の話になりますが、[2023-11-14-1] に github-nippou という Golang 製ツールのリリースを自動化しました。
- 自動的に作られた Release PR1 をマージする
- タグが自動で振られ、Releases ページに新しいリリースが作られる
- 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
andWrite
- Metadata:
Read
- Contents:
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_KEY
とCI_APP_ID
を actions/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 のリリースが完全に自動化されて、本当に楽になりました。
- 自動的に作られた Release PR1 をマージする
- タグが自動で振られ、Releases ページに新しいリリースが作られる
- macOS, Linux, Windows 用のバイナリがビルドされ、リリースページにアップロードされる
- Homebrew の formula ファイル2もアップデートされる 🆕