Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 0 additions & 3 deletions .github/workflows/e2e.yml
Original file line number Diff line number Diff line change
Expand Up @@ -61,9 +61,6 @@ jobs:
# (mineflayer/minecraft-data must support the target Minecraft version).
key: e2e-npm-${{ hashFiles('e2e/src/test/e2e/package-lock.json') }}

- name: Build Challenges jar (Maven)
run: mvn -B -DskipTests package

- name: Run E2E tests
working-directory: e2e
env:
Expand Down
4 changes: 4 additions & 0 deletions .mvn/wrapper/maven-wrapper.properties
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
67 changes: 58 additions & 9 deletions e2e/build.gradle.kts
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 -------------------------------------------------------------------------
Expand Down Expand Up @@ -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) {

Copy link
Copy Markdown
Member

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.)

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"))

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Minor completeness point: .mvn/, mvnw and mvnw.cmd aren't inputs, so bumping the Maven version wouldn't retrigger the build. Cheap to add:

inputs.dir(file("../.mvn"))
inputs.file(file("../mvnw"))

Not a blocker — the src + pom.xml inputs are the ones that matter day to day, and I confirmed those work.

// 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

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Optional: javaLauncherProvider.get() here resolves the toolchain at configuration time, which forces the lookup (and potentially a provision) whenever the task is realised, even on a no-op run. Moving it into doFirst { environment("JAVA_HOME", …) } keeps it lazy and is friendlier to the configuration cache if this build ever turns that on.

Separately, the else branch overriding JAVA_HOME with java.home is a no-op in the normal case (Exec inherits the environment) but does override a JAVA_HOME the developer set deliberately when the daemon JVM was chosen via org.gradle.java.home. Narrow edge case, just noting it.

} 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")
Expand All @@ -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"))
}
}
Binary file modified e2e/gradle/wrapper/gradle-wrapper.jar
Binary file not shown.
5 changes: 4 additions & 1 deletion e2e/gradle/wrapper/gradle-wrapper.properties
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
6 changes: 3 additions & 3 deletions e2e/gradlew

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

35 changes: 12 additions & 23 deletions e2e/gradlew.bat

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading
Loading