Browse Source

Merge pull request #80091 from YuriSizov/ci-compartmentalization

CI: Extract godot-cpp testing into its own job
Rémi Verschelde 2 years ago
parent
commit
c5da2e54fe

+ 18 - 0
.github/actions/download-artifact/action.yml

@@ -0,0 +1,18 @@
+name: Download Godot artifact
+description: Download the Godot artifact.
+inputs:
+  name:
+    description: The artifact name.
+    default: "${{ github.job }}"
+  path:
+    description: The path to download and extract to.
+    required: true
+    default: "./"
+runs:
+  using: "composite"
+  steps:
+    - name: Download Godot Artifact
+      uses: actions/download-artifact@v3
+      with:
+        name: ${{ inputs.name }}
+        path: ${{ inputs.path }}

+ 24 - 0
.github/actions/godot-api-dump/action.yml

@@ -0,0 +1,24 @@
+name: Dump Godot API
+description: Dump Godot API for GDExtension
+inputs:
+  bin:
+    description: The path to the Godot executable
+    required: true
+runs:
+  using: "composite"
+  steps:
+    # Dump GDExtension interface and API
+    - name: Dump GDExtension interface and API for godot-cpp build
+      shell: sh
+      run: |
+        ${{ inputs.bin }} --headless --dump-gdextension-interface --dump-extension-api
+        mkdir godot-api
+        cp -f gdextension_interface.h godot-api/
+        cp -f extension_api.json godot-api/
+
+    - name: Upload API dump
+      uses: ./.github/actions/upload-artifact
+      with:
+        name: 'godot-api-dump'
+        path: './godot-api/*'
+

+ 13 - 0
.github/actions/godot-cache/action.yml

@@ -16,7 +16,20 @@ runs:
       with:
       with:
         path: ${{inputs.scons-cache}}
         path: ${{inputs.scons-cache}}
         key: ${{inputs.cache-name}}-${{env.GODOT_BASE_BRANCH}}-${{github.ref}}-${{github.sha}}
         key: ${{inputs.cache-name}}-${{env.GODOT_BASE_BRANCH}}-${{github.ref}}-${{github.sha}}
+
+        # We try to match an existing cache to restore from it. Each potential key is checked against
+        # all existing caches as a prefix. E.g. 'linux-template-minimal' would match any cache that
+        # starts with "linux-template-minimal", such as "linux-template-minimal-master-refs/heads/master-6588a4a29af1621086feac0117d5d4d37af957fd".
+        #
+        # We check these prefixes in this order:
+        #
+        #   1. The exact match, including the base branch, the commit reference, and the SHA hash of the commit.
+        #   2. A partial match for the same base branch and the same commit reference.
+        #   3. A partial match for the same base branch and the base branch commit reference.
+        #   4. A partial match for the same base branch only (not ideal, matches any PR with the same base branch).
+
         restore-keys: |
         restore-keys: |
           ${{inputs.cache-name}}-${{env.GODOT_BASE_BRANCH}}-${{github.ref}}-${{github.sha}}
           ${{inputs.cache-name}}-${{env.GODOT_BASE_BRANCH}}-${{github.ref}}-${{github.sha}}
           ${{inputs.cache-name}}-${{env.GODOT_BASE_BRANCH}}-${{github.ref}}
           ${{inputs.cache-name}}-${{env.GODOT_BASE_BRANCH}}-${{github.ref}}
+          ${{inputs.cache-name}}-${{env.GODOT_BASE_BRANCH}}-refs/heads/${{env.GODOT_BASE_BRANCH}}
           ${{inputs.cache-name}}-${{env.GODOT_BASE_BRANCH}}
           ${{inputs.cache-name}}-${{env.GODOT_BASE_BRANCH}}

+ 18 - 0
.github/actions/godot-converter-test/action.yml

@@ -0,0 +1,18 @@
+name: Test Godot project converter
+description: Test the Godot project converter.
+inputs:
+  bin:
+    description: The path to the Godot executable
+    required: true
+runs:
+  using: "composite"
+  steps:
+    - name: Test 3-to-4 conversion
+      shell: sh
+      run: |
+        mkdir converter_test
+        cd converter_test
+        touch project.godot
+        ../${{ inputs.bin }} --headless --validate-conversion-3to4
+        cd ..
+        rm converter_test -rf

+ 37 - 0
.github/actions/godot-project-test/action.yml

