CI #213
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
name: CI | |
on: | |
workflow_dispatch: | |
pull_request: | |
push: | |
branches: main | |
schedule: | |
- cron: "0 18 * * 1,4,6" # 1800 UTC every Monday, Thursday, Saturday | |
jobs: | |
tests: | |
name: Unit tests | |
runs-on: ${{ matrix.os }} | |
strategy: | |
fail-fast: false | |
matrix: | |
os: [windows-latest, macos-latest, ubuntu-latest] | |
rust_version: [stable, 1.77.0] | |
steps: | |
- name: Checkout repository | |
uses: actions/checkout@v3 | |
- name: Install Rust toolchain | |
uses: dtolnay/rust-toolchain@master | |
with: | |
toolchain: ${{ matrix.rust_version }} | |
components: llvm-tools-preview | |
- name: Cache Rust dependencies | |
uses: Swatinem/rust-cache@v2 | |
- name: Install cargo-llvm-cov | |
uses: taiki-e/install-action@cargo-llvm-cov | |
- name: Generate code coverage | |
run: cargo llvm-cov --all-features --lcov --ignore-filename-regex tests --output-path lcov.info | |
- name: Upload code coverage results | |
uses: codecov/codecov-action@v3 | |
with: | |
token: ${{ secrets.CODECOV_TOKEN }} | |
fail_ci_if_error: true | |
verbose: true | |
tests-cross: | |
name: Unit tests | |
runs-on: ubuntu-latest | |
strategy: | |
fail-fast: false | |
matrix: | |
target: [aarch64-unknown-linux-gnu] | |
rust_version: [stable, 1.77.0] | |
steps: | |
- name: Checkout repository | |
uses: actions/checkout@v3 | |
- name: Install Rust toolchain | |
uses: dtolnay/rust-toolchain@master | |
with: | |
toolchain: ${{ matrix.rust_version }} | |
targets: ${{ matrix.target }} | |
- name: Install cross-compilation toolset | |
run: cargo install cross | |
- name: Cache Rust dependencies | |
uses: Swatinem/rust-cache@v2 | |
# Note that we do not run code coverage because | |
# it isn't readily accessible from cross-compilation | |
# environment. (A PR to fix this would be welcomed!) | |
- name: Run unit tests (cross build) | |
run: cross test --all-targets --all-features --target ${{ matrix.target }} | |
test-default-disabled: | |
name: Unit tests with default features disabled | |
runs-on: ${{ matrix.os }} | |
strategy: | |
fail-fast: false | |
matrix: | |
os: [windows-latest, macos-latest, ubuntu-latest] | |
steps: | |
- name: Checkout repository | |
uses: actions/checkout@v3 | |
- name: Install Rust toolchain | |
uses: dtolnay/rust-toolchain@stable | |
- name: Cache Rust dependencies | |
uses: Swatinem/rust-cache@v2 | |
- name: Run tests | |
run: cargo test --all-targets --no-default-features | |
test-direct-minimal-versions: | |
name: Unit tests with minimum versions of direct dependencies | |
runs-on: ${{ matrix.os }} | |
strategy: | |
fail-fast: false | |
matrix: | |
os: [windows-latest, macos-latest, ubuntu-latest] | |
steps: | |
- name: Checkout repository | |
uses: actions/checkout@v3 | |
- name: Install Rust toolchain | |
uses: dtolnay/rust-toolchain@nightly | |
with: | |
components: llvm-tools-preview | |
- name: Cache Rust dependencies | |
uses: Swatinem/rust-cache@v2 | |
- name: Run tests | |
run: cargo +nightly test -Z direct-minimal-versions --all-targets --all-features | |
# publish-preflight: | |
# name: Preflight crate publish | |
# runs-on: ${{ matrix.os }} | |
# strategy: | |
# fail-fast: false | |
# matrix: | |
# os: [ubuntu-latest] | |
# rust_version: [stable] | |
# steps: | |
# - name: Checkout repository | |
# uses: actions/checkout@v3 | |
# - name: Install Rust toolchain | |
# uses: dtolnay/rust-toolchain@master | |
# with: | |
# toolchain: ${{ matrix.rust_version }} | |
# components: llvm-tools-preview | |
# - name: Cache Rust dependencies | |
# uses: Swatinem/rust-cache@v2 | |
# - name: Dry-run of crate publish | |
# run: cargo publish --no-verify -p cawg-identity-core --dry-run | |
clippy_check: | |
name: Clippy | |
runs-on: ubuntu-latest | |
steps: | |
- name: Checkout repository | |
uses: actions/checkout@v3 | |
- name: Install Rust toolchain | |
uses: dtolnay/rust-toolchain@stable | |
- name: Install clippy | |
run: rustup component add clippy | |
- name: Cache Rust dependencies | |
uses: Swatinem/rust-cache@v2 | |
- name: Cargo clippy | |
uses: actions-rs/clippy-check@v1 | |
with: | |
token: ${{ secrets.GITHUB_TOKEN }} | |
args: --all-features --all-targets -- -D warnings | |
env: | |
RUST_BACKTRACE: "1" | |
cargo_fmt: | |
name: Enforce Rust code format | |
runs-on: ubuntu-latest | |
steps: | |
- name: Checkout repository | |
uses: actions/checkout@v3 | |
- name: Install stable toolchain | |
uses: dtolnay/rust-toolchain@nightly | |
with: | |
components: rustfmt | |
- name: Check format | |
run: cargo +nightly fmt --all -- --check | |
docs_rs: | |
name: Preflight docs.rs build | |
runs-on: ubuntu-latest | |
steps: | |
- name: Checkout repository | |
uses: actions/checkout@v3 | |
- name: Install nightly Rust toolchain | |
# Nightly is used here because the docs.rs build | |
# uses nightly and we use doc_cfg features that are | |
# not in stable Rust as of this writing (Rust 1.77). | |
uses: dtolnay/rust-toolchain@nightly | |
- name: Run cargo docs | |
# This is intended to mimic the docs.rs build | |
# environment. The goal is to fail PR validation | |
# if the subsequent release would result in a failed | |
# documentation build on docs.rs. | |
run: cargo +nightly doc --all-features --no-deps | |
env: | |
RUSTDOCFLAGS: --cfg docsrs | |
DOCS_RS: 1 | |
cargo-deny: | |
name: License / vulnerability audit | |
runs-on: ubuntu-latest | |
strategy: | |
fail-fast: false | |
matrix: | |
checks: | |
- advisories | |
- bans licenses sources | |
# Prevent sudden announcement of a new advisory from failing CI: | |
continue-on-error: ${{ matrix.checks == 'advisories' }} | |
steps: | |
- name: Checkout repository | |
uses: actions/checkout@v3 | |
- name: Audit crate dependencies | |
uses: EmbarkStudios/cargo-deny-action@v1 | |
with: | |
command: check ${{ matrix.checks }} | |
unused_deps: | |
name: Check for unused dependencies | |
runs-on: ubuntu-latest | |
steps: | |
- name: Checkout repository | |
uses: actions/checkout@v3 | |
- name: Install Rust toolchain | |
uses: dtolnay/rust-toolchain@nightly | |
- name: Run cargo-udeps | |
uses: aig787/cargo-udeps-action@v1 | |
with: | |
version: latest | |
args: --all-targets --all-features | |
# DISABLED until first version of crate is published: | |
# version_bump: | |
# name: Ensure (MINOR) tag is used when making an API breaking change | |
# # Change all of these steps to (MAJOR) after 1.0 release | |
# runs-on: ubuntu-latest | |
# steps: | |
# - name: Checkout repository | |
# uses: actions/checkout@v3 | |
# with: | |
# fetch-depth: 0 | |
# - name: Install Rust toolchain | |
# uses: dtolnay/rust-toolchain@stable | |
# - name: Get latest existing tag | |
# uses: WyriHaximus/github-action-get-previous-tag@v1 | |
# id: get-latest-tag | |
# - name: Set new version | |
# uses: paulhatch/semantic-version@v5.2.1 | |
# id: set-version | |
# with: | |
# tag_prefix: "v" | |
# version_format: "${major}.${minor}.${patch}" | |
# major_pattern: "(MAJOR)" | |
# minor_pattern: "(MINOR)" | |
# - name: Generate changelog since last tag | |
# run: | | |
# { | |
# echo 'changelog<<EOF' | |
# git log --format="* %s" ${{ steps.get-latest-tag.outputs.tag }}..HEAD | { grep -v "(IGNORE)" || :; } | |
# echo EOF | |
# } >> "$GITHUB_OUTPUT" | |
# - name: "Bump crate version (NOTE: Not pushed back to repo!)" | |
# continue-on-error: true # If no change to crate version, ignore git commit error | |
# run: | | |
# sed -i "s/^version = \"[^\"]*\"$/version = \"$VERSION\"/;" Cargo.toml | |
# git config user.email "nobody@example.com" | |
# git config --global user.name "PR validation bot" | |
# git add . | |
# git commit -m "DO NOT PUSH BACK TO PR: Bump crate version" | |
# env: | |
# VERSION: ${{ steps.set-version.outputs.version }} | |
# - name: If this step fails, change title of the PR to include (MINOR) tag | |
# uses: obi1kenobi/cargo-semver-checks-action@v2 | |
# with: | |
# package: cawg-identity-core |