おでーぶでおでーぶ

いろいろ書く。いろいろ。

Android app の versioning と naming

弊社ァでは今までリリースごとに1つずつバージョンを上げていたけれど、以下の問題点が存在した。

  • meaninglessなバージョンなので「それはアプリのx.y.zバージョンだとどれなのか」が分かりづらい。 e.g. SDK とのやり取り
  • Internal Trackテスト版ではログが有効であるなど、そのアプリをそのままリリースはできない。したがって最終的なリリース版は内部テストの回数だけ番号が上がってしまう。どのapkがproduction apkが分かりづらく、↑の問題をさらに加速させる。

そこで versioning と naming をうまくやることで上記の問題点を解決することにした。

  • CI でしかリリース署名apkは作らない
  • release ブランチの成果物を production artifacts としている
  • internal/xxx ブランチの成果物は Internal Track で使う artifacts

として、以下の記述にしている。

ext {
    isForInternalTrack = System.getenv("CI") == "true" && System.getenv("CIRCLE_BRANCH")?.startsWith("internal/")
    isReleaseCandidate = !isForInternalTrack && System.getenv("CI") == "true" && System.getenv("CIRCLE_BRANCH") == "release"
}

android {
    defaultConfig {
        applicationId ...

        def versions = [
                "major"   : 1,
                "minor"   : 0,
                "patch"   : 0,
                "internal": 0
        ]

        assert 0 <= versions["major"] && versions["major"] <= 99
        assert 0 <= versions["minor"] && versions["minor"] <= 99
        assert 0 <= versions["patch"] && versions["patch"] <= 99
        assert 0 <= versions["internal"] && versions["internal"] <= 99

        versionName versions["major"] + "." + versions["minor"] + "." + versions["patch"]

        if (!isReleaseCandidate) {
            versionNameSuffix "-${hashOrCINum}-non-production"
        }

        if (isForInternalTrack) {
            versionNameSuffix = (versionNameSuffix + "-internal-track")
        }

        // max value which GooglePlay allows is 2,100,000,000. 
        versionCode 1_000_000 * versions["major"] + 10_000 * versions["minor"] + 100 * versions["patch"] + versions["internal"]

        ...
    }
}

リリース自体を自動化してもっとシュッとしたい(小並感)