name: fparkan-ci on: push: branches: [devel, main] pull_request: branches: [devel, main] workflow_dispatch: jobs: msrv-backend-neutral: name: MSRV backend-neutral crates runs-on: ubuntu-latest timeout-minutes: 20 env: CARGO_TERM_COLOR: always steps: - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 - uses: dtolnay/rust-toolchain@67ef31d5b988238dd797d409d6f9574278e20537 with: toolchain: 1.87.0 - name: Test backend-neutral crates run: > cargo test -p fparkan-animation -p fparkan-binary -p fparkan-corpus -p fparkan-diagnostics -p fparkan-fx -p fparkan-inspection -p fparkan-material -p fparkan-mission-format -p fparkan-msh -p fparkan-nres -p fparkan-path -p fparkan-platform -p fparkan-prototype -p fparkan-render -p fparkan-resource -p fparkan-rsli -p fparkan-runtime -p fparkan-terrain -p fparkan-terrain-format -p fparkan-texm -p fparkan-vfs -p fparkan-world --all-targets --locked stage0-matrix: name: Stage 0 CI (${{ matrix.os }}) runs-on: ${{ matrix.os }} timeout-minutes: 30 strategy: fail-fast: false matrix: include: - os: macos-15 smoke_platform: macos runner_arch: arm64 moltenvk_version: 1.4.1 vulkan_sdk_version: 1.4.350.1 env: CARGO_TERM_COLOR: always steps: - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 - uses: dtolnay/rust-toolchain@67ef31d5b988238dd797d409d6f9574278e20537 with: toolchain: 1.87.0 components: clippy,rustfmt - name: Provision macOS Vulkan runtime shell: bash run: | set -euo pipefail brew install molten-vk vulkan-loader vulkan-tools vulkan-validationlayers test "$(uname -m)" = "${{ matrix.runner_arch }}" ruby <<'RUBY' require "json" expected = { "molten-vk" => "${{ matrix.moltenvk_version }}", "vulkan-loader" => "${{ matrix.vulkan_sdk_version }}", "vulkan-tools" => "${{ matrix.vulkan_sdk_version }}", "vulkan-validationlayers" => "${{ matrix.vulkan_sdk_version }}", } payload = JSON.parse(`brew info --json=v2 #{expected.keys.join(" ")}`) actual = payload.fetch("formulae").to_h do |formula| [formula.fetch("name"), formula.fetch("versions").fetch("stable")] end mismatches = expected.each_with_object({}) do |(name, version), out| actual_version = actual[name] next if actual_version == version out[name] = { "expected" => version, "actual" => actual_version, } end unless mismatches.empty? warn JSON.pretty_generate(mismatches) abort "unexpected macOS Vulkan formula version" end RUBY HOMEBREW_PREFIX="$(brew --prefix)" VK_ICD_FILENAMES="$HOMEBREW_PREFIX/opt/molten-vk/etc/vulkan/icd.d/MoltenVK_icd.json" VK_LAYER_PATH="$HOMEBREW_PREFIX/opt/vulkan-validationlayers/share/vulkan/explicit_layer.d" DYLD_FALLBACK_LIBRARY_PATH="$HOMEBREW_PREFIX/opt/vulkan-loader/lib:$HOMEBREW_PREFIX/opt/molten-vk/lib" test -f "$VK_ICD_FILENAMES" test -d "$VK_LAYER_PATH" echo "VK_ICD_FILENAMES=$VK_ICD_FILENAMES" >> "$GITHUB_ENV" echo "VK_LAYER_PATH=$VK_LAYER_PATH" >> "$GITHUB_ENV" echo "DYLD_FALLBACK_LIBRARY_PATH=$DYLD_FALLBACK_LIBRARY_PATH" >> "$GITHUB_ENV" - name: Install cargo-deny run: cargo install cargo-deny --version 0.19.9 --locked - name: Verify shader provenance run: cargo xtask shader-provenance - name: Run canonical CI gate run: cargo xtask ci - name: Run native Vulkan smoke run: > cargo run -p fparkan-vulkan-smoke --locked -- --out "target/fparkan/native-smoke/${{ matrix.smoke_platform }}.json" --timeout-seconds 120 - name: Upload acceptance audit if: always() uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 with: name: stage-0-acceptance-${{ matrix.os }} path: target/fparkan/acceptance/stage-0-audit.json if-no-files-found: error - name: Upload native smoke report if: always() uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 with: name: native-smoke-${{ matrix.smoke_platform }} path: target/fparkan/native-smoke/*.json if-no-files-found: error native-smoke-audit: name: Native smoke audit runs-on: ubuntu-latest timeout-minutes: 15 needs: stage0-matrix env: CARGO_TERM_COLOR: always steps: - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 - uses: dtolnay/rust-toolchain@67ef31d5b988238dd797d409d6f9574278e20537 with: toolchain: 1.87.0 - uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 with: pattern: native-smoke-* path: target/fparkan/native-smoke-artifacts merge-multiple: true - name: Aggregate native smoke reports run: > cargo xtask native-smoke audit --dir target/fparkan/native-smoke-artifacts