Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
22 commits
Select commit Hold shift + click to select a range
7152dc7
ci: add Paper 1.21.4 / 1.21.11 smoke test matrix with default package…
ez-plugins May 22, 2026
757526a
feat: Spigot/Folia compat + Folia/Purpur server smoke tests
ez-plugins May 22, 2026
7915b11
fix: remove redundant ChatColor.translateAlternateColorCodes in Quick…
ez-plugins May 22, 2026
0108a58
feat:
ez-plugins May 25, 2026
29b5fc5
ci: improved test metrix to test Java 17/Java 21/Java 25
ez-plugins May 25, 2026
e1f1344
docs: updated changelog
ez-plugins May 25, 2026
529d428
fix: improved test coverage
ez-plugins May 25, 2026
e35daa6
ci: fix Paper build version
ez-plugins May 25, 2026
4e3d540
fix: improved test coverage
ez-plugins May 25, 2026
fb999cd
ci: improved smoke tests
ez-plugins May 25, 2026
55ec3ec
ci: run smoke tests on pull request
ez-plugins May 25, 2026
85adba6
ci: fix MockBukkit ; fix skip tests in smoke tests
ez-plugins May 25, 2026
526a7b6
ci: fix smoke tests
ez-plugins May 25, 2026
fab4de6
ci: fix MockBukkit mismatch
ez-plugins May 25, 2026
6a9325d
ci: fix Vault in smoke test
ez-plugins May 25, 2026
ed29603
ci: fix smoke test kill cmd
ez-plugins May 25, 2026
21d7693
ci: added EzEconomy as economy provider to smoke test
ez-plugins May 25, 2026
f65ec97
ci: fixed EzEconomy as economy provider to smoke test
ez-plugins May 25, 2026
f45b35d
ci: fix python format in smoke test EzEconomy download
ez-plugins May 25, 2026
9e8eee4
ci: set EzEconomy to fixed 2.5.0
ez-plugins May 25, 2026
63417a6
ci: replace EzEconomy with EssentialsX in smoke test
ez-plugins May 25, 2026
81cc290
fix: fixed shading of libs
ez-plugins May 25, 2026
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
55 changes: 44 additions & 11 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -5,62 +5,95 @@ on:
branches: [ main, master ]

jobs:
java17-compat:
name: Java 17 Compatibility Build
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4

- name: Set up JDK 17
uses: actions/setup-java@v4
with:
distribution: temurin
java-version: '17'

- name: Cache Maven local repository
uses: actions/cache@v4
with:
path: ~/.m2/repository
key: ${{ runner.os }}-m2-jdk17-${{ hashFiles('**/pom.xml') }}
restore-keys: |
${{ runner.os }}-m2-jdk17-

- name: Build with Java 17-compatible API baseline
run: mvn -B -Dpaper.version=1.20.4-R0.1-SNAPSHOT -Dmaven.test.skip=true package

unit-tests:
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
include:
- paper-version: "1.21.11-R0.1-SNAPSHOT"
- java: "21"
paper-version: "1.21.11-R0.1-SNAPSHOT"
mockbukkit-groupId: "org.mockbukkit.mockbukkit"
mockbukkit-artifactId: "mockbukkit-v1.21"
mockbukkit-version: "4.101.0"
- java: "25"
paper-version: "1.21.11-R0.1-SNAPSHOT"
mockbukkit-groupId: "org.mockbukkit.mockbukkit"
mockbukkit-artifactId: "mockbukkit-v1.21"
mockbukkit-version: "4.101.0"

steps:
- name: Checkout
uses: actions/checkout@v4

- name: Set up JDK 21
- name: Set up JDK ${{ matrix.java }}
uses: actions/setup-java@v4
with:
distribution: temurin
java-version: '21'
java-version: ${{ matrix.java }}

