@@ -14,26 +14,117 @@ concurrency:
1414 cancel-in-progress : true
1515
1616jobs :
17+ # ---------- Change detection ----------
18+ changes :
19+ name : Detect Changes
20+ runs-on : ubuntu-22.04
21+ permissions :
22+ contents : read
23+ pull-requests : read
24+ outputs :
25+ ci : ${{ steps.filter.outputs.ci }}
26+ rust : ${{ steps.filter.outputs.rust }}
27+ ui : ${{ steps.filter.outputs.ui }}
28+ plugins : ${{ steps.filter.outputs.plugins }}
29+ e2e : ${{ steps.filter.outputs.e2e }}
30+ steps :
31+ - uses : actions/checkout@v5
32+ - uses : dorny/paths-filter@v3
33+ id : filter
34+ with :
35+ filters : |
36+ ci:
37+ - '.github/**'
38+ rust:
39+ - 'crates/**'
40+ - 'apps/**'
41+ - 'sdks/**'
42+ - 'Cargo.toml'
43+ - 'Cargo.lock'
44+ - 'deny.toml'
45+ - 'rust-toolchain.toml'
46+ - 'clippy.toml'
47+ - 'rustfmt.toml'
48+ - '.cargo/config.toml'
49+ ui:
50+ - 'ui/**'
51+ plugins:
52+ - 'plugins/native/**'
53+ e2e:
54+ - 'e2e/**'
55+
56+ # ---------- Sub-workflows ----------
1757 skit :
1858 name : Skit
59+ needs : changes
60+ if : >-
61+ github.event_name == 'workflow_dispatch' ||
62+ needs.changes.outputs.ci == 'true' ||
63+ needs.changes.outputs.rust == 'true' ||
64+ needs.changes.outputs.ui == 'true'
1965 uses : ./.github/workflows/skit.yml
2066
2167 ui :
2268 name : UI
69+ needs : changes
70+ if : >-
71+ github.event_name == 'workflow_dispatch' ||
72+ needs.changes.outputs.ci == 'true' ||
73+ needs.changes.outputs.ui == 'true'
2374 uses : ./.github/workflows/ui.yml
2475
2576 plugins :
2677 name : Plugins
78+ needs : changes
79+ if : >-
80+ github.event_name == 'workflow_dispatch' ||
81+ needs.changes.outputs.ci == 'true' ||
82+ needs.changes.outputs.plugins == 'true' ||
83+ needs.changes.outputs.rust == 'true'
2784 uses : ./.github/workflows/plugins.yml
2885
2986 e2e :
3087 name : E2E
88+ needs : changes
89+ if : >-
90+ github.event_name == 'workflow_dispatch' ||
91+ needs.changes.outputs.ci == 'true' ||
92+ needs.changes.outputs.rust == 'true' ||
93+ needs.changes.outputs.ui == 'true' ||
94+ needs.changes.outputs.e2e == 'true'
3195 uses : ./.github/workflows/e2e.yml
3296
97+ # ---------- Always-run checks ----------
98+ reuse :
99+ name : REUSE Compliance
100+ runs-on : ubuntu-22.04
101+ permissions :
102+ contents : read
103+ steps :
104+ - uses : actions/checkout@v5
105+ - uses : fsfe/reuse-action@v6
106+
107+ # ---------- Gate ----------
33108 all-checks :
34109 name : All Checks Passed
110+ if : always()
35111 runs-on : ubuntu-22.04
36- needs : [skit, ui, plugins, e2e]
112+ needs : [changes, skit, ui, plugins, e2e, reuse ]
37113 steps :
38- - name : All checks passed
39- run : echo "All CI checks passed successfully!"
114+ - name : Verify results
115+ run : |
116+ results=(
117+ "${{ needs.changes.result }}"
118+ "${{ needs.skit.result }}"
119+ "${{ needs.ui.result }}"
120+ "${{ needs.plugins.result }}"
121+ "${{ needs.e2e.result }}"
122+ "${{ needs.reuse.result }}"
123+ )
124+ for r in "${results[@]}"; do
125+ if [[ "$r" == "failure" || "$r" == "cancelled" ]]; then
126+ echo "::error::CI check failed or was cancelled ($r)"
127+ exit 1
128+ fi
129+ done
130+ echo "All checks passed or were appropriately skipped."
0 commit comments