werkator build succeeded after 00:38
Co-authored-by: claude-code <claude-code@javagil.de>
5.0 KiB
5.0 KiB
Temurin 25 as JDK and Runtime of All werk Repositories
Status:
- proposed: 2026-10-11
- accepted: 2026-10-11
- rejected: -
- superseded: -
- revised: 2026-10-11, see "Revision of 2026-10-11"
Decision [accepted]: All werk repositories build with Temurin 25, and each service runs on a runtime jlinked from it; Werkator's build environment provides Temurin 25, so no build downloads a JDK.
Context and Problem Statement
Each werk repository chose its JDK and its runtime on its own (state on 2026-10-11):
| Repository | JDK | Vendor | Download | Gradle | Kotlin | Runtime on the host |
|---|---|---|---|---|---|---|
| werkator | 21 | Temurin | Foojay 0.8.0 | 8.14.5 | 2.2.0 | jlinked, mih09 |
| werkregie | 21 | Temurin | Foojay 1.0.0 | 9.8.1 | 2.4.21 | jlinked |
| werkrevisor, statistics | 21 | Temurin | Foojay 0.8.0 | 8.14.5 | 2.2.0 | jar on mih09 |
| werkcrappit | 21 | any | - | 9.8.0 | - | none, a Gradle plugin |
| werkbaum, backend | 21 | any | - | 9.1.0 | 2.2.20 | full Temurin JDK 21 in the home, mih00 |
| werkprobe | any, bytecode 17 | any | - | 9.6.0 | - | Java 17 of the managed webspaces |
mi wants one choice for all of them.
Technical Background
- jlink compiles nothing; it copies the vendor's binaries, so the vendor's build platform sets the glibc floor of a runtime (Werkator ADR 0006, Werkator PR#62).
- Measured over all shared libraries: Temurin 21 needs
GLIBC_2.15, Temurin 25GLIBC_2.17, a distribution's OpenJDK the glibc of its distribution, e.g.GLIBC_2.38for Ubuntu 24.04's OpenJDK 21. - mih09 and mih00 run Debian 12 with glibc 2.36.
- Werkator's build environment has Debian's OpenJDK 21; a repository that pins Temurin downloads it with Foojay in each build.
Considered Options
- Temurin 25 everywhere
- Temurin 21 everywhere
- Any JDK for compiling, Temurin only where a runtime is jlinked
Temurin 25 Everywhere
Java 25 is the current LTS release.
A test build on 2026-10-11, of a copy of each main with the toolchain set to 25, showed:
- werkregie, werkcrappit and werkprobe build unchanged; the jlinked runtimes report Temurin 25.0.4.
- werkator, werkbaum and the statistics service of werkrevisor need Kotlin 2.4.21: Kotlin 2.2.0 and 2.2.20 have no JVM 25 target. With Kotlin 2.4.21 they build, and werkator's runtime bundle reports Temurin 25.0.4.
- PIT 1.30, JaCoCo 0.8.13 and 0.8.15, Spring Boot 4.0, Trixnity, sqlite-jdbc and H2 work with 25.
- Only tests that need a git checkout or werkdock's sandbox failed, and they fail with JDK 21 as well.
Advantages
- One JDK and one runtime for all repositories, with the longest support of an LTS release.
- A runtime jlinked from Temurin 25 starts on every Hostsharing host with glibc 2.17 or newer.
Disadvantages
- Three repositories must raise Kotlin to 2.4.21 first.
- Gradle 8.14 does not run on JDK 25; werkator and werkrevisor need Gradle 9 and Foojay 1.0.0, as werkregie.
- werkprobe stays on Java 17 bytecode: the managed webspaces bring their own Java 17.
Temurin 21 Everywhere
Advantages
- No Kotlin and no Gradle upgrade.
Disadvantages
- A move to 25 is still due later, with the same work.
Any JDK for Compiling, Temurin Only Where a Runtime Is jlinked
The state of 2026-10-11.
Advantages
- No change.
Disadvantages
- What the CI tests is not what runs on the hosts.
- Two Foojay versions and downloads in each build stay.
Decision Outcome
Temurin 25 everywhere, decided by mi on 2026-10-11:
- Each repository builds with the toolchain
JavaLanguageVersion.of(25)and the vendorJvmVendorSpec.ADOPTIUM. werkprobe keepsoptions.release = 17for the webspaces. - Werkator's build environment provides Temurin 25; Foojay stays only as a fallback.
- Each service runs on a runtime jlinked from Temurin 25, werkbaum included; the full JDK in its home goes.
The rollout, in this order:
- werkator: its build environment gets Temurin 25 beside OpenJDK 21, so no build breaks.
- One PR per repository switches it to 25, with Kotlin 2.4.21 and Gradle 9 where needed.
- OpenJDK 21 leaves the build environment.
Consequences
- A new repository builds with Temurin 25 from the start.
- The module list of each jlinked runtime is checked again with jdeps when its dependencies change.
- The next LTS release gets a decision of its own.
Revision of 2026-10-11
The build environment does not get Temurin 25; Foojay provides it, decided by mi on 2026-10-11 (werkregie PR#22).
- The reason above, "so that no build downloads a JDK", is wrong. The builds on mih09 share one Gradle home, and Foojay downloads a JDK into it only once; Temurin 21 lies there since 2026-09-17.
- Werkator PR#62 had already rejected a Temurin baked into the rootfs: each Java update would mean a new archive of about 425 MB, uploaded by hand.
What changes:
- Each repository pins Temurin 25 with
JvmVendorSpec.ADOPTIUMand loads it with Foojay 1.0.0. - Werkator's build environment stays as it is; its OpenJDK 21 runs Gradle.
- The rollout is one PR per repository, with Kotlin 2.4.21 and Gradle 9 where needed; steps 1 and 3 above are dropped.