Test #18
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: Test | |
| on: | |
| push: | |
| branches: [main, master] | |
| paths-ignore: | |
| - logs/** | |
| - bin/** | |
| pull_request: | |
| branches: [main, master] | |
| workflow_dispatch: | |
| workflow_run: | |
| workflows: [Build] | |
| types: [completed] | |
| branches: [main, master] | |
| concurrency: | |
| # workflow_run triggers are unique per build run — give each its own group so | |
| # a second triggered test run never cancels a still-running first. | |
| # push/PR triggers keep the old ref-based group so redundant runs are cancelled. | |
| group: ${{ github.workflow }}-${{ github.event.workflow_run.id || github.ref }} | |
| cancel-in-progress: ${{ github.event_name != 'workflow_run' }} | |
| # No flag gate. Seven platform queues start in parallel; inside each queue | |
| # variants are chained. A failure closes that queue (remaining are skipped). | |
| jobs: | |
| # =========================================================================== | |
| # WINDOWS queue: x86_64-msvc -> x86-msvc -> arm64-msvc -> x86_64-mingw -> x86-mingw -> armv7-msvc | |
| # =========================================================================== | |
| win_x86_64_msvc: | |
| name: Test Windows x86_64 MSVC | |
| uses: ./.github/workflows/test-variant.yml | |
| with: | |
| platform: win | |
| variant: x86_64-msvc | |
| runner: windows-2022 | |
| build_run_id: ${{ github.event.workflow_run.id }} | |
| test_mode: kat | |
| lib_glob: "*.dll" | |
| win_x86_msvc: | |
| name: Test Windows x86 MSVC | |
| needs: [win_x86_64_msvc] | |
| if: always() | |
| uses: ./.github/workflows/test-variant.yml | |
| with: | |
| platform: win | |
| variant: x86-msvc | |
| runner: windows-2022 | |
| build_run_id: ${{ github.event.workflow_run.id }} | |
| test_mode: kat | |
| lib_glob: "*.dll" | |
| should_test: ${{ needs.win_x86_64_msvc.result == 'success' && needs.win_x86_64_msvc.outputs.continue_queue == 'true' }} | |
| blocked_by: ${{ needs.win_x86_64_msvc.outputs.blocking_variant || 'x86_64-msvc' }} | |
| blocked_status: ${{ needs.win_x86_64_msvc.outputs.blocking_status || needs.win_x86_64_msvc.result }} | |
| win_arm64_msvc: | |
| name: Test Windows arm64 MSVC | |
| needs: [win_x86_msvc] | |
| if: always() | |
| uses: ./.github/workflows/test-variant.yml | |
| with: | |
| platform: win | |
| variant: arm64-msvc | |
| runner: windows-2022 | |
| build_run_id: ${{ github.event.workflow_run.id }} | |
| test_mode: pe-header | |
| lib_glob: "*.dll" | |
| should_test: ${{ needs.win_x86_msvc.result == 'success' && needs.win_x86_msvc.outputs.continue_queue == 'true' }} | |
| blocked_by: ${{ needs.win_x86_msvc.outputs.blocking_variant || 'x86-msvc' }} | |
| blocked_status: ${{ needs.win_x86_msvc.outputs.blocking_status || needs.win_x86_msvc.result }} | |
| win_x86_64_mingw: | |
| name: Test Windows x86_64 MinGW | |
| needs: [win_arm64_msvc] | |
| if: always() | |
| uses: ./.github/workflows/test-variant.yml | |
| with: | |
| platform: win | |
| variant: x86_64-mingw | |
| runner: windows-2022 | |
| build_run_id: ${{ github.event.workflow_run.id }} | |
| test_mode: kat | |
| lib_glob: "*.dll" | |
| should_test: ${{ needs.win_arm64_msvc.result == 'success' && needs.win_arm64_msvc.outputs.continue_queue == 'true' }} | |
| blocked_by: ${{ needs.win_arm64_msvc.outputs.blocking_variant || 'arm64-msvc' }} | |
| blocked_status: ${{ needs.win_arm64_msvc.outputs.blocking_status || needs.win_arm64_msvc.result }} | |
| win_x86_mingw: | |
| name: Test Windows x86 MinGW | |
| needs: [win_x86_64_mingw] | |
| if: always() | |
| uses: ./.github/workflows/test-variant.yml | |
| with: | |
| platform: win | |
| variant: x86-mingw | |
| runner: windows-2022 | |
| build_run_id: ${{ github.event.workflow_run.id }} | |
| test_mode: kat | |
| lib_glob: "*.dll" | |
| should_test: ${{ needs.win_x86_64_mingw.result == 'success' && needs.win_x86_64_mingw.outputs.continue_queue == 'true' }} | |
| blocked_by: ${{ needs.win_x86_64_mingw.outputs.blocking_variant || 'x86_64-mingw' }} | |
| blocked_status: ${{ needs.win_x86_64_mingw.outputs.blocking_status || needs.win_x86_64_mingw.result }} | |
| win_armv7_msvc: | |
| name: Test Windows armv7 MSVC | |
| needs: [win_x86_mingw] | |
| if: always() | |
| uses: ./.github/workflows/test-variant.yml | |
| with: | |
| platform: win | |
| variant: armv7-msvc | |
| runner: windows-2022 | |
| build_run_id: ${{ github.event.workflow_run.id }} | |
| test_mode: pe-header | |
| lib_glob: "*.dll" | |
| should_test: ${{ needs.win_x86_mingw.result == 'success' && needs.win_x86_mingw.outputs.continue_queue == 'true' }} | |
| blocked_by: ${{ needs.win_x86_mingw.outputs.blocking_variant || 'x86-mingw' }} | |
| blocked_status: ${{ needs.win_x86_mingw.outputs.blocking_status || needs.win_x86_mingw.result }} | |
| # =========================================================================== | |
| # LINUX GLIBC queue: x86_64 -> x86 -> arm64 -> armv7 -> riscv64 -> s390x -> ppc64le -> loongarch64 | |
| # =========================================================================== | |
| linux_glibc_x86_64: | |
| name: Test linux-glibc x86_64 | |
| uses: ./.github/workflows/test-variant.yml | |
| with: | |
| platform: linux-glibc | |
| variant: x86_64 | |
| runner: ubuntu-24.04 | |
| build_run_id: ${{ github.event.workflow_run.id }} | |
| test_mode: kat | |
| lib_glob: "*.so" | |
| linux_glibc_x86: | |
| name: Test linux-glibc x86 | |
| needs: [linux_glibc_x86_64] | |
| if: always() | |
| uses: ./.github/workflows/test-variant.yml | |
| with: | |
| platform: linux-glibc | |
| variant: x86 | |
| runner: ubuntu-24.04 | |
| build_run_id: ${{ github.event.workflow_run.id }} | |
| test_mode: kat | |
| lib_glob: "*.so" | |
| apt_packages: "qemu-user qemu-user-static gcc-multilib libc6-i386" | |
| qemu_ld_prefix: /usr/i686-linux-gnu | |
| should_test: ${{ needs.linux_glibc_x86_64.result == 'success' && needs.linux_glibc_x86_64.outputs.continue_queue == 'true' }} | |
| blocked_by: ${{ needs.linux_glibc_x86_64.outputs.blocking_variant || 'x86_64' }} | |
| blocked_status: ${{ needs.linux_glibc_x86_64.outputs.blocking_status || needs.linux_glibc_x86_64.result }} | |
| linux_glibc_arm64: | |
| name: Test linux-glibc arm64 | |
| needs: [linux_glibc_x86] | |
| if: always() | |
| uses: ./.github/workflows/test-variant.yml | |
| with: | |
| platform: linux-glibc | |
| variant: arm64 | |
| runner: ubuntu-24.04 | |
| build_run_id: ${{ github.event.workflow_run.id }} | |
| test_mode: kat | |
| lib_glob: "*.so" | |
| qemu_arch: aarch64 | |
| qemu_ld_prefix: /usr/aarch64-linux-gnu | |
| should_test: ${{ needs.linux_glibc_x86.result == 'success' && needs.linux_glibc_x86.outputs.continue_queue == 'true' }} | |
| blocked_by: ${{ needs.linux_glibc_x86.outputs.blocking_variant || 'x86' }} | |
| blocked_status: ${{ needs.linux_glibc_x86.outputs.blocking_status || needs.linux_glibc_x86.result }} | |
| linux_glibc_armv7: | |
| name: Test linux-glibc armv7 | |
| needs: [linux_glibc_arm64] | |
| if: always() | |
| uses: ./.github/workflows/test-variant.yml | |
| with: | |
| platform: linux-glibc | |
| variant: armv7 | |
| runner: ubuntu-24.04 | |
| build_run_id: ${{ github.event.workflow_run.id }} | |
| test_mode: kat | |
| lib_glob: "*.so" | |
| qemu_arch: arm | |
| qemu_ld_prefix: /usr/arm-linux-gnueabihf | |
| should_test: ${{ needs.linux_glibc_arm64.result == 'success' && needs.linux_glibc_arm64.outputs.continue_queue == 'true' }} | |
| blocked_by: ${{ needs.linux_glibc_arm64.outputs.blocking_variant || 'arm64' }} | |
| blocked_status: ${{ needs.linux_glibc_arm64.outputs.blocking_status || needs.linux_glibc_arm64.result }} | |
| linux_glibc_riscv64: | |
| name: Test linux-glibc riscv64 | |
| needs: [linux_glibc_armv7] | |
| if: always() | |
| uses: ./.github/workflows/test-variant.yml | |
| with: | |
| platform: linux-glibc | |
| variant: riscv64 | |
| runner: ubuntu-24.04 | |
| build_run_id: ${{ github.event.workflow_run.id }} | |
| test_mode: kat | |
| lib_glob: "*.so" | |
| qemu_arch: riscv64 | |
| qemu_ld_prefix: /usr/riscv64-linux-gnu | |
| should_test: ${{ needs.linux_glibc_armv7.result == 'success' && needs.linux_glibc_armv7.outputs.continue_queue == 'true' }} | |
| blocked_by: ${{ needs.linux_glibc_armv7.outputs.blocking_variant || 'armv7' }} | |
| blocked_status: ${{ needs.linux_glibc_armv7.outputs.blocking_status || needs.linux_glibc_armv7.result }} | |
| linux_glibc_s390x: | |
| name: Test linux-glibc s390x | |
| needs: [linux_glibc_riscv64] | |
| if: always() | |
| uses: ./.github/workflows/test-variant.yml | |
| with: | |
| platform: linux-glibc | |
| variant: s390x | |
| runner: ubuntu-24.04 | |
| build_run_id: ${{ github.event.workflow_run.id }} | |
| test_mode: kat | |
| lib_glob: "*.so" | |
| qemu_arch: s390x | |
| qemu_ld_prefix: /usr/s390x-linux-gnu | |
| should_test: ${{ needs.linux_glibc_riscv64.result == 'success' && needs.linux_glibc_riscv64.outputs.continue_queue == 'true' }} | |
| blocked_by: ${{ needs.linux_glibc_riscv64.outputs.blocking_variant || 'riscv64' }} | |
| blocked_status: ${{ needs.linux_glibc_riscv64.outputs.blocking_status || needs.linux_glibc_riscv64.result }} | |
| linux_glibc_ppc64le: | |
| name: Test linux-glibc ppc64le | |
| needs: [linux_glibc_s390x] | |
| if: always() | |
| uses: ./.github/workflows/test-variant.yml | |
| with: | |
| platform: linux-glibc | |
| variant: ppc64le | |
| runner: ubuntu-24.04 | |
| build_run_id: ${{ github.event.workflow_run.id }} | |
| test_mode: kat | |
| lib_glob: "*.so" | |
| qemu_arch: ppc64le | |
| qemu_ld_prefix: /usr/powerpc64le-linux-gnu | |
| should_test: ${{ needs.linux_glibc_s390x.result == 'success' && needs.linux_glibc_s390x.outputs.continue_queue == 'true' }} | |
| blocked_by: ${{ needs.linux_glibc_s390x.outputs.blocking_variant || 's390x' }} | |
| blocked_status: ${{ needs.linux_glibc_s390x.outputs.blocking_status || needs.linux_glibc_s390x.result }} | |
| linux_glibc_loongarch64: | |
| name: Test linux-glibc loongarch64 | |
| needs: [linux_glibc_ppc64le] | |
| if: always() | |
| uses: ./.github/workflows/test-variant.yml | |
| with: | |
| platform: linux-glibc | |
| variant: loongarch64 | |
| runner: ubuntu-24.04 | |
| build_run_id: ${{ github.event.workflow_run.id }} | |
| test_mode: kat | |
| lib_glob: "*.so" | |
| qemu_arch: loongarch64 | |
| qemu_ld_prefix: /usr/loongarch64-linux-gnu | |
| should_test: ${{ needs.linux_glibc_ppc64le.result == 'success' && needs.linux_glibc_ppc64le.outputs.continue_queue == 'true' }} | |
| blocked_by: ${{ needs.linux_glibc_ppc64le.outputs.blocking_variant || 'ppc64le' }} | |
| blocked_status: ${{ needs.linux_glibc_ppc64le.outputs.blocking_status || needs.linux_glibc_ppc64le.result }} | |
| # =========================================================================== | |
| # LINUX MUSL queue: x86_64 -> arm64 -> armv7 | |
| # =========================================================================== | |
| linux_musl_x86_64: | |
| name: Test linux-musl x86_64 | |
| uses: ./.github/workflows/test-variant.yml | |
| with: | |
| platform: linux-musl | |
| variant: x86_64 | |
| runner: ubuntu-24.04 | |
| build_run_id: ${{ github.event.workflow_run.id }} | |
| test_mode: kat | |
| lib_glob: "*.so" | |
| apt_packages: "musl musl-tools" | |
| linux_musl_arm64: | |
| name: Test linux-musl arm64 | |
| needs: [linux_musl_x86_64] | |
| if: always() | |
| uses: ./.github/workflows/test-variant.yml | |
| with: | |
| platform: linux-musl | |
| variant: arm64 | |
| runner: ubuntu-24.04 | |
| build_run_id: ${{ github.event.workflow_run.id }} | |
| test_mode: kat | |
| lib_glob: "*.so" | |
| qemu_arch: aarch64 | |
| should_test: ${{ needs.linux_musl_x86_64.result == 'success' && needs.linux_musl_x86_64.outputs.continue_queue == 'true' }} | |
| blocked_by: ${{ needs.linux_musl_x86_64.outputs.blocking_variant || 'x86_64' }} | |
| blocked_status: ${{ needs.linux_musl_x86_64.outputs.blocking_status || needs.linux_musl_x86_64.result }} | |
| linux_musl_armv7: | |
| name: Test linux-musl armv7 | |
| needs: [linux_musl_arm64] | |
| if: always() | |
| uses: ./.github/workflows/test-variant.yml | |
| with: | |
| platform: linux-musl | |
| variant: armv7 | |
| runner: ubuntu-24.04 | |
| build_run_id: ${{ github.event.workflow_run.id }} | |
| test_mode: kat | |
| lib_glob: "*.so" | |
| qemu_arch: arm | |
| should_test: ${{ needs.linux_musl_arm64.result == 'success' && needs.linux_musl_arm64.outputs.continue_queue == 'true' }} | |
| blocked_by: ${{ needs.linux_musl_arm64.outputs.blocking_variant || 'arm64' }} | |
| blocked_status: ${{ needs.linux_musl_arm64.outputs.blocking_status || needs.linux_musl_arm64.result }} | |
| # =========================================================================== | |
| # macOS queue: x86_64 -> arm64 -> universal | |
| # =========================================================================== | |
| macos_x86_64: | |
| name: Test macOS x86_64 | |
| uses: ./.github/workflows/test-variant.yml | |
| with: | |
| platform: macos | |
| variant: x86_64 | |
| runner: macos-14 | |
| build_run_id: ${{ github.event.workflow_run.id }} | |
| test_mode: kat | |
| lib_glob: "*.dylib" | |
| macos_arm64: | |
| name: Test macOS arm64 | |
| needs: [macos_x86_64] | |
| if: always() | |
| uses: ./.github/workflows/test-variant.yml | |
| with: | |
| platform: macos | |
| variant: arm64 | |
| runner: macos-14 | |
| build_run_id: ${{ github.event.workflow_run.id }} | |
| test_mode: kat | |
| lib_glob: "*.dylib" | |
| should_test: ${{ needs.macos_x86_64.result == 'success' && needs.macos_x86_64.outputs.continue_queue == 'true' }} | |
| blocked_by: ${{ needs.macos_x86_64.outputs.blocking_variant || 'x86_64' }} | |
| blocked_status: ${{ needs.macos_x86_64.outputs.blocking_status || needs.macos_x86_64.result }} | |
| macos_universal: | |
| name: Test macOS universal | |
| needs: [macos_arm64] | |
| if: always() | |
| uses: ./.github/workflows/test-variant.yml | |
| with: | |
| platform: macos | |
| variant: universal | |
| runner: macos-14 | |
| build_run_id: ${{ github.event.workflow_run.id }} | |
| test_mode: kat | |
| lib_glob: "*.dylib" | |
| should_test: ${{ needs.macos_arm64.result == 'success' && needs.macos_arm64.outputs.continue_queue == 'true' }} | |
| blocked_by: ${{ needs.macos_arm64.outputs.blocking_variant || 'arm64' }} | |
| blocked_status: ${{ needs.macos_arm64.outputs.blocking_status || needs.macos_arm64.result }} | |
| # =========================================================================== | |
| # WASM queue: emscripten-wasm32 -> wasi-wasm32 | |
| # =========================================================================== | |
| wasm_emscripten: | |
| name: Test WASM emscripten-wasm32 | |
| uses: ./.github/workflows/test-variant.yml | |
| with: | |
| platform: wasm | |
| variant: emscripten-wasm32 | |
| runner: ubuntu-24.04 | |
| build_run_id: ${{ github.event.workflow_run.id }} | |
| test_mode: wasm-node | |
| lib_glob: "*.js" | |
| wasm_wasi: | |
| name: Test WASM wasi-wasm32 | |
| needs: [wasm_emscripten] | |
| if: always() | |
| uses: ./.github/workflows/test-variant.yml | |
| with: | |
| platform: wasm | |
| variant: wasi-wasm32 | |
| runner: ubuntu-24.04 | |
| build_run_id: ${{ github.event.workflow_run.id }} | |
| test_mode: wasm-wasi | |
| lib_glob: "*.wasm" | |
| should_test: ${{ needs.wasm_emscripten.result == 'success' && needs.wasm_emscripten.outputs.continue_queue == 'true' }} | |
| blocked_by: ${{ needs.wasm_emscripten.outputs.blocking_variant || 'emscripten-wasm32' }} | |
| blocked_status: ${{ needs.wasm_emscripten.outputs.blocking_status || needs.wasm_emscripten.result }} | |
| # =========================================================================== | |
| # ANDROID queue: arm64-v8a -> armeabi-v7a -> x86_64 -> x86 | |
| # =========================================================================== | |
| android_arm64_v8a: | |
| name: Test Android arm64-v8a | |
| uses: ./.github/workflows/test-variant.yml | |
| with: | |
| platform: android | |
| variant: arm64-v8a | |
| runner: ubuntu-24.04 | |
| build_run_id: ${{ github.event.workflow_run.id }} | |
| test_mode: kat | |
| lib_glob: "*.so" | |
| qemu_arch: aarch64 | |
| android_armeabi_v7a: | |
| name: Test Android armeabi-v7a | |
| needs: [android_arm64_v8a] | |
| if: always() | |
| uses: ./.github/workflows/test-variant.yml | |
| with: | |
| platform: android | |
| variant: armeabi-v7a | |
| runner: ubuntu-24.04 | |
| build_run_id: ${{ github.event.workflow_run.id }} | |
| test_mode: kat | |
| lib_glob: "*.so" | |
| qemu_arch: arm | |
| should_test: ${{ needs.android_arm64_v8a.result == 'success' && needs.android_arm64_v8a.outputs.continue_queue == 'true' }} | |
| blocked_by: ${{ needs.android_arm64_v8a.outputs.blocking_variant || 'arm64-v8a' }} | |
| blocked_status: ${{ needs.android_arm64_v8a.outputs.blocking_status || needs.android_arm64_v8a.result }} | |
| android_x86_64: | |
| name: Test Android x86_64 | |
| needs: [android_armeabi_v7a] | |
| if: always() | |
| uses: ./.github/workflows/test-variant.yml | |
| with: | |
| platform: android | |
| variant: x86_64 | |
| runner: ubuntu-24.04 | |
| build_run_id: ${{ github.event.workflow_run.id }} | |
| test_mode: kat | |
| lib_glob: "*.so" | |
| should_test: ${{ needs.android_armeabi_v7a.result == 'success' && needs.android_armeabi_v7a.outputs.continue_queue == 'true' }} | |
| blocked_by: ${{ needs.android_armeabi_v7a.outputs.blocking_variant || 'armeabi-v7a' }} | |
| blocked_status: ${{ needs.android_armeabi_v7a.outputs.blocking_status || needs.android_armeabi_v7a.result }} | |
| android_x86: | |
| name: Test Android x86 | |
| needs: [android_x86_64] | |
| if: always() | |
| uses: ./.github/workflows/test-variant.yml | |
| with: | |
| platform: android | |
| variant: x86 | |
| runner: ubuntu-24.04 | |
| build_run_id: ${{ github.event.workflow_run.id }} | |
| test_mode: kat | |
| lib_glob: "*.so" | |
| apt_packages: "qemu-user qemu-user-static gcc-multilib libc6-i386" | |
| qemu_ld_prefix: /usr/i686-linux-gnu | |
| should_test: ${{ needs.android_x86_64.result == 'success' && needs.android_x86_64.outputs.continue_queue == 'true' }} | |
| blocked_by: ${{ needs.android_x86_64.outputs.blocking_variant || 'x86_64' }} | |
| blocked_status: ${{ needs.android_x86_64.outputs.blocking_status || needs.android_x86_64.result }} | |
| # =========================================================================== | |
| # iOS queue: device-arm64 -> sim-arm64 -> sim-x86_64 | |
| # =========================================================================== | |
| ios_device_arm64: | |
| name: Test iOS device-arm64 | |
| uses: ./.github/workflows/test-variant.yml | |
| with: | |
| platform: ios | |
| variant: device-arm64 | |
| runner: macos-14 | |
| build_run_id: ${{ github.event.workflow_run.id }} | |
| test_mode: macho-header | |
| lib_glob: "*.dylib" | |
| ios_sim_arm64: | |
| name: Test iOS sim-arm64 | |
| needs: [ios_device_arm64] | |
| if: always() | |
| uses: ./.github/workflows/test-variant.yml | |
| with: | |
| platform: ios | |
| variant: sim-arm64 | |
| runner: macos-14 | |
| build_run_id: ${{ github.event.workflow_run.id }} | |
| test_mode: kat | |
| lib_glob: "*.dylib" | |
| should_test: ${{ needs.ios_device_arm64.result == 'success' && needs.ios_device_arm64.outputs.continue_queue == 'true' }} | |
| blocked_by: ${{ needs.ios_device_arm64.outputs.blocking_variant || 'device-arm64' }} | |
| blocked_status: ${{ needs.ios_device_arm64.outputs.blocking_status || needs.ios_device_arm64.result }} | |
| ios_sim_x86_64: | |
| name: Test iOS sim-x86_64 | |
| needs: [ios_sim_arm64] | |
| if: always() | |
| uses: ./.github/workflows/test-variant.yml | |
| with: | |
| platform: ios | |
| variant: sim-x86_64 | |
| runner: macos-14 | |
| build_run_id: ${{ github.event.workflow_run.id }} | |
| test_mode: macho-header | |
| lib_glob: "*.dylib" | |
| should_test: ${{ needs.ios_sim_arm64.result == 'success' && needs.ios_sim_arm64.outputs.continue_queue == 'true' }} | |
| blocked_by: ${{ needs.ios_sim_arm64.outputs.blocking_variant || 'sim-arm64' }} | |
| blocked_status: ${{ needs.ios_sim_arm64.outputs.blocking_status || needs.ios_sim_arm64.result }} | |
| # =========================================================================== | |
| # REPORT — always runs, collects variant_status from all 29 jobs | |
| # =========================================================================== | |
| report: | |
| name: Test report | |
| if: always() | |
| needs: | |
| - win_x86_64_msvc | |
| - win_x86_msvc | |
| - win_arm64_msvc | |
| - win_x86_64_mingw | |
| - win_x86_mingw | |
| - win_armv7_msvc | |
| - linux_glibc_x86_64 | |
| - linux_glibc_x86 | |
| - linux_glibc_arm64 | |
| - linux_glibc_armv7 | |
| - linux_glibc_riscv64 | |
| - linux_glibc_s390x | |
| - linux_glibc_ppc64le | |
| - linux_glibc_loongarch64 | |
| - linux_musl_x86_64 | |
| - linux_musl_arm64 | |
| - linux_musl_armv7 | |
| - macos_x86_64 | |
| - macos_arm64 | |
| - macos_universal | |
| - wasm_emscripten | |
| - wasm_wasi | |
| - android_arm64_v8a | |
| - android_armeabi_v7a | |
| - android_x86_64 | |
| - android_x86 | |
| - ios_device_arm64 | |
| - ios_sim_arm64 | |
| - ios_sim_x86_64 | |
| runs-on: ubuntu-24.04 | |
| steps: | |
| - name: Write combined summary | |
| shell: bash | |
| env: | |
| R_WIN_X64_MSVC: ${{ needs.win_x86_64_msvc.outputs.variant_status }} | |
| R_WIN_X86_MSVC: ${{ needs.win_x86_msvc.outputs.variant_status }} | |
| R_WIN_A64_MSVC: ${{ needs.win_arm64_msvc.outputs.variant_status }} | |
| R_WIN_X64_MGW: ${{ needs.win_x86_64_mingw.outputs.variant_status }} | |
| R_WIN_X86_MGW: ${{ needs.win_x86_mingw.outputs.variant_status }} | |
| R_WIN_AV7_MSVC: ${{ needs.win_armv7_msvc.outputs.variant_status }} | |
| R_GLI_X64: ${{ needs.linux_glibc_x86_64.outputs.variant_status }} | |
| R_GLI_X86: ${{ needs.linux_glibc_x86.outputs.variant_status }} | |
| R_GLI_A64: ${{ needs.linux_glibc_arm64.outputs.variant_status }} | |
| R_GLI_AV7: ${{ needs.linux_glibc_armv7.outputs.variant_status }} | |
| R_GLI_RV64: ${{ needs.linux_glibc_riscv64.outputs.variant_status }} | |
| R_GLI_S390: ${{ needs.linux_glibc_s390x.outputs.variant_status }} | |
| R_GLI_PPC: ${{ needs.linux_glibc_ppc64le.outputs.variant_status }} | |
| R_GLI_LOONG: ${{ needs.linux_glibc_loongarch64.outputs.variant_status }} | |
| R_MUS_X64: ${{ needs.linux_musl_x86_64.outputs.variant_status }} | |
| R_MUS_A64: ${{ needs.linux_musl_arm64.outputs.variant_status }} | |
| R_MUS_AV7: ${{ needs.linux_musl_armv7.outputs.variant_status }} | |
| R_MAC_X64: ${{ needs.macos_x86_64.outputs.variant_status }} | |
| R_MAC_A64: ${{ needs.macos_arm64.outputs.variant_status }} | |
| R_MAC_UNI: ${{ needs.macos_universal.outputs.variant_status }} | |
| R_WASM_EM: ${{ needs.wasm_emscripten.outputs.variant_status }} | |
| R_WASM_WASI: ${{ needs.wasm_wasi.outputs.variant_status }} | |
| R_AND_A64: ${{ needs.android_arm64_v8a.outputs.variant_status }} | |
| R_AND_AV7: ${{ needs.android_armeabi_v7a.outputs.variant_status }} | |
| R_AND_X64: ${{ needs.android_x86_64.outputs.variant_status }} | |
| R_AND_X86: ${{ needs.android_x86.outputs.variant_status }} | |
| R_IOS_DEV: ${{ needs.ios_device_arm64.outputs.variant_status }} | |
| R_IOS_SIM_A64: ${{ needs.ios_sim_arm64.outputs.variant_status }} | |
| R_IOS_SIM_X64: ${{ needs.ios_sim_x86_64.outputs.variant_status }} | |
| run: | | |
| { | |
| echo "## Test suite — all 29 variants" | |
| echo | |
| echo "| Group | Variant | Status |" | |
| echo "|-------|---------|--------|" | |
| echo "| Windows | x86_64-msvc | ${R_WIN_X64_MSVC} |" | |
| echo "| Windows | x86-msvc | ${R_WIN_X86_MSVC} |" | |
| echo "| Windows | arm64-msvc | ${R_WIN_A64_MSVC} |" | |
| echo "| Windows | x86_64-mingw | ${R_WIN_X64_MGW} |" | |
| echo "| Windows | x86-mingw | ${R_WIN_X86_MGW} |" | |
| echo "| Windows | armv7-msvc | ${R_WIN_AV7_MSVC} |" | |
| echo "| linux-glibc | x86_64 | ${R_GLI_X64} |" | |
| echo "| linux-glibc | x86 | ${R_GLI_X86} |" | |
| echo "| linux-glibc | arm64 | ${R_GLI_A64} |" | |
| echo "| linux-glibc | armv7 | ${R_GLI_AV7} |" | |
| echo "| linux-glibc | riscv64 | ${R_GLI_RV64} |" | |
| echo "| linux-glibc | s390x | ${R_GLI_S390} |" | |
| echo "| linux-glibc | ppc64le | ${R_GLI_PPC} |" | |
| echo "| linux-glibc | loongarch64 | ${R_GLI_LOONG} |" | |
| echo "| linux-musl | x86_64 | ${R_MUS_X64} |" | |
| echo "| linux-musl | arm64 | ${R_MUS_A64} |" | |
| echo "| linux-musl | armv7 | ${R_MUS_AV7} |" | |
| echo "| macOS | x86_64 | ${R_MAC_X64} |" | |
| echo "| macOS | arm64 | ${R_MAC_A64} |" | |
| echo "| macOS | universal | ${R_MAC_UNI} |" | |
| echo "| WASM | emscripten | ${R_WASM_EM} |" | |
| echo "| WASM | wasi | ${R_WASM_WASI} |" | |
| echo "| Android | arm64-v8a | ${R_AND_A64} |" | |
| echo "| Android | armeabi-v7a | ${R_AND_AV7} |" | |
| echo "| Android | x86_64 | ${R_AND_X64} |" | |
| echo "| Android | x86 | ${R_AND_X86} |" | |
| echo "| iOS | device-arm64 | ${R_IOS_DEV} |" | |
| echo "| iOS | sim-arm64 | ${R_IOS_SIM_A64} |" | |
| echo "| iOS | sim-x86_64 | ${R_IOS_SIM_X64} |" | |
| } >> "${GITHUB_STEP_SUMMARY}" | |
| # =========================================================================== | |
| # COLLECT — downloads logs__test__* artifacts from this run, merges them, | |
| # and commits logs/test/ to the repository (main/master only). | |
| # Runs after report so all 29 variant jobs have finished uploading their logs. | |
| # =========================================================================== | |
| collect: | |
| name: Collect and publish test logs | |
| needs: [report] | |
| if: always() | |
| runs-on: ubuntu-24.04 | |
| permissions: | |
| contents: write | |
| steps: | |
| - uses: actions/checkout@v6 | |
| timeout-minutes: 25 | |
| with: | |
| fetch-depth: 0 | |
| - name: Download all test log artifacts | |
| timeout-minutes: 25 | |
| uses: actions/download-artifact@v8 | |
| with: | |
| pattern: logs__test__* | |
| path: _ci_test_logs/ | |
| merge-multiple: false | |
| - name: Merge test log artifacts | |
| timeout-minutes: 25 | |
| shell: bash | |
| run: | | |
| set -euo pipefail | |
| python3 build/ci_merge_logs.py _ci_test_logs merged-test-logs | |
| - name: Upload all-test-logs artifact | |
| timeout-minutes: 25 | |
| uses: actions/upload-artifact@v7 | |
| with: | |
| name: all-test-logs | |
| path: merged-test-logs/ | |
| retention-days: 30 | |
| if-no-files-found: warn | |
| - name: Determine publish target | |
| id: publish_target | |
| timeout-minutes: 25 | |
| shell: bash | |
| run: | | |
| set -euo pipefail | |
| if [ "${{ github.event_name }}" = "pull_request" ]; then | |
| echo "should_publish=false" >> "${GITHUB_OUTPUT}" | |
| echo "publish_state=artifact-only" >> "${GITHUB_OUTPUT}" | |
| echo "reason=pull request runs upload artifacts only" >> "${GITHUB_OUTPUT}" | |
| elif [ "${{ github.ref_name }}" = "main" ] || [ "${{ github.ref_name }}" = "master" ]; then | |
| echo "should_publish=true" >> "${GITHUB_OUTPUT}" | |
| echo "branch=${{ github.ref_name }}" >> "${GITHUB_OUTPUT}" | |
| else | |
| echo "should_publish=false" >> "${GITHUB_OUTPUT}" | |
| echo "publish_state=artifact-only" >> "${GITHUB_OUTPUT}" | |
| echo "reason=workflow runs on branch ${{ github.ref_name }}, so logs were not pushed back to the repository" >> "${GITHUB_OUTPUT}" | |
| fi | |
| - name: Publish test logs to repo branch | |
| id: publish_outputs | |
| timeout-minutes: 25 | |
| if: steps.publish_target.outputs.should_publish == 'true' | |
| continue-on-error: true | |
| shell: bash | |
| run: | | |
| set -euo pipefail | |
| branch="${{ steps.publish_target.outputs.branch }}" | |
| git config user.name "github-actions[bot]" | |
| git config user.email "41898282+github-actions[bot]@users.noreply.github.com" | |
| git fetch origin "${branch}" | |
| git switch -C "${branch}" "origin/${branch}" | |
| # Only replace logs/test/ — do not disturb logs/build/ written by build.yml | |
| rm -rf logs/test | |
| mkdir -p logs/test | |
| if [ -d merged-test-logs/test ]; then | |
| cp -R merged-test-logs/test/. logs/test/ | |
| fi | |
| git add logs/test | |
| if git diff --cached --quiet; then | |
| echo "publish_state=no-changes" >> "${GITHUB_OUTPUT}" | |
| else | |
| git commit -m "CI test logs for run ${{ github.run_id }}" | |
| git push origin HEAD:"${branch}" | |
| echo "publish_state=published" >> "${GITHUB_OUTPUT}" | |
| fi | |
| - name: Write pull instructions | |
| timeout-minutes: 25 | |
| if: always() | |
| shell: bash | |
| run: | | |
| set -euo pipefail | |
| publish_state="${{ steps.publish_target.outputs.publish_state }}" | |
| publish_reason="${{ steps.publish_target.outputs.reason }}" | |
| publish_branch="${{ steps.publish_target.outputs.branch }}" | |
| if [ "${{ steps.publish_target.outputs.should_publish }}" = "true" ]; then | |
| if [ "${{ steps.publish_outputs.outcome }}" = "success" ]; then | |
| publish_state="${{ steps.publish_outputs.outputs.publish_state }}" | |
| elif [ "${{ steps.publish_outputs.outcome }}" = "failure" ]; then | |
| publish_state="publish-failed" | |
| publish_reason="repository push failed; see the collect job log for details" | |
| fi | |
| fi | |
| { | |
| echo "## Test log outputs" | |
| echo | |
| case "${publish_state}" in | |
| published) | |
| echo "Test logs were published to branch: ${publish_branch}" | |
| ;; | |
| no-changes) | |
| echo "Test logs already matched branch: ${publish_branch}" | |
| ;; | |
| publish-failed) | |
| echo "Test logs were uploaded as artifacts, but publication to ${publish_branch} failed." | |
| echo | |
| echo "Reason: ${publish_reason}" | |
| ;; | |
| *) | |
| echo "Test logs were uploaded as artifacts only." | |
| echo | |
| echo "Reason: ${publish_reason}" | |
| ;; | |
| esac | |
| echo | |
| if [ -n "${publish_branch}" ]; then | |
| echo "Commands:" | |
| echo "git fetch origin ${publish_branch}" | |
| echo "git switch ${publish_branch}" | |
| fi | |
| echo | |
| echo "Test logs path: logs/test/<platform>/<variant>/" | |
| echo | |
| echo "Fallback artifact: all-test-logs" | |
| } >> "${GITHUB_STEP_SUMMARY}" | |
| - name: Fail collect job when publish failed | |
| timeout-minutes: 25 | |
| if: ${{ steps.publish_target.outputs.should_publish == 'true' && steps.publish_outputs.outcome == 'failure' }} | |
| shell: bash | |
| run: exit 1 |