@@ -0,0 +1,37 @@
+name: Test Godot project
+description: Run the test Godot project.
+inputs:
+  bin:
+    description: The path to the Godot executable
+    required: true
+runs:
+  using: "composite"
+  steps:
+    # Download and extract zip archive with project, folder is renamed to be able to easy change used project
+    - name: Download test project
+      shell: sh
+      run: |
+        wget https://github.com/godotengine/regression-test-project/archive/4.0.zip
+        unzip 4.0.zip
+        mv "regression-test-project-4.0" "test_project"
+
+    # Editor is quite complicated piece of software, so it is easy to introduce bug here.
+
+    - name: Open and close editor (Vulkan)
+      shell: sh
+      run: |
+        xvfb-run ${{ inputs.bin }} --audio-driver Dummy --editor --quit --path test_project 2>&1 | tee sanitizers_log.txt || true
+        misc/scripts/check_ci_log.py sanitizers_log.txt
+
+    - name: Open and close editor (GLES3)
+      shell: sh
+      run: |
+        DRI_PRIME=0 xvfb-run ${{ inputs.bin }} --audio-driver Dummy --rendering-driver opengl3 --editor --quit --path test_project 2>&1 | tee sanitizers_log.txt || true
+        misc/scripts/check_ci_log.py sanitizers_log.txt
+
+    # Run test project
+    - name: Run project
+      shell: sh
+      run: |
+        xvfb-run ${{ inputs.bin }} 40 --audio-driver Dummy --path test_project 2>&1 | tee sanitizers_log.txt || true
+        misc/scripts/check_ci_log.py sanitizers_log.txt

+ 54 - 0
.github/workflows/godot_cpp_test.yml

@@ -0,0 +1,54 @@
+name: 🪲 Godot CPP
+on:
+  workflow_call:
+
+# Global Settings
+env:
+  # Used for the cache key, and godot-cpp checkout. Add version suffix to force clean build.
+  GODOT_BASE_BRANCH: master
+
+concurrency:
+  group: ci-${{github.actor}}-${{github.head_ref || github.run_number}}-${{github.ref}}-cpp-tests
+  cancel-in-progress: true
+
+jobs:
+  godot-cpp-tests:
+    runs-on: "ubuntu-20.04"
+    name: "Build and test Godot CPP"
+    steps:
+      - uses: actions/checkout@v3
+
+      - name: Setup python and scons
+        uses: ./.github/actions/godot-deps
+
+      # Checkout godot-cpp
+      - name: Checkout godot-cpp
+        uses: actions/checkout@v3
+        with:
+          repository: godotengine/godot-cpp
+          ref: ${{ env.GODOT_BASE_BRANCH }}
+          submodules: 'recursive'
+          path: 'godot-cpp'
+
+      # Download generated API dump
+      - name: Download GDExtension interface and API dump
+        uses: ./.github/actions/download-artifact
+        with:
+          name: 'godot-api-dump'
+          path: './godot-api'
+
+      # Extract and override existing files with generated files
+      - name: Extract GDExtension interface and API dump
+        run: |
+          cp -f godot-api/gdextension_interface.h godot-cpp/gdextension/
+          cp -f godot-api/extension_api.json godot-cpp/gdextension/
+
+      # TODO: Add caching to the scons build and store it for CI via the godot-cache
+      # action.
+
+      # Build godot-cpp test extension
+      - name: Build godot-cpp test extension
+        run: |
+          cd godot-cpp/test
+          scons target=template_debug dev_build=yes
+          cd ../..

+ 42 - 87
.github/workflows/linux_builds.yml

@@ -4,7 +4,7 @@ on:
 
 
 # Global Settings
 # Global Settings
 env:
 env:
-  # Used for the cache key, and godot-cpp checkout. Add version suffix to force clean build.
+  # Used for the cache key. Add version suffix to force clean build.
   GODOT_BASE_BRANCH: master
   GODOT_BASE_BRANCH: master
   SCONSFLAGS: verbose=yes warnings=extra werror=yes module_text_server_fb_enabled=yes
   SCONSFLAGS: verbose=yes warnings=extra werror=yes module_text_server_fb_enabled=yes
   DOTNET_NOLOGO: true
   DOTNET_NOLOGO: true
@@ -25,53 +25,52 @@ jobs:
           - name: Editor w/ Mono (target=editor)
           - name: Editor w/ Mono (target=editor)
             cache-name: linux-editor-mono
             cache-name: linux-editor-mono
             target: editor
             target: editor
-            tests: false # Disabled due freeze caused by mix Mono build and CI
             sconsflags: module_mono_enabled=yes
             sconsflags: module_mono_enabled=yes
-            doc-test: true
             bin: "./bin/godot.linuxbsd.editor.x86_64.mono"
             bin: "./bin/godot.linuxbsd.editor.x86_64.mono"
             build-mono: true
             build-mono: true
