feat(stealth): migrate distribution to Java 25 and Purpur
CI / build (push) Successful in 3m31s
Release / release (push) Failing after 3m32s

BREAKING CHANGE: New releases require Java 25/Purpur 26.2 and use purpur-stealth-<version>.jar. Runtime SpigotStealth identity, existing data and permissions remain unchanged. Replace the old JAR rather than installing both.
This commit is contained in:
dmg
2026-09-12 12:43:18 -04:00
parent d0000810c1
commit b7db69d010
8 changed files with 96 additions and 18 deletions
@@ -13,7 +13,7 @@ class DeliveryConfigurationTest {
String workflow = Files.readString(Path.of(".gitea/workflows/ci.yml"));
assertTrue(workflow.contains("./gradlew clean check jar"));
assertTrue(workflow.contains("commitlint"));
assertTrue(workflow.contains("spigot-stealth-${{ github.sha }}"));
assertTrue(workflow.contains("purpur-stealth-${{ github.sha }}"));
}
@Test
@@ -21,7 +21,7 @@ class DeliveryConfigurationTest {
String workflow = Files.readString(Path.of(".gitea/workflows/release.yml"));
assertTrue(workflow.contains("semantic-release"));
assertTrue(workflow.contains("-PreleaseVersion=\"$VERSION\""));
assertTrue(workflow.contains("spigot-stealth-${VERSION}.jar"));
assertTrue(workflow.contains("purpur-stealth-${VERSION}.jar"));
assertTrue(workflow.contains("/releases/${release_id}/assets"));
}
}
@@ -0,0 +1,53 @@
package games.dmg.spigotstealth;
import static org.junit.jupiter.api.Assertions.*;
import java.io.DataInputStream;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.Map;
import java.util.jar.JarFile;
import org.junit.jupiter.api.Test;
import org.yaml.snakeyaml.Yaml;
class PurpurDistributionTest {
@Test
void packagesNewNameWithoutChangingRuntimeIdentityOrBundlingTheApi() throws Exception {
Path artifact = Path.of(System.getProperty("distribution.jar"));
String version = System.getProperty("distribution.version");
assertEquals("purpur-stealth-" + version + ".jar", artifact.getFileName().toString());
try (var jar = new JarFile(artifact.toFile())) {
Map<?, ?> metadata = new Yaml().load(jar.getInputStream(jar.getJarEntry("plugin.yml")));
assertEquals(version, metadata.get("version"));
assertEquals("SpigotStealth", metadata.get("name"), "Retain the data directory and persistent namespace");
assertEquals("games.dmg.spigotstealth.SpigotStealthPlugin", metadata.get("main"));
assertTrue(((Map<?, ?>) metadata.get("permissions")).containsKey("spigotstealth.admin"));
assertFalse(jar.stream().anyMatch(entry -> entry.getName().startsWith("org/bukkit/")
|| entry.getName().startsWith("org/purpurmc/") || entry.getName().endsWith("Test.class")));
}
}
@Test
void pluginBytecodeTargetsJava25() throws Exception {
try (var jar = new JarFile(System.getProperty("distribution.jar"));
var bytecode = new DataInputStream(jar.getInputStream(
jar.getJarEntry("games/dmg/spigotstealth/SpigotStealthPlugin.class")))) {
assertEquals(0xCAFEBABE, bytecode.readInt());
bytecode.readUnsignedShort();
assertEquals(69, bytecode.readUnsignedShort());
}
}
@Test
void releaseAndCiAgreeWithThePurpurDistributionNameAndToolchain() throws Exception {
String build = Files.readString(Path.of("build.gradle.kts"));
assertTrue(build.contains("purpur-api:26.2.build.2618-stable"));
assertFalse(build.contains("org.spigotmc:spigot-api"));
for (String workflow : new String[] {"ci.yml", "release.yml"}) {
String content = Files.readString(Path.of(".gitea/workflows", workflow));
assertTrue(content.contains("java-version: 25"));
assertTrue(content.contains("purpur-stealth-"), workflow);
assertFalse(content.contains("spigot-stealth-"), workflow);
}
}
}