From 4b1aba24b79394fe3622c06e0bd1527d2f077bbb Mon Sep 17 00:00:00 2001 From: Swung0x48 Date: Sat, 17 Oct 2026 08:03:27 -0400 Subject: [PATCH] [CI] (.github/actions, .github/workflows): run serial lanes at -j, retrace on the library alone - unit, integration and integration-verify ctest run at -j nproc; the same labels already run at -j in the split lanes, with the same names and results - build-linux, -split and -verify also publish the library (and the server image) alone; the retrace legs load nothing else, yet downloaded and unpacked the 0.5-0.8 GB test runtime - build-retrace no longer waits for build-linux: it fetched the runtime only to test -f a path configure does not read - every branch saves its own rolling ccache entry, deleting only its own old one (--ref); only dev saved, and dev has not run since the key rename, so every build was cold - !cancelled() replaces job-level always() on the retrace, summary and skip-census jobs: a superseded run kept starting its pending legs and held the next run in the concurrency group for up to 154 minutes - retrace and retrace-split run 8 legs at a time, not 4; the cap dates from per-leg LFS checkouts - apt requests time out after 30 s and retry 3 times; install steps time out at 15 minutes, not 45 - the APK trace case matrix no longer waits for the build, which it does not read - retrace-split prepares its metadata once, after the split library is unpacked --- .github/actions/setup-test-runner/action.yml | 6 + .github/workflows/apk.yml | 27 ++- .github/workflows/test.yml | 190 ++++++++++--------- 3 files changed, 119 insertions(+), 104 deletions(-) diff --git a/.github/actions/setup-test-runner/action.yml b/.github/actions/setup-test-runner/action.yml index ef169d84..3cffc3a3 100644 --- a/.github/actions/setup-test-runner/action.yml +++ b/.github/actions/setup-test-runner/action.yml @@ -38,4 +38,10 @@ runs: echo 'VK_ICD_FILENAMES=/usr/share/vulkan/icd.d/lvp_icd.json' echo 'VK_DRIVER_FILES=/usr/share/vulkan/icd.d/lvp_icd.json' } >> "$GITHUB_ENV" + # A stalled mirror must fail a request and retry it, not hold the install step until + # its timeout. + if [ -d /etc/apt/apt.conf.d ] && command -v sudo > /dev/null; then + printf 'Acquire::Retries "3";\nAcquire::http::Timeout "30";\nAcquire::https::Timeout "30";\n' | + sudo tee /etc/apt/apt.conf.d/80-mobilegl-ci-network > /dev/null + fi fi diff --git a/.github/workflows/apk.yml b/.github/workflows/apk.yml index 5e2de698..748a5d26 100644 --- a/.github/workflows/apk.yml +++ b/.github/workflows/apk.yml @@ -77,10 +77,10 @@ jobs: ${{ runner.os }}-apk-${{ github.job }}-ccache- - name: Install ccache - timeout-minutes: 45 + timeout-minutes: 15 run: | - sudo apt-get update - sudo apt-get install -y ccache + sudo apt-get -o Acquire::Retries=3 -o Acquire::http::Timeout=30 update + sudo apt-get -o Acquire::Retries=3 -o Acquire::http::Timeout=30 install -y ccache ccache --version - name: Setup Android SDK @@ -183,22 +183,18 @@ jobs: if: always() run: ccache --show-stats - # Rewrite one rolling entry per job on the default branch. The upload stays - # cumulative - it carries every object restored at the top of this run plus - # the few TUs that actually changed - but Actions cache keys are immutable, - # so the superseded blob has to be released before the same key can be - # re-uploaded. Running after the build means a failed build leaves the - # existing entry untouched. The other trigger branches restore this entry - # rather than each writing a ~4 GB one of their own. + # Rewrite one rolling entry per job and branch. The upload stays cumulative - it + # carries every object restored at the top of this run plus the few TUs that + # changed - but Actions cache keys are immutable, so this branch's superseded + # blob is released first; --ref keeps the delete off other branches' entries. + # Running after the build means a failed build leaves the entry untouched. - name: Release superseded ccache entry - if: github.ref_name == github.event.repository.default_branch env: GH_TOKEN: ${{ github.token }} CACHE_KEY: ${{ runner.os }}-apk-${{ github.job }}-ccache-v1 - run: gh cache delete "${CACHE_KEY}" || true + run: gh cache delete "${CACHE_KEY}" --ref "${GITHUB_REF}" || true - name: Save ccache - if: github.ref_name == github.event.repository.default_branch continue-on-error: true uses: actions/cache/save@v5 with: @@ -254,7 +250,6 @@ jobs: trace-cases: name: trace case matrix runs-on: ubuntu-latest - needs: build env: MOBILEGL_CI_DISAGGREGATED: ${{ (github.ref_name == 'feat/disaggregated' || github.ref_name == 'codex/fix-github-ci' || github.ref_name == 'cleanup') && 'ON' || 'OFF' }} outputs: @@ -404,7 +399,7 @@ jobs: - android-avd - trace-cases - trace-fixtures - if: ${{ always() && needs.build.result == 'success' && needs.android-avd.result == 'success' && needs.trace-cases.result == 'success' }} + if: ${{ !cancelled() && needs.build.result == 'success' && needs.android-avd.result == 'success' && needs.trace-cases.result == 'success' }} timeout-minutes: 75 env: MOBILEGL_CI_TRANSPORT: ${{ matrix.transport || 'monolith' }} @@ -675,7 +670,7 @@ jobs: name: retrace summary runs-on: ubuntu-latest needs: retrace - if: always() + if: ${{ !cancelled() }} env: MOBILEGL_CI_DISAGGREGATED: ${{ (github.ref_name == 'feat/disaggregated' || github.ref_name == 'codex/fix-github-ci' || github.ref_name == 'cleanup') && 'ON' || 'OFF' }} diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 3425d293..5424fe0e 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -101,7 +101,7 @@ jobs: run: python3 update_glslang_sources.py - name: Install build dependencies - timeout-minutes: 45 + timeout-minutes: 15 if: env.MOBILEGL_CI_NATIVE_GPU != '1' run: | sudo apt-get update @@ -158,22 +158,18 @@ jobs: if: ${{ always() }} run: ccache --show-stats - # Rewrite one rolling entry per job on the default branch. The upload stays - # cumulative - it carries every object restored at the top of this run plus - # the few TUs that actually changed - but Actions cache keys are immutable, - # so the superseded blob has to be released before the same key can be - # re-uploaded. Running after the build means a failed build leaves the - # existing entry untouched. The other trigger branches restore this entry - # rather than each writing one of their own. + # Rewrite one rolling entry per job and branch. The upload stays cumulative - it + # carries every object restored at the top of this run plus the few TUs that + # changed - but Actions cache keys are immutable, so this branch's superseded + # blob is released first; --ref keeps the delete off other branches' entries. + # Running after the build means a failed build leaves the entry untouched. - name: Release superseded ccache entry - if: github.ref_name == github.event.repository.default_branch env: GH_TOKEN: ${{ github.token }} CACHE_KEY: ${{ runner.os }}-ubuntu24-cpu-test-${{ github.job }}-ccache-v1 - run: gh cache delete "${CACHE_KEY}" || true + run: gh cache delete "${CACHE_KEY}" --ref "${GITHUB_REF}" || true - name: Save ccache - if: github.ref_name == github.event.repository.default_branch continue-on-error: true uses: actions/cache/save@v5 with: @@ -209,6 +205,21 @@ jobs: path: ci-artifacts/mobilegl-linux-runtime.tgz if-no-files-found: error + # The retrace legs load only the library, and the server image on the spawn arm, so they + # take this instead of the whole test runtime. + - name: Package retrace library + run: | + files=("${BUILD_DIR}/.ci-source-root" "${BUILD_DIR}/libMobileGL.so") + if [ -f "${BUILD_DIR}/libMobileGLServer.so" ]; then files+=("${BUILD_DIR}/libMobileGLServer.so"); fi + tar -czf ci-artifacts/mobilegl-linux-lib.tgz "${files[@]}" + + - name: Upload retrace library + uses: actions/upload-artifact@v7 + with: + name: mobilegl-linux-lib + path: ci-artifacts/mobilegl-linux-lib.tgz + if-no-files-found: error + # The pull-library negative control must not consume the primary artifact: # on disaggregation branches that artifact now contains the real transport. build-linux-monolith-control: @@ -266,7 +277,7 @@ jobs: working-directory: 3rdparty/glslang run: python3 update_glslang_sources.py - name: Install build dependencies - timeout-minutes: 45 + timeout-minutes: 15 if: env.MOBILEGL_CI_NATIVE_GPU != '1' run: | sudo apt-get update @@ -324,7 +335,7 @@ jobs: cmakeVersion: 3.31.10 - name: Install runtime dependencies - timeout-minutes: 45 + timeout-minutes: 15 if: env.MOBILEGL_CI_NATIVE_GPU != '1' run: | sudo apt-get update @@ -351,9 +362,9 @@ jobs: ulimit -c unlimited if [ "$MOBILEGL_CI_NATIVE_GPU" != 1 ] && [ ! -f /.dockerenv ]; then sudo sysctl -w kernel.core_pattern='/tmp/core.%e.%p'; fi if [ "${{ secrets.ACTIONS_STEP_DEBUG }}" = "true" ]; then - ctest -V -L unit --no-tests=error --output-junit "${RUNNER_TEMP}/unit.xml" + ctest -V -L unit --no-tests=error -j "$(nproc)" --output-junit "${RUNNER_TEMP}/unit.xml" else - ctest --output-on-failure -L unit --no-tests=error --output-junit "${RUNNER_TEMP}/unit.xml" + ctest --output-on-failure -L unit --no-tests=error -j "$(nproc)" --output-junit "${RUNNER_TEMP}/unit.xml" fi # P13 W1: every JUnit this job wrote, for the skip census (scripts/ci/skip_census.py). @@ -403,7 +414,7 @@ jobs: cmakeVersion: 3.31.10 - name: Install runtime dependencies - timeout-minutes: 45 + timeout-minutes: 15 if: env.MOBILEGL_CI_NATIVE_GPU != '1' # Same set as the benchmark job, for the same reason: the scenarios bring # up real headless EGL (llvmpipe) and Vulkan (lavapipe) contexts, and @@ -456,12 +467,12 @@ jobs: # coverage. The flag is NOT baked into the ctest ENVIRONMENT properties, # so an inline env reaches the test processes (unlike the ICD pin above). if [ "${{ secrets.ACTIONS_STEP_DEBUG }}" = "true" ]; then - ctest -V -L integration-gpu --no-tests=error --output-junit "${RUNNER_TEMP}/integration.xml" - MOBILEGL_ESPRYT_DISABLE_INVALIDATE_FLUSH=1 ctest -V -L integration-gpu \ + ctest -V -L integration-gpu --no-tests=error -j "$(nproc)" --output-junit "${RUNNER_TEMP}/integration.xml" + MOBILEGL_ESPRYT_DISABLE_INVALIDATE_FLUSH=1 ctest -V -L integration-gpu -j "$(nproc)" \ -R 'Buffer|Readback|Atomic|Ssbo|Arena' --no-tests=error --output-junit "${RUNNER_TEMP}/integration-staged-copy.xml" else - ctest --output-on-failure -L integration-gpu --no-tests=error --output-junit "${RUNNER_TEMP}/integration.xml" - MOBILEGL_ESPRYT_DISABLE_INVALIDATE_FLUSH=1 ctest --output-on-failure -L integration-gpu \ + ctest --output-on-failure -L integration-gpu --no-tests=error -j "$(nproc)" --output-junit "${RUNNER_TEMP}/integration.xml" + MOBILEGL_ESPRYT_DISABLE_INVALIDATE_FLUSH=1 ctest --output-on-failure -L integration-gpu -j "$(nproc)" \ -R 'Buffer|Readback|Atomic|Ssbo|Arena' --no-tests=error --output-junit "${RUNNER_TEMP}/integration-staged-copy.xml" fi @@ -584,7 +595,7 @@ jobs: run: python3 update_glslang_sources.py - name: Install build dependencies - timeout-minutes: 45 + timeout-minutes: 15 if: env.MOBILEGL_CI_NATIVE_GPU != '1' run: | sudo apt-get update @@ -666,14 +677,12 @@ jobs: run: ccache --show-stats - name: Release superseded ccache entry - if: github.ref_name == github.event.repository.default_branch env: GH_TOKEN: ${{ github.token }} CACHE_KEY: ${{ runner.os }}-ubuntu24-cpu-test-${{ github.job }}-ccache-v1 - run: gh cache delete "${CACHE_KEY}" || true + run: gh cache delete "${CACHE_KEY}" --ref "${GITHUB_REF}" || true - name: Save ccache - if: github.ref_name == github.event.repository.default_branch continue-on-error: true uses: actions/cache/save@v5 with: @@ -707,6 +716,21 @@ jobs: path: ci-artifacts/mobilegl-linux-runtime-verify.tgz if-no-files-found: error + # The retrace legs load only the library, and the server image on the spawn arm, so they + # take this instead of the whole test runtime. + - name: Package retrace library + run: | + files=("${BUILD_DIR}/.ci-source-root" "${BUILD_DIR}/libMobileGL.so") + if [ -f "${BUILD_DIR}/libMobileGLServer.so" ]; then files+=("${BUILD_DIR}/libMobileGLServer.so"); fi + tar -czf ci-artifacts/mobilegl-linux-lib-verify.tgz "${files[@]}" + + - name: Upload retrace library + uses: actions/upload-artifact@v7 + with: + name: mobilegl-linux-lib-verify + path: ci-artifacts/mobilegl-linux-lib-verify.tgz + if-no-files-found: error + # The verify lane itself, plus the two negative controls that keep it falsifiable. The controls # are ALWAYS-ON steps, not a manual exercise: a gate that can only be shown to work by someone # remembering to break it on purpose is a gate that has already stopped working. @@ -731,7 +755,7 @@ jobs: cmakeVersion: 3.31.10 - name: Install runtime dependencies - timeout-minutes: 45 + timeout-minutes: 15 if: env.MOBILEGL_CI_NATIVE_GPU != '1' run: | sudo apt-get update @@ -775,9 +799,9 @@ jobs: ulimit -c unlimited if [ "$MOBILEGL_CI_NATIVE_GPU" != 1 ] && [ ! -f /.dockerenv ]; then sudo sysctl -w kernel.core_pattern='/tmp/core.%e.%p'; fi if [ "${{ secrets.ACTIONS_STEP_DEBUG }}" = "true" ]; then - ctest -V -L integration-verify --no-tests=error --output-junit "${RUNNER_TEMP}/verify.xml" + ctest -V -L integration-verify --no-tests=error -j "$(nproc)" --output-junit "${RUNNER_TEMP}/verify.xml" else - ctest --output-on-failure -L integration-verify --no-tests=error --output-junit "${RUNNER_TEMP}/verify.xml" + ctest --output-on-failure -L integration-verify --no-tests=error -j "$(nproc)" --output-junit "${RUNNER_TEMP}/verify.xml" fi # The unit suite again, on the verify library: cases compiled only under MOBILEGL_PIPE_VERIFY @@ -975,7 +999,7 @@ jobs: with: cmakeVersion: 3.31.10 - name: Install runtime dependencies - timeout-minutes: 45 + timeout-minutes: 15 if: env.MOBILEGL_CI_NATIVE_GPU != '1' run: | sudo apt-get update @@ -1266,7 +1290,7 @@ jobs: run: python3 update_glslang_sources.py - name: Install build dependencies - timeout-minutes: 45 + timeout-minutes: 15 if: env.MOBILEGL_CI_NATIVE_GPU != '1' run: | sudo apt-get update @@ -1366,14 +1390,12 @@ jobs: run: ccache --show-stats - name: Release superseded ccache entry - if: github.ref_name == github.event.repository.default_branch env: GH_TOKEN: ${{ github.token }} CACHE_KEY: ${{ runner.os }}-ubuntu24-cpu-test-${{ github.job }}-ccache-v1 - run: gh cache delete "${CACHE_KEY}" || true + run: gh cache delete "${CACHE_KEY}" --ref "${GITHUB_REF}" || true - name: Save ccache - if: github.ref_name == github.event.repository.default_branch continue-on-error: true uses: actions/cache/save@v5 with: @@ -1407,6 +1429,21 @@ jobs: path: ci-artifacts/mobilegl-linux-runtime-split.tgz if-no-files-found: error + # The retrace legs load only the library, and the server image on the spawn arm, so they + # take this instead of the whole test runtime. + - name: Package retrace library + run: | + files=("${BUILD_DIR}/.ci-source-root" "${BUILD_DIR}/libMobileGL.so") + if [ -f "${BUILD_DIR}/libMobileGLServer.so" ]; then files+=("${BUILD_DIR}/libMobileGLServer.so"); fi + tar -czf ci-artifacts/mobilegl-linux-lib-split.tgz "${files[@]}" + + - name: Upload retrace library + uses: actions/upload-artifact@v7 + with: + name: mobilegl-linux-lib-split + path: ci-artifacts/mobilegl-linux-lib-split.tgz + if-no-files-found: error + # The split lane itself: the three-arm shape ARCHITECTURE.md §13.2 asks for verbatim, plus the # first real run of the five MG_Test/Wire suites, plus P5's two exit-gate negative controls. integration-split: @@ -1430,7 +1467,7 @@ jobs: cmakeVersion: 3.31.10 - name: Install runtime dependencies - timeout-minutes: 45 + timeout-minutes: 15 if: env.MOBILEGL_CI_NATIVE_GPU != '1' run: | sudo apt-get update @@ -1666,7 +1703,7 @@ jobs: cmakeVersion: 3.31.10 - name: Install runtime dependencies - timeout-minutes: 45 + timeout-minutes: 15 if: env.MOBILEGL_CI_NATIVE_GPU != '1' run: | sudo apt-get update @@ -2254,7 +2291,7 @@ jobs: run: git submodule update --init include/ska 3rdparty/xxHash 3rdparty/Vulkan-Headers - name: Install clang and X11 headers - timeout-minutes: 45 + timeout-minutes: 15 if: env.MOBILEGL_CI_NATIVE_GPU != '1' # Includes.h defines VK_USE_PLATFORM_XLIB_KHR before , which then # includes ; without libx11-dev every clang-mode probe dies in the @@ -2290,7 +2327,7 @@ jobs: cmakeVersion: 3.31.10 - name: Install runtime dependencies - timeout-minutes: 45 + timeout-minutes: 15 if: env.MOBILEGL_CI_NATIVE_GPU != '1' # libegl-mesa0 is the EGL vendor library itself: DriverBench brings up a # real GL context, and libegl1 is only glvnd's dispatch. It normally @@ -2332,8 +2369,6 @@ jobs: build-retrace: runs-on: ubuntu-latest - needs: - - build-linux permissions: actions: write contents: read @@ -2399,7 +2434,7 @@ jobs: run: python3 update_glslang_sources.py - name: Install dependencies - timeout-minutes: 45 + timeout-minutes: 15 if: env.MOBILEGL_CI_NATIVE_GPU != '1' run: | sudo apt-get update @@ -2413,17 +2448,6 @@ jobs: "${MOBILEGL_CI_LLD}" --version dpkg -l 'libc++*' 'libegl*' 'libgles*' 'mesa*' 'vulkan*' || true - - name: Download Linux runtime - uses: actions/download-artifact@v8 - with: - name: mobilegl-linux-runtime - path: . - - - name: Unpack Linux runtime - run: | - tar -xzf mobilegl-linux-runtime.tgz - test -f "${MOBILEGL_LIBRARY}" - - name: Prepare downloaded test metadata run: | for root in build-linux build-verify build-split build-verify-split build-retrace control-runtime/build-push-control; do @@ -2460,14 +2484,12 @@ jobs: run: ccache --show-stats - name: Release superseded ccache entry - if: github.ref_name == github.event.repository.default_branch env: GH_TOKEN: ${{ github.token }} CACHE_KEY: ${{ runner.os }}-ubuntu24-cpu-test-${{ github.job }}-ccache-v1 - run: gh cache delete "${CACHE_KEY}" || true + run: gh cache delete "${CACHE_KEY}" --ref "${GITHUB_REF}" || true - name: Save ccache - if: github.ref_name == github.event.repository.default_branch continue-on-error: true uses: actions/cache/save@v5 with: @@ -2635,10 +2657,10 @@ jobs: - build-retrace - trace-cases - trace-fixtures - if: ${{ always() && needs.build-linux.result == 'success' && needs.build-retrace.result == 'success' && needs.trace-cases.result == 'success' }} + if: ${{ !cancelled() && needs.build-linux.result == 'success' && needs.build-retrace.result == 'success' && needs.trace-cases.result == 'success' }} strategy: fail-fast: false - max-parallel: 4 + max-parallel: 8 matrix: ${{ fromJSON(needs.trace-cases.outputs.matrix) }} steps: @@ -2674,7 +2696,7 @@ jobs: cmakeVersion: 3.31.10 - name: Install runtime dependencies - timeout-minutes: 45 + timeout-minutes: 15 if: env.MOBILEGL_CI_NATIVE_GPU != '1' run: | sudo apt-get update @@ -2682,10 +2704,10 @@ jobs: test -e /usr/lib/x86_64-linux-gnu/libEGL.so test -e /usr/lib/x86_64-linux-gnu/libGLESv2.so - - name: Download Linux runtime + - name: Download Linux library uses: actions/download-artifact@v8 with: - name: mobilegl-linux-runtime + name: mobilegl-linux-lib path: . - name: Download trace replay @@ -2696,7 +2718,7 @@ jobs: - name: Unpack retrace runtime run: | - tar -xzf mobilegl-linux-runtime.tgz + tar -xzf mobilegl-linux-lib.tgz tar -xzf mobilegl-trace-replay.tgz test -f build-linux/libMobileGL.so test -f build-retrace/tools/trace_replay/mobilegl_trace_replay @@ -2756,7 +2778,7 @@ jobs: name: retrace summary runs-on: ubuntu-latest needs: [retrace] - if: ${{ always() && needs.retrace.result != 'skipped' }} + if: ${{ !cancelled() && needs.retrace.result != 'skipped' }} env: MOBILEGL_CI_DISAGGREGATED: ${{ (github.ref_name == 'feat/disaggregated' || github.ref_name == 'codex/fix-github-ci' || github.ref_name == 'cleanup') && 'ON' || 'OFF' }} @@ -2839,7 +2861,7 @@ jobs: - build-retrace - trace-cases - trace-fixtures - if: ${{ always() && needs.build-linux-verify.result == 'success' && needs.build-retrace.result == 'success' && needs.trace-cases.result == 'success' }} + if: ${{ !cancelled() && needs.build-linux-verify.result == 'success' && needs.build-retrace.result == 'success' && needs.trace-cases.result == 'success' }} strategy: fail-fast: false max-parallel: 4 @@ -2878,7 +2900,7 @@ jobs: cmakeVersion: 3.31.10 - name: Install runtime dependencies - timeout-minutes: 45 + timeout-minutes: 15 if: env.MOBILEGL_CI_NATIVE_GPU != '1' run: | sudo apt-get update @@ -2886,10 +2908,10 @@ jobs: test -e /usr/lib/x86_64-linux-gnu/libEGL.so test -e /usr/lib/x86_64-linux-gnu/libGLESv2.so - - name: Download Linux verify runtime + - name: Download Linux verify library uses: actions/download-artifact@v8 with: - name: mobilegl-linux-runtime-verify + name: mobilegl-linux-lib-verify path: . - name: Download trace replay @@ -2908,7 +2930,7 @@ jobs: # `nm`, not `nm -D`, for the reason spelled out in build-linux-verify: everything MGPipe is # hidden-visibility in a Release build and the dynamic table has none of it. run: | - tar -xzf mobilegl-linux-runtime-verify.tgz + tar -xzf mobilegl-linux-lib-verify.tgz tar -xzf mobilegl-trace-replay.tgz test -f build-verify/libMobileGL.so test -f build-retrace/tools/trace_replay/mobilegl_trace_replay @@ -3024,10 +3046,10 @@ jobs: # legs no longer require that build to have SUCCEEDED - gating on it skipped the whole split # matrix (grey, not red) whenever the control build failed (PLAN-P13 §0-7). The control steps # below download its artifact, and a missing one is a red step on every leg instead. - if: ${{ always() && needs.build-linux-split.result == 'success' && needs.build-retrace.result == 'success' && needs.trace-cases.result == 'success' }} + if: ${{ !cancelled() && needs.build-linux-split.result == 'success' && needs.build-retrace.result == 'success' && needs.trace-cases.result == 'success' }} strategy: fail-fast: false - max-parallel: 4 + max-parallel: 8 matrix: ${{ fromJSON(needs.trace-cases.outputs.split-matrix) }} steps: @@ -3063,7 +3085,7 @@ jobs: cmakeVersion: 3.31.10 - name: Install runtime dependencies - timeout-minutes: 45 + timeout-minutes: 15 if: env.MOBILEGL_CI_NATIVE_GPU != '1' run: | sudo apt-get update @@ -3071,10 +3093,10 @@ jobs: test -e /usr/lib/x86_64-linux-gnu/libEGL.so test -e /usr/lib/x86_64-linux-gnu/libGLESv2.so - - name: Download Linux split runtime + - name: Download Linux split library uses: actions/download-artifact@v8 with: - name: mobilegl-linux-runtime-split + name: mobilegl-linux-lib-split path: . - name: Download trace replay @@ -3096,18 +3118,12 @@ jobs: tar -xzf control-runtime/mobilegl-linux-monolith-control.tgz -C control-runtime test -f control-runtime/build-push-control/libMobileGL.so - - name: Prepare downloaded test metadata - run: | - for root in build-linux build-verify build-split build-verify-split build-retrace control-runtime/build-push-control; do - if [ -d "$root" ]; then python3 scripts/ci/prepare_test_runtime.py "$root"; fi - done - - name: Unpack split runtime (library under test) # build-retrace's CTestTestfile.cmake has the absolute path # /build-linux/libMobileGL.so frozen into every case, so the swap happens here # rather than through a variable, exactly as in retrace-verify. `nm`, not `nm -D`. run: | - tar -xzf mobilegl-linux-runtime-split.tgz + tar -xzf mobilegl-linux-lib-split.tgz tar -xzf mobilegl-trace-replay.tgz test -f build-split/libMobileGL.so test -f build-retrace/tools/trace_replay/mobilegl_trace_replay @@ -3119,18 +3135,18 @@ jobs: fi echo "the library at build-linux/libMobileGL.so is the split build" - # THE SPAWN ARM NEEDS A SECOND BINARY and the inproc arm needs none, which is the whole - # difference between the two at this level: inproc's server role is a thread in the replay - # process, spawn's is a PROCESS the client launches from this image. It is packaged by - # build-linux-split's `find -name '*.so'` sweep - libMobileGLServer.so is an executable that - # wears a .so name so an APK will install it somewhere exec-able - and a missing one must be - # a NAMED failure here rather than a LaunchServer refusal 78 jobs deep. - name: Prepare downloaded test metadata run: | for root in build-linux build-verify build-split build-verify-split build-retrace control-runtime/build-push-control; do if [ -d "$root" ]; then python3 scripts/ci/prepare_test_runtime.py "$root"; fi done + # THE SPAWN ARM NEEDS A SECOND BINARY and the inproc arm needs none, which is the whole + # difference between the two at this level: inproc's server role is a thread in the replay + # process, spawn's is a PROCESS the client launches from this image. It ships in + # build-linux-split's retrace library - libMobileGLServer.so is an executable that wears a + # .so name so an APK will install it somewhere exec-able - and a missing one must be a NAMED + # failure here rather than a LaunchServer refusal 78 jobs deep. - name: Place the server image (spawn arm only) if: ${{ matrix.transport == 'spawn' }} run: | @@ -3555,7 +3571,7 @@ jobs: run: python3 update_glslang_sources.py - name: Install build and runtime dependencies - timeout-minutes: 45 + timeout-minutes: 15 if: env.MOBILEGL_CI_NATIVE_GPU != '1' run: | sudo apt-get update @@ -3612,14 +3628,12 @@ jobs: run: ccache --show-stats - name: Release superseded ccache entry - if: github.ref_name == github.event.repository.default_branch env: GH_TOKEN: ${{ github.token }} CACHE_KEY: ${{ runner.os }}-ubuntu24-cpu-test-${{ github.job }}-ccache-v1 - run: gh cache delete "${CACHE_KEY}" || true + run: gh cache delete "${CACHE_KEY}" --ref "${GITHUB_REF}" || true - name: Save ccache - if: github.ref_name == github.event.repository.default_branch continue-on-error: true uses: actions/cache/save@v5 with: @@ -3661,7 +3675,7 @@ jobs: - integration-verify-split - integration-split - integration-split-strict - if: ${{ always() }} + if: ${{ !cancelled() }} steps: - name: Checkout repo uses: actions/checkout@v6