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
333 changes: 4 additions & 329 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -32,13 +32,13 @@ jobs:
cd /tmp/MockBukkit && ./gradlew publishToMavenLocal -xtest -xjavadoc

- name: Run unit tests
run: mvn -B -ntp -Dmockbukkit.version="$MOCKBUKKIT_VERSION" org.jacoco:jacoco-maven-plugin:0.8.14:prepare-agent test org.jacoco:jacoco-maven-plugin:0.8.14:report
run: mvn -B -ntp -pl ezafk-core -am -Dmockbukkit.version="$MOCKBUKKIT_VERSION" org.jacoco:jacoco-maven-plugin:0.8.14:prepare-agent test org.jacoco:jacoco-maven-plugin:0.8.14:report

- name: Upload unit test coverage to Codecov
uses: codecov/codecov-action@v5
with:
use_oidc: true
files: ./target/site/jacoco/jacoco.xml
files: ezafk-core/target/site/jacoco/jacoco.xml
flags: unit
name: unit-tests

Expand Down Expand Up @@ -66,338 +66,13 @@ jobs:
cd /tmp/MockBukkit && ./gradlew publishToMavenLocal -xtest -xjavadoc

- name: Run feature tests
run: mvn -B -ntp -Pfeature-tests -Dtest=*FeatureTest -Dmockbukkit.version="$MOCKBUKKIT_VERSION" org.jacoco:jacoco-maven-plugin:0.8.14:prepare-agent test org.jacoco:jacoco-maven-plugin:0.8.14:report
run: mvn -B -ntp -pl ezafk-core -am -Dtest=*FeatureTest -Dmockbukkit.version="$MOCKBUKKIT_VERSION" org.jacoco:jacoco-maven-plugin:0.8.14:prepare-agent test org.jacoco:jacoco-maven-plugin:0.8.14:report -Dsurefire.failIfNoSpecifiedTests=false

- name: Upload feature test coverage to Codecov
uses: codecov/codecov-action@v5
with:
use_oidc: true
files: ./target/site/jacoco/jacoco.xml
files: ezafk-core/target/site/jacoco/jacoco.xml
flags: feature
name: feature-tests

# ──────────────────────────────────────────────────────────────────────────
# SMOKE TESTS — verify EzAfk loads without errors on each server platform.
#
# All smoke jobs build with JDK 25:
# paper-api 26.x uses Java 25 class files (version 69); older JDKs
# cannot read them and the build fails.
# maven.compiler.release=21 → plugin JAR targets Java 21 bytecode,
# compatible with every Minecraft 1.21+ server (Java 21+ required).
#
# Build uses -Dmaven.test.skip=true (avoids needing the MockBukkit install).
# ──────────────────────────────────────────────────────────────────────────

spigot-smoke-test:
name: Spigot 1.21.4 (build JDK 25 / server JDK 21)
runs-on: ubuntu-latest
needs: [unit-tests, feature-tests]
# BuildTools for Spigot 1.21.4 requires Java 21–24 (javaVersions [65,68]).
# JDK 25 is rejected by BuildTools even though the server itself runs fine
# on any Java 21+ JVM. Strategy: compile the plugin with JDK 25 (paper-api
# 26.x needs it), then swap to JDK 21 for BuildTools and server launch.

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

- name: Set up build JDK 25
uses: actions/setup-java@v5
with:
distribution: temurin
java-version: '25'
cache: maven

- name: Build plugin JAR (JDK 25)
run: mvn -B -ntp -Dmaven.test.skip=true package

- name: Set up server JDK 21
uses: actions/setup-java@v5
with:
distribution: temurin
java-version: '21'

- name: Cache Spigot 1.21.4 JAR
id: spigot-cache
uses: actions/cache@v4
with:
path: spigot-1.21.4.jar
key: spigot-1.21.4-buildtools-v1

- name: Build Spigot 1.21.4 via BuildTools
if: steps.spigot-cache.outputs.cache-hit != 'true'
run: |
git config --global user.email "ci@ci.local"
git config --global user.name "CI"
curl -fsSL \
https://hub.spigotmc.org/jenkins/job/BuildTools/lastSuccessfulBuild/artifact/target/BuildTools.jar \
-o BuildTools.jar
java -jar BuildTools.jar --rev 1.21.4 --compile SPIGOT

