-
Notifications
You must be signed in to change notification settings - Fork 0
135 lines (123 loc) · 3.69 KB
/
ci.yml
File metadata and controls
135 lines (123 loc) · 3.69 KB
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
name: CI
on:
push:
branches: [main]
tags: ['v*']
pull_request:
env:
CARGO_TERM_COLOR: always
jobs:
changes:
runs-on: ubuntu-latest
outputs:
code: ${{ steps.filter.outputs.code }}
steps:
- uses: actions/checkout@v4
- uses: dorny/paths-filter@v3
id: filter
with:
filters: |
code:
- '**/*.rs'
- '**/Cargo.toml'
- '**/Cargo.lock'
- 'rust-toolchain.toml'
- '.cargo/config.toml'
- '.github/workflows/ci.yml'
- 'perf.toml'
test:
needs: changes
if: needs.changes.outputs.code == 'true'
strategy:
matrix:
os: [ubuntu-latest, macos-latest]
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@1.91.0
- uses: Swatinem/rust-cache@v2
- run: cargo test --workspace
clippy:
needs: changes
if: needs.changes.outputs.code == 'true'
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@1.91.0
with:
components: clippy
- uses: Swatinem/rust-cache@v2
- run: cargo clippy --workspace --all-targets -- -D warnings
fmt:
needs: changes
if: needs.changes.outputs.code == 'true'
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@1.91.0
with:
components: rustfmt
- run: cargo fmt --check
perf:
needs: changes
if: needs.changes.outputs.code == 'true'
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@1.91.0
- uses: Swatinem/rust-cache@v2
- uses: actions/cache@v4
with:
path: target/criterion
key: perf-${{ runner.os }}-${{ github.sha }}
restore-keys: perf-${{ runner.os }}-
- name: Save baseline
if: github.ref == 'refs/heads/main'
run: cargo bench --bench benchmarks -- --save-baseline ci parse resolve query
- name: Compare against baseline
if: github.event_name == 'pull_request'
run: |
if [ -d target/criterion/ts_parse_file/ci ]; then
cargo bench --bench benchmarks -- --baseline ci parse resolve query
else
echo "::warning::No baseline found — saving one for future comparisons"
cargo bench --bench benchmarks -- --save-baseline ci parse resolve query
fi
# Gate job: always runs, satisfies branch protection.
# Passes if no code changed OR all code checks passed.
build:
needs: [changes, test, clippy, fmt, perf]
if: always()
runs-on: ubuntu-latest
steps:
- name: Check results
run: |
if [ "${{ needs.changes.outputs.code }}" != "true" ]; then
echo "No code changes — skipping checks"
exit 0
fi
if [ "${{ needs.test.result }}" != "success" ]; then
echo "Tests failed"
exit 1
fi
if [ "${{ needs.clippy.result }}" != "success" ]; then
echo "Clippy failed"
exit 1
fi
if [ "${{ needs.fmt.result }}" != "success" ]; then
echo "Formatting failed"
exit 1
fi
if [ "${{ needs.perf.result }}" != "success" ]; then
echo "Perf benchmarks failed"
exit 1
fi
echo "All checks passed"
publish-check:
if: startsWith(github.ref, 'refs/tags/v')
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@1.91.0
- uses: Swatinem/rust-cache@v2
- run: cargo publish --dry-run