name: CI
on:
push:
branches: [main, develop]
pull_request:
branches: [main]
env:
CARGO_TERM_COLOR: always
RUST_BACKTRACE: 1
jobs:
build:
name: Build Release Binary
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install Rust toolchain
uses: dtolnay/rust-toolchain@stable
- name: Cache Rust dependencies
uses: swatinem/rust-cache@v2
with:
key: release-build
- name: Build release binary
run: cargo build --release
- name: Upload binary artifact
uses: actions/upload-artifact@v4
with:
name: mdbook-lint-binary
path: target/release/mdbook-lint
retention-days: 1
test:
name: Test Suite
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
os: [ubuntu-latest, windows-latest, macos-latest]
rust: [stable]
include:
- os: ubuntu-latest
rust: beta
steps:
- uses: actions/checkout@v4
- name: Install Rust toolchain
uses: dtolnay/rust-toolchain@master
with:
toolchain: ${{ matrix.rust }}
components: rustfmt, clippy
- name: Cache Rust dependencies
uses: swatinem/rust-cache@v2
with:
key: ${{ matrix.os }}-${{ matrix.rust }}
- name: Check formatting
if: matrix.rust == 'stable' && matrix.os == 'ubuntu-latest'
run: cargo fmt --all -- --check
- name: Check compilation
run: cargo check --all-targets --all-features
- name: Run clippy
if: matrix.rust == 'stable' && matrix.os == 'ubuntu-latest'
run: cargo clippy --all-targets --all-features -- -D warnings
- name: Run unit tests
run: cargo test --lib --all-features
- name: Run integration tests
run: cargo test --test '*' --all-features
- name: Run fast corpus tests
if: matrix.rust == 'stable' && matrix.os == 'ubuntu-latest'
run: |
# Run only essential corpus tests for fast CI feedback
cargo test --test corpus_integration_test test_corpus_edge_cases
cargo test --test corpus_integration_test test_rule_specific_cases
cargo test --test corpus_integration_test test_unicode_handling
cargo test --test corpus_integration_test test_robustness
- name: Run doc tests
if: matrix.rust == 'stable'
run: cargo test --doc --all-features
security-audit:
name: Security Audit
runs-on: ubuntu-latest
continue-on-error: true
steps:
- uses: actions/checkout@v4
- name: Install Rust toolchain
uses: dtolnay/rust-toolchain@stable
- name: Cache Rust dependencies
uses: swatinem/rust-cache@v2
- name: Cache cargo tools
uses: actions/cache@v4
with:
path: ~/.cargo/bin
key: cargo-tools-audit-v1
- name: Install cargo-audit
run: |
if ! command -v cargo-audit &> /dev/null; then
cargo install cargo-audit
fi
- name: Run security audit
run: cargo audit
coverage:
name: Code Coverage
runs-on: ubuntu-latest
continue-on-error: true
steps:
- uses: actions/checkout@v4
- name: Install Rust toolchain
uses: dtolnay/rust-toolchain@stable
- name: Cache Rust dependencies
uses: swatinem/rust-cache@v2
- name: Cache cargo tools
uses: actions/cache@v4
with:
path: ~/.cargo/bin
key: cargo-tools-tarpaulin-v1
- name: Install tarpaulin
run: |
if ! command -v cargo-tarpaulin &> /dev/null; then
cargo install cargo-tarpaulin
fi
- name: Generate coverage report
run: |
cargo tarpaulin --workspace --timeout 300 \
--out Xml --out Html --out Stdout \
--exclude-files 'target/*' \
--exclude-files 'tests/corpus_tests.rs' \
--fail-under 70
- name: Upload coverage to Codecov
uses: codecov/codecov-action@v4
continue-on-error: true
with:
files: cobertura.xml
fail_ci_if_error: false
token: ${{ secrets.CODECOV_TOKEN }}
- name: Archive coverage results
uses: actions/upload-artifact@v4
if: always()
with:
name: coverage-report
path: |
cobertura.xml
tarpaulin-report.html
docs:
name: Documentation
runs-on: ubuntu-latest
needs: build
steps:
- uses: actions/checkout@v4
- name: Download binary artifact
uses: actions/download-artifact@v4
with:
name: mdbook-lint-binary
path: ./bin
- name: Make binary executable
run: chmod +x ./bin/mdbook-lint
- name: Install mdbook
run: cargo install mdbook
- name: Lint documentation
continue-on-error: true
run: |
cd docs
../bin/mdbook-lint lint src/
- name: Install Rust toolchain for docs
uses: dtolnay/rust-toolchain@stable
- name: Cache Rust dependencies
uses: swatinem/rust-cache@v2
- name: Check rustdoc
run: cargo doc --no-deps --all-features
env:
RUSTDOCFLAGS: -D warnings
release-check:
name: Release Check
runs-on: ubuntu-latest
if: github.event_name == 'pull_request'
steps:
- uses: actions/checkout@v4
- name: Install Rust toolchain
uses: dtolnay/rust-toolchain@stable
- name: Cache Rust dependencies
uses: swatinem/rust-cache@v2
- name: Dry run package
run: cargo package --allow-dirty