- name: Configure server
run: |
mkdir -p smoke-server/plugins
cp target/ezafk-*.jar smoke-server/plugins/EzAfk.jar
cp spigot-1.21.4.jar smoke-server/
echo "eula=true" > smoke-server/eula.txt
printf '%s\n' \
"online-mode=false" \
"level-type=flat" \
"generate-structures=false" \
"max-players=0" \
> smoke-server/server.properties

- name: Run server and wait for ready
run: |
cd smoke-server
java -Xms512m -Xmx1g -jar spigot-1.21.4.jar --nogui > server.log 2>&1 &
SERVER_PID=$!
ELAPSED=0
while [ $ELAPSED -lt 120 ]; do
sleep 2; ELAPSED=$((ELAPSED + 2))
if grep -q "Done (" server.log 2>/dev/null; then
echo "Server ready after ${ELAPSED}s"; break
fi
if ! kill -0 $SERVER_PID 2>/dev/null; then
echo "Server process exited after ${ELAPSED}s"; break
fi
done
kill $SERVER_PID 2>/dev/null || true
for _ in $(seq 1 15); do
if ! kill -0 $SERVER_PID 2>/dev/null; then
break
fi
sleep 1
done
if kill -0 $SERVER_PID 2>/dev/null; then
echo "Server did not stop after SIGTERM; forcing shutdown"
kill -9 $SERVER_PID 2>/dev/null || true
fi
wait $SERVER_PID 2>/dev/null || true

- name: Assert no EzAfk errors
run: |
LOG=smoke-server/server.log
if grep -qE "(SEVERE|ERROR).*EzAfk|Could not load.*EzAfk" "$LOG"; then
echo "::error::EzAfk logged errors on Spigot 1.21.4 / Java 21 startup:"
grep -E "(SEVERE|ERROR).*EzAfk|Could not load.*EzAfk" "$LOG"
exit 1
fi
if grep -qiE "Enabling EzAfk" "$LOG"; then
echo "Spigot 1.21.4 / Java 21 smoke test passed."
else
echo "::warning::EzAfk 'Enabling EzAfk' not found in log — plugin may not have loaded within the timeout"
fi

- name: Upload server log
if: always()
uses: actions/upload-artifact@v4
with:
name: spigot-1.21.4-java21-smoke-log
path: smoke-server/server.log
retention-days: 7

paper-smoke-test:
name: Paper 1.21.11 / Java 25
runs-on: ubuntu-latest
needs: [unit-tests, feature-tests]

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

- name: Set up JDK 25
uses: actions/setup-java@v5
with:
distribution: temurin
java-version: '25'
cache: maven

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

- name: Resolve latest Paper 1.21.11 build
id: paper
run: |
USER_AGENT="EzAfk-CI/1.0 (https://github.com/ez-plugins/EzAfk)"
BUILDS_JSON=$(curl -fsSL -H "User-Agent: ${USER_AGENT}" "https://fill.papermc.io/v3/projects/paper/versions/1.21.11/builds")
BUILD=$(printf '%s' "$BUILDS_JSON" | \
python3 -c "import sys,json; builds=json.load(sys.stdin); chosen=next((b for b in builds if b.get('channel')=='STABLE'), None) or (builds[0] if builds else None); assert chosen, 'No Paper builds returned'; print(chosen['id'])")
DOWNLOAD_URL=$(printf '%s' "$BUILDS_JSON" | \
python3 -c "import sys,json; builds=json.load(sys.stdin); chosen=next((b for b in builds if b.get('channel')=='STABLE'), None) or (builds[0] if builds else None); assert chosen, 'No Paper builds returned'; print(chosen['downloads']['server:default']['url'])")
echo "build=${BUILD}" >> "$GITHUB_OUTPUT"
echo "download_url=${DOWNLOAD_URL}" >> "$GITHUB_OUTPUT"
echo "Resolved: Paper 1.21.11 build ${BUILD}"

