Skip to content

Commit

Permalink
chore: polish build scripts, use Java 17 for the build, target Java 11
Browse files Browse the repository at this point in the history
Previously, TestNG was build with the "current Java" version which was not very reproducible.
Now the build script would use Java 17 for building the code no matter which Java is selected for
launching Gradle.

Even though the code is always build with Java 17, the tests execute with a configurable Java version.
It enables executing tests with EA Java versions.
  • Loading branch information
vlsi committed Feb 15, 2024
1 parent c06cca4 commit e11604a
Show file tree
Hide file tree
Showing 19 changed files with 226 additions and 56 deletions.
2 changes: 2 additions & 0 deletions build-logic-commons/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
/build/
/*/build/
27 changes: 27 additions & 0 deletions build-logic-commons/gradle-plugin/build.gradle.kts
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
import org.gradle.kotlin.dsl.support.expectedKotlinDslPluginsVersion

plugins {
`kotlin-dsl`
}

group = "org.testng.build-logic"

dependencies {
// We use precompiled script plugins (== plugins written as src/kotlin/build-logic.*.gradle.kts files,
// and we need to declare dependency on org.gradle.kotlin.kotlin-dsl:org.gradle.kotlin.kotlin-dsl.gradle.plugin
// to make it work.
// See https://github.com/gradle/gradle/issues/17016 regarding expectedKotlinDslPluginsVersion
implementation("org.gradle.kotlin.kotlin-dsl:org.gradle.kotlin.kotlin-dsl.gradle.plugin:$expectedKotlinDslPluginsVersion")
}

// We need to figure out a version that is supported by the current JVM, and by the Kotlin Gradle plugin
// So we settle on 17 or 11 if the current JVM supports it
listOf(17, 11)
.firstOrNull { JavaVersion.toVersion(it) <= JavaVersion.current() }
?.let { buildScriptJvmTarget ->
java {
toolchain {
languageVersion.set(JavaLanguageVersion.of(buildScriptJvmTarget))
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
plugins {
id("java-library")
id("org.gradle.kotlin.kotlin-dsl") // this is 'kotlin-dsl' without version
}

tasks.validatePlugins {
failOnWarning.set(true)
enableStricterValidation.set(true)
}

// We need to figure out a version that is supported by the current JVM, and by the Kotlin Gradle plugin
// So we settle on 17 or 11 if the current JVM supports it
listOf(17, 11)
.firstOrNull { JavaVersion.toVersion(it) <= JavaVersion.current() }
?.let { buildScriptJvmTarget ->
java {
toolchain {
languageVersion.set(JavaLanguageVersion.of(buildScriptJvmTarget))
}
}
}
9 changes: 9 additions & 0 deletions build-logic-commons/settings.gradle.kts
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
dependencyResolutionManagement {
repositories {
gradlePluginPortal()
}
}

rootProject.name = "build-logic-commons"

include("gradle-plugin")
6 changes: 5 additions & 1 deletion build-logic/basics/build.gradle.kts
Original file line number Diff line number Diff line change
@@ -1,3 +1,7 @@
plugins {
`kotlin-dsl`
id("build-logic.kotlin-dsl-gradle-plugin")
}

dependencies {
api(projects.buildParameters)
}
20 changes: 20 additions & 0 deletions build-logic/basics/src/main/kotlin/ToolchainProperties.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
import buildparameters.BuildParametersExtension
import org.gradle.api.JavaVersion

class ToolchainProperties(
val version: Int,
val vendor: String?,
val implementation: String?,
)

val BuildParametersExtension.buildJdk: ToolchainProperties?
get() = jdkBuildVersion.takeIf { it != 0 }
?.let { ToolchainProperties(it, jdkBuildVendor.orNull, jdkBuildImplementation.orNull) }

val BuildParametersExtension.buildJdkVersion: Int
get() = buildJdk?.version ?: JavaVersion.current().majorVersion.toInt()

val BuildParametersExtension.testJdk: ToolchainProperties?
get() = jdkTestVersion.orNull?.takeIf { it != 0 }
?.let { ToolchainProperties(it, jdkTestVendor.orNull, jdkTestImplementation.orNull) }
?: buildJdk
24 changes: 24 additions & 0 deletions build-logic/basics/src/main/kotlin/configureToolchain.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
import org.gradle.api.provider.Provider
import org.gradle.jvm.toolchain.JavaLanguageVersion
import org.gradle.jvm.toolchain.JavaLauncher
import org.gradle.jvm.toolchain.JavaToolchainService
import org.gradle.jvm.toolchain.JavaToolchainSpec
import org.gradle.jvm.toolchain.JvmImplementation
import org.gradle.jvm.toolchain.JvmVendorSpec

fun JavaToolchainService.launcherFor(jdk: ToolchainProperties): Provider<JavaLauncher> = launcherFor {
configureToolchain(jdk)
}

fun JavaToolchainSpec.configureToolchain(jdk: ToolchainProperties?) {
if (jdk == null) {
return
}
languageVersion.set(JavaLanguageVersion.of(jdk.version))
jdk.vendor?.let {
vendor.set(JvmVendorSpec.matching(it))
}
if (jdk.implementation.equals("J9", ignoreCase = true)) {
implementation.set(JvmImplementation.J9)
}
}
52 changes: 52 additions & 0 deletions build-logic/build-parameters/build.gradle.kts
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
plugins {
id("org.gradlex.build-parameters") version "1.4.3"
id("com.github.vlsi.gradle-extensions") version "1.90"
id("build-logic.kotlin-dsl-gradle-plugin")
}

buildParameters {
// Other plugins can contribute parameters, so below list is not exhaustive
enableValidation.set(false)
pluginId("build-logic.build-params")
bool("enableMavenLocal") {
defaultValue.set(true)
description.set("Add mavenLocal() to repositories")
}
integer("targetJavaVersion") {
defaultValue.set(11)
mandatory.set(true)
description.set("Java version for source and target compatibility")
}
integer("jdkBuildVersion") {
defaultValue.set(17)
mandatory.set(true)
description.set("JDK version to use for building JMeter. If the value is 0, then the current Java is used. (see https://docs.gradle.org/8.0/userguide/toolchains.html#sec:consuming)")
}
string("jdkBuildVendor") {
description.set("JDK vendor to use building JMeter (see https://docs.gradle.org/8.0/userguide/toolchains.html#sec:vendors)")
}
string("jdkBuildImplementation") {
description.set("Vendor-specific virtual machine implementation to use building JMeter (see https://docs.gradle.org/8.0/userguide/toolchains.html#selecting_toolchains_by_virtual_machine_implementation)")
}
integer("jdkTestVersion") {
description.set("JDK version to use for testing JMeter. If the value is 0, then the current Java is used. (see https://docs.gradle.org/8.0/userguide/toolchains.html#sec:consuming)")
}
string("jdkTestVendor") {
description.set("JDK vendor to use testing JMeter (see https://docs.gradle.org/8.0/userguide/toolchains.html#sec:vendors)")
}
string("jdkTestImplementation") {
description.set("Vendor-specific virtual machine implementation to use testing JMeter (see https://docs.gradle.org/8.0/userguide/toolchains.html#selecting_toolchains_by_virtual_machine_implementation)")
}
bool("sonarqube") {
defaultValue.set(false)
description.set("Report verification results to Sonarqube")
}
bool("skipAutostyle") {
defaultValue.set(false)
description.set("Skip AutoStyle verifications")
}
bool("failOnJavadocWarning") {
defaultValue.set(true)
description.set("Fail build on javadoc warnings")
}
}
3 changes: 3 additions & 0 deletions build-logic/build.gradle.kts
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
plugins {
`embedded-kotlin` apply false
}
20 changes: 5 additions & 15 deletions build-logic/code-quality/build.gradle.kts
Original file line number Diff line number Diff line change
@@ -1,20 +1,10 @@
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile

plugins {
`kotlin-dsl`
}

repositories {
gradlePluginPortal()
id("build-logic.kotlin-dsl-gradle-plugin")
}

dependencies {
implementation("org.sonarqube:org.sonarqube.gradle.plugin:4.4.1.3373")
implementation("com.github.autostyle:autostyle-plugin-gradle:4.0")
}

tasks.withType<KotlinCompile>().configureEach {
kotlinOptions {
jvmTarget = "11"
}
api(projects.buildParameters)
api(projects.basics)
api("org.sonarqube:org.sonarqube.gradle.plugin:4.4.1.3373")
api("com.github.autostyle:autostyle-plugin-gradle:4.0")
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import org.gradle.api.tasks.testing.Test

plugins {
`java-library`
id("build-logic.build-params")
}

dependencies {
Expand All @@ -10,6 +11,9 @@ dependencies {

tasks.withType<Test>().configureEach {
useTestNG()
buildParameters.testJdk?.let {
javaLauncher.convention(javaToolchains.launcherFor(it))
}
providers.gradleProperty("testng.test.extra.jvmargs")
.orNull?.toString()?.trim()
?.takeIf { it.isNotEmpty() }
Expand Down
23 changes: 6 additions & 17 deletions build-logic/jvm/build.gradle.kts
Original file line number Diff line number Diff line change
@@ -1,22 +1,11 @@
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile

plugins {
`kotlin-dsl`
}

repositories {
gradlePluginPortal()
id("build-logic.kotlin-dsl-gradle-plugin")
}

dependencies {
implementation(project(":basics"))
implementation(project(":code-quality"))
implementation("com.github.vlsi.gradle-extensions:com.github.vlsi.gradle-extensions.gradle.plugin:1.90")
implementation("org.jetbrains.kotlin.jvm:org.jetbrains.kotlin.jvm.gradle.plugin:1.6.21")
}

tasks.withType<KotlinCompile>().configureEach {
kotlinOptions {
jvmTarget = "11"
}
api(projects.buildParameters)
api(projects.basics)
api(projects.codeQuality)
api("com.github.vlsi.gradle-extensions:com.github.vlsi.gradle-extensions.gradle.plugin:1.90")
api("org.jetbrains.kotlin.jvm:org.jetbrains.kotlin.jvm.gradle.plugin:1.6.21")
}
24 changes: 20 additions & 4 deletions build-logic/jvm/src/main/kotlin/testng.java.gradle.kts
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
import com.github.vlsi.gradle.dsl.configureEach

plugins {
`java-base`
id("build-logic.build-params")
id("testng.versioning")
id("testng.style")
id("testng.repositories")
Expand All @@ -9,18 +12,31 @@ plugins {
}

java {
sourceCompatibility = JavaVersion.VERSION_11
targetCompatibility = JavaVersion.VERSION_11
toolchain {
configureToolchain(buildParameters.buildJdk)
}
}

tasks.configureEach<JavaCompile> {
// Use --release=<targetJavaVersion> for javac so the generated bytecode does not include methods introduced in
// next Java releases
options.release.set(buildParameters.targetJavaVersion)
}

tasks.configureEach<JavaExec> {
buildParameters.testJdk?.let {
javaLauncher.convention(javaToolchains.launcherFor(it))
}
}

tasks.withType<JavaCompile>().configureEach {
tasks.configureEach<JavaCompile> {
inputs.property("java.version", System.getProperty("java.version"))
inputs.property("java.vendor", System.getProperty("java.vendor"))
inputs.property("java.vm.version", System.getProperty("java.vm.version"))
inputs.property("java.vm.vendor", System.getProperty("java.vm.vendor"))
}

tasks.withType<Test>().configureEach {
tasks.configureEach<Test> {
inputs.property("java.version", System.getProperty("java.version"))
inputs.property("java.vendor", System.getProperty("java.vendor"))
inputs.property("java.vm.version", System.getProperty("java.vm.version"))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,9 @@ dependencies {

tasks.withType<KotlinCompile>().configureEach {
kotlinOptions {
jvmTarget = "11"
freeCompilerArgs += "-Xjvm-default=all"
val jdkRelease = buildParameters.targetJavaVersion.toString()
freeCompilerArgs += "-Xjdk-release=$jdkRelease"
kotlinOptions.jvmTarget = jdkRelease
}
}
22 changes: 5 additions & 17 deletions build-logic/publishing/build.gradle.kts
Original file line number Diff line number Diff line change
@@ -1,22 +1,10 @@
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile

plugins {
`kotlin-dsl`
}

repositories {
gradlePluginPortal()
id("build-logic.kotlin-dsl-gradle-plugin")
}

dependencies {
implementation(project(":jvm"))
implementation("com.github.vlsi.gradle-extensions:com.github.vlsi.gradle-extensions.gradle.plugin:1.90")
implementation("com.github.johnrengelman.shadow:com.github.johnrengelman.shadow.gradle.plugin:8.1.1")
implementation("org.jetbrains.kotlin:kotlin-gradle-plugin")
}

tasks.withType<KotlinCompile>().configureEach {
kotlinOptions {
jvmTarget = "11"
}
api(projects.jvm)
api("com.github.vlsi.gradle-extensions:com.github.vlsi.gradle-extensions.gradle.plugin:1.90")
api("com.github.johnrengelman.shadow:com.github.johnrengelman.shadow.gradle.plugin:8.1.1")
api("org.jetbrains.kotlin:kotlin-gradle-plugin")
}
4 changes: 4 additions & 0 deletions build-logic/settings.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,11 @@ dependencyResolutionManagement {

rootProject.name = "build-logic"

enableFeaturePreview("TYPESAFE_PROJECT_ACCESSORS")

includeBuild("../build-logic-commons")
include(":basics")
include(":build-parameters")
include(":code-quality")
include(":jvm")
include(":publishing")
6 changes: 6 additions & 0 deletions build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,12 @@ version = buildVersion

println("Building testng $buildVersion")

tasks.register("parameters") {
group = HelpTasksPlugin.HELP_GROUP
description = "Displays the supported build parameters."
dependsOn(gradle.includedBuild("build-logic").task(":build-parameters:parameters"))
}

/**
* Release procedure:
* 1. ./gradlew prepareVote -Prc=1 -Pgh (builds artifacts, stages them to Central, closes staging repository)
Expand Down
2 changes: 1 addition & 1 deletion settings.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ rootProject.name = "testng-root"
plugins {
`gradle-enterprise`
id("de.fayard.refreshVersions") version "0.60.3"
id("org.gradle.toolchains.foojay-resolver-convention") version "0.5.0"
id("org.gradle.toolchains.foojay-resolver-convention") version "0.8.0"
}

gradleEnterprise {
Expand Down
8 changes: 8 additions & 0 deletions testng-core/testng-core-build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,14 @@ java {
}
}

tasks.withType<GroovyCompile>().configureEach {
// Groovy does not support targeting Java release yet
// See https://issues.apache.org/jira/browse/GROOVY-11105
sourceCompatibility = buildParameters.targetJavaVersion.toString()
targetCompatibility = buildParameters.targetJavaVersion.toString()
}


dependencies {
api(projects.testngCoreApi)
// Annotations have to be available on the compile classpath for the proper compilation
Expand Down

0 comments on commit e11604a

Please sign in to comment.