Repository navigation
161 lines (149 loc) · 5.91 KB
/
Copy pathci.yml
File metadata and controls
161 lines (149 loc) · 5.91 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
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
name: CI
on:
push:
branches: ["main", "master"]
pull_request:
branches: ["main", "master"]
schedule:
# Run nightly to catch upstream breakage early
- cron: "0 3 * * *"
concurrency:
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.sha }}
cancel-in-progress: true
env:
RUSTFLAGS: -Dwarnings
RUST_BACKTRACE: 1
# Edition 2024 requires 1.85; bump here and in Cargo.toml [package.rust-version] together
MSRV: "1.85"
permissions:
contents: read
jobs:
# ── Gate ──────────────────────────────────────────────────────────────────
# All cheap checks must be green before the expensive matrix runs.
ci:
name: CI
if: ${{ always() }}
needs: [fmt, clippy, docs, msrv, test]
runs-on: ubuntu-latest
steps:
- name: Result
run: |
results='${{ toJSON(needs) }}'
if echo "$results" | grep -qv '"result": "success"' | grep -q '"result":'; then
echo "One or more required jobs failed." && exit 1
fi
echo "All required jobs passed."
# ── Formatting ────────────────────────────────────────────────────────────
fmt:
name: fmt
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@stable
with:
components: rustfmt
- name: cargo fmt --check
run: cargo fmt --all -- --check
# ── Clippy ────────────────────────────────────────────────────────────────
clippy:
name: clippy
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@stable
with:
components: clippy
- uses: Swatinem/rust-cache@v2
- name: clippy (no default features)
run: cargo clippy --no-default-features -- -Dclippy::all
- name: clippy (full + serde)
run: cargo clippy --features full,serde -- -Dclippy::all
- name: clippy (all features)
run: cargo clippy --all-features -- -Dclippy::all
# ── Documentation ─────────────────────────────────────────────────────────
docs:
name: docs
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@nightly
- uses: Swatinem/rust-cache@v2
- name: cargo doc
run: cargo doc --no-deps --all-features
env:
RUSTDOCFLAGS: --cfg docsrs -Dwarnings
# ── Minimum Supported Rust Version ────────────────────────────────────────
msrv:
name: msrv (1.85)
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@stable
with:
toolchain: ${{ env.MSRV }}
- uses: Swatinem/rust-cache@v2
- name: cargo check (no default features)
run: cargo check --no-default-features
- name: cargo check (full + serde)
run: cargo check --features full,serde
# ── Tests (no database features) ──────────────────────────────────────────
test:
name: test (${{ matrix.os }} / ${{ matrix.rust }})
needs: [fmt, clippy]
strategy:
fail-fast: false
matrix:
os: [ubuntu-latest, macos-latest, windows-latest]
rust: [stable, beta]
include:
# Run nightly only on Ubuntu to keep the matrix lean
- os: ubuntu-latest
rust: nightly
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@stable
with:
toolchain: ${{ matrix.rust }}
- uses: Swatinem/rust-cache@v2
with:
key: ${{ matrix.os }}-${{ matrix.rust }}
- name: cargo test (no default features)
run: cargo test --no-default-features
- name: cargo test (feature contact)
run: cargo test --features contact
- name: cargo test (feature serde)
run: cargo test --features serde
- name: cargo test (full + serde)
run: cargo test --features full,serde
- name: cargo test --doc
run: cargo test --doc --features full,serde
# ── Minimal dependency versions ───────────────────────────────────────────
minimal-versions:
name: minimal-versions
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@nightly
- uses: Swatinem/rust-cache@v2
- name: Install cargo-minimal-versions and cargo-hack
uses: taiki-e/install-action@v2
with:
tool: cargo-hack,cargo-minimal-versions
- name: cargo minimal-versions check
run: cargo minimal-versions check --features full,serde
# ── Semver compatibility ───────────────────────────────────────────────────
# semver:
# name: semver
# runs-on: ubuntu-latest
# # Only meaningful on pushes to main (not PRs from forks) and when there's
# # a published baseline version to compare against.
# if: github.event_name == 'push'
# steps:
# - uses: actions/checkout@v4
# - name: cargo semver-checks
# uses: obi1kenobi/cargo-semver-checks-action@v2
# with:
# rust-toolchain: stable
# feature-group: only-explicit-features
# features: full,serde