アプリのコミットハッシュを取得する

開発中のアプリを複数の端末に入れたり消したりしながら動作確認していると、「これはどの時点のコミットからビルドしたんだっけ?」を知りたくなることが増えてきたので、 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