aboutsummaryrefslogtreecommitdiff
path: root/.github/workflows/ci.yml
blob: 3ca30669c1153990f8d10339a0d26e8908388541 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
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: 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