Files
werkregie/doc/adrs/0001-2026-10-11.temurin-25.md
2026-10-11 12:19:46 +02:00

126 lines
5.0 KiB
Markdown

# 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 25 `GLIBC_2.17`,
a distribution's OpenJDK the glibc of its distribution, e.g. `GLIBC_2.38` for 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 vendor `JvmVendorSpec.ADOPTIUM`.
werkprobe keeps `options.release = 17` for 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:
1. werkator: its build environment gets Temurin 25 beside OpenJDK 21, so no build breaks.
2. One PR per repository switches it to 25, with Kotlin 2.4.21 and Gradle 9 where needed.
3. 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.ADOPTIUM` and 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.