golang と Github と CircleCI で実行ファイル生成を自動化して楽に配布できるようにする

More than 3 years have passed since last update.

どこでも動いてほしいツールは golang で書いて Github の release page からバイナリー落とせれば最強じゃんと思ったのでその設定を書き留める。

前提は次。


  • Github に golang で書いたツールの public repo がある

目指すところは次。


  • 特定形式の git tag を push したときだけバイナリー生成してダウンロードできるようにする

参考にしたのは次。

実際に動いてるプロジェクトは次。


Github 設定

CircleCI が Github に書き込めるようにするためのトークンを生成しておく。


  1. Github 右上の自分のアイコンから "Settings" を選ぶ

  2. 右側の "Personal access tokens" を選ぶ

  3. "Generate new token" を選ぶ

  4. "Toke description" は適当に


    • ただし各プロジェクトごとに作ったほうが取り回しやすい気がするので "project - CircleCI" とかにしとくといい



  5. "repo" の下にある "public_repo" だけチェック

  6. その他の権限は今回はいらないのでチェックしない

  7. "Generate token" を押す

github-token.png

出てきた token をメモしておく。

忘れちゃったら "Edit" -> "Regenerate token" すれば出てくる。


CircleCI 設定


  1. 左ペインの "ADD PROJECTS" から対象のプロジェクトを追加する。

  2. なんか走りだすんだけどそれは無視して右上の "Project Settings" から設定を変更する

  3. "Environment Variables" から環境変数を設定する


    • "GITHUB_TOKEN" に上で Github で生成したトークンを指定する

    • "USERNAME" に Github アカウント名を指定する




プロジェクト設定

プロジェクトのルートディレクトリーに circleci.yml を追加する。


circleci.yml

---

machine:
timezone: Asia/Tokyo
deployment:
release:
tag: /v(0|[1-9][0-9]*)(\.(0|[1-9][0-9]*)){2}/
commands:
- go get github.com/mitchellh/gox
- go get github.com/tcnksm/ghr
- gox -osarch "linux/amd64 linux/arm darwin/amd64 windows/amd64" -output "dist/{{.Dir}}_{{.OS}}_{{.Arch}}"
- ghr -t ${GITHUB_TOKEN} -u ${USERNAME} -r ${CIRCLE_PROJECT_REPONAME} --replace $(cat release_tag) dist/

tag に正規表現を指定できるので特定形式に縛りたい場合は縛る。上の例だと semver 形式で最初に v がついている tag を push すると deployment セクションが走るようになる。

静的なファイルも一緒に配布したい場合は commands の ghr の前くらいに cp で dist の下にコピーしてやるとかする。

      - cp dotor.yml dist/dotor.yml

詳しくは https://circleci.com/docs/configuration/ を参照。ただしサンプル通りに owner を指定すると deployment セクションが走らなくなるので指定しないこと。

生成したい OS と arch の指定は https://github.com/mitchellh/gox を参照。 commands の gox の行の osarch のところを変更してやればいける。


release page

設定が終わった状態で次のように git tag を push してやる。

git tag v1.2.3

git push origin master --tags

そうすると次のように各 OS / arch のバイナリーがダウンロードできるようになる。

release-page.png