-
-
Notifications
You must be signed in to change notification settings - Fork 100
239 lines (225 loc) · 8.61 KB
/
ci.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
on:
push:
branches: [main, auto, canary]
pull_request:
branches:
- main
name: CI
env:
RUSTFLAGS: -D warnings
CARGO_TERM_COLOR: always
jobs:
lint:
name: Lint
runs-on: ${{ matrix.os }}
strategy:
matrix:
os:
- ubuntu-latest
- windows-latest
steps:
- uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4
- uses: dtolnay/rust-toolchain@stable
with:
components: rustfmt, clippy
- uses: Swatinem/rust-cache@23bce251a8cd2ffc3c1075eaa2367cf899916d84 # v2
- name: Lint (clippy)
run: cargo clippy --all-features --all-targets
- name: Lint (rustfmt)
run: cargo xfmt --check
- name: Install cargo readme
uses: taiki-e/install-action@58a3efb22c892c0e7d722787ab604b97b62ac694 # v2
with:
tool: cargo-readme
- name: Run cargo readme
run: ./scripts/regenerate-readmes.sh
- name: Check for differences
run: git diff --exit-code
build-rustdoc:
name: Build documentation
runs-on: ${{ matrix.os }}
strategy:
matrix:
os: [ubuntu-latest]
fail-fast: false
steps:
- uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4
- uses: dtolnay/rust-toolchain@stable
with:
components: rustfmt, clippy
- uses: Swatinem/rust-cache@23bce251a8cd2ffc3c1075eaa2367cf899916d84 # v2
- name: Build rustdoc
run: cargo doc --all-features --workspace
build:
name: Build and test
runs-on: ${{ matrix.os }}
strategy:
matrix:
os:
- ubuntu-latest
# macos-14 for M1 runners
- macos-14
- windows-latest
# 1.75 is the MSRV
rust-version: ["1.75", stable]
fail-fast: false
steps:
- uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4
- uses: dtolnay/rust-toolchain@master
with:
toolchain: ${{ matrix.rust-version }}
- uses: Swatinem/rust-cache@23bce251a8cd2ffc3c1075eaa2367cf899916d84 # v2
with:
# Matrix instances (other than OS) need to be added to this explicitly
key: ${{ matrix.rust-version }}
- name: Install latest nextest release
uses: taiki-e/install-action@nextest
- name: Build nextest-metadata
run: cargo build --package nextest-metadata
- name: Build cargo-nextest without self-update
run: cargo build --package cargo-nextest --no-default-features --features default-no-update
- name: Build cargo-nextest
run: cargo build --package cargo-nextest
- name: Build all targets
run: cargo build --all-targets
- name: Build all targets with all features
run: cargo build --all-targets --all-features
- name: Doctests
run: cargo test --doc
- name: Test with locally built nextest
run: cargo local-nt run --profile ci
- name: Upload results
# Run this step even if the test step ahead fails
if: "!cancelled()"
uses: trunk-io/analytics-uploader@main
with:
# Path to your test results.
junit-paths: target/nextest/ci/junit.xml
# Provide your Trunk organization slug.
org-slug: nextest-rs
# Provide your Trunk API token as a GitHub secret.
token: ${{ secrets.TRUNK_API_TOKEN }}
continue-on-error: true
- name: Test with latest nextest release
run: cargo nextest run --profile ci
- name: Test without double-spawning
if: ${{ matrix.os == 'ubuntu-latest' || matrix.os == 'macos-14' }}
env:
NEXTEST_DOUBLE_SPAWN: 0
run: cargo local-nt run --profile ci
- name: Test without rustup wrappers
env:
CARGO_NEXTEST: target/debug/cargo-nextest
RUSTUP_AVAILABLE: 1
shell: bash
run: ./scripts/nextest-without-rustup.sh run --profile ci
- name: Upload nextest binary
uses: actions/upload-artifact@50769540e7f4bd5e21e526ee35c689e35e0d6874 # v4.4.0
with:
name: cargo-nextest-${{ matrix.os }}-${{ matrix.rust-version }}
path: |
target/debug/cargo-nextest
target/debug/cargo-nextest.exe
if-no-files-found: error
test-archive-target-runner:
name: Test archives with a target runner
# gcc-mingw-w64-x86-64-win32 requires Ubuntu 22.04
runs-on: ubuntu-22.04
steps:
- uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4
- name: Install Rust toolchain
uses: dtolnay/rust-toolchain@stable
with:
toolchain: stable
targets: x86_64-pc-windows-gnu
- uses: Swatinem/rust-cache@23bce251a8cd2ffc3c1075eaa2367cf899916d84 # v2
# The version of wine that comes with Ubuntu 22.04 is too old: it doesn't contain
# bcryptprimitives.dll, which is required to run binaries built with Rust 1.78+. We use the
# WineHQ PPA to get a newer version.
- name: Add Wine PPA
run: |
sudo dpkg --add-architecture i386
wget -nc https://dl.winehq.org/wine-builds/winehq.key
sudo apt-key add winehq.key
sudo add-apt-repository 'deb https://dl.winehq.org/wine-builds/ubuntu/ jammy main'
- name: Install wine and gcc-mingw-w64-x86-64-win32
run: |
sudo apt-get update
sudo apt-get install winehq-stable gcc-mingw-w64-x86-64-win32
- name: Build cargo-nextest
run: cargo build --package cargo-nextest
- name: Archive test fixtures
env:
CARGO_NEXTEST: target/debug/cargo-nextest
RUSTUP_AVAILABLE: 1
run: |
./scripts/nextest-without-rustup.sh archive --manifest-path fixtures/nextest-tests/Cargo.toml \
--target x86_64-pc-windows-gnu --archive-file target/fixture-archive.tar.zst \
--package cdylib-example --package nextest-derive
# This ensures that for target binaries, we always use the libdir in the archive, never the
# one installed by rustup.
- name: Remove x86_64-pc-windows-gnu target from rustup
run: rustup target remove x86_64-pc-windows-gnu
- name: Run test fixtures
env:
CARGO_TARGET_X86_64_PC_WINDOWS_GNU_RUNNER: wine
run: cargo local-nt run --archive-file target/fixture-archive.tar.zst
# Completely uninstall rustup -- this is similar to running an archive on a machine without
# cargo.
- name: Uninstall rustup
run: rustup self uninstall -y
- name: Run test fixtures without rustup wrappers
env:
CARGO_TARGET_X86_64_PC_WINDOWS_GNU_RUNNER: wine
CARGO_NEXTEST: target/debug/cargo-nextest
run: ./scripts/nextest-without-rustup.sh run --archive-file target/fixture-archive.tar.zst
# Upload the archive for use in the next job.
- name: Upload archive
uses: actions/upload-artifact@50769540e7f4bd5e21e526ee35c689e35e0d6874 # v4.4.0
with:
name: fixture-archive
path: target/fixture-archive.tar.zst
if-no-files-found: error
test-archive-runner-dest:
name: Test archives with a runner (destination)
strategy:
matrix:
os:
- ubuntu-latest
- windows-latest
runs-on: ${{ matrix.os }}
needs:
- test-archive-target-runner
- build
steps:
- uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4
- name: Download nextest binary
uses: actions/download-artifact@fa0a91b85d4f404e444e00e005971372dc801d16 # v4.1.8
with:
name: cargo-nextest-${{ matrix.os }}-stable
path: nextest-bin
- name: Download archive
uses: actions/download-artifact@fa0a91b85d4f404e444e00e005971372dc801d16 # v4.1.8
with:
name: fixture-archive
path: fixture-archive
- name: Run test fixtures (host)
if: ${{ matrix.os == 'ubuntu-latest' }}
env:
CARGO_NEXTEST: nextest-bin/cargo-nextest
run: |
chmod +x $CARGO_NEXTEST
./scripts/nextest-without-rustup.sh run \
--archive-file fixture-archive/fixture-archive.tar.zst \
--workspace-remap $GITHUB_WORKSPACE/fixtures/nextest-tests \
-E 'platform(host)'
- name: Run test fixtures (target)
if: ${{ matrix.os == 'windows-latest' }}
shell: bash
env:
CARGO_NEXTEST: nextest-bin/cargo-nextest.exe
run: |
./scripts/nextest-without-rustup.sh run \
--archive-file fixture-archive/fixture-archive.tar.zst \
--workspace-remap $GITHUB_WORKSPACE/fixtures/nextest-tests \
-E 'platform(target)'