name: CI
on:
pull_request:
types: [opened, synchronize, reopened, ready_for_review]
push:
branches:
- main
permissions: {}
concurrency:
group: ci-${{ github.event.pull_request.head.sha || github.ref }}
cancel-in-progress: true
jobs:
plan:
name: Path Filter
runs-on: ubuntu-latest
permissions:
contents: read
pull-requests: read
outputs:
docs: ${{ steps.filter.outputs.docs }}
code: ${{ steps.filter.outputs.code }}
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 with:
persist-credentials: false
- uses: dorny/paths-filter@ceb8a2b8f2d89434be7ff52d3de7ec3738c5cc9d id: filter
with:
filters: |
docs:
- '**/*.md'
- 'docs/**'
- '.config/rumdl.toml'
- '.config/autocorrectrc'
- '.config/lychee.toml'
code:
- '**'
- '!**/*.md'
- '!docs/**'
- '!LICENSE'
- '!.config/rumdl.toml'
- '!.config/autocorrectrc'
- '!.config/lychee.toml'
docs:
name: Docs Checks
needs: plan
if: ${{ needs.plan.outputs.docs == 'true' || needs.plan.outputs.code == 'true' }}
runs-on: ubuntu-latest
permissions:
contents: read
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 with:
persist-credentials: false
- uses: jdx/mise-action@b44d12e7d0d8ee7461bb893e1b1993500433185b with:
install: true
- name: Run docs checks
run: mise x -- hk check --all -q --step autocorrect --step rumdl --step mmdr --step lychee --step typos
checks:
name: Checks
needs: plan
if: ${{ needs.plan.outputs.code == 'true' }}
runs-on: ubuntu-latest
permissions:
contents: read
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 with:
persist-credentials: false
- uses: dtolnay/rust-toolchain@683b588c487a69d01f6c6ddf40f036ff682cc2c8 with:
toolchain: stable
components: rustfmt, clippy
- uses: Swatinem/rust-cache@d1527c8f67ef9af357290475d4af4b0fab8f12e0 - uses: jdx/mise-action@b44d12e7d0d8ee7461bb893e1b1993500433185b with:
install: true
- name: Run code checks
run: mise x -- hk check --all -q --step cargo_fmt --step cargo_clippy --step cargo_test
security:
name: Security
needs: plan
if: ${{ needs.plan.outputs.code == 'true' }}
runs-on: ubuntu-latest
permissions:
contents: read
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 with:
fetch-depth: 0
persist-credentials: false
- uses: jdx/mise-action@b44d12e7d0d8ee7461bb893e1b1993500433185b with:
install: true
- name: Scan for leaked secrets
run: mise x -- gitleaks git --verbose --redact .
- name: Audit dependencies with cargo-deny
run: mise x -- cargo deny check
gate:
name: Merge Gate
needs: [plan, docs, checks, security]
if: always()
runs-on: ubuntu-latest
steps:
- name: Verify required checks
env:
PLAN_RESULT: ${{ needs.plan.result }}
DOCS_RESULT: ${{ needs.docs.result }}
CHECKS_RESULT: ${{ needs.checks.result }}
SECURITY_RESULT: ${{ needs.security.result }}
run: |
if [ "$PLAN_RESULT" != "success" ]; then
exit 1
fi
for r in "$DOCS_RESULT" "$CHECKS_RESULT" "$SECURITY_RESULT"; do
if [ "$r" != "success" ] && [ "$r" != "skipped" ]; then
exit 1
fi
done