(Translated by https://www.hiragana.jp/)
複数のGoツールをひとつのhomebrewリポジトリで配布する
2023/06/09

複数ふくすうのGoツールをひとつのhomebrewリポジトリで配布はいふする

GoでかれたCLIツールを homebrew で配布はいふするために goreleaser@goreleaser-action がよく使つかわれている。よくある解説かいせつでは、ひとつのCLIにたいしてひとつの homebrew リポジトリを作成さくせいして Formula を配布はいふするかたちになっていることがおおいが、複数ふくすうの CLI tool を配布はいふするとなったとき、毎回まいかいツール自体じたいのリポジトリとセットで homebrew ようのリポジトリを作成さくせいするのはちょっと面倒めんどうくさい。

awshashicorp がひとつの homebrewようリポジトリにある Formula ディレクトリに複数ふくすうツールの配布はいふようデータセットをいているのをつけたので、構成こうせいをマネして goreleaser の設定せっていいてみた。

なお、githubの公開こうかいリポジトリで野良のら配布はいふする前提ぜんていで、goreleaserで単発たんぱつ配布はいふまではできているとします。

homebrewようリポジトリ

いそぎ、Formula をくリポジトリをつくる。たぶん任意にんい名前なまえいが、 aws や hashicorp にならって homebrew-tap とする。わかりやすい。

わたしのを参考さんこうまでに:bayashi/homebrew-tap

GITHUB Personal access tokens

まず、複数ふくすうCLIをまとめることには関係かんけいないが、homebrewけのワークフロー設定せってい必要ひつようなので、githubアカウントで Personal access token を発行はっこうしておく。repo権限けんげんがあればOK。これはリポジトリごとに発行はっこうしてもいいし、ひとつのトークンを使つかいまわしてもいとおもう。なぜならおなじリポジトリを変更へんこうするための token だから(ひとつひとつのツールをセキュアにするなら個別こべつ発行はっこうほうのぞましいとはおもいますが)。

発行はっこうした token は、CLI ツールのリポジトリの Actions secrets メニューで HOMEBREW_TAP_GITHUB_TOKEN という名前なまえで secrets に登録とうろくしておく。この名前なまえ任意にんいです。後述こうじゅつする goreleaser の設定せっていファイル .yaml のなか指定していします。

goreleaser

releaser.yaml

まず、.github/workflows/releaser.yamlうえ発行はっこうした HOMEBREW_TAP_GITHUB_TOKEN指定してい追加ついかしておきます(最終さいしゅうぎょう)。

name: releaser

on:
  push:
    tags:
      - v*
jobs:
  goreleaser:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v3
        with:
          fetch-depth: 0
      - name: Set up Go
        uses: actions/setup-go@v4
        with:
          go-version: 1.19
      - name: Run GoReleaser
        uses: goreleaser/goreleaser-action@v4
        with:
          version: latest
          args: release --clean
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
          HOMEBREW_TAP_GITHUB_TOKEN: ${{ secrets.HOMEBREW_TAP_GITHUB_TOKEN }}

workflow 自体じたいのファイルめい任意にんいです。

.goreleaser.yaml

つづいて、プロジェクト直下ちょっか配置はいちする .goreleaser.yaml には、brew けに以下いかのような項目こうもくいておきます。irir というツールのれいです。

brews:
  - tap:
      owner: bayashi
      name: homebrew-tap
      token: "{{ .Env.HOMEBREW_TAP_GITHUB_TOKEN }}"
    folder: Formula
    homepage: https://github.com/bayashi/irir
    description: A filter to add colors for text lines generically from a YAML configuration file easily
    test: |
      system "#{bin}/irir", '--version'

抽象ちゅうしょうした解説かいせついておくと、

brews:
  - tap:
      owner: {あなたのgithubアカウント}
      name: {homebrewようリポジトリめい}
      token: "{{ .Env.CLIツールのリポジトリでsecretsに登録とうろくしたtokenの名前なまえ }}"
    folder: {homebrewようリポジトリでのディレクトリめいとく変更へんこうする必要ひつようもないので Formula のまま}
    homepage: {CLIツールを紹介しょうかいするページURL}
    description: {CLIツールの紹介しょうかいぶん}
    test: |
      system "#{bin}/{CLIツールコマンド}", '{必要ひつようならオプション}' # テスト発行はっこうするコマンド

brews.tap.name のところを {homebrewようリポジトリめい} として、今回こんかいhomebrew-tap指定していしている。HOMEBREW_TAP_GITHUB_TOKENうえ発行はっこうしたもの。

Workflow permissions

この設定せってい複数ふくすうCLI配布はいふするためというわけではないが、goreleaser を github でうごかすために必要ひつよう設定せってい

CLIのリポジトリの settings タブにある、Actions.General のメニューのなかWorkflow permissions というのがあるので、これを read and write permissions変更へんこうして保存ほぞんする。

これをしておかないと、goreleaser のワークフローが 403 でこける。

homebrew 配布はいふコマンド

goreleaser が無事ぶじはしると、homebrew-tap/Formula 以下いか{ツールめい}.rb生成せいせいされているとおもいます。

配布はいふようのコマンドは以下いかのようになります。

brew tap {あなたのgithubアカウント}/tap
brew install {あなたのgithubアカウント}/tap/{ツールめい}

たとえば、bayashi の irir というツールの場合ばあい

brew tap bayashi/tap
brew install bayashi/tap/irir

となります。

まとめ

リポジトリを毎回まいかいつく手間てまはぶけてハッピー

サイトない検索けんさく