name: CI
on:
push:
branches: [main]
pull_request:
workflow_call:
concurrency:
group: ${{ github.workflow }}-${{ github.head_ref || github.ref }}
cancel-in-progress: true
env:
CARGO_TERM_COLOR: always
jobs:
changes:
name: Detect changes
runs-on: ubuntu-latest
permissions:
pull-requests: read
outputs:
code: ${{ github.event_name == 'push' || steps.filter.outputs.code == 'true' }}
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd - uses: dorny/paths-filter@fbd0ab8f3e69293af611ebaee6363fc25e6d187d id: filter
with:
filters: |
code:
- 'src/**'
- 'tests/**'
- 'examples/**'
- 'benches/**'
- 'Cargo.toml'
- 'Cargo.lock'
- 'rustfmt.toml'
test:
name: Test
needs: [changes]
if: needs.changes.outputs.code == 'true'
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd - uses: tylerbutler/actions/setup-rust@c4c45a8284082163bc58623acfc4b3dc98633c3d - run: cargo test --all-features
lint:
name: Clippy
needs: [changes]
if: needs.changes.outputs.code == 'true'
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd - uses: tylerbutler/actions/setup-rust@c4c45a8284082163bc58623acfc4b3dc98633c3d with:
components: clippy
- run: cargo clippy --all-targets --all-features -- -D warnings
format:
name: Format
needs: [changes]
if: needs.changes.outputs.code == 'true'
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd - uses: tylerbutler/actions/setup-rust@c4c45a8284082163bc58623acfc4b3dc98633c3d with:
components: rustfmt
- run: cargo fmt --all -- --check
docs:
name: Documentation
needs: [changes]
if: needs.changes.outputs.code == 'true'
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd - uses: tylerbutler/actions/setup-rust@c4c45a8284082163bc58623acfc4b3dc98633c3d - run: RUSTDOCFLAGS="-D warnings" cargo doc --no-deps --all-features
ci-result:
name: CI Result
if: always()
needs: [test, lint, format, docs]
runs-on: ubuntu-latest
steps:
- name: Check CI results
run: |
for job in test lint format docs; do
result="${{ needs.test.result }}"
case "$job" in
lint) result="${{ needs.lint.result }}" ;;
format) result="${{ needs.format.result }}" ;;
docs) result="${{ needs.docs.result }}" ;;
esac
if [[ "$result" == "failure" || "$result" == "cancelled" ]]; then
echo "$job failed or was cancelled"
exit 1
fi
done