+            tests: false # Disabled due freeze caused by mix Mono build and CI
+            doc-test: true
             proj-conv: true
             proj-conv: true
+            api-compat: true
             artifact: true
             artifact: true
-            compat: true
 
 
           - name: Editor with doubles and GCC sanitizers (target=editor, tests=yes, dev_build=yes, scu_build=yes, precision=double, use_asan=yes, use_ubsan=yes, linker=gold)
           - name: Editor with doubles and GCC sanitizers (target=editor, tests=yes, dev_build=yes, scu_build=yes, precision=double, use_asan=yes, use_ubsan=yes, linker=gold)
             cache-name: linux-editor-double-sanitizers
             cache-name: linux-editor-double-sanitizers
             target: editor
             target: editor
-            tests: true
             # Debug symbols disabled as they're huge on this build and we hit the 14 GB limit for runners.
             # Debug symbols disabled as they're huge on this build and we hit the 14 GB limit for runners.
             sconsflags: dev_build=yes scu_build=yes debug_symbols=no precision=double use_asan=yes use_ubsan=yes linker=gold
             sconsflags: dev_build=yes scu_build=yes debug_symbols=no precision=double use_asan=yes use_ubsan=yes linker=gold
-            proj-test: true
-            # Can be turned off for PRs that intentionally break compat with godot-cpp,
-            # until both the upstream PR and the matching godot-cpp changes are merged.
-            godot-cpp-test: true
             bin: "./bin/godot.linuxbsd.editor.dev.double.x86_64.san"
             bin: "./bin/godot.linuxbsd.editor.dev.double.x86_64.san"
             build-mono: false
             build-mono: false
+            tests: true
+            proj-test: true
+            # Generate an API dump for godot-cpp tests.
+            api-dump: true
             # Skip 2GiB artifact speeding up action.
             # Skip 2GiB artifact speeding up action.
             artifact: false
             artifact: false
 
 
           - name: Editor with clang sanitizers (target=editor, tests=yes, dev_build=yes, use_asan=yes, use_ubsan=yes, use_llvm=yes, linker=lld)
           - name: Editor with clang sanitizers (target=editor, tests=yes, dev_build=yes, use_asan=yes, use_ubsan=yes, use_llvm=yes, linker=lld)
             cache-name: linux-editor-llvm-sanitizers
             cache-name: linux-editor-llvm-sanitizers
             target: editor
             target: editor
-            tests: true
             sconsflags: dev_build=yes use_asan=yes use_ubsan=yes use_llvm=yes linker=lld
             sconsflags: dev_build=yes use_asan=yes use_ubsan=yes use_llvm=yes linker=lld
             bin: "./bin/godot.linuxbsd.editor.dev.x86_64.llvm.san"
             bin: "./bin/godot.linuxbsd.editor.dev.x86_64.llvm.san"
             build-mono: false
             build-mono: false
+            tests: true
             # Skip 2GiB artifact speeding up action.
             # Skip 2GiB artifact speeding up action.
             artifact: false
             artifact: false
 
 
           - name: Template w/ Mono (target=template_release)
           - name: Template w/ Mono (target=template_release)
             cache-name: linux-template-mono
             cache-name: linux-template-mono
             target: template_release
             target: template_release
-            tests: false
             sconsflags: module_mono_enabled=yes
             sconsflags: module_mono_enabled=yes
             build-mono: false
             build-mono: false
+            tests: false
             artifact: true
             artifact: true
 
 
           - name: Minimal template (target=template_release, everything disabled)
           - name: Minimal template (target=template_release, everything disabled)
             cache-name: linux-template-minimal
             cache-name: linux-template-minimal
             target: template_release
             target: template_release
-            tests: false
             sconsflags: modules_enabled_by_default=no disable_3d=yes disable_advanced_gui=yes deprecated=no minizip=no
             sconsflags: modules_enabled_by_default=no disable_3d=yes disable_advanced_gui=yes deprecated=no minizip=no
+            tests: false
             artifact: true
             artifact: true
 
 
     steps:
     steps:
@@ -127,6 +126,24 @@ jobs:
         run: |
         run: |
           ./modules/mono/build_scripts/build_assemblies.py --godot-output-dir=./bin --godot-platform=linuxbsd
           ./modules/mono/build_scripts/build_assemblies.py --godot-output-dir=./bin --godot-platform=linuxbsd
 
 
