開発中のアプリを複数の端末に入れたり消したりしながら動作確認していると、「これはどの時点のコミットからビルドしたんだっけ?」を知りたくなることが増えてきたので、 git のコミットハッシュを取得して Android / iOS アプリに表示する方法を調べました。
HEAD のコミットハッシュを取得する
下記どちらかのコマンドで取得できます。体感値ですが rev-parse のほうが若干速い気がします。
git rev-parse --short HEAD
- HEAD が指す先の、コミットハッシュの短縮形を表示
git log -1 --format='%h'
- コミット履歴の先頭 1 件だけ、コミットハッシュの短縮形を表示
Android アプリに表示する
アプリの versionName の末尾にコミットハッシュを付加します。
アプリモジュールの build.gradle に下記の設定を追加します。
def commitHash = ["sh", "-c", "cd ${project.rootDir}; git rev-parse --short HEAD"].execute().in.text.trim() android { buildTypes { debug { versionNameSuffix "_" + commitHash } } }
アプリのコードで PackageInfo を取得すると、 versionName に 1.0.0_abcd1234
のような値が入っています。
val packageInfo = context.packageManager.getPackageInfo(context.packageName, 0) val versionName = packageInfo.versionName
サンプルコードはこちら github.com
iOS アプリに表示する
iOS の CFBundleShortVersionString は x.y.z 形式以外の文字列を受け付けないため、コミットハッシュをそのまま付加することはできません。したがって、 Info.plist に独自のキーを定義し、そこにコミットハッシュを設定するようにします。
まず、 Xcode の Targets > Info に以下の key-value pair を追加します。
Key | Type | Value |
---|---|---|
CommitHash | String | undefined |
次に Build Settings の Preprocess Info.plist File
を YES に変更します。
Build Phases の Compile Sources の前に Run Script Phase を追加し、下記のコマンドを設定します。
plistBuddy="/usr/libexec/PlistBuddy" infoPlistFile="${TEMP_DIR}/Preprocessed-Info.plist" commitHash=$(git rev-parse --short HEAD) $plistBuddy -c "Set :CommitHash $commitHash" $infoPlistFile
アプリのコードで CFBundleShortVersionString と CommitHash をそれぞれ取得し、連結すると 1.0.0_abcd1234
のような値を得ることができます。
let info = Bundle.main.infoDictionary! let versionName = "\(info["CFBundleShortVersionString"]!)_\(info["CommitHash"]!)"
Info.plist のプリプロセスを有効にし、もとのファイルは書き換えず中間ファイルにだけ値を設定するのがポイントです。
サンプルコードはこちら github.com