これはなに
brew tapで自分の実装成果物を公開する場合、パブリックリポジトリにある場合は簡単なのですがプライベートリポジトリの場合は結構詰まる部分があったので備忘録としてまとめておきました
なお、筆者がgoreleaserで成果物の生成やbrew tap公開を管理しているため備忘録としての手順になります
手順
0. プライベートリポジトリで実装
SSIA
1. 成果物をReleasesに打ち上げる
goreleaserを用いて成果物を生成しReleaseします
実運用する場合はgithub actionsで自動化するのが一番楽かなと思います
こんなイメージ
また、brew tapとして公開する用のリポジトリの準備やPATの生成などが必要ですが、それについては こちらの記事 がとても丁寧にまとめてくださっておりますのでぜひ御覧ください
こちらを参考に自分が作成したactionsのyamlを置いておきます
tagging_release.yaml
main mergeされたらtagging & releaseが走るようなyamlです
セマンティックバージョンのバージョン管理で github-tag-action を用いていますので、別のやり方でtaggingされている場合はjobsのtagging部分はよしなに差し替えてください
これにより、main mergeに積まれたコミットメッセージをみてよしなにバージョンを上げてくれます
なお筆者はmain merge時にrebase mergingをしたい人なのでPRタイトルに規則を持たせて運用しています
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 }}
2. .goreleaser.yamlの準備
プライベートリポジトリ用の.goreleaser.yamlをこちらにおいておきます
最後の2行が差分です
.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" # ↑の関数を自作するファイルパス
3. homebrew-tap用リポジトリに private_strategy.rb を配置
1で自作すると記載したファイルをhomebrew-tap用のリポジトリに lib/private_strategy.rb を配置します
4. brew install
$ brew tap KatsuyaAkasaka/hoge git@github.com:KatsuyaAkasaka/hoge.git
$ HOMEBREW_GITHUB_API_TOKEN=xxx brew install KatsuyaAkasaka/tap/hoge
終わりに
なかなか難しいですが一回設定してしまえば次回以降はprivate_strategy.rbは設定不要だったりと幾分楽になると思います
社内でのbrew公開などで役立ちそうです