gobump で Go プロジェクトのバージョニングをおこなう の続き。すっかり書くのが遅くなってしまったけれど、別にもったいぶるような特別なことはないです。
ここでは、Pull Request のマージを契機に、バージョンを進めるコミットをし、push して、GitHub のリリースを進める……ということを CI でおこなうことを目標とします。
これはわりと簡単で、以下のようなスクリプトで実現できます。必要なものは gobump、ghr、jq と GitHub のパーソナルアクセストークン。通常はクロスコンパイルするのに gox も使うことになるでしょう。
set -e
repo_owner=motemen
repo_name=test-repository
committer_email=motemen+gobump-bot@gmail.com
committer_name=motemen
pr_number=$(git show --pretty=%s | sed -n 's/^Merge pull request #\([0-9]\{1,\}\) .*/\1/p')
if [ -n "$pr_number" ]; then
new_version=$(gobump patch -w -v | jq -r '.[]')
if ! git diff --exit-code ./*.go; then
git config --global user.email "$committer_email"
git config --global user.name "$committer_name"
git add ./*.go
git commit -m "bump version to $new_version"
git push "https://$GITHUB_TOKEN@github.com/$repo_owner/$repo_name" HEAD:master >/dev/null 2>&1
ghr --username "$repo_owner" --repository "$repo_name" --token "$GITHUB_TOKEN" --replace --draft "v$new_version" dist/
fi
fi
gobump
に -v
オプションを与えると JSON で
{
"VERSION": "0.1.2"
}
のように出力するので、スクリプトから利用しやすい。
ドラフトとしてリリースを作成するので、デフォルトでは公開されません。そろそろ公開するか、という機運になってきたらプロジェクトのリリースページから文言を整えて publish する、というフローでリリースできます。
以下、CI as a Service を利用する場合。
上記のスクリプトをリポジトリに置いて、after_success
フェーズで実行する。.travis.yml
はこんな感じ。
language: go
go:
- 1.4
before_install:
- go get github.com/mitchellh/gox
- gox -build-toolchain
- go get github.com/motemen/gobump/cmd/gobump
- go get github.com/tcnksm/ghr
script:
- go test -v ./...
- gox -output "dist/{{.OS}}_{{.Arch}}_{{.Dir}}"
after_success:
- ./scripts/bump-release.sh
Wercker には専用のステップを作っていて、motemen/ghq や motemen/gore ではこれを使っています。こちらはもうちょっと高度なことをしていて、Pull Request についたラベルによってマイナーバージョンを上げる、みたいなこともできる(作ったはいいものの、使わなかったけど……)。werckerbot 名義でコミットします。
このステップは GOBUMP_NEW_VERSION
環境変数に新しいバージョンを格納するので、その後のステップから利用できます。
wercker.yml のエッセンスを見るとこんな感じ。
deploy:
steps:
...
- motemen/gobump-github-pull-request:
github_token: $GITHUB_TOKEN
- wercker/gox:
os: darwin linux windows
arch: 386 amd64
output: '{{.Dir}}_{{.OS}}_{{.Arch}}/{{.Dir}}'
dest: $WERCKER_OUTPUT_DIR/pkg
- tcnksm/zip:
input: $WERCKER_OUTPUT_DIR/pkg
output: $WERCKER_OUTPUT_DIR/dist
- script:
name: set release tag
code: |
if [ -n "$GOBUMP_NEW_VERSION" ]; then
export RELEASE_TAG="v$GOBUMP_NEW_VERSION"
fi
- tcnksm/ghr:
token: $GITHUB_TOKEN
input: $WERCKER_OUTPUT_DIR/dist
replace: true
version: $RELEASE_TAG
opt: --draft
https://github.com/motemen/ghq/compare/pull/61/head...v0.7.1 や https://github.com/motemen/gore/compare/pull/42/head...v0.2.5 で、PR のマージを契機にバージョンを上げることができているのが確認できます。
ちなみに Wercker は専用のツールを使うとビルド/デプロイプロセスをローカルの Docker を使って実行することができて、ちょっと癖はあるけれどこれがデバッグにとても便利だった。CI as a Service のデバッグは骨が折れるので……。