forked from rusqlite/rusqlite
-
Notifications
You must be signed in to change notification settings - Fork 0
283 lines (248 loc) · 10.2 KB
/
main.yml
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
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
name: CI
on:
push:
branches:
- master
pull_request:
branches:
- master
schedule:
- cron: "00 01 * * *"
env:
RUST_BACKTRACE: short
# CI builds don't benefit very much from this.
CARGO_INCREMENTAL: 0
# We can't use a debugger in CI, and this makes builds faster and the cache
# smaller. (TODO: use -Cdebuginfo=0 if it doesn't make backtraces useless)
RUSTFLAGS: -Cdebuginfo=1
permissions:
contents: read
concurrency:
group: ${{ github.ref }}
cancel-in-progress: true
jobs:
test:
name: Test ${{ matrix.target }}
strategy:
fail-fast: false
matrix:
include:
- { target: x86_64-pc-windows-msvc, os: windows-latest }
- { target: x86_64-unknown-linux-gnu, os: ubuntu-latest }
- { target: x86_64-apple-darwin, os: macos-latest }
- target: x86_64-pc-windows-gnu
os: windows-latest
host: -x86_64-pc-windows-gnu
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@v4
# This has a matcher for test panics, so we use it even though elsewhere
# we use actions-rs/toolchain.
- uses: hecrj/setup-rust-action@v2
with:
rust-version: stable${{ matrix.host }}
targets: ${{ matrix.target }}
# The `{ shared-key: ... }` allows different actions to share the cache.
# We're using a `fullBuild` key mostly as a "this needs to do the
# complete" that needs to do the complete build (that is, including
# `--features 'bundled-full session buildtime_bindgen preupdate_hook'`), which is very
# slow, and has several deps.
- uses: Swatinem/rust-cache@v2
with: { shared-key: fullBuild }
- run: cargo build --features bundled --workspace --all-targets --verbose
- run: cargo test --features bundled --workspace --all-targets --verbose
- run: cargo test --features bundled --workspace --doc --verbose
- name: Add llvm path on Windows
if: matrix.os == 'windows-latest'
run: echo "C:\msys64\mingw64\bin" | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append
- run: cargo test --features 'bundled-full session buildtime_bindgen preupdate_hook' --all-targets --workspace --verbose
- run: cargo test --features 'bundled-full session buildtime_bindgen preupdate_hook' --doc --workspace --verbose
- name: loadable extension
run: |
cargo build --example loadable_extension --features "loadable_extension functions trace"
cargo run --example load_extension --features "load_extension bundled functions trace"
- name: macros
run: |
cargo test --package rusqlite-macros
cargo test --features 'bundled rusqlite-macros'
# TODO: move into own action for better caching
- name: Static build
# Do we expect this to work / should we test with gnu toolchain?
if: matrix.os == 'x86_64-pc-windows-msvc'
env:
RUSTFLAGS: -Ctarget-feature=+crt-static -Cdebuginfo=1
run: cargo build --features bundled
test-wasm32-unknown-unknown:
name: Test ${{ matrix.os }} (wasm32-unknown-unknown)
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
os: [ubuntu-latest, macos-latest, windows-latest]
steps:
- uses: actions/checkout@v3
# This has a matcher for test panics, so we use it even though elsewhere
# we use actions-rs/toolchain.
- uses: hecrj/setup-rust-action@v1
with:
rust-version: stable${{ matrix.host }}
targets: ${{ matrix.target }}
- name: Install Homebrew llvm on macOS
if: matrix.os == 'macos-latest'
run: brew install llvm
- name: Add llvm path on Windows
if: matrix.os == 'windows-latest'
run: echo "C:\msys64\mingw64\bin" | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append
- run: npm install -g wasm-pack
- name: Test wasm-pack ${{ matrix.host }}
run: wasm-pack test --node --features bundled
test-sqlcipher-bundled:
name: Test ${{ matrix.os }} (bundled SQLcipher + OpenSSL)
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
os: [ubuntu-latest, macos-latest]
# TODO: find a way to test this on windows :(
steps:
- uses: actions/checkout@v4
# This has a matcher for test panics, so we use it even though elsewhere
# we use actions-rs/toolchain.
- uses: hecrj/setup-rust-action@v2
with:
rust-version: stable${{ matrix.host }}
targets: ${{ matrix.target }}
- uses: Swatinem/rust-cache@v2
with: { shared-key: fullBuild }
- run: cargo test --features 'bundled-sqlcipher' --workspace --all-targets --verbose
- run: cargo test --features 'bundled-sqlcipher' --workspace --doc --verbose
- run: cargo test --features 'modern-full bundled-sqlcipher' --workspace --all-targets --verbose
- run: cargo test --features 'modern-full bundled-sqlcipher' --workspace --doc --verbose
- run: cargo test --features 'bundled-sqlcipher-vendored-openssl' --workspace --all-targets --verbose
- run: cargo test --features 'bundled-sqlcipher-vendored-openssl' --workspace --doc --verbose
- run: cargo test --features 'modern-full bundled-sqlcipher-vendored-openssl' --all-targets --workspace --verbose
- run: cargo test --features 'modern-full bundled-sqlcipher-vendored-openssl' --doc --workspace --verbose
- name: Add llvm path on Windows
if: matrix.os == 'windows-latest'
run: echo "C:\msys64\mingw64\bin" | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append
- run: cargo test --features 'bundled-full session buildtime_bindgen preupdate_hook' --all-targets --workspace --verbose
- run: cargo test --features 'bundled-full session buildtime_bindgen preupdate_hook' --doc --workspace --verbose
sqlcipher:
name: Test with sqlcipher
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: hecrj/setup-rust-action@v2
- uses: Swatinem/rust-cache@v2
- run: sudo apt-get install sqlcipher libsqlcipher-dev
- run: sqlcipher --version
# TODO: Is it worth testing other features?
- run: cargo build --features sqlcipher --workspace --all-targets --verbose
- run: cargo test --features sqlcipher --workspace --all-targets --verbose
sanitizer:
name: Address Sanitizer
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
# Need nightly rust.
- uses: hecrj/setup-rust-action@v2
with:
rust-version: nightly
components: rust-src
- uses: Swatinem/rust-cache@v2
- name: Tests with asan
env:
RUSTFLAGS: -Zsanitizer=address -Cdebuginfo=0
RUSTDOCFLAGS: -Zsanitizer=address
ASAN_OPTIONS: "detect_stack_use_after_return=1:detect_leaks=0"
# Work around https://github.com/rust-lang/rust/issues/59125 by
# disabling backtraces. In an ideal world we'd probably suppress the
# leak sanitization, but we don't care about backtraces here, so long
# as the other tests have them.
RUST_BACKTRACE: "0"
run: cargo -Z build-std test --features 'bundled-full session buildtime_bindgen preupdate_hook with-asan' --target x86_64-unknown-linux-gnu
direct-minimal-versions:
name: Test min versions
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: hecrj/setup-rust-action@v2
with:
rust-version: nightly
- uses: Swatinem/rust-cache@v2
- run: cargo update -Z direct-minimal-versions
- run: cargo test --workspace --all-targets --features bundled-full
# Ensure clippy doesn't complain.
clippy:
name: Clippy
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: hecrj/setup-rust-action@v2
with:
components: clippy
- uses: Swatinem/rust-cache@v2
- run: cargo clippy --all-targets --workspace --features bundled -- -D warnings
# Clippy with all non-conflicting features
- run: cargo clippy --all-targets --workspace --features 'bundled-full session buildtime_bindgen preupdate_hook' -- -D warnings
# Ensure patch is formatted.
fmt:
name: Format
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: hecrj/setup-rust-action@v2
with:
components: rustfmt
- run: cargo fmt --all -- --check
# Detect cases where documentation links don't resolve and such.
doc:
name: Docs
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: hecrj/setup-rust-action@v2
- uses: Swatinem/rust-cache@v2
with: { shared-key: fullBuild }
- run: cargo doc --features 'bundled-full session buildtime_bindgen preupdate_hook' --no-deps
env: { RUSTDOCFLAGS: -Dwarnings }
codecov:
name: Generate code coverage
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@stable
with:
components: "llvm-tools-preview"
- uses: taiki-e/install-action@main
with:
tool: grcov
- name: Run tests for coverage
run: |
cargo test --verbose
cargo test --features="bundled-full" --verbose
cargo test --features="bundled-full session buildtime_bindgen preupdate_hook load_extension" --all --all-targets --verbose
cargo test --features="bundled-sqlcipher-vendored-openssl" --verbose
env:
RUSTFLAGS: -Cinstrument-coverage
RUSTDOCFLAGS: -Cinstrument-coverage
LLVM_PROFILE_FILE: rusqlite-%p-%m.profraw
- name: Produce coverage info
run: |
grcov $(find . -name "rusqlite-*.profraw" -print) \
-s . \
--branch \
--ignore-not-existing \
--ignore='target/*' \
--ignore='benches/*' \
--ignore='/*' \
--binary-path ./target/debug/ \
--excl-line='#\[derive' \
-t lcov \
-o lcov.info
- name: Upload to codecov.io
uses: codecov/codecov-action@v4
with:
files: lcov.info
fail_ci_if_error: true
token: ${{ secrets.CODECOV_TOKEN }}