search
LoginSignup
1

More than 1 year has passed since last update.

posted at

updated at

Organization

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も修正しています。

参考

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
1