- name: Cache Maven local repository
uses: actions/cache@v4
with:
path: ~/.m2/repository
key: ${{ runner.os }}-m2-${{ matrix.paper-version }}-${{ hashFiles('**/pom.xml') }}
key: ${{ runner.os }}-m2-${{ matrix.java }}-${{ matrix.paper-version }}-${{ hashFiles('**/pom.xml') }}
restore-keys: |
${{ runner.os }}-m2-${{ matrix.paper-version }}-
${{ runner.os }}-m2-${{ matrix.java }}-${{ matrix.paper-version }}-

- name: Run unit tests
run: mvn -B -Dpaper.version=${{ matrix.paper-version }} -Dmockbukkit.artifactId=${{ matrix.mockbukkit-artifactId }} -Dmockbukkit.version=${{ matrix.mockbukkit-version }} test
run: mvn -B -Dpaper.version=${{ matrix.paper-version }} -Dmockbukkit.groupId=${{ matrix.mockbukkit-groupId }} -Dmockbukkit.artifactId=${{ matrix.mockbukkit-artifactId }} -Dmockbukkit.version=${{ matrix.mockbukkit-version }} test

- name: Upload coverage to Codecov
uses: codecov/codecov-action@v5
with:
files: target/site/jacoco/jacoco.xml
flags: unit-tests
flags: unit-tests-jdk${{ matrix.java }}
fail_ci_if_error: false

feature-tests:
runs-on: ubuntu-latest
needs: unit-tests
needs: [java17-compat, unit-tests]
strategy:
matrix:
include:
- paper-version: "1.21.11-R0.1-SNAPSHOT"
- java: "21"
paper-version: "1.21.11-R0.1-SNAPSHOT"
mockbukkit-artifactId: "mockbukkit-v1.21"
mockbukkit-version: "4.101.0"

steps:
- name: Checkout
uses: actions/checkout@v4

- name: Set up JDK 21
- name: Set up JDK ${{ matrix.java }}
uses: actions/setup-java@v4
with:
distribution: temurin
java-version: '21'
java-version: ${{ matrix.java }}

- name: Cache Maven local repository
uses: actions/cache@v4
Expand Down
235 changes: 223 additions & 12 deletions .github/workflows/smoke-tests.yml
Original file line number Diff line number Diff line change
@@ -1,47 +1,258 @@
name: Smoke Tests

on:
push:
pull_request:
branches: [ main, master ]
workflow_dispatch:

jobs:
smoke:
name: Smoke (${{ matrix.name }})
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
include:
- name: "Paper 1.21.11 (MockBukkit-aligned)"
paper-version: "1.21.11-R0.1-SNAPSHOT"
mockbukkit-artifact: "mockbukkit-v1.21"
mockbukkit-group: "org.mockbukkit.mockbukkit"
mockbukkit-version: "4.101.0"
java: "21"
- name: "Paper 1.21.11 (Java 25)"
paper-version: "1.21.11-R0.1-SNAPSHOT"
mockbukkit-artifact: "mockbukkit-v1.21"
mockbukkit-group: "org.mockbukkit.mockbukkit"
mockbukkit-version: "4.101.0"
java: "25"

steps:
- name: Checkout
uses: actions/checkout@v4

- name: Set up JDK 21
- name: Set up JDK ${{ matrix.java }}
uses: actions/setup-java@v4
with:
distribution: temurin
java-version: '21'
java-version: ${{ matrix.java }}

- name: Cache Maven local repository
uses: actions/cache@v4
with:
path: ~/.m2/repository
key: ${{ runner.os }}-m2-smoke-${{ hashFiles('**/pom.xml') }}
key: ${{ runner.os }}-m2-smoke-${{ matrix.name }}-${{ hashFiles('**/pom.xml') }}
restore-keys: |
${{ runner.os }}-m2-smoke-

- name: Build plugin
run: mvn -B -DskipTests package
${{ runner.os }}-m2-smoke-${{ matrix.name }}-

