name: Main workflow on: push: paths-ignore: - "docs/**" - "**.md" pull_request: paths-ignore: - "docs/**" - "**.md" env: CARGO_INCREMENTAL: 0 CARGO_NET_RETRY: 10 RUST_BACKTRACE: short RUSTFLAGS: "-D warnings" RUSTUP_MAX_RETRIES: 10 jobs: # Run the `rustfmt` code formatter rustfmt: name: Rustfmt [Formatter] runs-on: ubuntu-latest steps: - name: Setup | Checkout uses: actions/checkout@v3 - name: Setup | Rust uses: actions-rs/toolchain@v1.0.7 with: toolchain: stable override: true profile: minimal components: rustfmt - name: Build | Format run: cargo fmt --all -- --check # Run the `clippy` linting tool clippy: name: Clippy [Linter] strategy: matrix: os: [ubuntu-latest, macOS-latest, windows-latest] runs-on: ${{ matrix.os }} steps: - name: Setup | Checkout uses: actions/checkout@v3 - name: Setup | Cache uses: Swatinem/rust-cache@v1 - name: Setup | Rust uses: actions-rs/toolchain@v1.0.7 with: toolchain: stable override: true profile: minimal components: clippy - name: Build | Lint uses: actions-rs/cargo@v1.0.3 with: command: clippy args: --workspace --locked --all-targets --all-features -- -D clippy::all # Ensure that the project could be successfully compiled cargo_check: name: Compile runs-on: ubuntu-latest steps: - name: Setup | Checkout uses: actions/checkout@v3 - name: Setup | Cache uses: Swatinem/rust-cache@v1 - name: Setup | Rust uses: actions-rs/toolchain@v1.0.7 with: toolchain: stable profile: minimal override: true - name: Build | Check run: cargo check --workspace --locked # Ensure that the project could be successfully compiled with no features enabled cargo_check_no_features: name: Compile with no features enabled needs: cargo_check runs-on: ubuntu-latest steps: - name: Setup | Checkout uses: actions/checkout@v3 - name: Setup | Cache uses: Swatinem/rust-cache@v1 - name: Setup | Rust uses: actions-rs/toolchain@v1.0.7 with: toolchain: stable profile: minimal override: true - name: Build | Check run: cargo check --workspace --locked --no-default-features # Ensure that the project could be successfully compiled with all features enabled cargo_check_all_features: name: Compile with all features enabled needs: cargo_check runs-on: ubuntu-latest steps: - name: Setup | Checkout uses: actions/checkout@v3 - name: Setup | Cache uses: Swatinem/rust-cache@v1 - name: Setup | Rust uses: actions-rs/toolchain@v1.0.7 with: toolchain: stable profile: minimal override: true - name: Build | Check run: cargo check --workspace --locked --all-features # Check if config schema needs to be updated to reflect updated configuration options check_if_config_schema_up_to_date: name: Check if config schema is up to date needs: cargo_check runs-on: ubuntu-latest steps: - name: Setup | Checkout uses: actions/checkout@v3 - name: Setup | Cache uses: Swatinem/rust-cache@v1 - name: Setup | Rust uses: actions-rs/toolchain@v1.0.7 with: toolchain: stable profile: minimal override: true - name: Run | Generate Schema run: cargo run --locked --features config-schema -- config-schema > .github/config-schema.json - name: Check | Detect Changes run: git diff --exit-code .github/config-schema.json # Run tests on Linux, macOS, and Windows # On both Rust stable and Rust nightly test: name: Test Suite runs-on: ${{ matrix.os }} needs: cargo_check # First check then run expansive tests strategy: fail-fast: false matrix: os: [ubuntu-latest, macOS-latest, windows-latest] rust: [stable, nightly] steps: - name: Setup | Checkout uses: actions/checkout@v3 - name: Setup | Cache uses: Swatinem/rust-cache@v1 # Install all the required dependencies for testing - name: Setup | Rust uses: actions-rs/toolchain@v1.0.7 with: toolchain: ${{ matrix.rust }} components: llvm-tools-preview profile: minimal override: true - name: Install cargo-llvm-cov uses: taiki-e/install-action@cargo-llvm-cov # Install Mercurial (pre-installed on Linux and windows) - name: Setup | Mercurial (macos) if: matrix.os == 'macOS-latest' run: brew install mercurial # Run the ignored tests that expect the above setup - name: Build | Test run: "cargo llvm-cov --all-features --locked --workspace --lcov --output-path lcov.info -- --include-ignored" env: # Avoid -D warnings on nightly builds RUSTFLAGS: "" - name: Upload coverage to Codecov uses: codecov/codecov-action@v3 with: files: lcov.info fail_ci_if_error: true