+      - name: Prepare artifact
+        if: ${{ matrix.artifact }}
+        run: |
+          strip bin/godot.*
+          chmod +x bin/godot.*
+
+      - name: Upload artifact
+        uses: ./.github/actions/upload-artifact
+        if: ${{ matrix.artifact }}
+        with:
+          name: ${{ matrix.cache-name }}
+
+      - name: Dump Godot API
+        uses: ./.github/actions/godot-api-dump
+        if: ${{ matrix.api-dump }}
+        with:
+          bin: ${{ matrix.bin }}
+
       # Execute unit tests for the editor
       # Execute unit tests for the editor
       - name: Unit tests
       - name: Unit tests
         if: ${{ matrix.tests }}
         if: ${{ matrix.tests }}
@@ -144,84 +161,22 @@ jobs:
           ${{ matrix.bin }} --doctool --headless 2>&1 > /dev/null || true
           ${{ matrix.bin }} --doctool --headless 2>&1 > /dev/null || true
           git diff --color --exit-code && ! git ls-files --others --exclude-standard | sed -e 's/^/New doc file missing in PR: /' | grep 'xml$'
           git diff --color --exit-code && ! git ls-files --others --exclude-standard | sed -e 's/^/New doc file missing in PR: /' | grep 'xml$'
 
 
-      # Test 3.x -> 4.x project converter
-      - name: Test project converter
-        if: ${{ matrix.proj-conv }}
-        run: |
-          mkdir converter_test
-          cd converter_test
-          touch project.godot
-          ../${{ matrix.bin }} --headless --validate-conversion-3to4
-          cd ..
-          rm converter_test -rf
-
-      # Download and extract zip archive with project, folder is renamed to be able to easy change used project
-      - name: Download test project
-        if: ${{ matrix.proj-test }}
-        run: |
-          wget https://github.com/godotengine/regression-test-project/archive/4.0.zip
-          unzip 4.0.zip
-          mv "regression-test-project-4.0" "test_project"
-
-      # Editor is quite complicated piece of software, so it is easy to introduce bug here
-      - name: Open and close editor (Vulkan)
-        if: ${{ matrix.proj-test }}
-        run: |
-          xvfb-run ${{ matrix.bin }} --audio-driver Dummy --editor --quit --path test_project 2>&1 | tee sanitizers_log.txt || true
-          misc/scripts/check_ci_log.py sanitizers_log.txt
-
-      - name: Open and close editor (GLES3)
-        if: ${{ matrix.proj-test }}
-        run: |
-          DRI_PRIME=0 xvfb-run ${{ matrix.bin }} --audio-driver Dummy --rendering-driver opengl3 --editor --quit --path test_project 2>&1 | tee sanitizers_log.txt || true
-          misc/scripts/check_ci_log.py sanitizers_log.txt
-
-      # Run test project
-      - name: Run project
-        if: ${{ matrix.proj-test }}
-        run: |
-          xvfb-run ${{ matrix.bin }} 40 --audio-driver Dummy --path test_project 2>&1 | tee sanitizers_log.txt || true
-          misc/scripts/check_ci_log.py sanitizers_log.txt
-
-      # Checkout godot-cpp
-      - name: Checkout godot-cpp
-        if: ${{ matrix.godot-cpp-test }}
-        uses: actions/checkout@v3
-        with:
-          repository: godotengine/godot-cpp
-          ref: ${{ env.GODOT_BASE_BRANCH }}
-          submodules: 'recursive'
-          path: 'godot-cpp'
-
-      # Dump GDExtension interface and API
-      - name: Dump GDExtension interface and API for godot-cpp build
-        if: ${{ matrix.godot-cpp-test }}
-        run: |
-          ${{ matrix.bin }} --headless --dump-gdextension-interface --dump-extension-api
-          cp -f gdextension_interface.h godot-cpp/gdextension/
-          cp -f extension_api.json godot-cpp/gdextension/
-
-      # Build godot-cpp test extension
-      - name: Build godot-cpp test extension
-        if: ${{ matrix.godot-cpp-test }}
-        run: |
-          cd godot-cpp/test
-          scons target=template_debug dev_build=yes
-          cd ../..
-
+      # Check API backwards compatibility
       - name: Check for GDExtension compatibility
       - name: Check for GDExtension compatibility
-        if: ${{ matrix.compat }}
+        if: ${{ matrix.api-compat }}
         run: |
         run: |
           ./misc/scripts/validate_extension_api.sh "${{ matrix.bin }}" || true # don't fail the CI for now
           ./misc/scripts/validate_extension_api.sh "${{ matrix.bin }}" || true # don't fail the CI for now
 
 
