Skip to content

ci(build): build and release questdb-client on JDK 8#56

Merged
bluestreak01 merged 5 commits into
mainfrom
ci/release-on-jdk8
Jun 26, 2026
Merged

ci(build): build and release questdb-client on JDK 8#56
bluestreak01 merged 5 commits into
mainfrom
ci/release-on-jdk8

Conversation

@bluestreak01

Copy link
Copy Markdown
Member

Problem

We recently moved java-questdb-client to a JDK 8 floor — the client ships as the Java 8 io.questdb:questdb-client artifact, and ci.yml already treats JDK 8 as the source of truth (build-jdk8). But the Maven Central release pipeline (maven_central_release.yml) was still on newer JDKs:

Job Was Role
resolve JDK 11 reads versions
build-macos JDK 11 macOS native lib
build-linux-x86-64 / aarch64 / windows GraalVM 25 native libs
verify JDK 11 mvn verifytest gate
publish JDK 11 mvn deployships to Central
open-bump-pr JDK 11 snapshot bump PR

The POMs auto-activate a profile from the running JDK. On JDK 11 the java11+ profile (core/pom.xml) kicks in and changes what gets shipped:

  • javac source/target11 → bytecode is class-file v55, so a JDK 8 runtime hits UnsupportedClassVersionError.
  • source root → src/main/java11 (module-info + jdk.internal.math.FDBigInteger bridge).
  • deps → slf4j 2.0.17 + logback 1.5.25 (Java 11+).

So verify was testing — and publish was shipping — a Java 11 artifact, contradicting the "ships as a Java 8 artifact, released from JDK 8" contract.

Change

Move the entire release workflow to JDK 8.

setup-java jobs (5)resolve, build-macos, verify, publish, open-bump-pr: java-version: "11""8". Now the java8 profile activates, so verify/publish build and ship the real Java 8 artifact (source/target 1.8, src/main/java8 shim, logback 1.3.x).

Native-lib jobs (3)build-linux-x86-64, build-linux-aarch64, build-windows-x86-64: replace Install GraalVM JDK 25 with Install Temurin JDK 8 via the Adoptium latest-GA redirect (api.adoptium.net/v3/binary/latest/8/ga/<os>/<arch>/jdk/hotspot/normal/eclipse).

Why JDK 8 is correct for the native builds

The native build consumes only $JAVA_HOME/include/jni.h + include/<platform>/jni_md.h (verified in core/CMakeLists.txt, lines 95–128) and produces platform machine code, not Java bytecode. The JNI ABI is stable, so building against JDK 8 headers is fine — and is the most correct choice for a Java 8 floor. The Windows cross-compile's jni_md.h now comes from openjdk/jdk8u (jdk/src/windows/javavm/export/jni_md.h) instead of jdk25u; the macros/typedefs are byte-identical.

The manylinux containers (glibc 2.17 / 2.28) run Temurin 8 fine, and the install mirrors the prior wget-tarball pattern (no setup-java, which needs Node 20 unavailable in the old container).

Verification

  • YAML validated (yaml.safe_load).
  • Confirmed the Adoptium JDK 8 download URLs (x64 + aarch64) resolve to real tarballs.
  • Confirmed the openjdk/jdk8u Windows jni_md.h path resolves and contains the expected JNICALL/jint/jlong definitions.
  • No remaining 11 / 25 / graalvm / jdk25u references in the workflow.

Out of scope

rebuild_native_libs.yml also uses GraalVM JDK 25, but it's a separate utility workflow, not the release-to-Central path. Happy to align it in a follow-up if wanted.

The Maven Central release pipeline compiled, tested, and deployed the
artifact on JDK 11 (and built the native libraries on GraalVM JDK 25),
while ci.yml already treats JDK 8 as the source of truth. On JDK 11 the
java11+ Maven profile auto-activates, producing a Java 11 artifact
(class-file v52 -> v55, src/main/java11 shim, logback 1.5.x) that a JDK 8
runtime cannot load -- contradicting the "ships as a Java 8 artifact,
released from JDK 8" contract.

Move the whole release workflow to JDK 8:

- resolve, build-macos, verify, publish, open-bump-pr: setup-java 11 -> 8,
  so the java8 profile activates and verify/publish build & ship the real
  Java 8 artifact (source/target 1.8, src/main/java8, logback 1.3.x).
- Native builds (linux x86-64/aarch64, windows cross-compile): replace
  GraalVM JDK 25 with Temurin JDK 8 via the Adoptium latest-GA redirect.
  The native build only consumes $JAVA_HOME/include JNI headers
  (core/CMakeLists.txt) and the JNI ABI is stable, so JDK 8 headers are
  the correct floor. The Windows jni_md.h now comes from openjdk/jdk8u.

YAML validated; Adoptium download URLs and the jdk8u jni_md.h path were
confirmed to resolve.
@bluestreak01 bluestreak01 changed the title ci: build and release questdb-client on JDK 8 ci(build): build and release questdb-client on JDK 8 Jun 24, 2026
bluestreak01 and others added 3 commits June 24, 2026 17:23
GitHub's runner now forces actions/checkout onto Node 24, which needs
glibc >= 2.28; the manylinux2014_x86_64 container is glibc 2.17, so the
stock /__e/node24 binary aborts with GLIBC_2.27/2.28 not found and the
checkout step fails. There is no glibc-2.17 build of Node 24, so reuse
the glibc-2.17 Node 20 binary for the node24 path too -- bind-mount
/node20217 over /__e/node24 as well. checkout's JS runs fine on it.
@bluestreak01 bluestreak01 deployed to maven-release June 26, 2026 13:18 — with GitHub Actions Active
@bluestreak01 bluestreak01 enabled auto-merge (squash) June 26, 2026 13:21

@nwoolmer nwoolmer left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM

@bluestreak01 bluestreak01 merged commit 51ed8ea into main Jun 26, 2026
12 checks passed
@bluestreak01 bluestreak01 deleted the ci/release-on-jdk8 branch June 26, 2026 13:54
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants