openlark 0.16.0

飞书开放平台 Rust SDK - 企业级高覆盖率 API 客户端,极简依赖一条命令
Documentation
name: CI

on:
  pull_request:
  push:

permissions:
  contents: read

env:
  CARGO_TERM_COLOR: always
  CARGO_TOOLCHAIN: stable
  # Sparse cargo registry for faster updates
  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 combination testing for issue #47
  feature-combinations:
    runs-on: ubuntu-latest
    timeout-minutes: 45
    strategy:
      fail-fast: false
      matrix:
        features:
          # === 基础组合 (Basic Combinations) ===
          - ""  # no-default-features (minimal build)
          - "auth"  # default features
          - "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"
          
          # === 文档细分组合 (Docs Sub-features) ===
          - "auth,docs-base"
          - "auth,docs-bitable"
          - "auth,docs-drive"
          - "auth,docs-full"
          
          # === Webhook 组合 (Webhook Features) ===
          - "webhook"
          - "webhook-card"
          - "webhook-signature"
          - "webhook-full"
          
          # === 推荐业务组合 (Recommended Business Combinations) ===
          - "essential"  # auth + communication + docs
          - "enterprise"  # essential + security + hr + workflow
          - "communication,docs,auth"
          - "communication,hr,auth"
          - "docs,hr,auth"
          - "hr,workflow,auth"
          - "communication,docs,hr,auth"
          
          # === 高价值组合 (High-Value Combinations) ===
          - "auth,communication,webhook"
          - "auth,docs,webhook-full"
          - "auth,communication,cardkit"
          - "essential,webhook-full"
          - "enterprise,ai"
          - "enterprise,meeting"
          
          # === Edge Cases ===
          - "full"  # all enterprise features
    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 检查 (Minimum Supported Rust Version)
  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