- name: Download Paper 1.21.11 server JAR
run: |
mkdir -p smoke-server/plugins
curl -fsSL -H "User-Agent: EzAfk-CI/1.0 (https://github.com/ez-plugins/EzAfk)" \
"${{ steps.paper.outputs.download_url }}" \
-o smoke-server/paper.jar

- name: Copy plugin JAR
run: cp target/ezafk-*.jar smoke-server/plugins/EzAfk.jar

- name: Configure server
run: |
echo "eula=true" > smoke-server/eula.txt
printf '%s\n' \
"online-mode=false" \
"level-type=flat" \
"generate-structures=false" \
"max-players=0" \
> smoke-server/server.properties

- name: Run server and wait for ready
run: |
cd smoke-server
java -Xms512m -Xmx1g -jar paper.jar --nogui > server.log 2>&1 &
SERVER_PID=$!
ELAPSED=0
while [ $ELAPSED -lt 120 ]; do
sleep 2; ELAPSED=$((ELAPSED + 2))
if grep -q "Done (" server.log 2>/dev/null; then
echo "Server ready after ${ELAPSED}s"; break
fi
if ! kill -0 $SERVER_PID 2>/dev/null; then
echo "Server process exited after ${ELAPSED}s"; break
fi
done
kill $SERVER_PID 2>/dev/null || true
for _ in $(seq 1 15); do
if ! kill -0 $SERVER_PID 2>/dev/null; then
break
fi
sleep 1
done
if kill -0 $SERVER_PID 2>/dev/null; then
echo "Server did not stop after SIGTERM; forcing shutdown"
kill -9 $SERVER_PID 2>/dev/null || true
fi
wait $SERVER_PID 2>/dev/null || true

- name: Assert no EzAfk errors
run: |
LOG=smoke-server/server.log
if grep -qE "(SEVERE|ERROR).*EzAfk|Could not load.*EzAfk" "$LOG"; then
echo "::error::EzAfk logged errors on Paper 1.21.11 / Java 25 startup:"
grep -E "(SEVERE|ERROR).*EzAfk|Could not load.*EzAfk" "$LOG"
exit 1
fi
if grep -qiE "Enabling EzAfk" "$LOG"; then
echo "Paper 1.21.11 / Java 25 smoke test passed."
else
echo "::warning::EzAfk 'Enabling EzAfk' not found in log — plugin may not have loaded within the timeout"
fi

- name: Upload server log
if: always()
uses: actions/upload-artifact@v4
with:
name: paper-1.21.11-java25-smoke-log
path: smoke-server/server.log
retention-days: 7

folia-smoke-test:
name: Folia 1.21.11 / Java 25
runs-on: ubuntu-latest
needs: [unit-tests, feature-tests]

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

- name: Set up JDK 25
uses: actions/setup-java@v5
with:
distribution: temurin
java-version: '25'
cache: maven

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

- name: Resolve latest Folia 1.21.11 build
id: folia
run: |
USER_AGENT="EzAfk-CI/1.0 (https://github.com/ez-plugins/EzAfk)"
BUILDS_JSON=$(curl -fsSL -H "User-Agent: ${USER_AGENT}" "https://fill.papermc.io/v3/projects/folia/versions/1.21.11/builds")
BUILD=$(printf '%s' "$BUILDS_JSON" | \
python3 -c "import sys,json; builds=json.load(sys.stdin); chosen=next((b for b in builds if b.get('channel')=='STABLE'), None) or (builds[0] if builds else None); assert chosen, 'No Folia builds returned'; print(chosen['id'])")
DOWNLOAD_URL=$(printf '%s' "$BUILDS_JSON" | \
python3 -c "import sys,json; builds=json.load(sys.stdin); chosen=next((b for b in builds if b.get('channel')=='STABLE'), None) or (builds[0] if builds else None); assert chosen, 'No Folia builds returned'; print(chosen['downloads']['server:default']['url'])")
echo "build=${BUILD}" >> "$GITHUB_OUTPUT"
echo "download_url=${DOWNLOAD_URL}" >> "$GITHUB_OUTPUT"
echo "Resolved: Folia 1.21.11 build ${BUILD}"

