goreleaser と Travis CI で Golang のバイナリ配布を自動化する

Golang で作ったツールを配布したいとき、ビルドして zip なりにまとめて GitHub の Release ページなり Homebrew で公開する必要がありますが、毎回手作業でやるのは面倒です。 そこで goreleaser と Travis CI を使って自動化してみました。

goreleaser の README にサンプルが載っていることと、GitHub と連携できて楽という理由で Travis CI を使っています。

goreleaser とは

Golang のバイナリを速く、簡単にデリバリーできるツールです(リポジトリ見てください) github.com

手順

Travis CI で GITHUB_TOKEN を設定

f:id:rnitame:20170719013612p:plain

権限を repo だけつけた Personal access token を生成して設定します。

yml を書く

.goreleaser.yml はこんな感じ。

# Build customization
builds:
  - binary: daily
    goos:
      - windows
      - darwin
      - linux
    goarch:
      - amd64

# Archive customization
archive:
  format: zip
  format_overrides:
    - goos: windows
      format: zip

# Release customization
release:
  github:
    owner: rnitame
    name: daily

brew:
  github:
    owner: rnitame
    name: homebrew-daily

  homepage: "https://github.com/rnitame/daily"

  install: |
    bin.install "daily"

builds でクロスビルド、archive で zip に固める、release で固めた zip をリリースするための設定をしています。 brew では homebrew-tap でも使えるようにするための設定をしてます。 設定自体はちょっとわかりづらいんですが、goreleaser のリポジトリにある yml を見ると参考になるかと思います。

.travis.yml はこんな感じ。

language: go

before_install:
  - go get -u github.com/Masterminds/glide

script:
  - glide install
  - go test -v

after_success:
  - test -n "$TRAVIS_TAG" && curl -sL https://git.io/goreleaser | bash

今回バイナリ配布した daily というツールがあるんですが、そこで glide を使っているので先にそれをインストールします。 そして、script でライブラリをインストールするなり、テストまわすなり、カバレッジ取るなりいろいろして、成功したあとに goreleaser を起動する。といった具合です。

before_install の go get のところは、curl https://glide.sh/get | sh でやってみたんですが linux amd64 に対応しておらずビルドがこけるのでこのようにしています。 参考 ↓

github.com

タグを打つ

上記の $TRAVIS_TAG はタグを打ったときに値が入る Travis CI の定数です。なのでタグを打ったときだけ自動でバイナリを生成してリリースします。

結果

タグを打つとビルドが走って、goreleaserbot がリリース作ってくれたり homebrew-tap のリポジトリにコミットしてくれます。

リリース↓

f:id:rnitame:20170719013923p:plain

homebrew-tap ↓

f:id:rnitame:20170719011724p:plain

便利!!

さいごに

自動化ってすばらしい 🙌