-
Notifications
You must be signed in to change notification settings - Fork 95
134 lines (125 loc) · 5.82 KB
/
test.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
# We use `actions-rs` for most of our actions
#
# This file is for the main tests. clippy & rustfmt are separate workflows
on: [push, pull_request]
name: Cargo Test
env:
CARGO_TERM_COLOR: always
# has a history of occasional bugs (especially on old versions)
#
# the ci is free so we might as well use it ;)
CARGO_INCREMENTAL: 0
# Tested versions:
# 1. stable
# 2. nightly
# 3. Minimum Supported Rust Version (MSRV)
jobs:
test:
# Only run on PRs if the source branch is on someone else's repo
if: ${{ github.event_name != 'pull_request' || github.repository != github.event.pull_request.head.repo.full_name }}
runs-on: ubuntu-latest
strategy:
fail-fast: false # Even if one job fails we still want to see the other ones
matrix:
rust:
# Minimum Supported Rust Version: 1.49
#
# This is hardcoded and needs to be in sync with Cargo.toml and the README
#
# Right now we have to explicitly list the combination of features & msrv,
# because some feature combinations are unsupported (currently nested-values).
#
# TODO: Once the MSRV supports all feature combos, add this back
# - << put msrv here >>
# Per the MSRV policy (discussed in Wiki/docs), this places an upper bound on the MSRV
#
# In other words, we can never raise the MSRV past this, and must always support it.
- "stable minus 15 releases"
# Major release 1.56: The first version to support `edition="2021"`
#
# This appears to be the earliest version that `erased-serde` supports,
# so is the earliest one we can enable the 'nested-values' feature.
- 1.56
# A recent version of stable rust that is hardcoded.
#
# This should be kept as up to date as possible.
#
# This is used so that clippy & tests are run on a reliable reference point.
# If clippy has any warnings, this will fail the build (we run with --deny warnings)
- 1.72
# The most recent version of stable rust (automatically updated)
#
# Sometimes, this is exactly the same as the hardcoded right above.
# However sometimes it will be automatically updated to something a little newer.
#
# If there are new clippy lints in the automatic update that aren't
# in the hardcoded versions, they will _NOT_ fail the build.
# This is true even if they are set to deny by default (clippy does this for some 'correctness' lints).
# They will simply be regular warnings.
- stable
- nightly
# NOTE: Features to test must be specified manually. They are applied to all versions separately.
#
# This has the advantage of being more flexibile and thorough
# This has the disadvantage of being more vebrose
#
# Specific feature combos can be overridden per-version with 'include' and 'ecclude'
features:
- ""
- "nested-values"
- "dynamic-keys"
- "nothreads"
- "nested-values dynamic-keys"
- "nested-values dynamic-keys nothreads"
include:
# Minimum Supported Rust Version (1.49) doesn't support nested-values feature
#
# This is because the erased-serde dependency currently requires edition="2021", which was added in Rust 1.56.
# As a workaround, we explicitly include the combinations of features that we want to test on MSRV.
#
# TODO: Go back to testing all features (see above)
- rust: 1.49
features: "" # Default features
- rust: 1.49
features: "dynamic-keys"
- rust: 1.49
features: "nothreads"
- rust: 1.49
features: "nothreads dynamic-keys" # All (supported) features
steps:
- uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@master
with:
toolchain: ${{ matrix.rust }}
components: clippy
- name: Check
# A failing `cargo check` always ends the build
run: |
cargo check --all-targets --verbose --features "${{ matrix.features }}"
# A failing `cargo check` always fails the build
continue-on-error: false
- name: Test
run: |
cargo test --all-targets --verbose --features "${{ matrix.features }}"
# We require tests to succeed on all the feature combinations.
#
# However, we can grant special exceptions for the Minimum Supported Rust Version
# if there is a really good reason (like a dependency that requires a newer version).
continue-on-error: false
- name: Clippy
# With the exception of nightly, we use --deny warnings to treat warnings on errors.
run: |
cargo clippy --all-targets --verbose --features "${{ matrix.features }}" -- --deny "${{ matrix.rust != 'nightly' && 'warnings' || 'clippy::correctness' }}"
# Clippy is required to succeed on hardcoded versions, and may not give any warnings.
#
# However, on automatically updated versions of rust (both stable & nightly) we allow clippy to fail.
# This is in case automatic updates have introduced new lints that would give warnings/errors
# about code that was previously allowed.
#
# This is the main reason that we have a 'hardcoded recent stable' version.
# We want as many lints from recent stable possible
# but don't want the surprises of automatic updates to our stable rust.
#
# Also, include an explicit exception for Rust 1.56.
# We don't want to deal with the fact clippy changed the names of some lints.
continue-on-error: ${{ !contains(matrix.rust, '1.') || matrix.rust == '1.56' }}