- name: Run smoke tests
run: |
mvn -B \
-Dpaper.version=1.21.11-R0.1-SNAPSHOT \
-Dmockbukkit.artifactId=mockbukkit-v1.21 \
-Dmockbukkit.version=4.101.0 \
-Dpaper.version=${{ matrix.paper-version }} \
-Dmockbukkit.groupId=${{ matrix.mockbukkit-group }} \
-Dmockbukkit.artifactId=${{ matrix.mockbukkit-artifact }} \
-Dmockbukkit.version=${{ matrix.mockbukkit-version }} \
-Dtest=EzShopsPluginFeatureTest,PluginLifecycleFeatureTest,EzShopsAPITest \
test

smoke-java17-compat:
name: Smoke Java 17 Compatibility Build
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4

- name: Set up JDK 17
uses: actions/setup-java@v4
with:
distribution: temurin
java-version: "17"

- name: Cache Maven local repository
uses: actions/cache@v4
with:
path: ~/.m2/repository
key: ${{ runner.os }}-m2-smoke-j17-${{ hashFiles('**/pom.xml') }}
restore-keys: |
${{ runner.os }}-m2-smoke-j17-

- name: Build with Java 17-compatible API baseline
run: mvn -B -Dpaper.version=1.20.4-R0.1-SNAPSHOT -Dmaven.test.skip=true package

smoke-server:
# Real server startup tests. Verifies the plugin JAR is recognised and
# loaded by each supported runtime without startup/class-loading errors.
name: Server (${{ matrix.name }})
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
include:
- name: "Paper 1.20.4 (Java 17)"
project: paper-j17
java: "17"
economy-download: |
curl -fsSL "https://github.com/EssentialsX/Essentials/releases/download/2.20.1/EssentialsX-2.20.1.jar" \
-o server/plugins/EssentialsX.jar
download: |
BUILD=$(curl -fsSL "https://api.papermc.io/v2/projects/paper/versions/1.20.4/builds" | \
python3 -c "import sys,json; b=json.load(sys.stdin)['builds']; print(b[-1]['build'])")
JAR=$(curl -fsSL "https://api.papermc.io/v2/projects/paper/versions/1.20.4/builds/$BUILD" | \
python3 -c "import sys,json; d=json.load(sys.stdin); print(d['downloads']['application']['name'])")
curl -fsSL "https://api.papermc.io/v2/projects/paper/versions/1.20.4/builds/$BUILD/downloads/$JAR" \
-o server/server.jar
- name: "Paper 1.21.4"
project: paper
java: "21"
economy-download: ""
download: |
BUILD=$(curl -fsSL "https://api.papermc.io/v2/projects/paper/versions/1.21.4/builds" | \
python3 -c "import sys,json; b=json.load(sys.stdin)['builds']; print(b[-1]['build'])")
JAR=$(curl -fsSL "https://api.papermc.io/v2/projects/paper/versions/1.21.4/builds/$BUILD" | \
python3 -c "import sys,json; d=json.load(sys.stdin); print(d['downloads']['application']['name'])")
curl -fsSL "https://api.papermc.io/v2/projects/paper/versions/1.21.4/builds/$BUILD/downloads/$JAR" \
-o server/server.jar
- name: "Folia 1.21.4"
project: folia
java: "21"
economy-download: ""
download: |
BUILD=$(curl -fsSL "https://api.papermc.io/v2/projects/folia/versions/1.21.4/builds" | \
python3 -c "import sys,json; b=json.load(sys.stdin)['builds']; print(b[-1]['build'])")
JAR=$(curl -fsSL "https://api.papermc.io/v2/projects/folia/versions/1.21.4/builds/$BUILD" | \
python3 -c "import sys,json; d=json.load(sys.stdin); print(d['downloads']['application']['name'])")
curl -fsSL "https://api.papermc.io/v2/projects/folia/versions/1.21.4/builds/$BUILD/downloads/$JAR" \
-o server/server.jar
- name: "Purpur 1.21.4 (Spigot-compatible)"
project: purpur
java: "21"
economy-download: ""
download: |
curl -fsSL "https://api.purpurmc.org/v2/purpur/1.21.4/latest/download" \
-o server/server.jar

