diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 5c356e809..ba5dd00ac 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -19,61 +19,57 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - java: [8, 11, 17, 18] + java: [17, 21, 25] distribution: [temurin] include: - - java: 17 + - java: 25 distribution: zulu - - java: 17 + - java: 25 distribution: microsoft outputs: - report-java: 17 + report-java: 25 report-dist: temurin steps: - name: Check out code uses: actions/checkout@v6 - - name: Set up JDK 17 - uses: actions/setup-java@v5 - with: - java-version: 17 - distribution: ${{ matrix.distribution }} - - - name: Compile libraries and tests - run: ./gradlew clean testClasses - - name: Set up JDK ${{ matrix.java }} uses: actions/setup-java@v5 with: java-version: ${{ matrix.java }} distribution: ${{ matrix.distribution }} - - name: Run tests against JDK17-compiled code - run: ./gradlew test --exclude-task compileJava - - - name: Archive HTML test report on failure - if: ${{ failure() }} - uses: actions/upload-artifact@v5 - with: - name: test-reports-java17-java${{ matrix.java }}-${{ matrix.distribution }}-html - path: "*/build/reports/**" - - name: Build and test with JDK ${{ matrix.java }} run: ./gradlew clean test - name: Build archives run: ./gradlew assemble - - name: Archive HTML test report + - name: Run test using Java 25 runtime + run: ./gradlew testJava25 + + - name: Run test using Java 21 runtime + run: ./gradlew testJava21 + + - name: Run test using Java 17 runtime + run: ./gradlew testJava17 + + - name: Run test using Java 11 runtime + run: ./gradlew testJava11 + + - name: Run test using Java 8 runtime + run: ./gradlew testJava8 + + - name: Archive HTML test reports if: ${{ always() }} uses: actions/upload-artifact@v5 with: name: test-reports-java${{ matrix.java }}-${{ matrix.distribution }}-html path: "*/build/reports/**" - - name: Archive JUnit test report + - name: Archive JUnit test reports if: ${{ always() }} uses: actions/upload-artifact@v5 with: @@ -81,7 +77,6 @@ jobs: path: "*/build/test-results/**/*.xml" - name: Check binary reproducibility - if: ${{ matrix.java != 8 }} # JDK 8 does not produce reproducible binaries run: | ./gradlew clean primaryPublishJar find . -name '*.jar' | grep -v buildSrc | grep -v gradle-wrapper | xargs sha256sum | tee java-webauthn-server-artifacts.sha256sum @@ -89,7 +84,6 @@ jobs: ./gradlew clean primaryPublishJar && sha256sum -c java-webauthn-server-artifacts.sha256sum - name: Archive artifact checksums - if: ${{ matrix.java != 8 }} # JDK 8 does not produce reproducible binaries uses: actions/upload-artifact@v5 with: name: artifact-checksums-java${{ matrix.java }}-${{ matrix.distribution }} diff --git a/build.gradle b/build.gradle index 4abf68a62..baeb81154 100644 --- a/build.gradle +++ b/build.gradle @@ -21,7 +21,7 @@ import com.yubico.gradle.GitUtils project.ext.isCiBuild = System.env.CI == 'true' wrapper { - gradleVersion = '8.14.3' + gradleVersion = '9.1.0' } dependencies { diff --git a/buildSrc/build.gradle.kts b/buildSrc/build.gradle.kts index 53c8a5f8f..18cb5dd9f 100644 --- a/buildSrc/build.gradle.kts +++ b/buildSrc/build.gradle.kts @@ -10,13 +10,13 @@ repositories { } dependencies { - implementation("info.solidsoft.gradle.pitest:gradle-pitest-plugin:1.15.0") - implementation("io.franzbecker:gradle-lombok:5.0.0") + implementation("info.solidsoft.gradle.pitest:gradle-pitest-plugin:1.19.0-rc.2") + implementation("io.freefair.gradle:lombok-plugin:9.2.0") // Spotless dropped Java 8 support in version 2.33.0 // spotless-plugin-gradle dropped Java <17 support in version 8.0.0 if (JavaVersion.current().isCompatibleWith(JavaVersion.VERSION_17)) { implementation("com.diffplug.spotless:spotless-plugin-gradle:8.2.0") - implementation("io.github.cosmicsilence:gradle-scalafix:0.2.2") + implementation("io.github.cosmicsilence:gradle-scalafix:0.2.6") } } diff --git a/buildSrc/src/main/groovy/com/yubico/gradle/pitest/tasks/PitestMergeTask.groovy b/buildSrc/src/main/groovy/com/yubico/gradle/pitest/tasks/PitestMergeTask.groovy index 720341d72..f330f7d33 100644 --- a/buildSrc/src/main/groovy/com/yubico/gradle/pitest/tasks/PitestMergeTask.groovy +++ b/buildSrc/src/main/groovy/com/yubico/gradle/pitest/tasks/PitestMergeTask.groovy @@ -1,6 +1,7 @@ package com.yubico.gradle.pitest.tasks import groovy.xml.XmlUtil +import groovy.xml.XmlParser import info.solidsoft.gradle.pitest.PitestTask import org.gradle.api.DefaultTask diff --git a/buildSrc/src/main/groovy/project-convention-lombok.gradle b/buildSrc/src/main/groovy/project-convention-lombok.gradle index 13ce462d1..c7b35b69a 100644 --- a/buildSrc/src/main/groovy/project-convention-lombok.gradle +++ b/buildSrc/src/main/groovy/project-convention-lombok.gradle @@ -1,36 +1,4 @@ -import io.franzbecker.gradle.lombok.task.DelombokTask - plugins { id "java" - id "io.franzbecker.gradle-lombok" -} - -lombok { - version = "1.18.24" - sha256 = "d3584bc2db03f059f984fb0a9c119aac1fa0da578a448e69fc3f68b36584c749" -} - -tasks.withType(AbstractCompile.class) { - dependsOn(tasks.verifyLombok) -} - -task delombok(type: DelombokTask.class, dependsOn: tasks.classes) { - ext.outputDir = file("${buildDir}/delombok") - outputs.dir(outputDir) - project.sourceSets.main.java.srcDirs.forEach { - if (!it.exists()) { - it.mkdirs() - } - inputs.dir(it) - args(it, "-d", outputDir) - } - doFirst { - outputDir.deleteDir() - } -} - -javadoc { - dependsOn(delombok) - source = tasks.delombok.outputDir - inputs.dir(tasks.delombok.outputDir) + id "io.freefair.lombok" } diff --git a/buildSrc/src/main/kotlin/project-convention-java.gradle.kts b/buildSrc/src/main/kotlin/project-convention-java.gradle.kts index bf19301ad..e7ab746a9 100644 --- a/buildSrc/src/main/kotlin/project-convention-java.gradle.kts +++ b/buildSrc/src/main/kotlin/project-convention-java.gradle.kts @@ -14,3 +14,38 @@ tasks.withType(JavaCompile::class) { sourceCompatibility = "1.8" } } + +tasks.register("testJava8") { + javaLauncher.set(javaToolchains.launcherFor { + languageVersion.set(JavaLanguageVersion.of(8)) + }) + tasks["check"].dependsOn(this) +} + +tasks.register("testJava11") { + javaLauncher.set(javaToolchains.launcherFor { + languageVersion.set(JavaLanguageVersion.of(11)) + }) + tasks["check"].dependsOn(this) +} + +tasks.register("testJava17") { + javaLauncher.set(javaToolchains.launcherFor { + languageVersion.set(JavaLanguageVersion.of(17)) + }) + tasks["check"].dependsOn(this) +} + +tasks.register("testJava21") { + javaLauncher.set(javaToolchains.launcherFor { + languageVersion.set(JavaLanguageVersion.of(21)) + }) + tasks["check"].dependsOn(this) +} + +tasks.register("testJava25") { + javaLauncher.set(javaToolchains.launcherFor { + languageVersion.set(JavaLanguageVersion.of(25)) + }) + tasks["check"].dependsOn(this) +} \ No newline at end of file diff --git a/buildSrc/src/main/kotlin/project-convention-pitest.gradle.kts b/buildSrc/src/main/kotlin/project-convention-pitest.gradle.kts index 0bd7a5104..40e19a76f 100644 --- a/buildSrc/src/main/kotlin/project-convention-pitest.gradle.kts +++ b/buildSrc/src/main/kotlin/project-convention-pitest.gradle.kts @@ -4,7 +4,7 @@ plugins { } pitest { - pitestVersion.set("1.15.0") + pitestVersion.set("1.20.3") timestampedReports.set(false) outputFormats.set(listOf("XML", "HTML")) diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index d4081da47..2e1113280 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.14.3-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-9.1.0-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/webauthn-server-attestation/build.gradle.kts b/webauthn-server-attestation/build.gradle.kts index 713cd59e5..69db25c6a 100644 --- a/webauthn-server-attestation/build.gradle.kts +++ b/webauthn-server-attestation/build.gradle.kts @@ -54,7 +54,7 @@ dependencies { testRuntimeOnly("uk.org.lidalia:slf4j-test") } -val integrationTest = task("integrationTest") { +val integrationTest = tasks.register("integrationTest") { description = "Runs integration tests." group = "verification" diff --git a/webauthn-server-core/build.gradle.kts b/webauthn-server-core/build.gradle.kts index 70b9c5a98..f234de334 100644 --- a/webauthn-server-core/build.gradle.kts +++ b/webauthn-server-core/build.gradle.kts @@ -1,6 +1,6 @@ plugins { `java-library` - id("me.champeau.jmh") version "0.6.8" + // id("me.champeau.jmh") version "0.7.3" `project-convention-java` `project-convention-scala` `project-convention-lombok` @@ -42,13 +42,13 @@ dependencies { } } - jmhImplementation(platform(project(":test-platform"))) - jmhRuntimeOnly("org.slf4j:slf4j-nop") + // jmhImplementation(platform(project(":test-platform"))) + // jmhRuntimeOnly("org.slf4j:slf4j-nop") } -configurations.jmhRuntimeClasspath { - exclude(module = "slf4j-test") -} +// configurations.jmhRuntimeClasspath { +// exclude(module = "slf4j-test") +// } tasks.withType(Jar::class) { manifest { diff --git a/yubico-util/build.gradle.kts b/yubico-util/build.gradle.kts index 0012ca94a..d12ba2504 100644 --- a/yubico-util/build.gradle.kts +++ b/yubico-util/build.gradle.kts @@ -1,6 +1,6 @@ plugins { `java-library` - id("me.champeau.jmh") version "0.6.8" + // id("me.champeau.jmh") version "0.7.3" `project-convention-java` `project-convention-scala` `project-convention-lombok` @@ -30,13 +30,13 @@ dependencies { testImplementation("org.scalatestplus:junit-4-13_2.13") testImplementation("org.scalatestplus:scalacheck-1-16_2.13") - jmhImplementation(platform(project(":test-platform"))) - jmhRuntimeOnly("org.slf4j:slf4j-nop") + // jmhImplementation(platform(project(":test-platform"))) + // jmhRuntimeOnly("org.slf4j:slf4j-nop") } -configurations.jmhRuntimeClasspath { - exclude(module = "slf4j-test") -} +// configurations.jmhRuntimeClasspath { +// exclude(module = "slf4j-test") +// } tasks.jar { manifest {