Skip to content

Commit e11604a

Browse files
committed
chore: polish build scripts, use Java 17 for the build, target Java 11
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.
1 parent c06cca4 commit e11604a

19 files changed

+226
-56
lines changed

build-logic-commons/.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
/build/
2+
/*/build/
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
import org.gradle.kotlin.dsl.support.expectedKotlinDslPluginsVersion
2+
3+
plugins {
4+
`kotlin-dsl`
5+
}
6+
7+
group = "org.testng.build-logic"
8+
9+
dependencies {
10+
// We use precompiled script plugins (== plugins written as src/kotlin/build-logic.*.gradle.kts files,
11+
// and we need to declare dependency on org.gradle.kotlin.kotlin-dsl:org.gradle.kotlin.kotlin-dsl.gradle.plugin
12+
// to make it work.
13+
// See https://github.com/gradle/gradle/issues/17016 regarding expectedKotlinDslPluginsVersion
14+
implementation("org.gradle.kotlin.kotlin-dsl:org.gradle.kotlin.kotlin-dsl.gradle.plugin:$expectedKotlinDslPluginsVersion")
15+
}
16+
17+
// We need to figure out a version that is supported by the current JVM, and by the Kotlin Gradle plugin
18+
// So we settle on 17 or 11 if the current JVM supports it
19+
listOf(17, 11)
20+
.firstOrNull { JavaVersion.toVersion(it) <= JavaVersion.current() }
21+
?.let { buildScriptJvmTarget ->
22+
java {
23+
toolchain {
24+
languageVersion.set(JavaLanguageVersion.of(buildScriptJvmTarget))
25+
}
26+
}
27+
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
plugins {
2+
id("java-library")
3+
id("org.gradle.kotlin.kotlin-dsl") // this is 'kotlin-dsl' without version
4+
}
5+
6+
tasks.validatePlugins {
7+
failOnWarning.set(true)
8+
enableStricterValidation.set(true)
9+
}
10+
11+
// We need to figure out a version that is supported by the current JVM, and by the Kotlin Gradle plugin
12+
// So we settle on 17 or 11 if the current JVM supports it
13+
listOf(17, 11)
14+
.firstOrNull { JavaVersion.toVersion(it) <= JavaVersion.current() }
15+
?.let { buildScriptJvmTarget ->
16+
java {
17+
toolchain {
18+
languageVersion.set(JavaLanguageVersion.of(buildScriptJvmTarget))
19+
}
20+
}
21+
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
dependencyResolutionManagement {
2+
repositories {
3+
gradlePluginPortal()
4+
}
5+
}
6+
7+
rootProject.name = "build-logic-commons"
8+
9+
include("gradle-plugin")

build-logic/basics/build.gradle.kts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
11
plugins {
2-
`kotlin-dsl`
2+
id("build-logic.kotlin-dsl-gradle-plugin")
3+
}
4+
5+
dependencies {
6+
api(projects.buildParameters)
37
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
import buildparameters.BuildParametersExtension
2+
import org.gradle.api.JavaVersion
3+
4+
class ToolchainProperties(
5+
val version: Int,
6+
val vendor: String?,
7+
val implementation: String?,
8+
)
9+
10+
val BuildParametersExtension.buildJdk: ToolchainProperties?
11+
get() = jdkBuildVersion.takeIf { it != 0 }
12+
?.let { ToolchainProperties(it, jdkBuildVendor.orNull, jdkBuildImplementation.orNull) }
13+
14+
val BuildParametersExtension.buildJdkVersion: Int
15+
get() = buildJdk?.version ?: JavaVersion.current().majorVersion.toInt()
16+
17+
val BuildParametersExtension.testJdk: ToolchainProperties?
18+
get() = jdkTestVersion.orNull?.takeIf { it != 0 }
19+
?.let { ToolchainProperties(it, jdkTestVendor.orNull, jdkTestImplementation.orNull) }
20+
?: buildJdk
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
import org.gradle.api.provider.Provider
2+
import org.gradle.jvm.toolchain.JavaLanguageVersion
3+
import org.gradle.jvm.toolchain.JavaLauncher
4+
import org.gradle.jvm.toolchain.JavaToolchainService
5+
import org.gradle.jvm.toolchain.JavaToolchainSpec
6+
import org.gradle.jvm.toolchain.JvmImplementation
7+
import org.gradle.jvm.toolchain.JvmVendorSpec
8+
9+
fun JavaToolchainService.launcherFor(jdk: ToolchainProperties): Provider<JavaLauncher> = launcherFor {
10+
configureToolchain(jdk)
11+
}
12+
13+
fun JavaToolchainSpec.configureToolchain(jdk: ToolchainProperties?) {
14+
if (jdk == null) {
15+
return
16+
}
17+
languageVersion.set(JavaLanguageVersion.of(jdk.version))
18+
jdk.vendor?.let {
19+
vendor.set(JvmVendorSpec.matching(it))
20+
}
21+
if (jdk.implementation.equals("J9", ignoreCase = true)) {
22+
implementation.set(JvmImplementation.J9)
23+
}
24+
}
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
plugins {
2+
id("org.gradlex.build-parameters") version "1.4.3"
3+
id("com.github.vlsi.gradle-extensions") version "1.90"
4+
id("build-logic.kotlin-dsl-gradle-plugin")
5+
}
6+
7+
buildParameters {
8+
// Other plugins can contribute parameters, so below list is not exhaustive
9+
enableValidation.set(false)
10+
pluginId("build-logic.build-params")
11+
bool("enableMavenLocal") {
12+
defaultValue.set(true)
13+
description.set("Add mavenLocal() to repositories")
14+
}
15+
integer("targetJavaVersion") {
16+
defaultValue.set(11)
17+
mandatory.set(true)
18+
description.set("Java version for source and target compatibility")
19+
}
20+
integer("jdkBuildVersion") {
21+
defaultValue.set(17)
22+
mandatory.set(true)
23+
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)")
24+
}
25+
string("jdkBuildVendor") {
26+
description.set("JDK vendor to use building JMeter (see https://docs.gradle.org/8.0/userguide/toolchains.html#sec:vendors)")
27+
}
28+
string("jdkBuildImplementation") {
29+
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)")
30+
}
31+
integer("jdkTestVersion") {
32+
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)")
33+
}
34+
string("jdkTestVendor") {
35+
description.set("JDK vendor to use testing JMeter (see https://docs.gradle.org/8.0/userguide/toolchains.html#sec:vendors)")
36+
}
37+
string("jdkTestImplementation") {
38+
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)")
39+
}
40+
bool("sonarqube") {
41+
defaultValue.set(false)
42+
description.set("Report verification results to Sonarqube")
43+
}
44+
bool("skipAutostyle") {
45+
defaultValue.set(false)
46+
description.set("Skip AutoStyle verifications")
47+
}
48+
bool("failOnJavadocWarning") {
49+
defaultValue.set(true)
50+
description.set("Fail build on javadoc warnings")
51+
}
52+
}

build-logic/build.gradle.kts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
plugins {
2+
`embedded-kotlin` apply false
3+
}
Lines changed: 5 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,10 @@
1-
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
2-
31
plugins {
4-
`kotlin-dsl`
5-
}
6-
7-
repositories {
8-
gradlePluginPortal()
2+
id("build-logic.kotlin-dsl-gradle-plugin")
93
}
104

115
dependencies {
12-
implementation("org.sonarqube:org.sonarqube.gradle.plugin:4.4.1.3373")
13-
implementation("com.github.autostyle:autostyle-plugin-gradle:4.0")
14-
}
15-
16-
tasks.withType<KotlinCompile>().configureEach {
17-
kotlinOptions {
18-
jvmTarget = "11"
19-
}
6+
api(projects.buildParameters)
7+
api(projects.basics)
8+
api("org.sonarqube:org.sonarqube.gradle.plugin:4.4.1.3373")
9+
api("com.github.autostyle:autostyle-plugin-gradle:4.0")
2010
}

build-logic/code-quality/src/main/kotlin/testng.testing.gradle.kts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import org.gradle.api.tasks.testing.Test
22

33
plugins {
44
`java-library`
5+
id("build-logic.build-params")
56
}
67

78
dependencies {
@@ -10,6 +11,9 @@ dependencies {
1011

1112
tasks.withType<Test>().configureEach {
1213
useTestNG()
14+
buildParameters.testJdk?.let {
15+
javaLauncher.convention(javaToolchains.launcherFor(it))
16+
}
1317
providers.gradleProperty("testng.test.extra.jvmargs")
1418
.orNull?.toString()?.trim()
1519
?.takeIf { it.isNotEmpty() }

build-logic/jvm/build.gradle.kts

Lines changed: 6 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,11 @@
1-
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
2-
31
plugins {
4-
`kotlin-dsl`
5-
}
6-
7-
repositories {
8-
gradlePluginPortal()
2+
id("build-logic.kotlin-dsl-gradle-plugin")
93
}
104

115
dependencies {
12-
implementation(project(":basics"))
13-
implementation(project(":code-quality"))
14-
implementation("com.github.vlsi.gradle-extensions:com.github.vlsi.gradle-extensions.gradle.plugin:1.90")
15-
implementation("org.jetbrains.kotlin.jvm:org.jetbrains.kotlin.jvm.gradle.plugin:1.6.21")
16-
}
17-
18-
tasks.withType<KotlinCompile>().configureEach {
19-
kotlinOptions {
20-
jvmTarget = "11"
21-
}
6+
api(projects.buildParameters)
7+
api(projects.basics)
8+
api(projects.codeQuality)
9+
api("com.github.vlsi.gradle-extensions:com.github.vlsi.gradle-extensions.gradle.plugin:1.90")
10+
api("org.jetbrains.kotlin.jvm:org.jetbrains.kotlin.jvm.gradle.plugin:1.6.21")
2211
}

build-logic/jvm/src/main/kotlin/testng.java.gradle.kts

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
1+
import com.github.vlsi.gradle.dsl.configureEach
2+
13
plugins {
24
`java-base`
5+
id("build-logic.build-params")
36
id("testng.versioning")
47
id("testng.style")
58
id("testng.repositories")
@@ -9,18 +12,31 @@ plugins {
912
}
1013

1114
java {
12-
sourceCompatibility = JavaVersion.VERSION_11
13-
targetCompatibility = JavaVersion.VERSION_11
15+
toolchain {
16+
configureToolchain(buildParameters.buildJdk)
17+
}
18+
}
19+
20+
tasks.configureEach<JavaCompile> {
21+
// Use --release=<targetJavaVersion> for javac so the generated bytecode does not include methods introduced in
22+
// next Java releases
23+
options.release.set(buildParameters.targetJavaVersion)
24+
}
25+
26+
tasks.configureEach<JavaExec> {
27+
buildParameters.testJdk?.let {
28+
javaLauncher.convention(javaToolchains.launcherFor(it))
29+
}
1430
}
1531

16-
tasks.withType<JavaCompile>().configureEach {
32+
tasks.configureEach<JavaCompile> {
1733
inputs.property("java.version", System.getProperty("java.version"))
1834
inputs.property("java.vendor", System.getProperty("java.vendor"))
1935
inputs.property("java.vm.version", System.getProperty("java.vm.version"))
2036
inputs.property("java.vm.vendor", System.getProperty("java.vm.vendor"))
2137
}
2238

23-
tasks.withType<Test>().configureEach {
39+
tasks.configureEach<Test> {
2440
inputs.property("java.version", System.getProperty("java.version"))
2541
inputs.property("java.vendor", System.getProperty("java.vendor"))
2642
inputs.property("java.vm.version", System.getProperty("java.vm.version"))

build-logic/jvm/src/main/kotlin/testng.kotlin-library.gradle.kts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,9 @@ dependencies {
1212

1313
tasks.withType<KotlinCompile>().configureEach {
1414
kotlinOptions {
15-
jvmTarget = "11"
15+
freeCompilerArgs += "-Xjvm-default=all"
16+
val jdkRelease = buildParameters.targetJavaVersion.toString()
17+
freeCompilerArgs += "-Xjdk-release=$jdkRelease"
18+
kotlinOptions.jvmTarget = jdkRelease
1619
}
1720
}
Lines changed: 5 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,10 @@
1-
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
2-
31
plugins {
4-
`kotlin-dsl`
5-
}
6-
7-
repositories {
8-
gradlePluginPortal()
2+
id("build-logic.kotlin-dsl-gradle-plugin")
93
}
104

115
dependencies {
12-
implementation(project(":jvm"))
13-
implementation("com.github.vlsi.gradle-extensions:com.github.vlsi.gradle-extensions.gradle.plugin:1.90")
14-
implementation("com.github.johnrengelman.shadow:com.github.johnrengelman.shadow.gradle.plugin:8.1.1")
15-
implementation("org.jetbrains.kotlin:kotlin-gradle-plugin")
16-
}
17-
18-
tasks.withType<KotlinCompile>().configureEach {
19-
kotlinOptions {
20-
jvmTarget = "11"
21-
}
6+
api(projects.jvm)
7+
api("com.github.vlsi.gradle-extensions:com.github.vlsi.gradle-extensions.gradle.plugin:1.90")
8+
api("com.github.johnrengelman.shadow:com.github.johnrengelman.shadow.gradle.plugin:8.1.1")
9+
api("org.jetbrains.kotlin:kotlin-gradle-plugin")
2210
}

build-logic/settings.gradle.kts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,11 @@ dependencyResolutionManagement {
66

77
rootProject.name = "build-logic"
88

9+
enableFeaturePreview("TYPESAFE_PROJECT_ACCESSORS")
10+
11+
includeBuild("../build-logic-commons")
912
include(":basics")
13+
include(":build-parameters")
1014
include(":code-quality")
1115
include(":jvm")
1216
include(":publishing")

build.gradle.kts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,12 @@ version = buildVersion
1010

1111
println("Building testng $buildVersion")
1212

13+
tasks.register("parameters") {
14+
group = HelpTasksPlugin.HELP_GROUP
15+
description = "Displays the supported build parameters."
16+
dependsOn(gradle.includedBuild("build-logic").task(":build-parameters:parameters"))
17+
}
18+
1319
/**
1420
* Release procedure:
1521
* 1. ./gradlew prepareVote -Prc=1 -Pgh (builds artifacts, stages them to Central, closes staging repository)

settings.gradle.kts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ rootProject.name = "testng-root"
77
plugins {
88
`gradle-enterprise`
99
id("de.fayard.refreshVersions") version "0.60.3"
10-
id("org.gradle.toolchains.foojay-resolver-convention") version "0.5.0"
10+
id("org.gradle.toolchains.foojay-resolver-convention") version "0.8.0"
1111
}
1212

1313
gradleEnterprise {

testng-core/testng-core-build.gradle.kts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,14 @@ java {
1818
}
1919
}
2020

21+
tasks.withType<GroovyCompile>().configureEach {
22+
// Groovy does not support targeting Java release yet
23+
// See https://issues.apache.org/jira/browse/GROOVY-11105
24+
sourceCompatibility = buildParameters.targetJavaVersion.toString()
25+
targetCompatibility = buildParameters.targetJavaVersion.toString()
26+
}
27+
28+
2129
dependencies {
2230
api(projects.testngCoreApi)
2331
// Annotations have to be available on the compile classpath for the proper compilation

0 commit comments

Comments
 (0)