-
-
Notifications
You must be signed in to change notification settings - Fork 33
Automate Challenges jar compilation for Plugwright E2E tests and enforce Java 21 #430
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from all commits
1ac50cb
638e68d
c9415f6
734f776
be00869
93889c1
64a98f4
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,4 @@ | ||
| wrapperVersion=3.3.4 | ||
| distributionType=only-script | ||
| distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.9.12/apache-maven-3.9.12-bin.zip | ||
| distributionSha256Sum=305773a68d6ddfd413df58c82b3f8050e89778e777f3a745c8e5b8cbea4018ef |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -1,8 +1,10 @@ | ||
| import java.net.URI | ||
| import me.drownek.plugwright.PlugwrightTestTask | ||
|
|
||
| plugins { | ||
| // Plugwright: boots a real Paper server, deploys plugins, drives Mineflayer bots. | ||
| id("io.github.drownek.plugwright") version "2.0.2" | ||
| id("java-base") | ||
| } | ||
|
|
||
| // --- Dependency jars ------------------------------------------------------------------------- | ||
|
|
@@ -31,15 +33,62 @@ val bskyblockJar = cachedJar( | |
| "https://github.com/BentoBoxWorld/BSkyBlock/releases/download/1.20.0/BSkyBlock-1.20.0.jar" | ||
| ) | ||
|
|
||
| // Maven-built Challenges jar (version/profile suffix varies: -SNAPSHOT-LOCAL locally, plain on CI). | ||
| val challengesJar: File = (file("../target").listFiles()?.toList() ?: emptyList()) | ||
| .firstOrNull { | ||
| it.name.startsWith("Challenges-") && it.name.endsWith(".jar") && | ||
| !it.name.contains("sources") && !it.name.contains("javadoc") | ||
| // If Gradle is running on Java 17, try to find a Java 21+ toolchain to satisfy Maven/Paper. | ||
| // If Gradle is already running on Java 21+ (e.g., 22, 23), don't force a strict toolchain lock. | ||
| val currentJava = JavaVersion.current() | ||
| val javaLauncherProvider = if (currentJava < JavaVersion.VERSION_21) { | ||
| extensions.getByType<JavaToolchainService>().launcherFor { | ||
| languageVersion.set(JavaLanguageVersion.of(21)) | ||
| } | ||
| ?: throw GradleException( | ||
| "Challenges jar not found in ../target — run 'mvn -q -DskipTests package' first." | ||
| ) | ||
| } else { | ||
| null | ||
| } | ||
|
|
||
| val buildChallenges = tasks.register<Exec>("buildChallenges") { | ||
| workingDir = file("..") | ||
|
|
||
| inputs.dir(file("../src")) | ||
| inputs.file(file("../pom.xml")) | ||
|
Member
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Minor completeness point: inputs.dir(file("../.mvn"))
inputs.file(file("../mvnw"))Not a blocker — the |
||
| // The wrapper pins the Maven version, so a bump there has to retrigger the build too. | ||
| inputs.dir(file("../.mvn")) | ||
| inputs.file(file("../mvnw")) | ||
|
|
||
| val isWindows = System.getProperty("os.name").lowercase().contains("win") | ||
| val executable = if (isWindows) listOf("cmd", "/c", "mvnw.cmd") else listOf("./mvnw") | ||
| commandLine(executable + listOf("-q", "package", "-DskipTests")) | ||
|
|
||
| // Pass the correct JAVA_HOME to Maven if we needed a custom toolchain | ||
| if (javaLauncherProvider != null) { | ||
| environment["JAVA_HOME"] = javaLauncherProvider.get().metadata.installationPath.asFile.absolutePath | ||
|
Member
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Optional: Separately, the |
||
| } else { | ||
| environment["JAVA_HOME"] = System.getProperty("java.home") | ||
| } | ||
|
|
||
| // Explicitly define the expected output file | ||
| val outputJar = layout.buildDirectory.file("Challenges.jar") | ||
| outputs.file(outputJar) | ||
|
|
||
| doFirst { | ||
| logger.lifecycle("Building Challenges project using Maven Wrapper (mvnw package)...") | ||
| } | ||
|
|
||
| doLast { | ||
| val builtJar = fileTree("../target") { | ||
| include("Challenges-*.jar") | ||
| exclude("*sources*", "*javadoc*") | ||
| }.files.maxByOrNull { it.lastModified() } | ||
| ?: throw GradleException("No Challenges jar found in target/") | ||
|
|
||
| builtJar.copyTo(outputJar.get().asFile, overwrite = true) | ||
| } | ||
| } | ||
|
|
||
| tasks.named<PlugwrightTestTask>("plugwrightTest") { | ||
| dependsOn(buildChallenges) | ||
| if (javaLauncherProvider != null) { | ||
| javaLauncher.set(javaLauncherProvider) | ||
| } | ||
| } | ||
|
|
||
| plugwright { | ||
| minecraftVersion.set("1.21.11") | ||
|
|
@@ -52,6 +101,6 @@ plugwright { | |
| writeFiles { | ||
| file("plugins/BentoBox.jar", bentoboxJar) | ||
| file("plugins/BentoBox/addons/BSkyBlock.jar", bskyblockJar) | ||
| file("plugins/BentoBox/addons/Challenges.jar", challengesJar) | ||
| file("plugins/BentoBox/addons/Challenges.jar", file("build/Challenges.jar")) | ||
| } | ||
| } | ||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -1,7 +1,10 @@ | ||
| distributionBase=GRADLE_USER_HOME | ||
| distributionPath=wrapper/dists | ||
| distributionUrl=https\://services.gradle.org/distributions/gradle-8.10-bin.zip | ||
| distributionSha256Sum=84fbba45c7f4c64abc77460e1c00f541e9f960e3c7ed2538f1ede19eacd873ae | ||
| distributionUrl=https\://services.gradle.org/distributions/gradle-9.7.0-bin.zip | ||
| networkTimeout=10000 | ||
| retries=0 | ||
| retryBackOffMs=500 | ||
| validateDistributionUrl=true | ||
| zipStoreBase=GRADLE_USER_HOME | ||
| zipStorePath=wrapper/dists |
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This narrows @mrfloris's toolchain point nicely, but doesn't fully close it: a developer on Java 17 with no JDK 21 installed still gets "no matching toolchains found" and no way to recover automatically. Gradle can provision one if you add the foojay resolver to
e2e/settings.gradle.kts:plugins { id("org.gradle.toolchains.foojay-resolver-convention") version "0.8.0" }Optional, but it's one line and it makes the "just run
./gradlew plugwrightTest" promise in the PR description actually true on a clean machine.(On my Mac Gradle did find the Homebrew JDK 21 from a 17 daemon, so this only bites people who genuinely don't have a 21 anywhere.)