Skip to content

Commit 85a164d

Browse files
rom1504claude
andauthored
CI: run 4 MC versions per job to halve runner pressure (#3870)
* Run 2 MC versions per CI job to halve runner pressure Pair up tested versions so each CI job runs 2 versions in parallel. Reduces matrix from 27 jobs to 14, cutting runner queueing time while keeping the same wall time per job (~5 min for 2 versions). Each version's output goes to a separate log file, printed sequentially with clear headers at the end for easy debugging. Job names show both versions (e.g. "MC 1.8.8 1.9.4"). Tested locally: 1.9.4 + 1.12.2 both pass (45/45 each) in 5 min total wall time vs 9 min sequential. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * Fix internal test port conflict when running versions in parallel Use getPort() instead of hardcoded port 25567 in internalTest.js. When 2 versions run in the same CI job, both would try to bind the same port, causing EADDRINUSE. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * Fix lint, sync to master, run 4 versions per CI job - Fix indentation lint errors in internalTest.js - Group 4 MC versions per CI job (27 versions → 7 jobs) - Rebased on latest master Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> --------- Co-authored-by: rom1504 <rom1504@users.noreply.github.com> Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1 parent 81ecd72 commit 85a164d

2 files changed

Lines changed: 67 additions & 43 deletions

File tree

.github/workflows/ci.yml

Lines changed: 28 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -32,15 +32,21 @@ jobs:
3232
- id: set-matrix
3333
run: |
3434
node -e "
35-
const testedVersions = require('./lib/version').testedVersions;
36-
console.log('matrix='+JSON.stringify({'include': testedVersions.map(mcVersion => ({mcVersion}))}))
35+
const v = require('./lib/version').testedVersions;
36+
const groups = [];
37+
const SIZE = 4;
38+
for (let i = 0; i < v.length; i += SIZE) {
39+
groups.push({ versions: v.slice(i, i + SIZE).join(' ') });
40+
}
41+
console.log('matrix='+JSON.stringify({'include': groups}))
3742
" >> $GITHUB_OUTPUT
3843
3944
MinecraftServer:
4045
needs: PrepareSupportedVersions
4146
runs-on: ubuntu-latest
47+
name: MC ${{ matrix.versions }}
4248
strategy:
43-
matrix: ${{fromJson(needs.PrepareSupportedVersions.outputs.matrix)}}
49+
matrix: ${{ fromJson(needs.PrepareSupportedVersions.outputs.matrix) }}
4450
fail-fast: false
4551

4652
steps:
@@ -58,4 +64,22 @@ jobs:
5864
run: npm install
5965

6066
- name: Start Tests
61-
run: npm run mocha_test -- --retries 2 -g ${{ matrix.mcVersion }}v
67+
run: |
68+
exit_code=0
69+
pids=""
70+
for v in ${{ matrix.versions }}; do
71+
npm run mocha_test -- --retries 2 -g "${v}v" > "test-${v}.log" 2>&1 &
72+
pids="$pids $!"
73+
done
74+
for pid in $pids; do
75+
wait $pid || exit_code=$?
76+
done
77+
# Print logs sequentially with clear headers
78+
for v in ${{ matrix.versions }}; do
79+
echo ""
80+
echo "=========================================="
81+
echo " Results for Minecraft ${v}"
82+
echo "=========================================="
83+
cat "test-${v}.log"
84+
done
85+
exit $exit_code

test/internalTest.js

Lines changed: 39 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ const assert = require('assert')
77
const { sleep } = require('../lib/promise_utils')
88
const nbt = require('prismarine-nbt')
99
const { once } = require('../lib/promise_utils')
10+
const { getPort } = require('./common/util')
1011

1112
for (const supportedVersion of mineflayer.testedVersions) {
1213
const registry = require('prismarine-registry')(supportedVersion)
@@ -52,54 +53,53 @@ for (const supportedVersion of mineflayer.testedVersions) {
5253
this.timeout(10 * 1000)
5354
let bot
5455
let server
55-
beforeEach((done) => {
56+
let PORT
57+
beforeEach(async function () {
58+
PORT = await getPort()
5659
server = mc.createServer({
5760
'online-mode': false,
5861
version: supportedVersion,
59-
// 25565 - local server, 25566 - proxy server
60-
port: 25567
62+
port: PORT
6163
})
62-
server.on('listening', () => {
63-
bot = mineflayer.createBot({
64-
username: 'player',
65-
version: supportedVersion,
66-
port: 25567
67-
})
68-
bot.test = {}
64+
await once(server, 'listening')
65+
bot = mineflayer.createBot({
66+
username: 'player',
67+
version: supportedVersion,
68+
port: PORT
69+
})
70+
bot.test = {}
6971

70-
bot.test.buildChunk = () => {
71-
if (bot.supportFeature('tallWorld')) {
72-
return new Chunk({ minY: -64, worldHeight: 384 })
73-
} else {
74-
return new Chunk()
75-
}
72+
bot.test.buildChunk = () => {
73+
if (bot.supportFeature('tallWorld')) {
74+
return new Chunk({ minY: -64, worldHeight: 384 })
75+
} else {
76+
return new Chunk()
7677
}
78+
}
7779

78-
bot.test.generateLoginPacket = () => {
79-
let loginPacket
80-
if (bot.supportFeature('usesLoginPacket')) {
81-
loginPacket = registry.loginPacket
82-
loginPacket.entityId = 0 // Default login packet in minecraft-data 1.16.5 is 1, so set it to 0
83-
} else {
84-
loginPacket = {
85-
entityId: 0,
86-
levelType: 'fogetaboutit',
87-
gameMode: 0,
88-
previousGameMode: 255,
89-
worldNames: ['minecraft:overworld'],
90-
dimension: 0,
91-
worldName: 'minecraft:overworld',
92-
hashedSeed: [0, 0],
93-
difficulty: 0,
94-
maxPlayers: 20,
95-
reducedDebugInfo: 1,
96-
enableRespawnScreen: true
97-
}
80+
bot.test.generateLoginPacket = () => {
81+
let loginPacket
82+
if (bot.supportFeature('usesLoginPacket')) {
83+
loginPacket = registry.loginPacket
84+
loginPacket.entityId = 0 // Default login packet in minecraft-data 1.16.5 is 1, so set it to 0
85+
} else {
86+
loginPacket = {
87+
entityId: 0,
88+
levelType: 'fogetaboutit',
89+
gameMode: 0,
90+
previousGameMode: 255,
91+
worldNames: ['minecraft:overworld'],
92+
dimension: 0,
93+
worldName: 'minecraft:overworld',
94+
hashedSeed: [0, 0],
95+
difficulty: 0,
96+
maxPlayers: 20,
97+
reducedDebugInfo: 1,
98+
enableRespawnScreen: true
9899
}
99-
return loginPacket
100100
}
101-
done()
102-
})
101+
return loginPacket
102+
}
103103
})
104104
afterEach((done) => {
105105
bot.on('end', () => {

0 commit comments

Comments
 (0)