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とかの圧縮形式の設定ができる
- 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 を見ると良いだろう。