- name: Download Folia 1.21.11 server JAR
run: |
mkdir -p smoke-server/plugins
curl -fsSL -H "User-Agent: EzAfk-CI/1.0 (https://github.com/ez-plugins/EzAfk)" \
"${{ steps.folia.outputs.download_url }}" \
-o smoke-server/folia.jar

- name: Copy plugin JAR
run: cp target/ezafk-*.jar smoke-server/plugins/EzAfk.jar

- name: Configure server
run: |
echo "eula=true" > smoke-server/eula.txt
printf '%s\n' \
"online-mode=false" \
"level-type=flat" \
"generate-structures=false" \
"max-players=0" \
> smoke-server/server.properties

- name: Run server and wait for ready
run: |
cd smoke-server
java -Xms512m -Xmx1g -jar folia.jar --nogui > server.log 2>&1 &
SERVER_PID=$!
ELAPSED=0
while [ $ELAPSED -lt 120 ]; do
sleep 2; ELAPSED=$((ELAPSED + 2))
if grep -q "Done (" server.log 2>/dev/null; then
echo "Server ready after ${ELAPSED}s"; break
fi
if ! kill -0 $SERVER_PID 2>/dev/null; then
echo "Server process exited after ${ELAPSED}s"; break
fi
done
kill $SERVER_PID 2>/dev/null || true
for _ in $(seq 1 15); do
if ! kill -0 $SERVER_PID 2>/dev/null; then
break
fi
sleep 1
done
if kill -0 $SERVER_PID 2>/dev/null; then
echo "Server did not stop after SIGTERM; forcing shutdown"
kill -9 $SERVER_PID 2>/dev/null || true
fi
wait $SERVER_PID 2>/dev/null || true

- name: Assert no EzAfk errors
run: |
LOG=smoke-server/server.log
if grep -qE "(SEVERE|ERROR).*EzAfk|Could not load.*EzAfk" "$LOG"; then
echo "::error::EzAfk logged errors on Folia 1.21.11 / Java 25 startup:"
grep -E "(SEVERE|ERROR).*EzAfk|Could not load.*EzAfk" "$LOG"
exit 1
fi
if grep -qiE "Enabling EzAfk" "$LOG"; then
echo "Folia 1.21.11 / Java 25 smoke test passed."
else
echo "::warning::EzAfk 'Enabling EzAfk' not found in log — server may not have finished loading within the timeout"
fi

- name: Upload server log
if: always()
uses: actions/upload-artifact@v4
with:
name: folia-1.21.11-java25-smoke-log
path: smoke-server/server.log
retention-days: 7

8 changes: 4 additions & 4 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -80,7 +80,7 @@ jobs:
-DgenerateBackupPoms=false

- name: Build
run: mvn -B -ntp -DskipTests package
run: mvn -B -ntp -f pom.xml -DskipTests package

# ──────────────────────────────────────────────────────────────────────
# 5. EXTRACT CHANGELOG
Expand Down Expand Up @@ -119,7 +119,7 @@ jobs:
gh release create "${{ steps.meta.outputs.ref }}" \
--title "EzAfk ${{ steps.meta.outputs.version }}" \
--notes-file release-notes.md \
"target/ezafk-${{ steps.meta.outputs.version }}.jar"
"ezafk/target/ezafk-${{ steps.meta.outputs.version }}.jar"

# ──────────────────────────────────────────────────────────────────────
# 7. MODRINTH RELEASE
Expand All @@ -133,7 +133,7 @@ jobs:
name: "EzAfk ${{ steps.meta.outputs.version }}"
version: "${{ steps.meta.outputs.version }}"
version-type: release
files: target/ezafk-${{ steps.meta.outputs.version }}.jar
files: ezafk/target/ezafk-${{ steps.meta.outputs.version }}.jar
game-versions: ">=1.19"
game-versions-filter: release
loaders: |
Expand Down Expand Up @@ -185,4 +185,4 @@ jobs:

curl --fail -s -X POST "$DISCORD_WEBHOOK" \
-H "Content-Type: application/json" \
-d "$PAYLOAD"
-d "$PAYLOAD"
Loading
Loading