Skip to content
Draft
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
35 changes: 0 additions & 35 deletions .github/workflows/java-17-builds.yml

This file was deleted.

19 changes: 15 additions & 4 deletions .github/workflows/java-21-builds.yml
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
name: Java 21 CI (MC 1.20.6+)
name: Java 21 CI

on:
push:
Expand All @@ -8,9 +8,20 @@ on:
pull_request:

jobs:
build:
prepare:
name: Parallelize Tests
if: "! contains(toJSON(github.event.commits.*.message), '[ci skip]')"
uses: ./.github/workflows/parallelize-tests.yml
with:
environments: 1.21.3,1.21.4,1.21.5,1.21.8,1.21.10
java_version: 21

build:
name: ${{ matrix.display }}
needs: prepare
runs-on: ubuntu-latest
strategy:
matrix: ${{ fromJSON(needs.prepare.outputs.matrix) }}
steps:
- uses: actions/checkout@v5
with:
Expand All @@ -26,10 +37,10 @@ jobs:
- name: Grant execute permission for gradlew
run: chmod +x gradlew
- name: Build Skript and run test scripts
run: ./gradlew clean skriptTestJava21
run: ./gradlew clean customTest -PtestEnvs="${{ matrix.envs }}" -PtestEnvJavaVersion=21
- name: Upload Nightly Build
uses: actions/upload-artifact@v4
if: success()
if: success() && matrix.id == 1
with:
name: skript-nightly
path: build/libs/*
29 changes: 0 additions & 29 deletions .github/workflows/junit-17-builds.yml

This file was deleted.

26 changes: 22 additions & 4 deletions .github/workflows/junit-21-builds.yml
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
name: JUnit (MC 1.20.6+)
name: JUnit 21

on:
push:
Expand All @@ -8,9 +8,20 @@ on:
pull_request:

jobs:
build:
prepare:
name: Parallelize Tests
if: "! contains(toJSON(github.event.commits.*.message), '[ci skip]')"
uses: ./.github/workflows/parallelize-tests.yml
with:
environments: 1.21.3,1.21.4,1.21.5,1.21.8,1.21.10
java_version: 21

build:
name: ${{ matrix.display }}
needs: prepare
runs-on: ubuntu-latest
strategy:
matrix: ${{ fromJSON(needs.prepare.outputs.matrix) }}
steps:
- uses: actions/checkout@v5
with:
Expand All @@ -25,5 +36,12 @@ jobs:
cache: gradle
- name: Grant execute permission for gradlew
run: chmod +x gradlew
- name: Build Skript and run JUnit
run: ./gradlew clean JUnitJava21
- name: Build Skript and run test scripts
run: ./gradlew clean customTest -PtestEnvs="${{ matrix.envs }}" -PtestEnvJavaVersion=21 -Pjunit=true
- name: Upload Nightly Build
uses: actions/upload-artifact@v4
if: success() && matrix.id == 1
with:
name: skript-nightly
path: build/libs/*

85 changes: 85 additions & 0 deletions .github/workflows/parallelize-tests.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,85 @@
name: Parallelize Tests

on:
workflow_call:
inputs:
environments:
required: true
type: string
parallel_jobs:
required: false
type: number
default: 2
java_version:
required: true
type: number
outputs:
matrix:
description: "Generated test matrix"
value: ${{ jobs.prepare.outputs.matrix }}

jobs:
prepare:
name: ""
runs-on: ubuntu-latest
outputs:
matrix: ${{ steps.set-matrix.outputs.matrix }}
steps:
- name: Generate matrix
id: set-matrix
run: |
# Use environment variables
N=${{ inputs.parallel_jobs }}
JAVA_VERSION=${{ inputs.java_version }}

# Convert to array and transform
IFS=',' read -ra ENVS <<< "${{ inputs.environments }}"
TRANSFORMED=()
for env in "${ENVS[@]}"; do
TRANSFORMED+=("java${JAVA_VERSION}/paper-${env}")
done

TOTAL=${#TRANSFORMED[@]}

# avoid creating more jobs than needed
JOBS=$((TOTAL < N ? TOTAL : N))
# environments per job
BASE=$((TOTAL / JOBS))
EXTRA=$((TOTAL % JOBS))

# Build matrix JSON
# Format is:
# [{"id":1,"envs":"java21/paper-1.20.6,java21/paper-1.21.3","display":"1.20.6, 1.21.3"},...]
# Where "envs" is the actual environment strings and "display" is for easier identification
MATRIX="["
INDEX=0
for ((i=0; i<JOBS; i++)); do
# Determine count for this job (BASE + 1 if i < EXTRA)
COUNT=$BASE
if [ $i -lt $EXTRA ]; then
COUNT=$((COUNT + 1))
fi

# Build envs and display strings
GROUP=""
DISPLAY_GROUP=""
for ((j=0; j<COUNT; j++)); do
if [ -n "$GROUP" ]; then
GROUP="$GROUP,"
DISPLAY_GROUP="$DISPLAY_GROUP, "
fi
GROUP="$GROUP${TRANSFORMED[$INDEX]}"
DISPLAY_GROUP="$DISPLAY_GROUP${ENVS[$INDEX]}"
INDEX=$((INDEX + 1))
done

# add to matrix with separating comma if needed
if [ $i -gt 0 ]; then
MATRIX="$MATRIX,"
fi
MATRIX="$MATRIX{\"id\":$((i+1)),\"envs\":\"$GROUP\",\"display\":\"$DISPLAY_GROUP\"}"
done
MATRIX="$MATRIX]"

echo "matrix={\"include\":$MATRIX}" >> $GITHUB_OUTPUT
echo "Generated matrix: {\"include\":$MATRIX}"
36 changes: 33 additions & 3 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -176,7 +176,7 @@ tasks.register('testNaming') {
}

enum Modifiers {
DEV_MODE, GEN_NIGHTLY_DOCS, GEN_RELEASE_DOCS, DEBUG, PROFILE, JUNIT
DEV_MODE, GEN_NIGHTLY_DOCS, GEN_RELEASE_DOCS, DEBUG, PROFILE, JUNIT, PARALLEL
}

// Create a test task with given name, environments dir/file, dev mode and java version.
Expand All @@ -187,6 +187,7 @@ void createTestTask(String name, String desc, String environments, int javaVersi
boolean junit = modifiers.contains(Modifiers.JUNIT)
boolean releaseDocs = modifiers.contains(Modifiers.GEN_RELEASE_DOCS)
boolean docs = modifiers.contains(Modifiers.GEN_NIGHTLY_DOCS) || releaseDocs
boolean parallel = modifiers.contains(Modifiers.PARALLEL)
def artifact = 'build' + File.separator + 'libs' + File.separator
if (junit) {
artifact += 'Skript-JUnit.jar'
Expand Down Expand Up @@ -227,7 +228,8 @@ void createTestTask(String name, String desc, String environments, int javaVersi
junit,
modifiers.contains(Modifiers.DEBUG),
project.findProperty('verbosity') ?: "null",
timeout
timeout,
parallel
]

// Do first is used when throwing exceptions.
Expand Down Expand Up @@ -265,7 +267,7 @@ compileJava.options.encoding = 'UTF-8'
compileTestJava.options.encoding = 'UTF-8'

// Register different Skript testing tasks
String environments = 'src/test/skript/environments/';
String environments = 'src/test/skript/environments/'
int envJava = project.property('testEnvJavaVersion') == null ? latestJava : Integer.parseInt(project.property('testEnvJavaVersion') as String)
createTestTask('quickTest', 'Runs tests on one environment being the latest supported Java and Minecraft.', environments + env, latestJava, 0)
createTestTask('skriptTestJava21', 'Runs tests on all Java 21 environments.', environments + 'java21', java21, 0)
Expand All @@ -287,6 +289,34 @@ tasks.register('JUnit') {
dependsOn JUnitJava17, JUnitJava21
}

// custom test task
// usage: gradle customTest -PtestEnvs=<environment files, comma separated list.> -PtestEnvJavaVersion=<java version> -Ptimeout=<timeout in ms> -Pjunit=[true|false] -Pparallel=[true|false]
// defaults: testEnvJavaVersion=latestJava, timeout=0, junit=false, parallel=false
// example: gradle customTest -PtestEnvs=java21/1.21.4,java21/1.21.6 -PtestEnvJavaVersion=21 -Ptimeout=600000 -Pjunit=true -Pparallel=true

// get environments
String propEnvs = project.hasProperty('testEnvs') ? project.property('testEnvs') as String : project.testEnv
String[] envList = propEnvs != null ? propEnvs.split(',') : [env]
StringBuilder customEnvironmentsBuilder = new StringBuilder()
for (int i = 0; i < envList.length; i++) {
customEnvironmentsBuilder.append(environments).append(envList[i]).append('.json')
if (i < envList.length - 1) {
customEnvironmentsBuilder.append(',') // use ',' as separator for multiple environments
}
}
String customEnvironments = customEnvironmentsBuilder.toString()

long customTimeout = project.hasProperty('timeout') ? Long.parseLong(project.property('timeout') as String) : 0
List<Modifiers> customModifiers = new ArrayList<>()
if (project.hasProperty('junit') && (project.property('junit') as String).toLowerCase() == 'true') {
customModifiers.add(Modifiers.JUNIT)
}
if (project.hasProperty('parallel') && (project.property('parallel') as String).toLowerCase() == 'true') {
customModifiers.add(Modifiers.PARALLEL)
}
createTestTask('customTest', 'Runs tests based on provided parameters.', customEnvironments, envJava, customTimeout, customModifiers.toArray(new Modifiers[0]) as Modifiers[])


// Build flavor configurations
task githubResources(type: ProcessResources) {
from 'src/main/resources', {
Expand Down
Loading