読者です 読者をやめる 読者になる 読者になる

平常運転

アニソンが好き

過去記事とかは記事一覧で見れます

Travis CI で go のバイナリを GitHub Releases に上げるようにした

engineer

特別目新しい話は多分ないと思うけど、まあやったので。

リポジトリ

mackerel-plugin-darwin-battery という Mackerel 用のエージェント。
github.com

この記事で書いたやつ。
astj.hatenablog.com

go のバイナリを作るので GitHub release にアップロードできると便利そう、ということでやった。別にこれくらいなら手でビルドすればいいんだけど、仕事でもちょっと Travis 触ってることもあって試しに Travis でやってみる。
Travis CI は組み込みで GitHub Releases へのアップロード機能があるので、ひとまずはそれにお任せしてみる。

GitHub Releases Uploading - Travis CI

まずテストする

テストしたいだけなら.travis.ymllanguage: goと書けば良いので楽。( ref: Building a Go Project - Travis CI )
いちおう go のバージョンくらいは指定している:

language: go
go:
- 1.7.3

go lint とかもやりたければ script をきちんと定義することになるけど、今回は手抜きしてる。

go のリリース用アーカイブを作る

ちょっと迷ったけど、今回は lahr/goxc を使うことにした。単体で GitHub releases へのアップロードもできたり重厚なので少し大袈裟ではある。mitchellh/gox とかのシンプルな他の選択肢もあるし、そもそも単にバイナリをクロスコンパイルするだけなら標準の go build だけでできるんだけれど、今回リリース用の zip に固める作業もあって、それを手で用意するのが少し面倒なので goxc にしたという感じ。丁寧に Makefileシェルスクリプト書くならビルド部分自体は go build でいい気がする。

コマンド自体はざっくりとこういう感じ。性質上 Mac でしか使わないので darwin だけ。 tasks はごちゃっと書いたけどよく見たら xcarchive だけやれば十分な気がする。

goxc -d=$TRAVIS_BUILD_DIR/dist -bc=darwin -tasks=clean-destination,xc,archive,rmbin

これを Travis での deploy 前に実行してビルドしたいので、.travis.ymlbefore_deploy に書いておく。当然 goxcもここで入れないといけない。アーカイブを置くディレクトリもここで mkdir しておくと安心感がある。

before_deploy:
- go get -u github.com/laher/goxc
- mkdir -p $TRAVIS_BUILD_DIR/dist
- goxc -d=$TRAVIS_BUILD_DIR/dist -bc=darwin -tasks=clean-destination,xc,archive,rmbin

リリース用の設定を作る

travis のドキュメントにもあるけど、GitHub への Access Token を .travis.yml に書いたりしないといけない。手でやるといかにも面倒そうで、公式の CLI ツールを使うと楽。
github.com

travis setup releases して適当に質問に答えると .travis.yml にデプロイ用の設定が書き加えられる。後はちょいちょい設定していくと完成という感じ。

deploy:
  provider: releases
  skip_cleanup: true
  api_key:
    secure: (snip)
  file_glob: true
  file: "$TRAVIS_BUILD_DIR/dist/**/*.{tar.gz,zip}"
  on:
    tags: true
    all_branches: true
    condition: "$TRAVIS_TAG =~ ^v[0-9].*$"

file_glob とかは qiita のこの辺のエントリを見た。ビルドしたファイルの構成に過不足なくマッチする glob を書けばよい。
qiita.com

onv0.0.9みたいなタグを切ったときに実行されるように書いておく。master にしかタグ打たないなら all_branches はもしかしたらいらないかもしれない。試してない。タグの書式は個人的にはなんでもよかったのだけど、Songmu/ghchvX.Y.Zを期待してそうなので踏襲した。

タグ打ち => ビルド => リリース

ここまでで設定は完成。完成した .travis.yml はこういう感じ:
https://github.com/astj/mackerel-plugin-darwin-battery/blob/master/.travis.yml

"Release v0.0.2" みたいなコミットをしてv0.0.2みたいなタグを打って push すると GitHub の releases にアーカイブが上がってくるようになった。
Release v0.0.2: Release v0.02 · astj/mackerel-plugin-darwin-battery · GitHub

デフォルトの挙動だとタグを打ったコミットのコミットメッセージが release の説明に入るので、タグを打つコミットメッセージに changelog っぽいものを書いておくとよい気がする。

今後のステップ

そもそもこのリポジトリリポジトリ内部にバージョンや CHANGELOG を持ってないので(雑)、なんかそういうのをきちんと更新したりするともう少しよくなる気がする。

余談

TravisMac でジョブを走らせることもできるのだけど、今回のやつは Mac 依存のテストやビルドもないのでふつうに Linux で動かしている。 go のクロスコンパイルは便利。