name: CI
on:
pull_request:
push:
permissions:
contents: read
env:
CARGO_TERM_COLOR: always
CARGO_TOOLCHAIN: stable
CARGO_REGISTRIES_CRATES_IO_PROTOCOL: sparse
jobs:
test:
runs-on: ubuntu-latest
timeout-minutes: 60
steps:
- uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@v1
with:
toolchain: ${{ env.CARGO_TOOLCHAIN }}
- uses: Swatinem/rust-cache@v2
- name: Install Protoc
uses: arduino/setup-protoc@v3
with:
version: 23.4
repo-token: ${{ secrets.GITHUB_TOKEN }}
- name: Run cargo test (workspace, all features)
run: cargo test --workspace --all-features --no-fail-fast
- name: Validate public examples
run: bash scripts/check-public-examples.sh
doc:
runs-on: ubuntu-latest
timeout-minutes: 60
env:
RUSTDOCFLAGS: "-D warnings -A rustdoc::bare_urls"
steps:
- uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@v1
with:
toolchain: ${{ env.CARGO_TOOLCHAIN }}
- uses: Swatinem/rust-cache@v2
- name: Install Protoc
uses: arduino/setup-protoc@v3
with:
version: 23.4
repo-token: ${{ secrets.GITHUB_TOKEN }}
- name: Run cargo doc
run: cargo doc --workspace --all-features --no-deps
api-contracts:
runs-on: ubuntu-latest
timeout-minutes: 10
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with:
python-version: "3.12"
- name: Run API contract tooling tests
run: |
python3 -m unittest \
tools.tests.test_validate_api_contracts_official \
tools.tests.test_validate_api_contracts_rust_source \
tools.tests.test_validate_api_contracts_compare
- name: Validate typed API endpoint contracts
run: |
python3 tools/validate_api_contracts.py \
--all-crates \
--strict endpoint \
--report-dir "$RUNNER_TEMP/api_contracts"
- name: Upload API contract reports
if: always()
uses: actions/upload-artifact@v4
with:
name: api-contracts
path: ${{ runner.temp }}/api_contracts
retention-days: 14
lint:
runs-on: ubuntu-latest
timeout-minutes: 60
env:
RUSTFLAGS: "-D warnings"
steps:
- uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@v1
with:
toolchain: ${{ env.CARGO_TOOLCHAIN }}
components: rustfmt, clippy
- uses: Swatinem/rust-cache@v2
- name: Install Protoc
uses: arduino/setup-protoc@v3
with:
version: 23.4
repo-token: ${{ secrets.GITHUB_TOKEN }}
- name: Check format
run: cargo fmt --all -- --check
- name: Run clippy (all features)
run: cargo clippy --workspace --lib --all-features -- -D warnings
- name: Run clippy (no default features)
run: cargo clippy --workspace --lib --no-default-features -- -D warnings
feature-combinations:
runs-on: ubuntu-latest
timeout-minutes: 45
strategy:
fail-fast: false
matrix:
features:
- "" - "auth" - "auth,communication"
- "auth,docs"
- "auth,hr"
- "auth,workflow"
- "auth,meeting"
- "auth,ai"
- "auth,security"
- "auth,platform"
- "auth,application"
- "auth,mail"
- "auth,helpdesk"
- "auth,analytics"
- "auth,user"
- "auth,cardkit"
- "auth,docs-base"
- "auth,docs-bitable"
- "auth,docs-drive"
- "auth,docs-full"
- "webhook"
- "webhook-card"
- "webhook-signature"
- "webhook-full"
- "essential" - "enterprise" - "communication,docs,auth"
- "communication,hr,auth"
- "docs,hr,auth"
- "hr,workflow,auth"
- "communication,docs,hr,auth"
- "auth,communication,webhook"
- "auth,docs,webhook-full"
- "auth,communication,cardkit"
- "essential,webhook-full"
- "enterprise,ai"
- "enterprise,meeting"
- "full" steps:
- uses: actions/checkout@v4
- name: Install Rust toolchain
uses: dtolnay/rust-toolchain@v1
with:
toolchain: ${{ env.CARGO_TOOLCHAIN }}
components: clippy
- name: Cache Cargo build files
uses: Swatinem/rust-cache@v2
- name: Install Protoc
uses: arduino/setup-protoc@v3
with:
version: 23.4
repo-token: ${{ secrets.GITHUB_TOKEN }}
- name: Build with feature combination
run: |
echo "Testing feature combination: ${{ matrix.features }}"
if [ -z "${{ matrix.features }}" ]; then
echo "Building with no features (minimal build)"
timeout 20m cargo build --no-default-features
else
echo "Building with features: ${{ matrix.features }}"
timeout 20m cargo build --no-default-features --features "${{ matrix.features }}"
fi
- name: Test with feature combination
run: |
if [ -z "${{ matrix.features }}" ]; then
echo "Testing with no features"
timeout 15m cargo test --no-default-features --lib
else
echo "Testing with features: ${{ matrix.features }}"
timeout 15m cargo test --no-default-features --features "${{ matrix.features }}" --lib
fi
- name: Run clippy with feature combination
run: |
if [ -z "${{ matrix.features }}" ]; then
cargo clippy --no-default-features --lib -- -D warnings
else
cargo clippy --no-default-features --features "${{ matrix.features }}" --lib -- -D warnings
fi
msrv:
runs-on: ubuntu-latest
timeout-minutes: 30
steps:
- uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@v1
with:
toolchain: 1.88
- uses: Swatinem/rust-cache@v2
- name: Install Protoc
uses: arduino/setup-protoc@v3
with:
version: 23.4
repo-token: ${{ secrets.GITHUB_TOKEN }}
- name: Use pinned MSRV lockfile
run: cp .github/msrv/Cargo.lock Cargo.lock
- name: Check MSRV build
run: cargo check --workspace --all-features --locked
security-audit:
runs-on: ubuntu-latest
timeout-minutes: 30
steps:
- uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@v1
with:
toolchain: ${{ env.CARGO_TOOLCHAIN }}
- uses: Swatinem/rust-cache@v2
- name: Install cargo-deny
uses: taiki-e/install-action@cargo-deny
- name: Run cargo-deny check
run: cargo deny check
unused-deps:
runs-on: ubuntu-latest
timeout-minutes: 30
continue-on-error: true steps:
- uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@v1
with:
toolchain: ${{ env.CARGO_TOOLCHAIN }}
- uses: Swatinem/rust-cache@v2
- name: Install cargo-machete
uses: taiki-e/install-action@cargo-machete
- name: Check unused dependencies
run: cargo machete