HackToTech

Hack To Technology

dependabotのgradleにKotlin DSLでpluginsとdependenciesで同じバージョンを指定してPRを作らせたい

残念ながら、gradleのバージョンが古くて(6.9系)version catalogが使えなかったので、その場合にしか役に立たない備忘録

おそらくgradleのバージョンが7.2以上なら多分version catalog使って、こんな面倒なことしなくても色々解決する気がしている developer.android.com Add support for Gradle Version Catalogs (Gradle 7.0) · Issue #3121 · dependabot/dependabot-core · GitHub

後は、最近GAされたdependabotの grouped version を使っても出来るような気もするが、個人的にはktsで完結している方が好みではある github.blog

以下は、通常であればそれぞれで指定する意味はないケースだが、今回は例としてあげる
できればバージョンを一箇所で指定して読み取るのがベストだが、
後述の理由によりそれができないので springBootVersion の変数をそれぞれ指定して作ることによって、dependabotのPRとしては1つ作成させるようにしている

  • build.gradle.kts
plugins {
  val springBootVersion = "3.1.1"
  id("org.springframework.boot") version springBootVersion 
}
  • module/build.gradle.kts
dependencies {
  val springBootVersion = "3.1.1"
  implementation("org.springframework.boot:spring-boot-starter:$springBootVersion")
}

そうすると↓みたいな感じで、変数に対してまとめてPRを出してくれる

で、なぜ一箇所で定義して読み取る方式ができないかというと、
古い gradle のージョンで恐らく出来ることといえば、
gradle.properties を使って pluginManagement 側で指定しつつ、 dependencies 側は inejct することになると思う

  • gradle.properties
springBootVersion=3.1.1
  • settings.gradle.kts
pluginManagement {
  plugins {
    val springBootVersion: String by settings
    id("org.springframework.boot") version springBootVersion
  }
}
  • build.gradle.kts
plugins {
  // pluginManagement 側で指定しているので特に指定しない
  id("org.springframework.boot")
}
  • module/build.gradle.kts
dependencies {
  val springBootVersion: String  by project
  implementation("org.springframework.boot:spring-boot-starter:$springBootVersion")
}

ただこれだと、gradleは正しく読み取って処理を行えるが、
dependabotは gradle.properties で指定して埋め込んだバージョンを理解できなくてPRを作ってくれないので、
最初に紹介した変数を複数定義する方式を今回は採用した

ちなみにこの変数を使う方式だと同じバージョンを複数のライブラリに使ってまとめてアップデートすることも可能だったりする

  • build.gradle.kts
dependencies {
  val awsSdkVersion = "2.20.135"
  implementation("software.amazon.awssdk:sts:$awsSdkVersion")
  implementation("software.amazon.awssdk:s3:$awsSdkVersion")
  implementation("software.amazon.awssdk:cognitoidentityprovider:$awsSdkVersion")
}