はじめに
gorillangというゴリラ語で遊べるコマンドツールを作りました。
ウホゥホウホッッホゥ ウホゥホウホ!!ゥゥ ウホゥホウホ!!オホ ウホ?ゥゥオホ!! ウホうほホッウウウッホ ウホウォホホウウウホ ウホホホウォ ウホゥホウホォ!ウウ ウホゥホウホウッホッ! ウホゥホウホッッホッ ウホホッウォウォ?
このとき、goreleaserを使うことで簡単にGo言語で作ったプログラムをHomebrew化して配布できるとわかったので記事にします。
バージョン・環境
- Go: go version go1.15 darwin/amd64
- goreleaser: version: 0.142.0
やり方
GitHubにHomebrewのFormula用のレポジトリを事前に作っておく
事前にHomebrewのFormula用のレポジトリを作る必要があります。
GitHubにてNew repositoryから下記のような名前のレポジトリを作ります。
homebrew-【配布するコマンドツールの名前】
私の場合はhomebrew-gorillangという名前で作成しています。
【注意】今回は配布できるコマンドツールを作ったのでPublicなレポジトリでしか検証していません。Privateなレポジトリでの実現に関して本記事ではカバーできておりません。
.goreleaser.yml
でbrewsなキーを追加
下記のように.goreleaser.yml
へ追加します。
brews:
- github:
owner: あなたのGitHubユーザ名
name: homebrew-【配布するコマンドツールの名前】
folder: Formula
homepage: コマンドツールとしてのホームページ(どんなURLでも良い)
description: コマンドツールの概要を記載
test: |
system "#{bin}/goreleaser -v"
gorillangの場合は全体は以下のようになっています。
https://github.com/momotaro98/gorillang/blob/master/.goreleaser.yml
before:
hooks:
- go mod download
builds:
- env:
- CGO_ENABLED=0
main: ./cmd/gorillang/
binary: gorillang
archives:
- replacements:
darwin: Darwin
386: i386
amd64: x86_64
checksum:
name_template: 'checksums.txt'
snapshot:
name_template: "{{ .Tag }}-next"
changelog:
sort: asc
filters:
exclude:
- '^docs:'
- '^test:'
brews:
- tap:
owner: momotaro98
name: homebrew-gorillang
token: "{{ .Env.HOMEBREW_TAP_GITHUB_TOKEN }}"
folder: Formula
homepage: https://github.com/momotaro98/gorillang
description: gorillang
test: |
system "#{bin}/gorillang --version"
詳細は公式ドキュメントを参照ください。
ローカルPCの環境変数として$GITHUB_TOKEN
を設定しよう
CLI配布のリリースはローカルPCで行うので、ローカルPCにてGitHubのパーソナルトークンを発行してGITHUB_TOKEN
という名前で環境変数に入れてあげる必要があります。
私の場合は、プロジェクトごとでトークンがあった方が便利なので専用にパーソナルトークンを生成しました。
権限は下記のようにrepoだけで十分です。
ここで得られたトークンを私の場合は、direnvを利用してプロジェクト配下の.envrc
ファイルに追加し、.envrc
ファイルを.gitignore
に設定させています。
export GITHUB_TOKEN="発行されたトークン文字列"
.envrc
ローカルからリリースしてみよう
ローカルのMacからリリースをします。
下記の手順でタグを生成しそれをPushした後にgoreleaserコマンドを叩くとリリースがされます。
$ git tag v1.0.8
$ git push origin v1.0.8
$ goreleaser --rm-dist
goreleserコマンドを実行するとdist
ディレクトリが生成されます。--rm-dist
オプションは既存でdist
ディレクトリがあるときそれを削除してくれます。オプションが無いとエラーになります。
goreleaserコマンドの結果をみて、• release succeeded after 38.86s
のように出ているのを確認したら、事前に作っていたHomebrewのFormula用のレポジトリを見てみましょう。
こんな感じでgoreleaserbotなるユーザが勝手にコミットしていれば成功です。
brew install しよう
brew tapを利用することでbrew installができます。
Qiita記事: brew tapとは
今回私が作ったgorillangの場合は以下のようにすることでCLIをインストールすることができます。
$ brew tap momotaro98/gorillang
$ brew install momotaro98/gorillang/gorillang
GitHub Actions からリリースしよう!
goreleserは公式でGitHub Actions用のActionを作っています。
https://github.com/goreleaser/goreleaser-action
これを使うことで、タグをGitHubへPushか作成したときにgoreleserが走るようにしたいのですが、GitHub Actions上でエラーになってしまいハマっている状況です。 全く同じエラーになっている人が公式にIssueをあげていて、2020年5月4日時点でまだ解決方法がわかっていません。
@progrhyme さんからのフィードバックにより成功するようになりました!
下記の記載いただいたコメントのように、パーソナルトークンにてトークンを生成し、HOMEBREW_TAP_GITHUB_TOKEN
という名前でGitHub Actionsを動かす対象レポジトリのSecretへ登録することで動くようになりました。(公式ドキュメント記載の内容も2020年5月と2020年11月で変わっていました。)
gorillangの場合はGitHub Actionsのワークローはこちらのようにしています。
上記の.goreleaser.yml
も修正しています。