RenovateでCompose CompilerとKotlinを合わせてアップデートする
依存関係のアップデートを自動で行ってくれるRenovate、Androidの個人開発でもとても便利に使っているのですがJetpack Composeで開発しているリポジトリでは若干困りごとがあります。
困りごと
Jetpack ComposeのCompilerはKotlinのバージョンと強い依存関係があり、Compilerで想定していないKotlinバージョンとの組み合わせではビルドが通りません。
また、このCompose Compilerはkaptやkspといった依存関係には定義せずbuild.gradle.ktsにバージョンのみ指定する形になっているため、通常ではRenovateのアップデート対象になりません。
android {
composeOptions {
kotlinCompilerExtensionVersion = "1.4.5"
}
}
解決方法
Renovateには独自のManagerを作成する方法もあるのですが、今回はそこまでは行わずもっとお手軽に実現します。
バージョンカタログの準備
私は個人開発アプリのライブラリバージョン管理にTomlのバージョンカタログを使っています。
まずはCompose Compilerのバージョンもここで管理するようにします。
[versions]
kotlin = "1.8.20"
compose = "1.4.3"
# Compose Compiler version
# https://developer.android.com/jetpack/androidx/releases/compose-compiler
compose-compiler = "1.4.5"
ここに記載したバージョンをbuild.gradle側で参照します。
android {
composeOptions {
kotlinCompilerExtensionVersion = libs.versions.compose.compiler.get()
}
}
当然ですが、これだけではRenovateで更新はできません。
Renovateに管理させるためにはアーティファクトの情報を渡す必要があります。
実は、build.gradleに記載の必要がないだけでCompose Compilerのリリースノートを見るとMavenのアーティファクトIDが記載されています。
このアーティファクトIDをlibs.versions.tomlに追加します。追加するだけでbuild.gradle側で使う必要はありません。
[libraries]
compose-compiler = { module = "androidx.compose.compiler:compiler", version.ref = "compose-compiler" }
Renovateの設定
最初にも書いたとおり、Compose CompilerのバージョンはKotlinのバージョンと強い依存関係にあり、どちらか一方のみをアップデートすることはできないことが多いです(Compose CompilerのBug fixでCompose Compilerだけ上げられることが極稀にある程度)。
なのでCompose CompilerとKotlinは一つのPull requestでアップデートするようにRenovateを設定します。
{
"$schema": "https://docs.renovatebot.com/renovate-schema.json",
"extends": [
"config:base"
],
//...省略
"packageRules": [
{
"matchPackagePrefixes": [
"androidx.compose.compiler", "org.jetbrains.kotlin:"
],
"groupName": "Compose Compiler and Kotlin",
"groupSlug": "compose_compiler_and_kotlin"
}
]
}
androidx.compose.compiler
とorg.jetbrains.kotlin:
が一つのPull requestでアップデートされるようグループ化します。
これで、Compose CompilerとKotlinのバージョンが同じPull requestでアップデートされるようになったので、Compatibleな組み合わせであればCIが通るようになるのでマージするといった運用が可能になりました。
Discussion