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
162
163
164
165
166
167
# Weavegraph CI — runs on push to main and on every pull request.
name: "CI"
# triggers
on: # event hooks
push: # push events
branches:
pull_request: # all PR events
types:
workflow_dispatch: # allow manual runs from the GitHub UI
# build env
env: # build-time defaults
CARGO_TERM_COLOR: "always"
RUST_VERSION: "1.90.0"
# jobs
jobs: # CI pipeline
# ── format ───────────────────────────────────────────────────────────────
fmt: # formatting check
name: cargo fmt
runs-on: ubuntu-24.04
steps: # fmt steps
- uses: "actions/checkout@v4"
- uses: dtolnay/rust-toolchain@stable
with: # fmt toolchain
toolchain: ${{ env.RUST_VERSION }}
components: rustfmt
- uses: "Swatinem/rust-cache@v2"
with: # fmt cache
prefix-key: fmt
- run: cargo fmt --all -- --check
# ───────────────────────────────────────────────────────────────────────
# ── lint ─────────────────────────────────────────────────────────────────
clippy:
name: cargo clippy (${{ matrix.toolchain }})
runs-on: ubuntu-24.04
strategy: # toolchain matrix
fail-fast: false
matrix: # toolchain variants
include:
- toolchain: "1.90.0"
experimental: false
- toolchain: stable
experimental: true
continue-on-error: ${{ matrix.experimental }}
steps: # clippy steps
- uses: "actions/checkout@v4"
- uses: dtolnay/rust-toolchain@stable
with: # clippy toolchain
toolchain: "${{ matrix.toolchain }}"
components: clippy
- uses: "Swatinem/rust-cache@v2"
with: # clippy cache
prefix-key: clippy-${{ matrix.toolchain }}
- run: cargo clippy --workspace --all-targets --all-features -- -D warnings
# ---
# ── test ─────────────────────────────────────────────────────────────────
test:
name: cargo test (${{ matrix.toolchain }})
runs-on: ubuntu-24.04
strategy: # test matrix
fail-fast: false # continue even if one toolchain fails
matrix: # test toolchains
include:
- toolchain: "1.90.0"
experimental: false
- toolchain: stable
experimental: true
continue-on-error: ${{ matrix.experimental }}
steps: # test steps
- uses: "actions/checkout@v4"
- uses: dtolnay/rust-toolchain@stable
with: # test toolchain
toolchain: "${{ matrix.toolchain }}"
- uses: "Swatinem/rust-cache@v2"
with: # test cache
prefix-key: test-${{ matrix.toolchain }}
# postgres feature tests require an external service; run lib-only here
- run: cargo test --lib --all-features
# ── docs ─────────────────────────────────────────────────────────────────
doc:
name: cargo doc
runs-on: ubuntu-24.04
steps: # doc steps
- uses: "actions/checkout@v4"
- uses: dtolnay/rust-toolchain@stable
with: # doc toolchain
toolchain: nightly
- uses: "Swatinem/rust-cache@v2"
with: # doc cache
prefix-key: doc
- name: Build docs — deny rustdoc warnings
env: # rustdoc flags
RUSTDOCFLAGS: "--cfg docsrs -D warnings"
run: cargo +nightly doc --workspace --all-features --no-deps
# ───────────────────────────────────────────────────────────────────────
# ── semver ───────────────────────────────────────────────────────────────
semver-checks:
name: cargo semver-checks
runs-on: ubuntu-24.04
steps: # semver steps
- uses: "actions/checkout@v4"
- uses: dtolnay/rust-toolchain@stable
with: # semver toolchain
toolchain: stable
- uses: taiki-e/install-action@v2
with: # semver install
tool: cargo-semver-checks
- uses: "Swatinem/rust-cache@v2"
with: # semver cache
prefix-key: semver-checks
# semver-checks requires rustc >= 1.91.0; run on stable rather than pinned MSRV
- run: cargo +stable semver-checks check-release --workspace
# ── deny ─────────────────────────────────────────────────────────────────
deny: # license/advisory check
name: "cargo deny"
runs-on: ubuntu-24.04
steps: # deny steps
- uses: "actions/checkout@v4"
- uses: dtolnay/rust-toolchain@stable
with: # deny toolchain
toolchain: ${{ env.RUST_VERSION }}
- uses: "taiki-e/install-action@v2"
with: # deny install
tool: "cargo-deny"
- uses: "Swatinem/rust-cache@v2"
with: # deny cache
prefix-key: "deny"
- run: cargo deny check
# ───────────────────────────────────────────────────────────────────────
# ── machete ──────────────────────────────────────────────────────────────
machete: # unused-dep check
name: "cargo machete"
runs-on: ubuntu-24.04
continue-on-error: true # non-blocking
steps: # machete steps
- uses: "actions/checkout@v4"
- uses: dtolnay/rust-toolchain@stable
with: # machete toolchain
toolchain: ${{ env.RUST_VERSION }}
- uses: "taiki-e/install-action@v2"
with: # machete install
tool: "cargo-machete"
- uses: "Swatinem/rust-cache@v2"
with: # machete cache
prefix-key: "machete"
- run: cargo machete --with-metadata
# ── benchmarks ───────────────────────────────────────────────────────────
benchmarks:
name: benchmark regression
runs-on: ubuntu-24.04
if: github.ref == 'refs/heads/main'
steps: # bench steps
- uses: "actions/checkout@v4"
- uses: dtolnay/rust-toolchain@stable
with: # bench toolchain
toolchain: ${{ env.RUST_VERSION }}
- uses: "Swatinem/rust-cache@v2"
with: # bench cache
prefix-key: bench
- run: cargo bench --workspace
- uses: actions/upload-artifact@v4
with: # artifact upload
name: benchmark-results
path: target/criterion
retention-days: 30