対象とする方
- 自動ビルド環境がある and
- コミットのたびに自動ビルドしたい and
- ビルドごとに違うバージョンにしたい
はじめに
コミットのたびに自動ビルドしたい場合、同じバージョン値のアプリを量産してしまったらカオスです。でも都度アプリケーションのバージョン値を変更してコミットするのは非常に手間です。なので、SubversionでいうリビジョンIDみたいなものをバージョン値の3桁目に埋め込みたいわけです。
しかしながらgitではリビジョンIDではなくハッシュです。これは16進数だし数値も時系列ごとに大きくなりません。ということで、この記事ではリビジョンIDの代わりにコミットした数を取得する方法と、それを埋め込むシェルスクリプトについて解説します。
コミットした数を取得する
これは簡単に、git logで出てきた行数をコミットした数とします。
# コミット回数を取得
count=`git log --one-line | wc -l`
ただし、この方法はブランチ同士では同じ番号になることがある点に注意が必要です。Unityゲーム開発の現場ではコンフリクトすると面倒なので、あまり複雑なブランチ管理をしていることは少ないと思いますが、そういう現場では注意しましょう。
コミットした数をバージョン値に埋め込む
私の好みですが、 メジャーバージョン.マイナーバージョン.コミットした数 になるように3桁目を書き換えるシェルスクリプトを作ります。この時メジャーバージョンとマイナーバージョンはコミットされた値がそのまま使われるようにします。
# メジャー、マイナーバージョンを取得
set $(grep bundleVersion ProjectSettings/ProjectSettings.asset | sed 's/\./ /g')
major=${2}
minor=${3}
# 新しいバージョン値をUnityの設定ファイルに書き込む
version=$major.$minor.$count
gsed -ri "s/(bundleVersion: ).*$/\1$version/" ProjectSettings/ProjectSettings.asset
作成したスクリプト全体
# コミット回数を取得
count=`git log --one-line | wc -l`
# メジャー、マイナーバージョンを取得
set $(grep bundleVersion ProjectSettings/ProjectSettings.asset | sed 's/\./ /g')
major=${2}
minor=${3}
# 新しいバージョン値をUnityの設定ファイルに書き込む
version=$major.$minor.$count
gsed -ri "s/(bundleVersion: ).*$/\1$version/" ProjectSettings/ProjectSettings.asset
上記はgnu版のsedを使っているので、別途brew install gsedなどでインストールを行なってください。
Jenkinsのシェルの実行などにこのスクリプトを仕込んでください。
メリットとデメリット
この方法を使うことで発生するメリットとデメリットをまとめます。
メリット
- 自動的に作られたバイナリに一意のバージョンが付く
- どのコミットをビルドしたものかがバージョン値から特定できる
デメリット
- リポジトリの内容から修正されたものがビルドされるのが気持ち悪い
さいごに
私はこの方法が気に入っていますが、他の方法としてはゲーム画面内にアプリ情報を表示するエリアを作って、そこにコミットハッシュ値を表示させる、といった方法もアリだと思います。この方法の場合ブランチの区別も付く点が優れていますが、アプリケーションを起動しないと情報が得られない点がデメリットです。
他に、もっと業界標準的なやり方などご存知の方がいらっしゃいましたら是非コメント欄で教えてください。ありがとうございました。