- Web Engineer
- アウトバウンド営業
- Webエンジニア(経験者)
- Other occupations (18)
- Development
- Business
はじめに
現在、個人開発しているAndroidアプリでFirebase App Distributionへの自動デプロイする際に利用している、GitHub Actionsを利用したアプリバージョン情報の更新 について解説していこうと思います。
次の記事では、実際に今回の方法と組み合わせて 1クリックでバージョン更新 & Firebase App Distributionにアプリをデプロイする方法 について執筆予定です。
それでは早速見ていきましょう!
どうしてやったの?
Androidアプリを継続リリースするためには、リリースAPKをビルドする前にアプリのバージョン情報を更新する必要があります。
バージョン情報は「バージョンコード」と「バージョン名」の2つで構成されています。
プロジェクトのビルドファイルapp/build.gradle.kts
にあるversionCode
/versionName
がそれぞれ「バージョンコード」/「バージョン名」に対応します。
ここを開発者が編集しリリースAPKをビルドする、というのが一般的です。
/// app/build.gradle.kts
android {
/* ~中略~ */
defaultConfig {
/* ~中略~ */
versionCode = 12
versionName = "0.10.0"
}
/* ~中略~ */
}
この部分を GitHub Actionsを利用して自動化する ことで、タイムコストを削減しつつ手動更新によるヒューマンエラーを防ぐことができます。
また、GitHub上で実行するため開発者の環境に依存せず実行できるというメリットもあります。
何をやったの?
今回、この仕組みを作るにあたって行なったことは大きく分けて2つです。
- バージョン情報を更新するGradleタスクの実装
- 1を実行するGitHub Actionsのワークフローの実装
それでは、それぞれで具体的に何をやったのか、詳しく見ていきましょう。
ちなみに、今回Gradleファイルを扱いますが、Kotlin DSLでの実装を前提としています。
1. バージョン情報を更新するGradleタスクの実装
まず、versionCode
とversionName
からバージョンコード/バージョン名を操作するクラスを実装します。
/// app/build.gradle.kts
// バージョンを取り扱うクラス
class Version(private var code: Int, version: String) {
private var major: Int
private var minor: Int
private var patch: Int
init {
// "0.0.0"で表現されるバージョン名を、メジャー/マイナー/パッチに分割 & 整数として操作できるように管理する。
val (major, minor, patch) = version.split(".").map { it.toInt() }
this.major = major
this.minor = minor
this.patch = patch
}
// バージョン情報を操作するメソッドをコマンドから実行するために、各メソッド名を保持。
val functionsByName = listOf(::bumpMajor, ::bumpMinor, ::bumpPatch).associateBy { it.name }
@SuppressWarnings("unused")
fun bumpMajor() {
major += 1
minor = 0
patch = 0
code += 1
}
@SuppressWarnings("unused")
fun bumpMinor() {
minor += 1
patch = 0
code += 1
}
@SuppressWarnings("unused")
fun bumpPatch() {
patch += 1
code += 1
}
fun getName(): String = "$major.$minor.$patch"
fun getCode(): Int = code
}
バージョン番号/バージョン情報それぞれの文字列から、メジャー/マイナー/パッチを抽出して保持し、それぞれを操作するメソッドを実装しています。
次にGradleタスクのコマンドでそれぞれのメソッドを実行するために、メソッド名のリストをfunctionsByName
で保持しておきます。
次に実際にバージョン情報を操作するGradleタスクのコマンドを実装していきます。
/// app/build.gradle.kts
tasks.addRule("Pattern: bumpVersion") {
if (this.matches(Regex("bump(Major|Minor|Patch)Version"))) {
task(this) {
doLast {
// コマンド名から実行タイプを抽出
val type = this@addRule
.replace(Regex("bump"), "")
.replace(Regex("Version"), "")
println("Bumping ${type.lowercase(Locale.getDefault())} version...")
// 旧バージョンを取得
val oldVersionCode = android.defaultConfig.versionCode ?: return@doLast
val oldVersionName = android.defaultConfig.versionName ?: return@doLast
val version = Version(oldVersionCode, oldVersionName)
// メソッド名を取得しそのメソッドを実行(実行不可であればエラー)
val methodName = "bump${type}"
version.functionsByName[methodName]?.invoke() ?: error("Unknown method: $methodName")
// 更新したバージョンを取得
val newVersionCode = version.getCode()
val newVersionName = version.getName()
println("${oldVersionName}($oldVersionCode) -> ${newVersionName}($newVersionCode)")
// ビルドファイルに更新したversionName・versionCodeを書き込み
var updated = buildFile.readText()
updated = updated.replaceFirst(
"versionName = \"${oldVersionName}\"",
"versionName = \"${newVersionName}\""
)
updated = updated.replaceFirst(
"versionCode = $oldVersionCode",
"versionCode = $newVersionCode"
)
buildFile.writeText(updated)
}
}
}
}
// バージョン情報を出力するコマンド群
tasks.register("printVersionCode") {
doLast {
println(android.defaultConfig.versionCode)
}
}
tasks.register("printVersionName") {
doLast {
println(android.defaultConfig.versionName)
}
}
今回は、
- メジャー/マイナー/パッチそれぞれを操作する
bumpMajorVersion
/bumpMinorVersion
/bumpPatchVersion
の3コマンド - バージョンコード/バージョン名それぞれを標準出力する2コマンド
の合計5コマンドを実装しています。
個々の処理が何を行っているかはコード上のコメントを参照していただけると幸いですが、重要な部分を抜粋して解説します。
…
記事の続きは下のURLをクリック!
https://rightcode.co.jp/blogs/50911
エンジニア積極採用中です!
現在、WEBエンジニア、モバイルエンジニア、デザイナー、営業などを積極採用中です!
採用ページはこちら:https://rightcode.co.jp/recruit
社員の声や社風などを知りたい方はこちら:https://rightcode.co.jp/blogs?category=life
社長と一杯飲みながらお話しませんか?(転職者向け)
特設ページはこちら: https://rightcode.co.jp/gohan-sake-president-talk
もっとワクワクしたいあなたへ
現在、ライトコードでは「WEBエンジニア」「モバイルエンジニア」「ゲームエンジニア」、「デザイナー」「WEBディレクター」「営業」などを積極採用中です!
ライトコードは技術力に定評のある受託開発をメインにしているIT企業です。
有名WEBサービスやアプリの受託開発などの企画、開発案件が目白押しの状況です。
- もっと大きなことに挑戦したい!
- エンジニアとしてもっと成長したい!
- モダンな技術に触れたい!
現状に満足していない方は、まずは、エンジニアとしても第一線を走り続ける弊社代表と気軽にお話してみませんか?
ネット上では、ちょっとユルそうな会社に感じると思いますが(笑)、
実は技術力に定評があり、沢山の実績を残している会社ということをお伝えしたいと思っております。
- ライトコードの魅力を知っていただきたい!
- 社風や文化なども知っていただきたい!
- 技術に対して熱意のある方に入社していただきたい!
一度、【Wantedly内の弊社ページ】や【コーポレートサイト】をのぞいてみてください。