neon-sprawl/.github/workflows/gdscript.yml

92 lines
3.2 KiB
YAML

# Lint, format-check, and unit-test GDScript (Godot 4.6). gdtoolkit: https://github.com/Scony/godot-gdscript-toolkit
# GDUnit4 v6.1.2 under client/addons/gdUnit4; tests in client/test/
name: GDScript
on:
push:
branches: [main]
paths:
- "client/scripts/**"
- "client/test/**"
- "client/addons/**"
- "client/project.godot"
- ".github/workflows/gdscript.yml"
pull_request:
branches: [main]
paths:
- "client/scripts/**"
- "client/test/**"
- "client/addons/**"
- "client/project.godot"
- ".github/workflows/gdscript.yml"
jobs:
lint_and_test:
runs-on: ubuntu-latest
# Folder is addons/gdUnit4 (capital U). Lowercase gdunit4 fails on Linux (case-sensitive res://).
env:
GDUNIT_CMDTOOL: res://addons/gdUnit4/bin/GdUnitCmdTool.gd
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with:
python-version: "3.x"
- name: Install gdtoolkit
run: pip install "gdtoolkit==4.5.0"
- name: gdlint
run: gdlint client/scripts client/test
- name: gdformat (check only)
run: gdformat --check client/scripts client/test
- name: Cache Godot 4.6
uses: actions/cache@v4
id: godot-cache
with:
path: ~/godot/Godot_v4.6-stable_linux.x86_64
key: godot-4.6-stable-linux-x86_64
- name: Download Godot 4.6
if: steps.godot-cache.outputs.cache-hit != 'true'
run: |
mkdir -p ~/godot
wget -q "https://github.com/godotengine/godot/releases/download/4.6-stable/Godot_v4.6-stable_linux.x86_64.zip" -O /tmp/godot.zip
unzip -q /tmp/godot.zip -d ~/godot
chmod +x ~/godot/Godot_v4.6-stable_linux.x86_64
- name: Import project (.godot)
working-directory: client
run: ~/godot/Godot_v4.6-stable_linux.x86_64 --headless --import --path . --quit-after 10
- name: Verify GDUnit path (Linux res:// is case-sensitive)
working-directory: client
run: |
test -f addons/gdUnit4/bin/GdUnitCmdTool.gd || {
echo "::error::Missing GdUnit CLI script. Use addons/gdUnit4 (capital U), not gdunit4."
ls -la addons/ || true
exit 1
}
# GdUnit returns 0 if *executed* tests pass, even when Godot logs SCRIPT ERROR during suite
# discovery (broken test files are skipped). Fail the job if those errors appear in output.
- name: GDUnit4 (headless)
working-directory: client
shell: bash
run: |
set -euo pipefail
LOG="$(mktemp)"
trap 'rm -f "$LOG"' EXIT
~/godot/Godot_v4.6-stable_linux.x86_64 --headless --path . -s "$GDUNIT_CMDTOOL" --ignoreHeadlessMode -a res://test 2>&1 | tee "$LOG"
godot_ec="${PIPESTATUS[0]}"
if [[ "$godot_ec" -ne 0 ]]; then
echo "::error::Godot/GdUnit exited with code ${godot_ec}"
exit "$godot_ec"
fi
if grep -E 'SCRIPT ERROR:|ERROR: Failed to load script' "$LOG"; then
echo "::error::Godot reported script parse/load errors (suites may have been skipped). Fix the test scripts."
exit 1
fi