Skip to content

Test

Test #18

Workflow file for this run

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