なぜこんな事を?
Windows のパッケージマネージャ Chocolatey 向けにパッケージを作ったりしてるわけなんですが、パッケージは一度作ったらバージョン番号を変えるだけの定型作業になります。これが面倒なので golang で定型作業をやってくれるツールを作りました。
Windows 向けのツールですが、 x86/x64 向けにビルドする必要があるので、 gox を使おうとしたわけです。ところが Windows では gox を使えるようにするのも一筋縄ではいきません。 Vagrant 等で linux 環境を整えれば簡単ですが、 Windows 向けツールをビルドするためにそれはあまりにアホらしい。そこで CI ツールで楽にできないか検討してみました。
参考URL
- Wercker で Go のプロジェクトをクロスコンパイルし、GitHub にリリースする - 詩と創作・思索のひろば
- シェルスクリプトでGo言語のツールをクロスコンパイルしてGithubにリリースする | SOTA
- 高速に自作パッケージをGithubにリリースするghrというツールをつくった | SOTA
- tcnksm/ghr
- mitchellh/gox
事前準備
GitHub と CircleCI にアカウントを作りましょう。
GitHub 設定
API 経由で GitHub にリリースするために Authorized applications
で GitHub TOKEN を生成しておきます。
CircleCI 設定
まず目的の GitHub リポジトリを監視するように設定します。
次に CircleCI で Project settings
-> Environment variables
を開きます。以下のように環境変数を2つ定義します。
リポジトリに追加するファイル
release_tag
GitHub にリリースするときは tcnksm/ghr を使います。
CircleCI では1行毎にシェルを起動するため、環境変数を持ち回ることができません。
ghr ではリリースするタグを指定しなければなりませんが、これを動的に指定できるようにするため、ファイルに記述しておきます。
ここでは release_tag
に指定し、リポジトリに追加しておきます。今後リリースするバージョンを変更したい場合はこのファイルを変更します。
v1.0
circle.yml
次に CircleCI の設定ファイルを追加します。
この設定ファイルでは、 gox でビルドするときに --output "dist/{{.Dir}}_{{.OS}}_{{.Arch}}"
と指定して、 dist
以下に配置されるようにしてあります。
そして ghr でタグを指定して dist
以下のファイルを GitHub にリリースします。
machine:
timezone:
Asia/Tokyo
deployment:
release:
branch: master
commands:
- go get github.com/mitchellh/gox
- go get github.com/tcnksm/ghr
- gox --osarch "windows/386 windows/amd64" --output "dist/{{.Dir}}_{{.OS}}_{{.Arch}}"
- ghr -t $GITHUB_TOKEN -u $USERNAME -r $CIRCLE_PROJECT_REPONAME --replace `cat release_tag` dist/
これで master ブランチにコミットされる度に、ビルドしたバイナリが GitHub にリリースされます。
GitHub 時代のデプロイ戦略 - naoyaのはてなダイアリー のように Pull Request を作ってリリースするようにしてもよいでしょう。
ビルドステータス表示
せっかく CircleCI でビルドしているので、ステータスを GitHub の README に表示しておきます。
ユーザー名とリポジトリ名をそれぞれに応じて変えておきましょう。
[![Circle CI](https://circleci.com/gh/:user/:repo/tree/master.svg?style=shield)](https://circleci.com/gh/:user/:repo/tree/master)