弊社ァでは今までリリースごとに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"] ... } }
リリース自体を自動化してもっとシュッとしたい(小並感)