Refactor CI pipelines
Various semi-related changes to the GHA setup to maximize code-reuse and cache effectiveness, as well as introduce rust-toolchain.toml and cargo deny.
This commit is contained in:
parent
c60f48df6d
commit
b216ac63aa
18
.github/actions/cargo-binstall/action.yaml
vendored
Normal file
18
.github/actions/cargo-binstall/action.yaml
vendored
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
name: Install cargo binaries
|
||||||
|
description: Install cargo binaries using cargo-binstall
|
||||||
|
inputs:
|
||||||
|
binstall:
|
||||||
|
description: "Programs to install with binstall"
|
||||||
|
required: true
|
||||||
|
runs:
|
||||||
|
using: "composite"
|
||||||
|
steps:
|
||||||
|
- name: Install cargo-binstall
|
||||||
|
shell: bash
|
||||||
|
run: >
|
||||||
|
curl -L --proto '=https' --tlsv1.3 -sSf https://github.com/cargo-bins/cargo-binstall/releases/latest/download/cargo-binstall-x86_64-unknown-linux-musl.tgz | sudo tar -xzv -C /usr/bin
|
||||||
|
|
||||||
|
- name: Install cargo bins
|
||||||
|
shell: bash
|
||||||
|
run: >
|
||||||
|
cargo-binstall --no-confirm --min-tls-version 1.3 ${{ inputs.binstall }}
|
19
.github/actions/setup-ci/action.yaml
vendored
Normal file
19
.github/actions/setup-ci/action.yaml
vendored
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
name: Setup CI environment
|
||||||
|
inputs:
|
||||||
|
rust-cache-key:
|
||||||
|
description: "An additional cache key that is added alongside the automatic `job`-based cache key and can be used to further differentiate jobs."
|
||||||
|
required: false
|
||||||
|
rust-cache-shared-key:
|
||||||
|
description: "A cache key that is used instead of the automatic `job`-based key, and is stable over multiple jobs."
|
||||||
|
required: false
|
||||||
|
runs:
|
||||||
|
using: "composite"
|
||||||
|
steps:
|
||||||
|
- name: Install rust toolchain
|
||||||
|
shell: bash
|
||||||
|
run: rustup show
|
||||||
|
|
||||||
|
- uses: Swatinem/rust-cache@23bce251a8cd2ffc3c1075eaa2367cf899916d84 # v2
|
||||||
|
with:
|
||||||
|
key: "${{ inputs.rust-cache-key }}"
|
||||||
|
shared-key: "${{ inputs.rust-cache-shared-key }}"
|
12
.github/renovate.json5
vendored
12
.github/renovate.json5
vendored
@ -11,6 +11,18 @@
|
|||||||
enabled: true,
|
enabled: true,
|
||||||
automerge: true
|
automerge: true
|
||||||
},
|
},
|
||||||
|
"customManagers": [
|
||||||
|
{
|
||||||
|
"customType": "regex",
|
||||||
|
"fileMatch": ["^rust-toolchain\\.toml?$"],
|
||||||
|
"matchStrings": [
|
||||||
|
"channel\\s*=\\s*\"(?<currentValue>\\d+\\.\\d+(\\.\\d+)?)\""
|
||||||
|
],
|
||||||
|
"depNameTemplate": "rust",
|
||||||
|
"packageNameTemplate": "rust-lang/rust",
|
||||||
|
"datasourceTemplate": "github-releases"
|
||||||
|
},
|
||||||
|
],
|
||||||
packageRules: [
|
packageRules: [
|
||||||
{
|
{
|
||||||
matchCategories: ["rust"],
|
matchCategories: ["rust"],
|
||||||
|
104
.github/workflows/ci.yml
vendored
Normal file
104
.github/workflows/ci.yml
vendored
Normal file
@ -0,0 +1,104 @@
|
|||||||
|
name: CI tests
|
||||||
|
on: [push]
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
populate-rust-cache:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4
|
||||||
|
- uses: ./.github/actions/setup-ci
|
||||||
|
with:
|
||||||
|
rust-cache-shared-key: "base"
|
||||||
|
- run: cargo check --all-targets --all-features
|
||||||
|
continue-on-error: true
|
||||||
|
|
||||||
|
rust-jobs:
|
||||||
|
name: ${{ matrix.job }}
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
needs: populate-rust-cache
|
||||||
|
strategy:
|
||||||
|
matrix:
|
||||||
|
job:
|
||||||
|
- cargo fmt --all -- --check
|
||||||
|
- cargo test
|
||||||
|
- cargo clippy -- -D warnings
|
||||||
|
fail-fast: false
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4
|
||||||
|
- uses: ./.github/actions/setup-ci
|
||||||
|
with:
|
||||||
|
rust-cache-shared-key: "base"
|
||||||
|
- run: ${{ matrix.job }}
|
||||||
|
|
||||||
|
deny:
|
||||||
|
name: ${{ matrix.job }}
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
strategy:
|
||||||
|
matrix:
|
||||||
|
job:
|
||||||
|
- cargo deny --all-features check advisories
|
||||||
|
- cargo deny --all-features check bans licenses sources
|
||||||
|
fail-fast: false
|
||||||
|
# Prevent sudden announcement of a new advisory from failing CI:
|
||||||
|
continue-on-error: ${{ endsWith(matrix.job, 'check advisories') }}
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4
|
||||||
|
- uses: ./.github/actions/cargo-binstall
|
||||||
|
with:
|
||||||
|
binstall: "cargo-deny"
|
||||||
|
- run: ${{ matrix.job }}
|
||||||
|
|
||||||
|
pre-commit:
|
||||||
|
name: Run pre-commit
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
needs: populate-rust-cache
|
||||||
|
env:
|
||||||
|
# These hooks are expensive and already run as dedicated jobs above
|
||||||
|
SKIP: "tests,clippy"
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4
|
||||||
|
|
||||||
|
- uses: ./.github/actions/setup-ci
|
||||||
|
with:
|
||||||
|
rust-cache-shared-key: "base"
|
||||||
|
|
||||||
|
- uses: actions/setup-python@82c7e631bb3cdc910f68e0081d67478d79c6982d # v5
|
||||||
|
- name: set PYVERSION
|
||||||
|
run: echo "PYVERSION=$(python --version | tr ' ' '-')" >> $GITHUB_ENV
|
||||||
|
|
||||||
|
- uses: actions/cache@0c45773b623bea8c8e75f6c82b208c3cf94ea4f9 # v4
|
||||||
|
with:
|
||||||
|
path: ~/.cache/pre-commit
|
||||||
|
# Changes to pre-commit-config.yaml may require the installation of
|
||||||
|
# new binaries/scripts. When a cache hit occurs, changes to the cache
|
||||||
|
# aren't persisted at the end of the run, so making the key dependent
|
||||||
|
# on the configuration file ensures we always persist a complete cache.
|
||||||
|
key: pre-commit-${{ env.PYVERSION }}-${{ hashFiles('.pre-commit-config.yaml') }}
|
||||||
|
|
||||||
|
- run: pip install pre-commit
|
||||||
|
- run: pre-commit run --all --color=always --show-diff-on-failure
|
||||||
|
|
||||||
|
test-windows:
|
||||||
|
name: Test on Windows
|
||||||
|
runs-on: windows-latest
|
||||||
|
steps:
|
||||||
|
- run: git config --system core.autocrlf false && git config --system core.eol lf
|
||||||
|
- uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4
|
||||||
|
- uses: ./.github/actions/setup-ci
|
||||||
|
- run: cargo test
|
||||||
|
|
||||||
|
coverage:
|
||||||
|
name: Code coverage
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
needs: populate-rust-cache
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4
|
||||||
|
- uses: ./.github/actions/setup-ci
|
||||||
|
- uses: ./.github/actions/cargo-binstall
|
||||||
|
with:
|
||||||
|
binstall: "cargo-tarpaulin"
|
||||||
|
- run: cargo tarpaulin --out Html
|
||||||
|
- uses: actions/upload-artifact@65462800fd760344b1a7b4382951275a0abb4808 # v4
|
||||||
|
with:
|
||||||
|
name: tarpaulin-report
|
||||||
|
path: tarpaulin-report.html
|
184
.github/workflows/test.yml
vendored
184
.github/workflows/test.yml
vendored
@ -1,184 +0,0 @@
|
|||||||
name: CI tests
|
|
||||||
on: [push, pull_request]
|
|
||||||
|
|
||||||
env:
|
|
||||||
SCCACHE_GHA_ENABLED: "true"
|
|
||||||
RUSTC_WRAPPER: "sccache"
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
build:
|
|
||||||
name: Build project
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
outputs:
|
|
||||||
rustc_cache_key: ${{ steps.setup_rust.outputs.cachekey }}
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4
|
|
||||||
- uses: dtolnay/rust-toolchain@stable
|
|
||||||
id: setup_rust
|
|
||||||
with:
|
|
||||||
components: "rustfmt, clippy"
|
|
||||||
- uses: actions/cache@0c45773b623bea8c8e75f6c82b208c3cf94ea4f9 # v4
|
|
||||||
with:
|
|
||||||
path: |
|
|
||||||
~/.cargo/bin/
|
|
||||||
~/.cargo/registry/index/
|
|
||||||
~/.cargo/registry/cache/
|
|
||||||
~/.cargo/git/db/
|
|
||||||
target/
|
|
||||||
key: "cargo-base-${{ steps.setup_rust.outputs.cachekey }}-${{ hashFiles('**/Cargo.lock') }}"
|
|
||||||
restore-keys: |
|
|
||||||
cargo-base-${{ env.RUSTC_CACHEKEY }}
|
|
||||||
- name: Run sccache-cache
|
|
||||||
uses: mozilla-actions/sccache-action@89e9040de88b577a072e3760aaf59f585da083af # v0.0.5
|
|
||||||
- run: cargo build --locked --all-targets
|
|
||||||
|
|
||||||
lint:
|
|
||||||
name: Run lints
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
needs: build
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4
|
|
||||||
- uses: actions/cache@0c45773b623bea8c8e75f6c82b208c3cf94ea4f9 # v4
|
|
||||||
with:
|
|
||||||
path: |
|
|
||||||
~/.cargo/bin/
|
|
||||||
~/.cargo/registry/index/
|
|
||||||
~/.cargo/registry/cache/
|
|
||||||
~/.cargo/git/db/
|
|
||||||
target/
|
|
||||||
key: "cargo-lint-${{ needs.build.outputs.rustc_cache_key }}-${{ hashFiles('**/Cargo.lock') }}"
|
|
||||||
restore-keys: |
|
|
||||||
cargo-lint-${{ env.RUSTC_CACHEKEY }}
|
|
||||||
cargo-base-${{ env.RUSTC_CACHEKEY }}
|
|
||||||
fail-on-cache-miss: true
|
|
||||||
- name: Run sccache-cache
|
|
||||||
uses: mozilla-actions/sccache-action@89e9040de88b577a072e3760aaf59f585da083af # v0.0.5
|
|
||||||
|
|
||||||
- run: cargo fmt --all -- --check
|
|
||||||
- run: cargo check
|
|
||||||
- run: cargo clippy -- -D warnings
|
|
||||||
|
|
||||||
|
|
||||||
pre-commit:
|
|
||||||
name: Run pre-commit
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
needs: build
|
|
||||||
env:
|
|
||||||
# These hooks are expensive and already run as dedicated jobs above
|
|
||||||
SKIP: "tests,clippy"
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4
|
|
||||||
- uses: actions/cache@0c45773b623bea8c8e75f6c82b208c3cf94ea4f9 # v4
|
|
||||||
with:
|
|
||||||
path: |
|
|
||||||
~/.cargo/bin/
|
|
||||||
~/.cargo/registry/index/
|
|
||||||
~/.cargo/registry/cache/
|
|
||||||
~/.cargo/git/db/
|
|
||||||
target/
|
|
||||||
key: "cargo-lint-${{ needs.build.outputs.rustc_cache_key }}-${{ hashFiles('**/Cargo.lock') }}"
|
|
||||||
restore-keys: |
|
|
||||||
cargo-lint-${{ env.RUSTC_CACHEKEY }}
|
|
||||||
cargo-base-${{ env.RUSTC_CACHEKEY }}
|
|
||||||
fail-on-cache-miss: true
|
|
||||||
- name: Run sccache-cache
|
|
||||||
uses: mozilla-actions/sccache-action@89e9040de88b577a072e3760aaf59f585da083af # v0.0.5
|
|
||||||
|
|
||||||
- uses: actions/setup-python@82c7e631bb3cdc910f68e0081d67478d79c6982d # v5
|
|
||||||
- name: set PYVERSION
|
|
||||||
run: echo "PYVERSION=$(python --version | tr ' ' '-')" >> $GITHUB_ENV
|
|
||||||
- uses: actions/cache@0c45773b623bea8c8e75f6c82b208c3cf94ea4f9 # v4
|
|
||||||
with:
|
|
||||||
path: ~/.cache/pre-commit
|
|
||||||
# Changes to pre-commit-config.yaml may require the installation of
|
|
||||||
# new binaries/scripts. When a cache hit occurs, changes to the cache
|
|
||||||
# aren't persisted at the end of the run, so making the key dependent
|
|
||||||
# on the configuration file ensures we always persist a complete cache.
|
|
||||||
key: pre-commit-${{ env.PYVERSION }}-${{ hashFiles('.pre-commit-config.yaml') }}
|
|
||||||
|
|
||||||
- run: pip install pre-commit
|
|
||||||
- run: pre-commit run --all --color=always --show-diff-on-failure
|
|
||||||
|
|
||||||
test-linux:
|
|
||||||
name: Test on Linux
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
needs: build
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4
|
|
||||||
- uses: actions/cache@0c45773b623bea8c8e75f6c82b208c3cf94ea4f9 # v4
|
|
||||||
with:
|
|
||||||
path: |
|
|
||||||
~/.cargo/bin/
|
|
||||||
~/.cargo/registry/index/
|
|
||||||
~/.cargo/registry/cache/
|
|
||||||
~/.cargo/git/db/
|
|
||||||
target/
|
|
||||||
key: "cargo-test-${{ needs.build.outputs.rustc_cache_key }}-${{ hashFiles('**/Cargo.lock') }}"
|
|
||||||
restore-keys: |
|
|
||||||
cargo-test-${{ env.RUSTC_CACHEKEY }}
|
|
||||||
cargo-base-${{ env.RUSTC_CACHEKEY }}
|
|
||||||
fail-on-cache-miss: true
|
|
||||||
- name: Run sccache-cache
|
|
||||||
uses: mozilla-actions/sccache-action@89e9040de88b577a072e3760aaf59f585da083af # v0.0.5
|
|
||||||
|
|
||||||
- run: cargo test
|
|
||||||
|
|
||||||
test-windows:
|
|
||||||
name: Test on Windows
|
|
||||||
runs-on: windows-latest
|
|
||||||
needs: build
|
|
||||||
steps:
|
|
||||||
- run: git config --system core.autocrlf false && git config --system core.eol lf
|
|
||||||
- uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4
|
|
||||||
- uses: dtolnay/rust-toolchain@stable
|
|
||||||
id: setup_rust
|
|
||||||
- uses: actions/cache@0c45773b623bea8c8e75f6c82b208c3cf94ea4f9 # v4
|
|
||||||
with:
|
|
||||||
path: |
|
|
||||||
~/.cargo/bin/
|
|
||||||
~/.cargo/registry/index/
|
|
||||||
~/.cargo/registry/cache/
|
|
||||||
~/.cargo/git/db/
|
|
||||||
target/
|
|
||||||
key: "cargo-windows-${{ needs.build.outputs.rustc_cache_key }}-${{ hashFiles('**/Cargo.lock') }}"
|
|
||||||
restore-keys: |
|
|
||||||
cargo-windows-${{ env.RUSTC_CACHEKEY }}
|
|
||||||
cargo-base-${{ env.RUSTC_CACHEKEY }}
|
|
||||||
fail-on-cache-miss: true
|
|
||||||
- name: Run sccache-cache
|
|
||||||
uses: mozilla-actions/sccache-action@89e9040de88b577a072e3760aaf59f585da083af # v0.0.5
|
|
||||||
|
|
||||||
- run: cargo test
|
|
||||||
|
|
||||||
coverage:
|
|
||||||
name: Code coverage
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
needs: build
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4
|
|
||||||
- uses: actions/cache@0c45773b623bea8c8e75f6c82b208c3cf94ea4f9 # v4
|
|
||||||
with:
|
|
||||||
path: |
|
|
||||||
~/.cargo/bin/
|
|
||||||
~/.cargo/registry/index/
|
|
||||||
~/.cargo/registry/cache/
|
|
||||||
~/.cargo/git/db/
|
|
||||||
target/
|
|
||||||
key: "cargo-coverage-${{ needs.build.outputs.rustc_cache_key }}-${{ hashFiles('**/Cargo.lock') }}"
|
|
||||||
restore-keys: |
|
|
||||||
cargo-coverage-${{ env.RUSTC_CACHEKEY }}
|
|
||||||
cargo-base-${{ env.RUSTC_CACHEKEY }}
|
|
||||||
fail-on-cache-miss: true
|
|
||||||
- name: Run sccache-cache
|
|
||||||
uses: mozilla-actions/sccache-action@89e9040de88b577a072e3760aaf59f585da083af # v0.0.5
|
|
||||||
|
|
||||||
- uses: actions-rs/tarpaulin@044a1e5bdace8dd2f727b1af63c1d9a1d3572068 # v0.1
|
|
||||||
with:
|
|
||||||
# Constrained by https://github.com/actions-rs/tarpaulin/pull/23
|
|
||||||
version: "0.22.0"
|
|
||||||
args: "--ignore-tests"
|
|
||||||
out-type: "Html"
|
|
||||||
- uses: actions/upload-artifact@65462800fd760344b1a7b4382951275a0abb4808 # v4
|
|
||||||
with:
|
|
||||||
name: tarpaulin-report
|
|
||||||
path: tarpaulin-report.html
|
|
73
deny.toml
Normal file
73
deny.toml
Normal file
@ -0,0 +1,73 @@
|
|||||||
|
[output]
|
||||||
|
# When outputting inclusion graphs in diagnostics that include features, this
|
||||||
|
# option can be used to specify the depth at which feature edges will be added.
|
||||||
|
# This option is included since the graphs can be quite large and the addition
|
||||||
|
# of features from the crate(s) to all of the graph roots can be far too verbose.
|
||||||
|
# This option can be overridden via `--feature-depth` on the cmd line
|
||||||
|
feature-depth = 1
|
||||||
|
|
||||||
|
[advisories]
|
||||||
|
# Opt-in to new config format - https://github.com/EmbarkStudios/cargo-deny/pull/611
|
||||||
|
version = 2
|
||||||
|
|
||||||
|
# The path where the advisory databases are cloned/fetched into
|
||||||
|
db-path = "$CARGO_HOME/advisory-dbs"
|
||||||
|
# The url(s) of the advisory databases to use
|
||||||
|
db-urls = ["https://github.com/rustsec/advisory-db"]
|
||||||
|
# A list of advisory IDs to ignore. Note that ignored advisories will still
|
||||||
|
# output a note when they are encountered.
|
||||||
|
ignore = []
|
||||||
|
|
||||||
|
[licenses]
|
||||||
|
# Opt-in to new config format - https://github.com/EmbarkStudios/cargo-deny/pull/611
|
||||||
|
version = 2
|
||||||
|
|
||||||
|
# Licenses we accept, identified by their SPDX short identifier (+ optional
|
||||||
|
# exception) from https://spdx.org/licenses/
|
||||||
|
allow = [
|
||||||
|
"Apache-2.0",
|
||||||
|
"BSD-2-Clause",
|
||||||
|
"BSD-2-Clause-Patent",
|
||||||
|
"BSD-3-Clause",
|
||||||
|
"MIT",
|
||||||
|
"MPL-2.0",
|
||||||
|
]
|
||||||
|
unused-allowed-license = "allow"
|
||||||
|
exceptions = [
|
||||||
|
{ allow = ["Unicode-DFS-2016"], crate = "unicode-ident" },
|
||||||
|
]
|
||||||
|
# Default confidence is 0.8, let's require a higher confidence level for now.
|
||||||
|
# We can lower this later if it's too pedantic.
|
||||||
|
confidence-threshold = 0.95
|
||||||
|
|
||||||
|
[bans]
|
||||||
|
# Lint level for when multiple versions of the same crate are detected. Deny
|
||||||
|
# for now to make this super obvious, though we might wish to change this back
|
||||||
|
# to the default of warn if that gets too disruptive.
|
||||||
|
#
|
||||||
|
# Background reading about the use of this check is at:
|
||||||
|
# https://embarkstudios.github.io/cargo-deny/checks/bans/index.html#use-case---duplicate-version-detection
|
||||||
|
multiple-versions = "deny"
|
||||||
|
skip = [
|
||||||
|
# When encountering multiple versions of crates that we wish to tolerate,
|
||||||
|
# specify a `<=1.2.3` for the OLDEST version in use. That way, as soon as
|
||||||
|
# whichever dependency holding us back is updated, one of two things can
|
||||||
|
# happen:
|
||||||
|
#
|
||||||
|
# 1. The dependency is updated to a version that is compatible with the
|
||||||
|
# other dependencies, resolving the duplication. At this point a WARNING
|
||||||
|
# will be generated that the `<=1.2.3` version no longer matches anything.
|
||||||
|
# 2. The dependency is updated to a version that is still not compatible
|
||||||
|
# with the other dependencies, at which point the ban action will FAIL the
|
||||||
|
# result. We can then choose to again skip that version, or decide more
|
||||||
|
# drastic action is needed.
|
||||||
|
"syn:<=1.0.109",
|
||||||
|
]
|
||||||
|
wildcards = "deny"
|
||||||
|
allow-wildcard-paths = false
|
||||||
|
|
||||||
|
[sources]
|
||||||
|
unknown-registry = "deny"
|
||||||
|
unknown-git = "deny"
|
||||||
|
allow-registry = ["https://github.com/rust-lang/crates.io-index"]
|
||||||
|
allow-git = []
|
3
rust-toolchain.toml
Normal file
3
rust-toolchain.toml
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
[toolchain]
|
||||||
|
channel = "1.79.0"
|
||||||
|
profile = "default"
|
Loading…
Reference in New Issue
Block a user