$shibayu36->blog;

株式会社はてなでエンジニアをしています。プログラミングや読書のことなどについて書いています。

goreleaserを使ってGoで書いたツールのバイナリをGithub Releasesで配布する

Goで書いたツールのバイナリ配布ってどうやれば良いのかなーと思っていたら、goreleaser というツールを見つけたので使ってみた。非常に便利だったのでメモしておく。

goreleaserとは

簡単に言うと、Goのバイナリのクロスコンパイルと、Github Releasesへのデプロイをやってくれる君。詳しくは https://goreleaser.com/https://github.com/goreleaser/goreleaser を参照。

goreleaserのインストール

https://github.com/goreleaser/goreleaser/releases からバイナリを取ってくるでも良いけど、僕はgo getでインストールした。

$ go get github.com/goreleaser/goreleaser

goreleaserの設定を行う

まずはリリースの設定を行う。レポジトリのルートに.goreleaser.ymlというのを置いて設定していく。僕はこんな感じで設定した。

https://github.com/shibayu36/shibayu36/blob/v0.0.5/.goreleaser.yml

builds:
  - binary: shibayu36
    goos:
      - windows
      - darwin
      - linux
    goarch:
      - amd64
      - 386
archive:
  format: zip
  name_template: "{{ .ProjectName }}_{{ .Os }}_{{ .Arch }}"
  files:
    - README.md
release:
  github:
    owner: shibayu36
    name: shibayu36

一つ一つ説明していくと

  • buildsのセクションでクロスコンパイルの設定ができる
  • archiveのセクションでzipとかの圧縮形式の設定ができる
    • 今回は全部zipで圧縮
    • name_templateでディレクトリ名の設定
      • デフォルトでは{{ .ProjectName }}_{{ .Version }}_{{ .Os }}_{{ .Arch }}{{ if .Arm }}v{{ .Arm }}{{ end }}なのだけど、バージョン番号はリリースタグで分かるし、Arm用にはビルドしないので、シンプルなものに変更した
    • さらにアーカイブにはREADME.mdも入れるように
  • releaseのセクションで、Github Releasesへの配布の設定をする
    • 今回はshibayu36/shibayu36のレポジトリに配置したいのでownerとnameを設定した

これで設定は終わり。

実際に手元からgoreleaserでリリースする

リリースするときは、GithubでPersonal access tokenをrepo権限で発行して、以下のようなコマンドを打つだけ。

$ git tag v0.0.5
$ GITHUB_TOKEN=... goreleaser --rm-dist
   • running goreleaser dev
   • loading config file       file=.goreleaser.yml
   • SETTING DEFAULTS
   • GETTING AND VALIDATING GIT STATE
   • releasing v0.0.5, commit a02b3bd5240af3b7898bbfe2adcb1aad4ae39dbf
   • LOADING ENVIRONMENT VARIABLES
   • CHECKING ./DIST
   • --rm-dist is set, removing ./dist
   • BUILDING BINARIES
   • building                  binary=dist/shibayu36_windows_386/shibayu36.exe
   • building                  binary=dist/shibayu36_darwin_386/shibayu36
   • building                  binary=dist/shibayu36_darwin_amd64/shibayu36
   • building                  binary=dist/shibayu36_windows_amd64/shibayu36.exe
   • building                  binary=dist/shibayu36_linux_amd64/shibayu36
   • building                  binary=dist/shibayu36_linux_386/shibayu36
   • CREATING ARCHIVES
   • creating                  archive=dist/shibayu36_linux_386.zip
   • creating                  archive=dist/shibayu36_windows_amd64.zip
   • creating                  archive=dist/shibayu36_darwin_amd64.zip
   • creating                  archive=dist/shibayu36_darwin_386.zip
   • creating                  archive=dist/shibayu36_windows_386.zip
   • creating                  archive=dist/shibayu36_linux_amd64.zip
   • new release artifact      artifact=shibayu36_windows_386.zip
   • new release artifact      artifact=shibayu36_linux_386.zip
   • new release artifact      artifact=shibayu36_windows_amd64.zip
   • new release artifact      artifact=shibayu36_linux_amd64.zip
   • new release artifact      artifact=shibayu36_darwin_386.zip
   • new release artifact      artifact=shibayu36_darwin_amd64.zip
   • CREATING LINUX PACKAGES WITH FPM
   • skipped                   reason=no output formats configured
   • CREATING LINUX PACKAGES WITH SNAPCRAFT
   • skipped                   reason=no summary nor description were provided
   • CALCULATING CHECKSUMS
   • checksumming              file=shibayu36_windows_amd64.zip
   • checksumming              file=shibayu36_windows_386.zip
   • checksumming              file=shibayu36_linux_386.zip
   • checksumming              file=shibayu36_linux_amd64.zip
   • checksumming              file=shibayu36_darwin_386.zip
   • checksumming              file=shibayu36_darwin_amd64.zip
   • new release artifact      artifact=shibayu36_0.0.5_checksums.txt
   • CREATING DOCKER IMAGES
   • skipped                   reason=docker section is not configured
   • RELEASING TO GITHUB
   • creating or updating release repo=shibayu36/shibayu36 tag=v0.0.5
   • release updated           url=https://github.com/shibayu36/shibayu36/releases/tag/v0.0.5
   • uploading to release      file=dist/shibayu36_linux_amd64.zip name=shibayu36_linux_amd64.zip
   • uploading to release      file=dist/shibayu36_windows_386.zip name=shibayu36_windows_386.zip
   • uploading to release      file=dist/shibayu36_windows_amd64.zip name=shibayu36_windows_amd64.zip
   • uploading to release      file=dist/shibayu36_linux_386.zip name=shibayu36_linux_386.zip
   • uploading to release      file=dist/shibayu36_darwin_386.zip name=shibayu36_darwin_386.zip
   • uploading to release      file=dist/shibayu36_darwin_amd64.zip name=shibayu36_darwin_amd64.zip
   • uploading to release      file=dist/shibayu36_0.0.5_checksums.txt name=shibayu36_0.0.5_checksums.txt
   • CREATING HOMEBREW FORMULA
   • skipped                   reason=brew section is not configured
   • SUCCESS!

これで、https://github.com/shibayu36/shibayu36/releases/tag/v0.0.5 にリリースがなされた。便利!

TravisCIで自動リリースする

タグを打ってpushした時に自動でTravisCIでビルドしたいなら、.travis.ymlを以下のように設定する。

https://github.com/shibayu36/shibayu36/blob/v0.0.5/.travis.yml

language: go
go:
  - 1.9
script:
  - make test
after_success:
  - test -n "$TRAVIS_TAG" && curl -sL https://git.io/goreleaser | bash

またTravisCIの設定で、GITHUB_TOKENを設定するのを忘れずに。

あとは以下のようにコマンドを打つと、TravisCIが勝手にビルドしてリリースまでしてくれる。

$ git tag v0.0.5
$ git push
$ git push --tags

便利!

まとめ

今回はGoのバイナリをgoreleaserを使って配布する方法について調べたのでまとめてみた。Goで作ったツールをクロスコンパイルしてGithub Releasesで配布したいなら、goreleaserは非常に手軽にできて良いと感じた。


他にもいろいろと柔軟な設定もっといろんな設定をしたいときは、https://goreleaser.com/ や、https://github.com/goreleaser/goreleaser/blob/master/.goreleaser.yml を見ると良いだろう。