Proof of concept for a hot-reload test case #1
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| name: Continuous integration | ||
|
Check failure on line 1 in .github/workflows/ci-scons.yml
|
||
| 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 | ||