🧰

RenovateでCompose CompilerとKotlinを合わせてアップデートする

2023/05/05に公開

依存関係のアップデートを自動で行ってくれるRenovate、Androidの個人開発でもとても便利に使っているのですがJetpack Composeで開発しているリポジトリでは若干困りごとがあります。

https://github.com/renovatebot/renovate

困りごと

Jetpack ComposeのCompilerはKotlinのバージョンと強い依存関係があり、Compilerで想定していないKotlinバージョンとの組み合わせではビルドが通りません。
また、このCompose Compilerはkaptやkspといった依存関係には定義せずbuild.gradle.ktsにバージョンのみ指定する形になっているため、通常ではRenovateのアップデート対象になりません。

android {
    composeOptions {
        kotlinCompilerExtensionVersion = "1.4.5"
    }
}

解決方法

Renovateには独自のManagerを作成する方法もあるのですが、今回はそこまでは行わずもっとお手軽に実現します。

https://docs.renovatebot.com/modules/manager/regex/

バージョンカタログの準備

私は個人開発アプリのライブラリバージョン管理に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が記載されています。

https://developer.android.com/jetpack/androidx/releases/compose-compiler

このアーティファクト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.compilerorg.jetbrains.kotlin:が一つのPull requestでアップデートされるようグループ化します。

これで、Compose CompilerとKotlinのバージョンが同じPull requestでアップデートされるようになったので、Compatibleな組み合わせであればCIが通るようになるのでマージするといった運用が可能になりました。

Discussion