Scala Steward

Automatisierte Dependency-Updates für JVM Projekte

Worum geht es?

  • Unsere Software hat Abhängigkeiten
  • Abhängigkeiten sollten aktuell bleiben
  • diese Arbeit ist aufwändig und langweilig

Beispiel

https://github.com/akka/akka/pull/32591

Inhalt

  1. Features
  2. Zahlen & Fakten
  3. Historie & Implementierung

Features

Unterstütze Build Tools

  • Gradle
  • Maven
  • sbt
  • Mill
  • Scala CLI

Maven

pom.xml

<hikari.version>6.2.1</hikari.version>
...
<dependency>
  <groupId>com.zaxxer</groupId>
  <artifactId>HikariCP</artifactId>
  <version>${hikari.version}</version>
</dependency>

Gradle

gradle/libs.versions.toml

[versions]
apache-poi = "5.4.0"

[libraries]
apache-poi = { module = "org.apache.poi:poi",
               version.ref = "apache-poi" }

sbt

build.sbt

libraryDependencies ++= Seq(
  ...
  "org.postgresql" % "postgresql" % "42.7.5",
  ...
)

Mill

build.mill

def ivyDeps = Agg(
  ...
  ivy"activemq:activemq:4.0-M3",
  ...
)

Unterstütze Git Forges

  • GitHub
  • GitLab
  • Bitbucket Cloud und Server
  • Forgejo / Gitea
  • Azure Repos

Konfiguration pro Instanz / Repo

.scala-steward.conf

updates.pin = [
  { groupId = "com.oracle.database.jdbc",
    artifactId = "ojdbc8", version = "19." }
]

commits.message =
  "bump: ${artifactName} ${nextVersion} (was ${currentVersion})"

pullRequests.frequency = "@monthly"

Artefakt-Migrationen

Umbenennung von groupId und/oder artifactId

Post-update hooks

Ausführung beliebiger Programme nach einem Update

Scalafix-Migrationen

Umschreiben des Quelltexts an neue Version

scalafix-migrations.conf

Zahlen & Fakten

Community

  • mehr als 6250 Commits
  • ... seit September 2018
  • ... von 119 Personen

Öffentliche Instanz

  • betrieben von 2018 bis 2022 von mir;
    seit 2022 von VirtusLab
  • hat bis zu 2400 Projekte aktualisiert
  • > 429.000 erstellte PRs
  • > 237.000 zusammengeführte PRs

Kommerzielle Nutzung

  • > 2.500.000 Downloads des Docker Image
  • 40 Unternehmen gelistet in README
    (darunter Zalando, Spotify, Guardian, Avast, Springer Nature, ...)

Bei uns

  • seit September 2020
  • 11 Projekte
  • 122 MRs auf GitLab
  • 3189 PRs auf Bitbucket

Historie & Implementierung

Wie alles begann

  • Aufsatz auf sbt-updates Plugin
  • daher nur für sbt-Projekte
  • PRs nur auf GitHub
  • aufgebohrter Regex zum Ersetzen
    von Versionsnummern

Stand heute

  • Batch-Prozess
    1. Dependencies extrahieren
    2. neue Versionen ermitteln
    3. Versionsnummern suchen und ersetzen
    4. PR erstellen
  • Caches everywhere: Repos, Versionen, PRs

Ausblick

Dependencies via Build Server Protocol (BSP) extrahieren

  • Scala Steward automatisiert Dependency-Updates
  • ... unterstützt viele JVM Build Tools und Git Forges
  • ... kann vielseitig konfiguriert werden
  • ... hat noch Kapazitäten frei für eure Projekte!

github.com/scala-steward-org/scala-steward