Skip to content

Proof of concept for a hot-reload test case #1

Proof of concept for a hot-reload test case

Proof of concept for a hot-reload test case #1

Workflow file for this run

name: Continuous integration

Check failure on line 1 in .github/workflows/ci-scons.yml

View workflow run for this annotation

GitHub Actions / .github/workflows/ci-scons.yml

Invalid workflow file

(Line: 185, Col: 16): Unrecognized named-value: 'matrix'. Located at position 1 within expression: matrix.test_shell, (Line: 195, Col: 16): Unrecognized named-value: 'matrix'. Located at position 1 within expression: matrix.test_shell, (Line: 206, Col: 16): Unrecognized named-value: 'matrix'. Located at position 1 within expression: matrix.test_shell, (Line: 212, Col: 16): Unrecognized named-value: 'matrix'. Located at position 1 within expression: matrix.test_shell, (Line: 220, Col: 16): Unrecognized named-value: 'matrix'. Located at position 1 within expression: matrix.test_shell, (Line: 232, Col: 16): Unrecognized named-value: 'matrix'. Located at position 1 within expression: matrix.test_shell
on:
workflow_call:
env:
# Only used for the cache key. Increment version to force clean build.
GODOT_BASE_BRANCH: master
# Used to select the version of Godot to run the tests with.
GODOT_TEST_VERSION: master
# Use UTF-8 on Linux.
LANG: en_US.UTF-8
LC_ALL: en_US.UTF-8
# Use UTF-8 on Windows.
PYTHONIOENCODING: utf8
concurrency:
group: ci-scons-${{ github.actor }}-${{ github.head_ref || github.run_number }}-${{ github.ref }}
cancel-in-progress: true
jobs:
build-scons:
name: ${{ matrix.name }}
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
include:
# Linux: Standard tests with bash
- name: 🐧 Linux (GCC)
os: ubuntu-22.04
platform: linux
artifact-name: godot-cpp-linux-glibc2.27-x86_64-release
artifact-path: bin/libgodot-cpp.linux.template_release.x86_64.a
run-tests: true
cache-name: linux-x86_64
godot_workflow: linux_builds.yml
godot_artifact_name: linux-editor-mono
godot_binary_path: godot.linuxbsd.editor.x86_64.mono
test_shell: bash
stable_url: https://github.com/godotengine/godot-builds/releases/download/4.5.1-stable/Godot_v4.5.1-stable_linux.x86_64.zip
stable_binary_path: Godot_v4.5.1-stable_linux.x86_64
# Windows MSVC: Tests with pwsh, .exe binary
- name: 🏁 Windows (x86_64, MSVC)
os: windows-2022
platform: windows
artifact-name: godot-cpp-windows-msvc2019-x86_64-release
artifact-path: bin/libgodot-cpp.windows.template_release.x86_64.lib
run-tests: true # Enabled: Uses PS1 script
cache-name: windows-x86_64-msvc
godot_workflow: windows_builds.yml
godot_artifact_name: windows-editor-mono
godot_binary_path: godot.windows.editor.x86_64.mono.exe
test_shell: pwsh
stable_url: https://github.com/godotengine/godot-builds/releases/download/4.5.1-stable/Godot_v4.5.1-stable_win64.zip
stable_binary_path: Godot_v4.5.1-stable_win64.exe
# macOS: Tests with bash, .app path
- name: 🍎 macOS (universal)
os: macos-latest
platform: macos
artifact-name: godot-cpp-macos-universal-release
artifact-path: bin/libgodot-cpp.macos.template_release.universal.a
flags: arch=universal
run-tests: true # Enabled: Quick macOS validation
cache-name: macos-universal
godot_workflow: macos_builds.yml
godot_artifact_name: macos-editor-mono
godot_binary_path: Godot.app/Contents/MacOS/Godot # Inside .app bundle
test_shell: bash
stable_url: https://github.com/godotengine/godot-builds/releases/download/4.5.1-stable/Godot_v4.5.1-stable_macos.universal.zip
stable_binary_path: Godot_v4.5.1-stable_macos.universal/Godot.app/Contents/MacOS/Godot
# Other platforms: No tests, no godot vars
- name: 🏁 Windows (x86_64, MinGW)
os: windows-2022
platform: windows
artifact-name: godot-cpp-linux-mingw-x86_64-release
artifact-path: bin/libgodot-cpp.windows.template_release.x86_64.a
flags: use_mingw=yes
run-tests: false
cache-name: windows-x86_64-mingw
- name: πŸ€– Android (arm64)
os: ubuntu-22.04
platform: android
artifact-name: godot-cpp-android-arm64-release
artifact-path: bin/libgodot-cpp.android.template_release.arm64.a
flags: arch=arm64
run-tests: false
cache-name: android-arm64
- name: 🍏 iOS (arm64)
os: macos-latest
platform: ios
artifact-name: godot-cpp-ios-arm64-release
artifact-path: bin/libgodot-cpp.ios.template_release.arm64.a
flags: arch=arm64
run-tests: false
cache-name: ios-arm64
- name: 🌐 Web (wasm32)
os: ubuntu-22.04
platform: web
artifact-name: godot-cpp-web-wasm32-release
artifact-path: bin/libgodot-cpp.web.template_release.wasm32.a
run-tests: false
cache-name: web-wasm32
env:
SCONS_CACHE: ${{ github.workspace }}/.scons-cache/
EM_VERSION: 3.1.39
steps:
- name: Checkout
uses: actions/checkout@v4
with:
submodules: recursive
- name: Restore Godot build cache
uses: ./.github/actions/godot-cache-restore
with:
cache-name: ${{ matrix.cache-name }}
continue-on-error: true
- name: Setup godot-cpp
uses: ./.github/actions/setup-godot-cpp
with:
platform: ${{ matrix.platform }}
windows-compiler: ${{ contains(matrix.flags, 'use_mingw=yes') && 'mingw' || 'msvc' }}
buildtool: scons
- name: Generate godot-cpp sources only
run: |
scons platform=${{ matrix.platform }} verbose=yes build_library=no ${{ matrix.flags }}
scons -c
- name: Build godot-cpp (debug)
run: |
scons platform=${{ matrix.platform }} verbose=yes target=template_debug ${{ matrix.flags }}
- name: Build test without rebuilding godot-cpp (debug)
run: |
cd test
scons platform=${{ matrix.platform }} verbose=yes target=template_debug ${{ matrix.flags }} build_library=no
- name: Build test and godot-cpp (release)
run: |
cd test
scons platform=${{ matrix.platform }} verbose=yes target=template_release ${{ matrix.flags }}
- name: Save Godot build cache
uses: ./.github/actions/godot-cache-save
with:
cache-name: ${{ matrix.cache-name }}
continue-on-error: true
# Godot Download & Prep (only if run-tests: true)
- name: Download latest Godot artifacts
id: godot-download
if: matrix.run-tests && env.GODOT_TEST_VERSION == 'master'
uses: dsnopek/action-download-artifact@1322f74e2dac9feed2ee76a32d9ae1ca3b4cf4e9
with:
repo: godotengine/godot
branch: master
event: push
workflow: ${{ matrix.godot_workflow }}
workflow_conclusion: success
name: ${{ matrix.godot_artifact_name }}
search_artifacts: true
check_artifacts: true
ensure_latest: true
path: godot-artifacts
if_no_artifact_found: warn
continue-on-error: true # Allows fallback step
- name: Download stable Godot (fallback or non-master)
id: godot-fallback
if: |
matrix.run-tests &&
(
(env.GODOT_TEST_VERSION == 'master' && steps.godot-download.outcome != 'success') ||
env.GODOT_TEST_VERSION != 'master'
)
shell: ${{ matrix.test_shell }}
run: |
# wget/unzip to stable (matrix provides exact URL/path)
curl -L -o Godot.zip "${{ matrix.stable_url }}"
unzip -q Godot.zip
# Set GODOT env (platform-specific path from matrix)
echo "GODOT=$(pwd)/${{ matrix.stable_binary_path }}" >> $GITHUB_ENV
- name: Prepare Godot binary from artifacts
if: matrix.run-tests && env.GODOT_TEST_VERSION == 'master' && steps.godot-download.outcome == 'success'
shell: ${{ matrix.test_shell }}
run: |
# chmod only if not Windows (matrix binary_path assumes extracted name)
if [ "${{ matrix.platform }}" != "windows" ]; then
chmod +x "./godot-artifacts/${{ matrix.godot_binary_path }}"
fi
# Set GODOT env
echo "GODOT=$(pwd)/godot-artifacts/${{ matrix.godot_binary_path }}" >> $GITHUB_ENV
- name: Verify Godot binary
if: matrix.run-tests
shell: ${{ matrix.test_shell }}
run: $GODOT --headless --version # Confirms correct binary loaded
# Test Execution (separate for clarity; scripts handle internals)
- name: Prep project import
if: matrix.run-tests
shell: ${{ matrix.test_shell }}
run: |
cd test/project
# Timeout import (30s, ignore crash)
timeout 30 $GODOT --import --headless || true # Bash; for pwsh, matrix.shell handles equiv if needed
- name: Run unit tests
if: matrix.run-tests
shell: ${{ matrix.test_shell }}
working-directory: test
run: |
# Calls run-tests.sh/ps1 for first half (unit tests)
if [ "${{ matrix.test_shell }}" = "pwsh" ]; then
pwsh -File ./run-tests.ps1 --unit-only # Assume PS1 updated with flag; else split script
else
./run-tests.sh --unit-only # Assume bash updated with flag
fi
- name: Run reload test
if: matrix.run-tests
shell: ${{ matrix.test_shell }}
working-directory: test
run: |
# Handles lock/filtering in script
rm -f project/test_reload_lock # Pre-clean (cross-shell safe)
if [ "${{ matrix.test_shell }}" = "pwsh" ]; then
pwsh -File ./run-tests.ps1 --reload-only
else
./run-tests.sh --reload-only
fi
rm -f project/test_reload_lock # Post-clean
- name: Upload artifact
uses: actions/upload-artifact@v4
with:
name: ${{ matrix.artifact-name }}
path: ${{ matrix.artifact-path }}
if-no-files-found: error