みずきち日記

ひらすらプログラミング

Android プロジェクトのアプリバージョンを自動で更新する

Android のアプリバージョンは build.gradle 内で定義されています。

android {
  ...
  defaultConfig {
    versionCode 1
    versionName 1.0.0
    ...
  }
}

この記事では、build.gradle 内のバージョンを CI などを使って自動で更新出来るようにします。

参考記事では、grale script を使った方法でやってますが、CI で実行する場合 gradle の環境構築などが走ってしまい無駄なので、 shell script を使って更新してみることにします。

参考記事: https://medium.com/@IlyaEremin/npm-version-for-gradle-android-9137a7dc273c

まずは、アプリのバージョンを定義する properties ファイルを作成します。 今回は、appversions.properties としました。

VERSION_NAME=1.0.0
VERSION_CODE=1

先程の build.gradle 内のバージョンを appversions.properties から参照する形に書き換えます。

android {
  ...
  defaultConfig {
    def versionPropsFile = file('appversions.properties')
    def versionProps = new Properties()
    versionProps.load(new FileInputStream(versionPropsFile))
    
    versionCode versionProps['VERSION_CODE'].toInteger()
    versionName versionProps['VERSION_NAME']
    ...
  }
}

これで、ビルド時に appversions.properties の中身を使うようになります。 あとは、shell script で properties を書き換えるようにします。

#!/bin/bash
function get_version_code() {
    command="grep -o 'VERSION_CODE=[^,]*' appversions.properties | sed -e 's/^VERSION_CODE=//'"
    eval $command
}
VERSION_NAME=$1
VERSION_CODE=$((`get_version_code`+1))
echo -e "VERSION_NAME=$1\nVERSION_CODE=$VERSION_CODE" > appversions.properties

あとは、CI 上で ./bump.sh [version-name] と実行すれば、version code が自動でインクリメントされ、version name が指定した文字列に置換されます。 例えば、github actions などでバージョンを上げるタイミングを上手くフックして上記を実行すれば、バージョンを更新する PR を自動で作成する事もできます。 これは、次回の記事で書いてみたいと思います。