Help us understand the problem. What is going on with this article?

goreleaserでGitHub Actionsから簡単にオレオレCLIをbrew installできるようにする

はじめに

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へ追加します。

.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

.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だけで十分です。

スクリーンショット 2020-05-04 17.05.27.png

ここで得られたトークンを私の場合は、direnvを利用してプロジェクト配下の.envrcファイルに追加し、.envrcファイルを.gitignoreに設定させています。

.envrc
export GITHUB_TOKEN="発行されたトークン文字列"
.gitignoreの一部
.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用のレポジトリを見てみましょう。

スクリーンショット 2020-05-04 16.52.01.png

こんな感じで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も修正しています。

参考

momotaro98
Gopher ʕ ◔ϖ◔ʔなWebエンジニアです。
https://momotaro98.github.io
rarejob
明治神宮にあるオンライン英会話サービスを提供するベンチャー
https://www.rarejob.com/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away