diff --git a/.github/workflows/rust.yml b/.github/workflows/rust.yml index 85aa9f3..6de9296 100644 --- a/.github/workflows/rust.yml +++ b/.github/workflows/rust.yml @@ -1,30 +1,273 @@ name: Rust -on: [push] +on: + pull_request: + paths: + - '**' + - '!/*.md' + - '!/*.org' + - "!/LICENSE" + + push: + branches: + - main + paths: + - '**' + - '!/*.md' + - '!/*.org' + - "!/LICENSE" + + schedule: + - cron: '12 12 12 * *' jobs: - build: + publish: + name: Publish (dry-run) + needs: [test, docs] strategy: matrix: - os: [ubuntu-latest, windows-latest, macos-latest] + package: + - email_address + continue-on-error: true + runs-on: ubuntu-latest + steps: + - name: Checkout repository + uses: actions/checkout@v2 + + - name: Install Rust + uses: actions-rs/toolchain@v1 + with: + toolchain: stable + profile: minimal + override: true + + - uses: Swatinem/rust-cache@v1 + + - name: Check publish + uses: actions-rs/cargo@v1 + with: + command: publish + args: --package ${{ matrix.package}} --dry-run + + + check_tests: + name: Check for test types + runs-on: ubuntu-latest + outputs: + has_benchmarks: ${{ steps.check_benchmarks.outputs.has_benchmarks }} + has_examples: ${{ steps.check_examples.outputs.has_examples }} + steps: + - name: Check for benchmarks + id: check_benchmarks + run: test -d benchmarks && echo "has_benchmarks=1" || echo "has_benchmarks=" >> $GITHUB_OUTPUT + shell: bash + + - name: Check for examples + id: check_examples + run: test -d examples && echo "has_examples=1" || echo "has_examples=" >> $GITHUB_OUTPUT + shell: bash + + test: + name: Test + needs: [rustfmt, clippy] + strategy: + matrix: + os: ["ubuntu-latest", "windows-latest", "macos-latest"] + rust: ["stable", "beta", "nightly"] + test-features: ["", "--all-features", "--no-default-features"] + continue-on-error: ${{ matrix.rust != 'stable' }} runs-on: ${{ matrix.os }} + steps: + - name: Checkout repository + uses: actions/checkout@v2 + + - name: Install Rust + uses: actions-rs/toolchain@v1 + with: + toolchain: ${{ matrix.rust }} + profile: minimal + override: true + + - uses: Swatinem/rust-cache@v1 + + - name: Build + uses: actions-rs/cargo@v1 + with: + command: build + args: --workspace ${{ matrix.test-features }} + + - name: Test + uses: actions-rs/cargo@v1 + with: + command: test + args: --workspace ${{ matrix.test-features }} + + + benchmarks: + name: Benchmarks + needs: [rustfmt, clippy, check_tests] + if: needs.check_tests.outputs.has_benchmarks + strategy: + matrix: + os: ["ubuntu-latest", "windows-latest", "macos-latest"] + rust: ["stable"] + runs-on: ubuntu-latest + steps: + - name: Checkout repository + uses: actions/checkout@v2 + + - name: Install Rust + uses: actions-rs/toolchain@v1 + with: + toolchain: ${{ matrix.rust }} + profile: minimal + override: true + + - uses: Swatinem/rust-cache@v1 + + - name: Run benchmarks with all features + uses: actions-rs/cargo@v1 + with: + command: test + args: --workspace --benches --all-features --no-fail-fast + + examples: + name: Examples + needs: [rustfmt, clippy, check_tests] + if: needs.check_tests.outputs.has_examples + runs-on: ubuntu-latest + strategy: + matrix: + os: ["ubuntu-latest", "windows-latest", "macos-latest"] + rust: ["stable"] steps: - - uses: actions/checkout@v1 + - name: Checkout repository + uses: actions/checkout@v2 + + - name: Install Rust + uses: actions-rs/toolchain@v1 + with: + toolchain: ${{ matrix.rust }} + profile: minimal + override: true + + - uses: Swatinem/rust-cache@v1 + + - name: Run examples with all features + uses: actions-rs/cargo@v1 + with: + command: test + args: --workspace --examples --all-features --no-fail-fast - - name: Install dependencies - run: rustup component add rustfmt + + coverage: + name: Code Coverage + needs: test + runs-on: ubuntu-latest + strategy: + matrix: + os: ["ubuntu-latest", "windows-latest", "macos-latest"] + rust: ["stable"] + steps: + - name: Checkout repository + uses: actions/checkout@v2 + + - name: Install Rust + uses: actions-rs/toolchain@v1 + with: + toolchain: ${{ matrix.rust }} + override: true + + - name: Run cargo-tarpaulin + uses: actions-rs/tarpaulin@v0.1 + with: + version: 0.22.0 + args: --all-features -- --test-threads 1 - - name: Format - run: cargo fmt -- --check + - name: Upload to codecov.io + uses: codecov/codecov-action@v1.0.2 + with: + token: ${{secrets.CODECOV_TOKEN}} - - name: Build - run: cargo build --verbose + - name: Archive code coverage results + uses: actions/upload-artifact@v1 + with: + name: code-coverage-report + path: cobertura.xml - - name: Run tests - run: cargo test --all-features --verbose + + docs: + name: Document generation + needs: [rustfmt, clippy] + runs-on: ubuntu-latest + steps: + - name: Checkout repository + uses: actions/checkout@v2 + + - name: Install Rust + uses: actions-rs/toolchain@v1 + with: + toolchain: stable + profile: minimal + override: true + + - uses: Swatinem/rust-cache@v1 + + - name: Generate documentation + uses: actions-rs/cargo@v1 + env: + RUSTDOCFLAGS: -D warnings + with: + command: doc + args: --workspace --all-features --no-deps + + + rustfmt: + name: rustfmt + runs-on: ubuntu-latest + steps: + - name: Checkout repository + uses: actions/checkout@v2 + + - name: Install Rust + uses: actions-rs/toolchain@v1 + with: + toolchain: stable + profile: minimal + override: true + components: rustfmt + + - uses: Swatinem/rust-cache@v1 - - name: Docs - run: cargo doc --no-deps + - name: Check formatting + uses: actions-rs/cargo@v1 + with: + command: fmt + args: --all -- --check + + + clippy: + name: clippy + runs-on: ubuntu-latest + permissions: + checks: write + steps: + - name: Checkout repository + uses: actions/checkout@v2 + + - name: Install Rust + uses: actions-rs/toolchain@v1 + with: + toolchain: stable + profile: minimal + override: true + components: clippy + + - uses: Swatinem/rust-cache@v1 + - uses: actions-rs/clippy-check@v1 + with: + token: ${{ secrets.GITHUB_TOKEN }} + args: --workspace --no-deps --all-features --all-targets -- -D warnings diff --git a/.github/workflows/security-audit.yml b/.github/workflows/security-audit.yml new file mode 100644 index 0000000..9b04b9e --- /dev/null +++ b/.github/workflows/security-audit.yml @@ -0,0 +1,36 @@ +name: Security audit + +on: + push: + paths: + - '**/Cargo.toml' + - '**/Cargo.lock' + + pull_request: + paths: + - '**/Cargo.toml' + - '**/Cargo.lock' + + schedule: + - cron: '12 12 12 * *' + +jobs: + security_audit: + runs-on: ubuntu-latest + permissions: + checks: write + steps: + - name: Checkout repository + uses: actions/checkout@v3 + + - name: Install Rust + uses: actions-rs/toolchain@v1 + with: + toolchain: stable + profile: minimal + override: true + + - uses: actions-rs/audit-check@v1 + with: + token: ${{ secrets.GITHUB_TOKEN }} + diff --git a/.github/workflows/typos.yml b/.github/workflows/typos.yml new file mode 100644 index 0000000..aa9dd59 --- /dev/null +++ b/.github/workflows/typos.yml @@ -0,0 +1,13 @@ +name: Spelling +on: [pull_request] + +jobs: + spelling: + name: Spell Check with Typos + runs-on: ubuntu-latest + steps: + - name: Checkout repository + uses: actions/checkout@v2 + + - name: Spell check repository + uses: crate-ci/typos@master