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


# はじめに

[gorillang](https://github.com/momotaro98/gorillang)というゴリラ語で遊べるコマンドツールを作りました。

> ウホゥホウホッッホゥ ウホゥホウホ！！ゥゥ ウホゥホウホ！！オホ ウホ？ゥゥオホ！！ ウホうほホッウウウッホ ウホウォホホウウウホ ウホホホウォ ウホゥホウホォ！ウウ ウホゥホウホウッホッ！ ウホゥホウホッッホッ ウホホッウォウォ？

このとき、[goreleaser](https://goreleaser.com/)を使うことで簡単にGo言語で作ったプログラムを[Homebrew](https://brew.sh/index_ja)化して配布できるとわかったので記事にします。

# バージョン・環境

* Go: go version go1.15 darwin/amd64
* goreleaser: version: 0.142.0

# やり方

## GitHubにHomebrewのFormula用のレポジトリを事前に作っておく

事前にHomebrewのFormula用のレポジトリを作る必要があります。

GitHubにてNew repositoryから下記のような名前のレポジトリを作ります。

`homebrew-【配布するコマンドツールの名前】`

私の場合は[homebrew-gorillang](https://github.com/momotaro98/homebrew-gorillang)という名前で作成しています。

__【注意】今回は配布できるコマンドツールを作ったのでPublicなレポジトリでしか検証していません。Privateなレポジトリでの実現に関して本記事ではカバーできておりません。__

## `.goreleaser.yml`でbrewsなキーを追加

下記のように`.goreleaser.yml`へ追加します。

```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

```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"
```

詳細は[公式ドキュメント](https://goreleaser.com/customization/)を参照ください。

## ローカルPCの環境変数として`$GITHUB_TOKEN`を設定しよう

CLI配布のリリースはローカルPCで行うので、ローカルPCにてGitHubのパーソナルトークンを発行して`GITHUB_TOKEN`という名前で環境変数に入れてあげる必要があります。

私の場合は、プロジェクトごとでトークンがあった方が便利なので専用にパーソナルトークンを生成しました。
権限は下記のようにrepoだけで十分です。

![スクリーンショット 2020-05-04 17.05.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/91562/9fb11e0d-ddb7-55c3-dde2-7be4a06a8c21.png)

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

```sh:.envrc
export GITHUB_TOKEN="発行されたトークン文字列"
```

```sh:.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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/91562/70bd831a-294b-fac8-fb14-c47d923208e6.png)

こんな感じでgoreleaserbotなるユーザが勝手にコミットしていれば成功です。

## brew install しよう

brew tapを利用することでbrew installができます。

Qiita記事: [brew tapとは](https://qiita.com/saa/items/85ed5e914d424fbf9fd6)

今回私が作った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](https://github.com/goreleaser/goreleaser-action/issues/167
)をあげていて、2020年5月4日時点でまだ解決方法がわかっていません。~~

@progrhyme さんからのフィードバックにより成功するようになりました!

[下記の記載いただいたコメント](https://qiita.com/momotaro98/items/a421c8b3412dec3fb2fc#comment-788beac791252928bb16)のように、パーソナルトークンにてトークンを生成し、`HOMEBREW_TAP_GITHUB_TOKEN`という名前でGitHub Actionsを動かす対象レポジトリのSecretへ登録することで動くようになりました。([公式ドキュメント](https://goreleaser.com/customization/homebrew/)記載の内容も2020年5月と2020年11月で変わっていました。)

gorillangの場合はGitHub Actionsのワークローは[こちら](https://github.com/momotaro98/gorillang/blob/master/.github/workflows/workflow.yml)のようにしています。

上記の`.goreleaser.yml`も修正しています。

# 参考

* https://qiita.com/knqyf263/items/53dd0d0916afc5472281
* https://qiita.com/saa/items/85ed5e914d424fbf9fd6