Skip to content

Commit 81daf01

Browse files
committed
feat: initial commit
0 parents  commit 81daf01

22 files changed

Lines changed: 3148 additions & 0 deletions
Lines changed: 223 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,223 @@
1+
name: Integration Tests
2+
3+
on:
4+
push:
5+
branches: [ main, develop ]
6+
pull_request:
7+
branches: [ main, develop ]
8+
schedule:
9+
# Run integration tests daily at 2 AM UTC
10+
- cron: '0 2 * * *'
11+
12+
jobs:
13+
integration-test:
14+
runs-on: ubuntu-latest
15+
16+
services:
17+
# Use PostgreSQL if needed for complex server setups
18+
postgres:
19+
image: postgres:13
20+
env:
21+
POSTGRES_PASSWORD: postgres
22+
POSTGRES_DB: test
23+
options: >-
24+
--health-cmd pg_isready
25+
--health-interval 10s
26+
--health-timeout 5s
27+
--health-retries 5
28+
29+
steps:
30+
- name: Checkout code
31+
uses: actions/checkout@v4
32+
33+
- name: Set up JDK 21
34+
uses: actions/setup-java@v4
35+
with:
36+
java-version: '21'
37+
distribution: 'temurin'
38+
39+
- name: Cache Maven packages
40+
uses: actions/cache@v4
41+
with:
42+
path: ~/.m2
43+
key: ${{ runner.os }}-m2-${{ hashFiles('**/pom.xml') }}
44+
restore-keys: ${{ runner.os }}-m2
45+
46+
- name: Install Docker Compose
47+
run: |
48+
sudo rm /usr/local/bin/docker-compose
49+
curl -L https://github.com/docker/compose/releases/latest/download/docker-compose-Linux-x86_64 > docker-compose
50+
chmod +x docker-compose
51+
sudo mv docker-compose /usr/local/bin
52+
53+
- name: Build plugin
54+
run: mvn clean package -DskipTests
55+
56+
- name: Verify plugin JAR exists
57+
run: |
58+
ls -la target/DragonEggLightning-*.jar
59+
echo "Plugin JAR size: $(du -h target/DragonEggLightning-*.jar | cut -f1)"
60+
61+
- name: Prepare server directory
62+
run: |
63+
mkdir -p server-data/plugins
64+
cp target/DragonEggLightning-*.jar server-data/plugins/
65+
ls -la server-data/plugins/
66+
67+
- name: Start Paper server with plugin
68+
run: |
69+
docker-compose up -d
70+
echo "Waiting for server to start..."
71+
72+
- name: Wait for server startup
73+
run: |
74+
echo "Checking server logs..."
75+
timeout 300 bash -c '
76+
until docker logs papermc-dragonegg 2>&1 | grep -q "Done"; do
77+
echo "Waiting for server startup..."
78+
sleep 10
79+
done
80+
'
81+
echo "Server startup completed!"
82+
83+
- name: Check plugin loading
84+
run: |
85+
echo "Checking for plugin loading messages..."
86+
docker logs papermc-dragonegg 2>&1 | grep -i dragon
87+
echo "Plugin should be loaded if no errors above"
88+
89+
- name: Create integration test script
90+
run: |
91+
cat > integration-test.sh << 'EOF'
92+
#!/bin/bash
93+
set -e
94+
95+
echo "Starting integration tests..."
96+
97+
# Test 1: Plugin loads
98+
echo "Test 1: Checking plugin loading..."
99+
if docker logs papermc-dragonegg 2>&1 | grep -q "DragonEggLightning enabled"; then
100+
echo "✅ Plugin loaded successfully"
101+
else
102+
echo "❌ Plugin failed to load"
103+
exit 1
104+
fi
105+
106+
# Test 2: Server responds to commands
107+
echo "Test 2: Checking server responsiveness..."
108+
sleep 30 # Give server time to fully initialize
109+
110+
# Test 3: Check server health
111+
echo "Test 3: Server health check..."
112+
if docker ps | grep -q papermc-dragonegg; then
113+
echo "✅ Server container is running"
114+
else
115+
echo "❌ Server container is not running"
116+
docker logs papermc-dragonegg
117+
exit 1
118+
fi
119+
120+
# Test 4: Verify no critical errors
121+
echo "Test 4: Checking for critical errors..."
122+
ERROR_COUNT=$(docker logs papermc-dragonegg 2>&1 | grep -i "error\|exception" | grep -v "INFO" | wc -l)
123+
if [ "$ERROR_COUNT" -eq 0 ]; then
124+
echo "✅ No critical errors found"
125+
else
126+
echo "⚠️ Found $ERROR_COUNT potential errors (may be non-critical)"
127+
docker logs papermc-dragonegg 2>&1 | grep -i "error\|exception" | tail -5
128+
fi
129+
130+
# Test 5: Check memory usage
131+
echo "Test 5: Memory usage check..."
132+
MEMORY_USAGE=$(docker stats papermc-dragonegg --no-stream --format "table {{.MemUsage}}" | tail -1 | awk '{print $1}' | sed 's/MiB//')
133+
echo "Memory usage: ${MEMORY_USAGE}MiB"
134+
135+
if [ "$MEMORY_USAGE" -lt 2048 ]; then
136+
echo "✅ Memory usage is acceptable"
137+
else
138+
echo "⚠️ High memory usage: ${MEMORY_USAGE}MiB"
139+
fi
140+
141+
# Test 6: Server performance
142+
echo "Test 6: Server performance check..."
143+
sleep 10
144+
145+
# Keep server running for a bit to check stability
146+
echo "Server running for stability test..."
147+
sleep 60
148+
149+
if docker ps | grep -q papermc-dragonegg; then
150+
echo "✅ Server remained stable during test period"
151+
else
152+
echo "❌ Server crashed during test"
153+
docker logs papermc-dragonegg --tail 50
154+
exit 1
155+
fi
156+
157+
echo "Integration tests completed successfully!"
158+
EOF
159+
chmod +x integration-test.sh
160+
161+
- name: Run integration tests
162+
run: |
163+
./integration-test.sh
164+
165+
- name: Collect server logs
166+
if: always()
167+
run: |
168+
echo "=== Server logs (last 100 lines) ==="
169+
docker logs papermc-dragonegg --tail 100
170+
echo "=== End of logs ==="
171+
172+
- name: Collect Docker stats
173+
if: always()
174+
run: |
175+
echo "=== Docker stats ==="
176+
docker stats papermc-dragonegg --no-stream
177+
echo "=== End of stats ==="
178+
179+
- name: Stop server
180+
if: always()
181+
run: |
182+
echo "Stopping server..."
183+
docker-compose down
184+
docker system prune -f
185+
186+
- name: Upload integration test results
187+
if: always()
188+
uses: actions/upload-artifact@v4
189+
with:
190+
name: integration-test-results
191+
path: |
192+
integration-test.sh
193+
server-data/
194+
retention-days: 7
195+
196+
docker-build-test:
197+
runs-on: ubuntu-latest
198+
needs: integration-test
199+
200+
steps:
201+
- name: Checkout code
202+
uses: actions/checkout@v4
203+
204+
- name: Test Docker image builds
205+
run: |
206+
echo "Testing that Docker Compose configuration is valid..."
207+
docker-compose config > /dev/null
208+
echo "✅ Docker Compose configuration is valid"
209+
210+
- name: Test plugin JAR in clean environment
211+
run: |
212+
echo "Testing plugin JAR in isolated environment..."
213+
docker run --rm -v $(pwd)/target:/plugin alpine:latest \
214+
sh -c '
215+
ls -la /plugin/DragonEggLightning-*.jar
216+
file /plugin/DragonEggLightning-*.jar
217+
if file /plugin/DragonEggLightning-*.jar | grep -q "Java"; then
218+
echo "✅ JAR file appears to be valid Java bytecode"
219+
else
220+
echo "❌ JAR file does not appear to be valid Java bytecode"
221+
exit 1
222+
fi
223+
'