-      - name: Prepare artifact
-        if: ${{ matrix.artifact }}
-        run: |
-          strip bin/godot.*
-          chmod +x bin/godot.*
+      # Download and run the test project
+      - name: Test Godot project
+        uses: ./.github/actions/godot-project-test
+        if: ${{ matrix.proj-test }}
+        with:
+          bin: ${{ matrix.bin }}
 
 
-      - name: Upload artifact
-        uses: ./.github/actions/upload-artifact
-        if: ${{ matrix.artifact }}
+      # Test the project converter
+      - name: Test project converter
+        uses: ./.github/actions/godot-converter-test
+        if: ${{ matrix.proj-conv }}
         with:
         with:
-          name: ${{ matrix.cache-name }}
+          bin: ${{ matrix.bin }}

+ 8 - 8
.github/workflows/macos_builds.yml

@@ -56,14 +56,6 @@ jobs:
           target: ${{ matrix.target }}
           target: ${{ matrix.target }}
           tests: ${{ matrix.tests }}
           tests: ${{ matrix.tests }}
 
 
-      # Execute unit tests for the editor
-      - name: Unit tests
-        if: ${{ matrix.tests }}
-        run: |
-          ${{ matrix.bin }} --version
-          ${{ matrix.bin }} --help
-          ${{ matrix.bin }} --test
-
       - name: Prepare artifact
       - name: Prepare artifact
         run: |
         run: |
           strip bin/godot.*
           strip bin/godot.*
@@ -73,3 +65,11 @@ jobs:
         uses: ./.github/actions/upload-artifact
         uses: ./.github/actions/upload-artifact
         with:
         with:
           name: ${{ matrix.cache-name }}
           name: ${{ matrix.cache-name }}
+
+      # Execute unit tests for the editor
+      - name: Unit tests
+        if: ${{ matrix.tests }}
+        run: |
+          ${{ matrix.bin }} --version
+          ${{ matrix.bin }} --help
+          ${{ matrix.bin }} --test

+ 16 - 0
.github/workflows/runner.yml

@@ -6,10 +6,14 @@ concurrency:
   cancel-in-progress: true
   cancel-in-progress: true
 
 
 jobs:
 jobs:
+  # First stage: Only static checks, fast and prevent expensive builds from running.
+
   static-checks:
   static-checks:
     name: 📊 Static checks
     name: 📊 Static checks
     uses: ./.github/workflows/static_checks.yml
     uses: ./.github/workflows/static_checks.yml
 
 
+  # Second stage: Run all the builds and some of the tests.
+
   android-build:
   android-build:
     name: 🤖 Android
     name: 🤖 Android
     needs: static-checks
     needs: static-checks
@@ -39,3 +43,15 @@ jobs:
     name: 🌐 Web
     name: 🌐 Web
     needs: static-checks
     needs: static-checks
     uses: ./.github/workflows/web_builds.yml
     uses: ./.github/workflows/web_builds.yml
+
+  # Third stage: Run auxiliary tests using build artifacts from previous jobs.
+
+  # Can be turned off for PRs that intentionally break compat with godot-cpp,
+  # until both the upstream PR and the matching godot-cpp changes are merged.
+  godot-cpp-test:
+    name: 🪲 Godot CPP
+    # This can be changed to depend on another platform, if we decide to use it for
+    # godot-cpp instead. Make sure to move the .github/actions/godot-api-dump step
+    # appropriately.
+    needs: linux-build
+    uses: ./.github/workflows/godot_cpp_test.yml

+ 8 - 8
.github/workflows/windows_builds.yml

@@ -60,14 +60,6 @@ jobs:
           target: ${{ matrix.target }}
           target: ${{ matrix.target }}
           tests: ${{ matrix.tests }}
           tests: ${{ matrix.tests }}
 
 
-      # Execute unit tests for the editor
-      - name: Unit tests
-        if: ${{ matrix.tests }}
-        run: |
-          ${{ matrix.bin }} --version
-          ${{ matrix.bin }} --help
-          ${{ matrix.bin }} --test
-
       - name: Prepare artifact
       - name: Prepare artifact
         run: |
         run: |
           Remove-Item bin/* -Include *.exp,*.lib,*.pdb -Force
           Remove-Item bin/* -Include *.exp,*.lib,*.pdb -Force
@@ -76,3 +68,11 @@ jobs:
         uses: ./.github/actions/upload-artifact
         uses: ./.github/actions/upload-artifact
         with:
         with:
           name: ${{ matrix.cache-name }}
           name: ${{ matrix.cache-name }}
+
+      # Execute unit tests for the editor
+      - name: Unit tests
+        if: ${{ matrix.tests }}
+        run: |
+          ${{ matrix.bin }} --version
+          ${{ matrix.bin }} --help
+          ${{ matrix.bin }} --test