Proof of concept for a hot-reload test case #25
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-cmake.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 | ||
| concurrency: | ||
| group: ci-cmake-${{ github.actor }}-${{ github.head_ref || github.run_number }}-${{ github.ref }} | ||
| cancel-in-progress: true | ||
| jobs: | ||
| build-cmake: | ||
| name: ${{ matrix.name }} | ||
| runs-on: ${{ matrix.os }} | ||
| env: | ||
| EM_VERSION: 3.1.39 | ||
| config-flags: | ||
| -DCMAKE_C_COMPILER_LAUNCHER=sccache | ||
| -DCMAKE_CXX_COMPILER_LAUNCHER=sccache | ||
| -DGODOTCPP_ENABLE_TESTING=ON | ||
| -DGODOTCPP_BUILD_PROFILE="test/build_profile.json" | ||
| SCCACHE_GHA_ENABLED: "true" | ||
| strategy: | ||
| fail-fast: false | ||
| matrix: | ||
| include: | ||
| # Linux: Standard tests with bash | ||
| - name: π§ Linux (GCC, Makefiles) | ||
| os: ubuntu-22.04 | ||
| platform: linux | ||
| config-flags: -DCMAKE_BUILD_TYPE=Release | ||
| artifact-name: godot-cpp-linux-glibc2.27-x86_64-release.cmake | ||
| artifact-path: cmake-build/bin/libgodot-cpp.linux.template_release.x86_64.a | ||
| run-tests: true | ||
| 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 | ||
| compiler: msvc | ||
| build-flags: --config Release | ||
| artifact-name: godot-cpp-windows-msvc2019-x86_64-release.cmake | ||
| artifact-path: cmake-build/bin/libgodot-cpp.windows.template_release.x86_64.lib | ||
| run-tests: true # Enabled: Uses PS1 script | ||
| 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, Makefiles) | ||
| os: macos-latest | ||
| platform: macos | ||
| config-flags: -DCMAKE_OSX_ARCHITECTURES="arm64;x86_64" | ||
| artifact-name: godot-cpp-macos-universal-release.cmake | ||
| artifact-path: cmake-build/bin/libgodot-cpp.macos.template_release.universal.a | ||
| run-tests: true # Enabled: Quick macOS validation | ||
| 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 (MinGW uses compiler: mingw, etc.) | ||
| - name: π Windows (x86_64, MinGW, Ninja) | ||
| os: windows-2022 | ||
| platform: windows | ||
| compiler: mingw | ||
| config-flags: | ||
| -GNinja -DCMAKE_BUILD_TYPE=Release | ||
| -DCMAKE_CXX_COMPILER=cc -DCMAKE_CXX_COMPILER=c++ | ||
| artifact-name: godot-cpp-linux-mingw-x86_64-release.cmake | ||
| artifact-path: cmake-build/bin/libgodot-cpp.windows.template_release.x86_64.a | ||
| run-tests: false | ||
| - name: π€ Android (arm64, Ninja) | ||
| os: ubuntu-22.04 | ||
| platform: android | ||
| config-flags: | ||
| -G Ninja -DCMAKE_BUILD_TYPE=Release | ||
| --toolchain ${ANDROID_HOME}/ndk/28.1.13356709/build/cmake/android.toolchain.cmake | ||
| -DANDROID_PLATFORM=24 -DANDROID_ABI=arm64-v8a | ||
| artifact-name: godot-cpp-android-arm64-release.cmake | ||
| artifact-path: cmake-build/bin/libgodot-cpp.android.template_release.arm64.a | ||
| flags: arch=arm64 | ||
| run-tests: false | ||
| - name: π iOS (arm64, XCode) | ||
| os: macos-latest | ||
| platform: ios | ||
| config-flags: | ||
| -G Xcode | ||
| --toolchain cmake/ios.toolchain.cmake | ||
| -DPLATFORM=OS64 | ||
| build-flags: --config Release | ||
| artifact-name: godot-cpp-ios-arm64-release.cmake | ||
| artifact-path: cmake-build/bin/libgodot-cpp.ios.template_release.arm64.a | ||
| flags: arch=arm64 | ||
| run-tests: false | ||
| - name: π Web (wasm32, Ninja) | ||
| os: ubuntu-22.04 | ||
| platform: web | ||
| config-flags: | ||
| -G Ninja -DCMAKE_BUILD_TYPE=Release | ||
| --toolchain ${EMSDK}/upstream/emscripten/cmake/Modules/Platform/Emscripten.cmake | ||
| artifact-name: godot-cpp-web-wasm32-release.cmake | ||
| artifact-path: cmake-build/bin/libgodot-cpp.web.template_release.wasm32.a | ||
| run-tests: false | ||
| steps: | ||
| - name: Checkout | ||
| uses: actions/checkout@v4 | ||
| with: | ||
| submodules: recursive | ||
| - name: Run sccache-cache | ||
| uses: mozilla-actions/sccache-action@v0.0.9 | ||
| - name: Setup godot-cpp | ||
| uses: ./.github/actions/setup-godot-cpp | ||
| with: | ||
| platform: ${{ matrix.platform }} | ||
| windows-compiler: ${{ matrix.compiler }} | ||
| buildtool: cmake | ||
| - name: Configure godot-cpp-test with template_debug | ||
| run: > | ||
| cmake --log-level=VERBOSE -S . -B cmake-build ${{ env.config-flags }} ${{ matrix.config-flags }} | ||
| - name: Build godot-cpp-test (template_debug) | ||
| run: > | ||
| cmake --build cmake-build --verbose --target godot-cpp-test ${{ matrix.build-flags }} | ||
| - name: Configure godot-cpp-test with template_release | ||
| run: > | ||
| cmake --fresh --log-level=VERBOSE -S . -B cmake-build | ||
| -DGODOTCPP_TARGET=template_release ${{ env.config-flags }} ${{ matrix.config-flags }} | ||
| - name: Build godot-cpp-test (template_release) | ||
| run: > | ||
| cmake --build cmake-build --verbose --target godot-cpp-test ${{ matrix.build-flags }} | ||
| - name: Run sccache stat for check | ||
| shell: bash | ||
| run: ${SCCACHE_PATH} --show-stats | ||
| # Godot Download & Prep (only if run-tests: true) - Identical to SCons | ||
| - 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 | ||
| - 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: | | ||
| curl -L -o Godot.zip "${{ matrix.stable_url }}" | ||
| unzip -q Godot.zip | ||
| 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: | | ||
| if [ "${{ matrix.platform }}" != "windows" ]; then | ||
| chmod +x "./godot-artifacts/${{ matrix.godot_binary_path }}" | ||
| fi | ||
| 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 | ||
| - name: Prep project import | ||
| if: matrix.run-tests | ||
| shell: ${{ matrix.test_shell }} | ||
| run: | | ||
| cd test/project | ||
| timeout 30 $GODOT --import --headless || true | ||
| - name: Run unit tests | ||
| if: matrix.run-tests | ||
| shell: ${{ matrix.test_shell }} | ||
| working-directory: test | ||
| run: | | ||
| if [ "${{ matrix.test_shell }}" = "pwsh" ]; then | ||
| pwsh -File ./run-tests.ps1 --unit-only | ||
| else | ||
| ./run-tests.sh --unit-only | ||
| fi | ||
| - name: Run reload test | ||
| if: matrix.run-tests | ||
| shell: ${{ matrix.test_shell }} | ||
| working-directory: test | ||
| run: | | ||
| rm -f project/test_reload_lock | ||
| 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 | ||
| - name: Upload artifact | ||
| uses: actions/upload-artifact@v4 | ||
| with: | ||
| name: ${{ matrix.artifact-name }} | ||
| path: ${{ matrix.artifact-path }} | ||
| if-no-files-found: error | ||