.github/workflows/release.yml

Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
1+
name: Release
2+
3+
on:
4+
push:
5+
tags:
6+
- 'v*.*.*'
7+
8+
jobs:
9+
release:
10+
name: Create Release
11+
runs-on: ubuntu-latest
12+
13+
steps:
14+
- name: Checkout code
15+
uses: actions/checkout@v4
16+
with:
17+
fetch-depth: 0
18+
19+
- name: Set up JDK 21
20+
uses: actions/setup-java@v4
21+
with:
22+
java-version: '21'
23+
distribution: 'temurin'
24+
25+
- name: Build plugin
26+
run: |
27+
mvn clean package -DskipTests
28+
echo "Plugin built successfully"
29+
30+
- name: Get version from tag
31+
id: version
32+
run: |
33+
TAG=${GITHUB_REF#refs/tags/}
34+
echo "tag=$TAG" >> $GITHUB_OUTPUT
35+
echo "version=${TAG#v}" >> $GITHUB_OUTPUT
36+
37+
- name: Generate changelog
38+
id: changelog
39+
run: |
40+
TAG=${{ steps.version.outputs.tag }}
41+
echo "## Changes in $TAG" > CHANGELOG.md
42+
echo "" >> CHANGELOG.md
43+
44+
# Get previous tag
45+
PREVIOUS_TAG=$(git describe --tags --abbrev=0 HEAD^ 2>/dev/null || echo "")
46+
47+
if [ -n "$PREVIOUS_TAG" ]; then
48+
echo "### Commits since $PREVIOUS_TAG:" >> CHANGELOG.md
49+
echo "" >> CHANGELOG.md
50+
git log --pretty=format:"- %s (%h)" $PREVIOUS_TAG..HEAD >> CHANGELOG.md
51+
else
52+
echo "### Initial release" >> CHANGELOG.md
53+
fi
54+
55+
echo "" >> CHANGELOG.md
56+
echo "### Installation" >> CHANGELOG.md
57+
echo "" >> CHANGELOG.md
58+
echo "1. Download the plugin JAR file below" >> CHANGELOG.md
59+
echo "2. Place it in your Paper server's \`plugins/\` directory" >> CHANGELOG.md
60+
echo "3. Restart your server" >> CHANGELOG.md
61+
echo "4. Players can use \`/ability 1\` with a Dragon Egg in offhand" >> CHANGELOG.md
62+
63+
# Add file info
64+
JAR_FILE=$(ls target/DragonEggLightning-*.jar | head -1)
65+
JAR_SIZE=$(du -h "$JAR_FILE" | cut -f1)
66+
echo "" >> CHANGELOG.md
67+
echo "### File Information" >> CHANGELOG.md
68+
echo "" >> CHANGELOG.md
69+
echo "- **File**: $JAR_FILE" >> CHANGELOG.md
70+
echo "- **Size**: $JAR_SIZE" >> CHANGELOG.md
71+
echo "- **Build Date**: $(date -u +"%Y-%m-%d %H:%M:%S UTC")" >> CHANGELOG.md
72+
echo "- **Commit**: ${{ github.sha }}" >> CHANGELOG.md
73+
74+
- name: Create Release
75+
uses: softprops/action-gh-release@v1
76+
with:
77+
tag_name: ${{ steps.version.outputs.tag }}
78+
name: Release ${{ steps.version.outputs.version }}
79+
body_path: CHANGELOG.md
80+
draft: false
81+
prerelease: false
82+
files: |
83+
target/DragonEggLightning-*.jar
84+
env:
85+
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
86+
87+
- name: Upload JAR to release
88+
uses: actions/upload-release-asset@v1
89+
env:
90+
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
91+
with:
92+
upload_url: ${{ steps.create_release.outputs.upload_url }}
93+
asset_path: target/DragonEggLightning-*.jar
94+
asset_name: DragonEggLightning-${{ steps.version.outputs.version }}.jar
95+
asset_content_type: application/java-archive

.github/workflows/unit-tests.yml

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
name: Unit Tests
2+
3+
on:
4+
push:
5+
branches: [ main, develop ]
6+
pull_request:
7+
branches: [ main, develop ]
8+
9+
jobs:
10+
test:
11+
runs-on: ubuntu-latest
12+
13+
strategy:
14+
matrix:
15+
java-version: [21, 22]
16+
17+
steps:
18+
- name: Checkout code
19+
uses: actions/checkout@v4
20+
21+
- name: Set up JDK ${{ matrix.java-version }}
22+
uses: actions/setup-java@v4
23+
with:
24+
java-version: ${{ matrix.java-version }}
25+
distribution: 'temurin'
26+
27+
- name: Cache Maven packages
28+
uses: actions/cache@v4
29+
with:
30+
path: ~/.m2
31+
key: ${{ runner.os }}-m2-${{ hashFiles('**/pom.xml') }}
32+
restore-keys: ${{ runner.os }}-m2
33+
34+
- name: Build with Maven
35+
run: mvn clean compile
36+
37+
- name: Run unit tests
38+
run: mvn test
39+
40+
- name: Generate test report
41+
run: mvn surefire-report:report
42+
43+
- name: Upload test results
44+
uses: actions/upload-artifact@v4
45+
if: always()
46+
with:
47+
name: test-results-java-${{ matrix.java-version }}
48+
path: |
49+
target/surefire-reports/
50+
target/site/surefire-report.html
51+
52+
- name: Upload coverage reports
53+
uses: codecov/codecov-action@v4
54+
with:
55+
files: ./target/site/jacoco/jacoco.xml
56+
flags: unittests
57+
name: codecov-umbrella
58+
fail_ci_if_error: false

0 commit comments

Comments
 (0)