steps:
- name: Checkout
uses: actions/checkout@v4

- name: Set up JDK ${{ matrix.java }}
uses: actions/setup-java@v4
with:
distribution: temurin
java-version: ${{ matrix.java }}

- name: Cache Maven local repository
uses: actions/cache@v4
with:
path: ~/.m2/repository
key: ${{ runner.os }}-m2-build-${{ hashFiles('**/pom.xml') }}
restore-keys: |
${{ runner.os }}-m2-build-

- name: Build plugin
run: mvn -B -Dmaven.test.skip=true package

- name: Set up server directory
run: |
mkdir -p server/plugins
cp target/EzShops-*.jar server/plugins/
echo "eula=true" > server/eula.txt
printf "server-port=25565\nonline-mode=false\n" > server/server.properties

- name: Download Vault dependency plugin
run: |
curl -fsSL "https://github.com/MilkBowl/Vault/releases/download/1.7.3/Vault.jar" \
-o server/plugins/Vault.jar

- name: Download optional economy provider plugin
if: ${{ matrix.economy-download != '' }}
run: ${{ matrix.economy-download }}

- name: Download ${{ matrix.name }} JAR
run: ${{ matrix.download }}

- name: Start server and verify EzShops loads
run: |
cd server
java -jar server.jar --nogui &
SERVER_PID=$!
# Wait up to 120 s for EzShops to appear in the log, then stop early
for i in $(seq 1 60); do
sleep 2
if [ -f logs/latest.log ] && grep -qi "ezshops" logs/latest.log; then
break
fi
done

# Graceful shutdown first. SIGINT maps better to console Ctrl+C and
# avoids noisy ThreadDeath traces seen with abrupt termination.
kill -INT $SERVER_PID 2>/dev/null || true
for i in $(seq 1 20); do
if ! kill -0 $SERVER_PID 2>/dev/null; then
break
fi
sleep 1
done
# Fallback escalation only if the process is still alive.
if kill -0 $SERVER_PID 2>/dev/null; then
kill -TERM $SERVER_PID 2>/dev/null || true
sleep 3
fi
if kill -0 $SERVER_PID 2>/dev/null; then
kill -KILL $SERVER_PID 2>/dev/null || true
fi
wait $SERVER_PID 2>/dev/null || true
# EzShops must appear in the server log (even if it self-disables
# due to Vault being absent — that is expected and not a failure).
if ! grep -qi "ezshops" logs/latest.log 2>/dev/null; then
echo "EzShops was not recognised by the server"
cat logs/latest.log
exit 1
fi
# Any unhandled exception during onEnable would produce this line.
if grep -q "Error occurred while enabling EzShops" logs/latest.log 2>/dev/null; then
echo "EzShops encountered an unexpected error during enable:"
grep -A 20 "Error occurred while enabling EzShops" logs/latest.log
exit 1
fi
echo "Smoke test passed"

- name: Upload server log
if: always()
uses: actions/upload-artifact@v4
with:
name: server-log-${{ matrix.project }}-${{ github.sha }}
path: server/logs/latest.log
retention-days: 7

package:
name: Package (default)
runs-on: ubuntu-latest
needs: [smoke, smoke-java17-compat, smoke-server]

steps:
- name: Checkout
uses: actions/checkout@v4

- name: Set up JDK 21
uses: actions/setup-java@v4
with:
distribution: temurin
java-version: "21"

- name: Cache Maven local repository
uses: actions/cache@v4
with:
path: ~/.m2/repository
key: ${{ runner.os }}-m2-${{ hashFiles('**/pom.xml') }}
restore-keys: |
${{ runner.os }}-m2-

- name: Build plugin (default compatibility)
run: mvn -B -Dmaven.test.skip=true package

- name: Upload jar artifact
uses: actions/upload-artifact@v4
with:
name: EzShops-smoke-${{ github.sha }}
name: EzShops-${{ github.sha }}
path: target/*.jar
retention-days: 7
Loading
Loading