name: CI permissions: contents: read on: pull_request: push: branches: - "*master" env: RUST_BACKTRACE: 1 CARGO_TERM_COLOR: always CLICOLOR: 1 concurrency: group: "${{ github.workflow }}-${{ github.ref }}" cancel-in-progress: true jobs: ci: permissions: contents: none name: CI needs: [test, check, lockfile, docs, rustfmt, clippy, cffconvert] runs-on: ubuntu-latest if: "always()" steps: - name: Failed run: exit 1 if: "contains(needs.*.result, 'failure') || contains(needs.*.result, 'cancelled') || contains(needs.*.result, 'skipped')" test: name: Test strategy: matrix: build: [linux, windows, mac, minimal, default, next] include: - build: linux os: buildjet-8vcpu-ubuntu-2204 rust: "stable" features: "full" - build: windows os: windows-latest rust: "stable" features: "full" - build: mac os: macos-14 rust: "stable" features: "full" - build: minimal os: ubuntu-latest rust: "stable" features: "minimal" - build: default os: ubuntu-latest rust: "stable" features: "default" - build: next os: ubuntu-latest rust: "stable" features: "next" continue-on-error: ${{ matrix.rust != 'stable' }} runs-on: ${{ matrix.os }} steps: - name: Checkout repository uses: actions/checkout@v4 - name: Install Rust uses: dtolnay/rust-toolchain@stable with: toolchain: ${{ matrix.rust }} - uses: Swatinem/rust-cache@v2 - uses: taiki-e/install-action@cargo-hack - name: Build run: make build-${{matrix.features}} - name: Test run: make test-${{matrix.features}} - name: Test (benches) run: make test-${{matrix.features}} ARGS='--workspace --benches' - name: Test (ultra-minimal) if: matrix.build == 'minimal' run: make test-minimal ARGS='--manifest-path Cargo.toml' - name: Test dynamic completions run: cargo test -p clap_complete -F unstable-dynamic check: name: Check runs-on: ubuntu-latest strategy: fail-fast: false matrix: build: [msrv, wasm, wasm-wasi, debug, release] include: - build: msrv rust: "1.74" # MSRV target: x86_64-unknown-linux-gnu features: full - build: wasm rust: stable target: wasm32-unknown-unknown features: wasm - build: wasm-wasi rust: stable target: wasm32-wasi features: wasm - build: debug rust: stable target: x86_64-unknown-linux-gnu features: debug - build: release rust: stable target: x86_64-unknown-linux-gnu features: release steps: - name: Checkout repository uses: actions/checkout@v4 - name: Install rust uses: dtolnay/rust-toolchain@stable with: toolchain: ${{ matrix.rust }} targets: ${{ matrix.target }} - uses: Swatinem/rust-cache@v2 - name: Check run: make check-${{ matrix.features }} env: TOOLCHAIN_TARGET: ${{ matrix.target }} ui: name: UI Tests runs-on: ubuntu-latest strategy: fail-fast: false matrix: features: [default, next] steps: - name: Checkout repository uses: actions/checkout@v4 - name: Install Rust uses: dtolnay/rust-toolchain@stable with: toolchain: "1.74" # MSRV - uses: Swatinem/rust-cache@v2 - name: UI Tests run: make test-ui-${{ matrix.features }} lockfile: runs-on: ubuntu-latest steps: - name: Checkout repository uses: actions/checkout@v4 - name: Install Rust uses: dtolnay/rust-toolchain@stable with: toolchain: stable - uses: Swatinem/rust-cache@v2 - name: "Is lockfile updated?" run: cargo update --workspace --locked docs: name: Docs runs-on: ubuntu-latest steps: - name: Checkout repository uses: actions/checkout@v4 - name: Install Rust uses: dtolnay/rust-toolchain@stable with: toolchain: "1.76" # STABLE - uses: Swatinem/rust-cache@v2 - name: Check documentation env: RUSTDOCFLAGS: -D warnings run: make doc rustfmt: name: rustfmt runs-on: ubuntu-latest steps: - name: Checkout repository uses: actions/checkout@v4 - name: Install Rust uses: dtolnay/rust-toolchain@stable with: toolchain: "1.76" # STABLE components: rustfmt - uses: Swatinem/rust-cache@v2 - name: Check formatting run: cargo fmt --all -- --check clippy: name: clippy runs-on: ubuntu-latest steps: - name: Checkout repository uses: actions/checkout@v4 - name: Install Rust uses: dtolnay/rust-toolchain@stable with: toolchain: "1.76" # STABLE components: clippy - uses: Swatinem/rust-cache@v2 - name: Lint (ultra-minimal) run: make clippy-minimal ARGS='--manifest-path Cargo.toml' - name: Lint (minimal) run: make clippy-minimal - name: Lint (all) run: make clippy-full - name: Lint (release) run: make clippy-release cffconvert: name: cffconvert runs-on: ubuntu-latest steps: - name: Checkout repository uses: actions/checkout@v4 with: persist-credentials: false - name: CFF validation uses: citation-file-format/cffconvert-github-action@2.0.0 with: args: --validate