# spell-checker:ignore (rust) clippy rustdoc rustfmt rustup RUSTC RUSTFLAGS RUSTDOCFLAGS profraw # spell-checker:ignore (abbrevs/acronyms) MSVC (bash) alnum esac (jargon) maint (utils) codecov grcov lcov markdownlint sccache () uutils # spell-checker:ignore (people) dtolnay ; Swatinem ; DavidAnson on: [push, pull_request] name: CI env: CARGO_INCREMENTAL: "0" PROJECT_NAME: platform-info PROJECT_DESC: 'Cross-platform host machine info' PROJECT_AUTH: 'uutils' # * `rust` caching configuration RUSTC_WRAPPER: 'sccache' SCCACHE_GHA_ENABLED: 'true' # terminate execution of the current workflow group when there is a newer changeset detected # * the group is defined by "WORKFLOW_NAME-REF", where REF can be a branch, tag, or pull-request reference # * workflows executing for the default branch are excluded from termination concurrency: group: ${{ github.workflow }}-${{ github.ref }} cancel-in-progress: ${{ github.ref != format('refs/heads/{0}', github.event.repository.default_branch) }} jobs: style_format: name: Style/format runs-on: ubuntu-latest steps: - uses: actions/checkout@v6 - uses: Swatinem/rust-cache@v2 - uses: mozilla-actions/sccache-action@v0.0.10 - run: cargo fmt --all -- --check style_lint: name: Style/lint runs-on: ${{ matrix.os }} strategy: fail-fast: false matrix: os: [ubuntu-latest, macos-latest, windows-latest] steps: - uses: actions/checkout@v6 - uses: Swatinem/rust-cache@v2 - uses: mozilla-actions/sccache-action@v0.0.10 - uses: DavidAnson/markdownlint-cli2-action@v23 with: fix: true globs: | *.md docs/src/**/*.md src/**/*.md - run: cargo clippy --all-targets -- -D warnings - name: Clippy (WASI) if: matrix.os == 'ubuntu-latest' run: | rustup target add wasm32-wasip1 cargo clippy --target wasm32-wasip1 -- -D warnings style_spellcheck: name: Style/spellcheck runs-on: ubuntu-latest steps: - uses: actions/checkout@v6 - uses: streetsidesoftware/cspell-action@v8 ## ref: with: incremental_files_only: false verbose: true msrv: name: MSRV runs-on: ubuntu-latest steps: - uses: actions/checkout@v6 - uses: dtolnay/rust-toolchain@1.65.0 - uses: Swatinem/rust-cache@v2 - uses: mozilla-actions/sccache-action@v0.0.10 - run: cargo fetch --locked - run: cargo test --all-features test: name: Build/Test runs-on: ${{ matrix.os }} strategy: fail-fast: false matrix: os: [ubuntu-latest, macos-latest, windows-latest] steps: - uses: actions/checkout@v6 - uses: Swatinem/rust-cache@v2 - uses: mozilla-actions/sccache-action@v0.0.10 - name: Build/Test Info shell: bash run: | ## Build/Test Info # repo/commit info echo "## repo/commit" echo GITHUB_REPOSITORY=${GITHUB_REPOSITORY} echo GITHUB_REF=${GITHUB_REF} echo GITHUB_SHA=${GITHUB_SHA} # environment echo "## environment" echo "CI='${CI}'" echo "PWD='${PWD}'" # tooling info display echo "## tooling" command -v gcc >/dev/null 2>&1 && (gcc --version | head -1) || true rustup -V 2>/dev/null rustup show active-toolchain cargo -V rustc -V # dependencies echo "## crate dependency list" # * note: for applications, use `--locked` for `cargo fetch`` and `cargo tree`) and commit *Cargo.lock* cargo fetch --quiet cargo tree --edges=no-dev --prefix=none --workspace | grep -vE "\(.*[/\\]${GITHUB_REPOSITORY##*/}\)" | sort --unique - run: cargo test --all-features -- --test-threads 1 env: RUST_BACKTRACE: '1' test_wasi: name: Build/Test (WASI) runs-on: ubuntu-latest steps: - uses: actions/checkout@v6 - uses: dtolnay/rust-toolchain@stable with: targets: wasm32-wasip1 - uses: Swatinem/rust-cache@v2 - uses: mozilla-actions/sccache-action@v0.0.10 - name: Install wasmtime run: | curl https://wasmtime.dev/install.sh -sSf | bash echo "$HOME/.wasmtime/bin" >> $GITHUB_PATH - name: Build for WASI run: cargo build --target wasm32-wasip1 - name: Test with wasmtime env: CARGO_TARGET_WASM32_WASIP1_RUNNER: wasmtime # WASI does not support threads, so tests must run sequentially run: cargo test --target wasm32-wasip1 -- --test-threads 1 coverage: name: Code Coverage runs-on: ${{ matrix.job.os }} strategy: fail-fast: true matrix: job: - { os: ubuntu-latest } - { os: macos-latest } - { os: windows-latest } steps: - uses: actions/checkout@v6 - name: Initialize/setup workflow id: vars shell: bash run: | ## VARs and paths setup outputs() { step_id="${{ github.action }}"; for var in "$@" ; do echo steps.${step_id}.outputs.${var}="${!var}"; echo "${var}=${!var}" >> $GITHUB_OUTPUT; done; } # toolchain TOOLCHAIN="nightly" ## default to "nightly" toolchain (required for certain required unstable compiler flags) ## !maint: refactor when stable channel has needed support # * specify gnu-type TOOLCHAIN for windows; `grcov` requires gnu-style code coverage data files case ${{ matrix.job.os }} in windows-*) TOOLCHAIN="$TOOLCHAIN-x86_64-pc-windows-msvc" ;; esac; # * use requested TOOLCHAIN if specified if [ -n "${{ matrix.job.toolchain }}" ]; then TOOLCHAIN="${{ matrix.job.toolchain }}" ; fi outputs TOOLCHAIN # target-specific options # * CARGO_FEATURES_OPTION CARGO_FEATURES_OPTION='--all-features' ; ## default to '--all-features' for code coverage if [ -n "${{ matrix.job.features }}" ]; then CARGO_FEATURES_OPTION='--features=${{ matrix.job.features }}' ; fi outputs CARGO_FEATURES_OPTION # * CODECOV_FLAGS CODECOV_FLAGS=$( echo "${{ matrix.job.os }}" | sed 's/[^[:alnum:]]/_/g' ) outputs CODECOV_FLAGS # * code coverage COVERAGE_REPORT_DIR="target/debug/coverage" PROFILES_DIR="${COVERAGE_REPORT_DIR}/profiles" mkdir -p "${COVERAGE_REPORT_DIR}" "${PROFILES_DIR}" outputs COVERAGE_REPORT_DIR PROFILES_DIR LLVM_PROFILE_FILE="${PROFILES_DIR}/profile-%p-%m.profraw" outputs LLVM_PROFILE_FILE - uses: dtolnay/rust-toolchain@master with: toolchain: ${{ steps.vars.outputs.TOOLCHAIN }} components: llvm-tools - uses: Swatinem/rust-cache@v2 - uses: mozilla-actions/sccache-action@v0.0.10 - run: cargo install grcov - name: Test shell: bash env: LLVM_PROFILE_FILE: ${{ steps.vars.outputs.LLVM_PROFILE_FILE }} RUSTC_WRAPPER: '' RUSTFLAGS: '-C instrument-coverage' RUSTDOCFLAGS: '' run: | ## Test cargo test ${{ steps.vars.outputs.CARGO_FEATURES_OPTION }} --no-fail-fast -- --test-threads 1 - name: Test examples shell: bash env: LLVM_PROFILE_FILE: ${{ steps.vars.outputs.LLVM_PROFILE_FILE }} RUSTC_WRAPPER: '' RUSTFLAGS: '-C instrument-coverage' RUSTDOCFLAGS: '' run: | ## Test examples cargo test ${{ steps.vars.outputs.CARGO_FEATURES_OPTION }} --examples --no-fail-fast -- --test-threads 1 - name: Generate coverage data (via `grcov`) id: coverage shell: bash run: | ## Generate coverage data outputs() { step_id="${{ github.action }}"; for var in "$@" ; do echo steps.${step_id}.outputs.${var}="${!var}"; echo "${var}=${!var}" >> $GITHUB_OUTPUT; done; } # COVERAGE_REPORT_DIR='${{ steps.vars.outputs.COVERAGE_REPORT_DIR }}' LLVM_PROFILE_FILE='${{ steps.vars.outputs.LLVM_PROFILE_FILE }}' PROFILES_DIR='${{ steps.vars.outputs.PROFILES_DIR }}' BINARY_PATH='target/debug' COVERAGE_REPORT_FILE="${COVERAGE_REPORT_DIR}/lcov.info" # display coverage files grcov . --binary-path "${BINARY_PATH}" --source-dir . --output-type files --ignore build.rs --ignore "examples/*" --ignore "vendor/*" --ignore "/*" --ignore "[a-zA-Z]:/*" --excl-br-line "^\s*((debug_)?assert(_eq|_ne)?!|#\[derive\()" | sort --unique # generate coverage report grcov . --binary-path "${BINARY_PATH}" --source-dir . --output-type lcov --output-path "${COVERAGE_REPORT_FILE}" --ignore build.rs --ignore "examples/*" --ignore "vendor/*" --ignore "/*" --ignore "[a-zA-Z]:/*" --excl-br-line "^\s*((debug_)?assert(_eq|_ne)?!|#\[derive\()" report=${COVERAGE_REPORT_FILE} outputs report - name: Upload coverage results (to Codecov.io) uses: codecov/codecov-action@v7 # if: steps.vars.outputs.HAS_CODECOV_TOKEN with: token: ${{ secrets.CODECOV_TOKEN }} files: ${{ steps.coverage.outputs.report }} ## flags: IntegrationTests, UnitTests, ${{ steps.vars.outputs.CODECOV_FLAGS }} flags: ${{ steps.vars.outputs.CODECOV_FLAGS }} name: codecov-umbrella fail_ci_if_error: false