LoginSignup
20
19

More than 5 years have passed since last update.

CIrcleCI で Go のプロジェクトを gox でビルドして GitHub にリリースする

Posted at

なぜこんな事を?

Windows のパッケージマネージャ Chocolatey 向けにパッケージを作ったりしてるわけなんですが、パッケージは一度作ったらバージョン番号を変えるだけの定型作業になります。これが面倒なので golang で定型作業をやってくれるツールを作りました。
Windows 向けのツールですが、 x86/x64 向けにビルドする必要があるので、 gox を使おうとしたわけです。ところが Windows では gox を使えるようにするのも一筋縄ではいきません。 Vagrant 等で linux 環境を整えれば簡単ですが、 Windows 向けツールをビルドするためにそれはあまりにアホらしい。そこで CI ツールで楽にできないか検討してみました。

参考URL

事前準備

GitHub と CircleCI にアカウントを作りましょう。

GitHub 設定

API 経由で GitHub にリリースするために Authorized applications
で GitHub TOKEN を生成しておきます。
Authorized applications.png

CircleCI 設定

まず目的の GitHub リポジトリを監視するように設定します。
次に CircleCI で Project settings -> Environment variables を開きます。以下のように環境変数を2つ定義します。

  • GITHUB_TOKEN
    上記のように GitHub で取得したトークンです。
    circle01.png

  • USERNAME
    GitHub のユーザー名です。
    circle02.png

リポジトリに追加するファイル

release_tag

GitHub にリリースするときは tcnksm/ghr を使います。
CircleCI では1行毎にシェルを起動するため、環境変数を持ち回ることができません。
ghr ではリリースするタグを指定しなければなりませんが、これを動的に指定できるようにするため、ファイルに記述しておきます。
ここでは release_tag に指定し、リポジトリに追加しておきます。今後リリースするバージョンを変更したい場合はこのファイルを変更します。

release_tag
v1.0

circle.yml

次に CircleCI の設定ファイルを追加します。
この設定ファイルでは、 gox でビルドするときに --output "dist/{{.Dir}}_{{.OS}}_{{.Arch}}" と指定して、 dist 以下に配置されるようにしてあります。
そして ghr でタグを指定して dist 以下のファイルを GitHub にリリースします。

circle.yml
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 に表示しておきます。

ユーザー名とリポジトリ名をそれぞれに応じて変えておきましょう。

toruuetani Cacao.png

README.md
[![Circle CI](https://circleci.com/gh/:user/:repo/tree/master.svg?style=shield)](https://circleci.com/gh/:user/:repo/tree/master)

20
19
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
20
19