プライベートリポジトリをbrew tapでinstallできるようにする

# これはなに
brew tapで自分の実装成果物を公開する場合、パブリックリポジトリにある場合は簡単なのですがプライベートリポジトリの場合は結構詰まる部分があったので備忘録としてまとめておきました

なお、筆者がgoreleaserで成果物の生成やbrew tap公開を管理しているため備忘録としての手順になります

# 手順
## 0. プライベートリポジトリで実装
SSIA

## 1. 成果物をReleasesに打ち上げる
goreleaserを用いて成果物を生成しReleaseします
実運用する場合はgithub actionsで自動化するのが一番楽かなと思います
こんなイメージ
![CleanShot 2025-01-02 at 11.37.14@2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178971/7813a72c-98fb-707d-c477-7c36aaa722e1.png)

また、brew tapとして公開する用のリポジトリの準備やPATの生成などが必要ですが、それについては [こちらの記事](https://zenn.dev/kou_pg_0131/articles/goreleaser-usage) がとても丁寧にまとめてくださっておりますのでぜひ御覧ください

こちらを参考に自分が作成したactionsのyamlを置いておきます

<details><summary>tagging_release.yaml</summary>

main mergeされたらtagging & releaseが走るようなyamlです
セマンティックバージョンのバージョン管理で [github-tag-action](https://github.com/mathieudutour/github-tag-action) を用いていますので、別のやり方でtaggingされている場合はjobsのtagging部分はよしなに差し替えてください
これにより、main mergeに積まれたコミットメッセージをみてよしなにバージョンを上げてくれます
なお筆者はmain merge時にrebase mergingをしたい人なのでPRタイトルに規則を持たせて運用しています


```.github/workflows/tagging_release.yaml
name: Tagging and Release
on:
  push:
    branches:
      - main
jobs:
  tagging:
    runs-on: ubuntu-24.04
    steps:
      - uses: actions/checkout@v4
      - name: Bump version and push tag
        id: tagging
        uses: mathieudutour/github-tag-action@v6.2
        with:
          github_token: ${{ secrets.GITHUB_TOKEN }}
          custom_release_rules: |
            feat:minor:New Functionality,
            bug:patch:Bug Fixes,
            perf:patch:Performance Improvement,
            refactor:patch:Refactoring/TODO's,
            docs:patch:Documentation Improvement,
            style:patch:Code Style,
            ci:patch:Continuous Integration,
            chore:patch:Chores
  release:
    needs: tagging
    runs-on: ubuntu-24.04
    steps:
      -
        name: Checkout
        uses: actions/checkout@v4
        with:
          fetch-depth: 0
      -
        name: Set up Go
        uses: actions/setup-go@v5
      -
        name: Run GoReleaser
        uses: goreleaser/goreleaser-action@v6
        with:
          distribution: goreleaser
          version: '~> v2'
          args: release --clean
        env:
          TAP_GITHUB_TOKEN: ${{ secrets.TAP_GITHUB_TOKEN }} # TAP_GITHUB_TOKENのPATにこのリポジトリの権限付与しておくこと
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
```

</details>


## 2. .goreleaser.yamlの準備

プライベートリポジトリ用の.goreleaser.yamlをこちらにおいておきます
最後の2行が差分です


<details><summary>.goreleaser.yaml</summary>

```.goreleaser.yaml
version: 2

before:
  hooks:
    # You may remove this if you don't use go modules.
    - go mod tidy
    # you may remove this if you don't need go generate
    - go generate ./...

builds:
  - env:
      - CGO_ENABLED=0
    goos:
      - linux
      - windows
      - darwin
    main: ./cmd/hoge

archives:
  - format: tar.gz
    # this name template makes the OS and Arch compatible with the results of `uname`.
    name_template: >-
      {{ .ProjectName }}_
      {{- title .Os }}_
      {{- if eq .Arch "amd64" }}x86_64
      {{- else if eq .Arch "386" }}i386
      {{- else }}{{ .Arch }}{{ end }}
      {{- if .Arm }}v{{ .Arm }}{{ end }}
    # use zip for windows archives
    format_overrides:
      - goos: windows
        format: zip

changelog:
  use: git
  sort: asc
  groups:
    - title: '🚀 新機能'
      regexp: "^.*feat[(\\w)]*:+.*$"
      order: 0
    - title: '🐛 バグ修正'
      regexp: "^.*bug[(\\w)]*:+.*$"
      order: 1
    - title: '⚡ パフォーマンス改善'
      regexp: "^.*perf[(\\w)]*:+.*$"
      order: 2
    - title: '♻️ リファクタリング'
      regexp: "^.*refactor[(\\w)]*:+.*$"
      order: 3
    - title: '📝 ドキュメント'
      regexp: "^.*docs[(\\w)]*:+.*$"
      order: 4
    - title: '🎨 スタイル'
      regexp: "^.*style[(\\w)]*:+.*$"
      order: 5
    - title: '🔧 CI/CD'
      regexp: "^.*ci[(\\w)]*:+.*$"
      order: 6
    - title: '🧹 その他'
      regexp: "^.*chore[(\\w)]*:+.*$"
      order: 7

release:
  footer: >-

    ---

    Released by [GoReleaser](https://github.com/goreleaser/goreleaser).
brews:
  - repository:
      owner: KatsuyaAkasaka
      name: hoge
      token: "{{ .Env.TAP_GITHUB_TOKEN }}"
    download_strategy: GitHubPrivateRepositoryReleaseDownloadStrategy # 今は提供されていないので後ほど自作する必要あり
    custom_require: "lib/private_strategy" # ↑の関数を自作するファイルパス
```

</details>

## 3. homebrew-tap用リポジトリに private_strategy.rb を配置

1で自作すると記載したファイルをhomebrew-tap用のリポジトリに [lib/private_strategy.rb](https://gist.github.com/KatsuyaAkasaka/3408b45099febcfda220765312ad53f0) を配置します


## 4. brew install
```sh
$ brew tap KatsuyaAkasaka/hoge git@github.com:KatsuyaAkasaka/hoge.git
$ HOMEBREW_GITHUB_API_TOKEN=xxx brew install KatsuyaAkasaka/tap/hoge
```

# 終わりに
なかなか難しいですが一回設定してしまえば次回以降はprivate_strategy.rbは設定不要だったりと幾分楽になると思います
社内でのbrew公開などで役立ちそうです