talos-rust-client 0.1.3

Rust gRPC client for SideroLabs Talos (mTLS, tonic, rustls)
Documentation
name: CI

on:
  push:
    branches: [ main, develop ]
  pull_request:
    branches: [ main, develop ]
  schedule:
    # Run daily at 2 AM UTC to catch any bitrot
    - cron: '0 2 * * *'

env:
  RUST_BACKTRACE: 1
  CARGO_TERM_COLOR: always

# Cancel previous runs for PRs
concurrency:
  group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
  cancel-in-progress: true

jobs:
  test:
    name: Test Suite
    runs-on: ubuntu-latest
    timeout-minutes: 30
    strategy:
      fail-fast: false
      matrix:
        rust: [stable, beta, "1.75"]
    steps:
      - uses: actions/checkout@v5
        with:
          submodules: recursive

      - name: Install Rust toolchain
        uses: dtolnay/rust-toolchain@master
        with:
          toolchain: ${{ matrix.rust }}
          components: rustfmt, clippy

      - name: Cache dependencies
        uses: Swatinem/rust-cache@v2
        with:
          prefix-key: v0-rust-${{ matrix.rust }}

      - name: Check formatting
        if: matrix.rust == 'stable'
        run: cargo fmt --all -- --check

      - name: Run clippy
        if: matrix.rust == 'stable'
        run: cargo clippy --all-features --all-targets -- -D warnings

      - name: Build without features
        run: cargo build --verbose

      - name: Build with all features
        run: cargo build --all-features --verbose

      - name: Run tests
        run: cargo test --all-features --verbose

      - name: Check examples
        run: |
          cargo check --example version
          cargo check --example health
          cargo check --example events
          cargo check --example talosconfig_connect --features talosconfig

  docs:
    name: Documentation
    runs-on: ubuntu-latest
    timeout-minutes: 20
    steps:
      - uses: actions/checkout@v5
        with:
          submodules: recursive

      - name: Install Rust toolchain
        uses: dtolnay/rust-toolchain@stable

      - name: Cache dependencies
        uses: Swatinem/rust-cache@v2

      - name: Check documentation
        env:
          RUSTDOCFLAGS: -D warnings
        run: cargo doc --all-features --no-deps

  security-audit:
    name: Security Audit
    runs-on: ubuntu-latest
    timeout-minutes: 10
    steps:
      - uses: actions/checkout@v5
      - uses: rustsec/audit-check@v2
        with:
          token: ${{ secrets.GITHUB_TOKEN }}

  msrv:
    name: Minimum Supported Rust Version
    runs-on: ubuntu-latest
    timeout-minutes: 20
    steps:
      - uses: actions/checkout@v5
        with:
          submodules: recursive

      - name: Install MSRV toolchain
        uses: dtolnay/rust-toolchain@master
        with:
          toolchain: "1.75"

      - name: Cache dependencies
        uses: Swatinem/rust-cache@v2

      - name: Check MSRV
        run: |
          cargo check --all-features
          cargo test --all-features

  integration:
    name: Integration Tests
    runs-on: ubuntu-latest
    timeout-minutes: 45
    # Run on PRs with 'integration' label or on main branch
    if: |
      github.event_name == 'push' ||
      github.event_name == 'schedule' ||
      contains(github.event.pull_request.labels.*.name, 'integration')
    steps:
      - uses: actions/checkout@v5
        with:
          submodules: recursive

      - name: Install Rust toolchain
        uses: dtolnay/rust-toolchain@stable

      - name: Cache dependencies
        uses: Swatinem/rust-cache@v2

      - name: Set up Talos test environment
        run: |
          echo "Setting up mock Talos certificates for testing"
          mkdir -p test-certs
          # Generate test CA
          openssl req -x509 -newkey rsa:4096 -keyout test-certs/ca-key.pem -out test-certs/ca.crt -days 365 -nodes -subj "/CN=Test CA"
          # Generate client cert
          openssl req -newkey rsa:4096 -keyout test-certs/client-key.pem -out test-certs/client.csr -nodes -subj "/CN=Test Client"
          openssl x509 -req -in test-certs/client.csr -CA test-certs/ca.crt -CAkey test-certs/ca-key.pem -CAcreateserial -out test-certs/client.crt -days 365

      - name: Run integration tests
        env:
          TALOS_CA: test-certs/ca.crt
          TALOS_CERT: test-certs/client.crt
          TALOS_KEY: test-certs/client-key.pem
        run: |
          # Run connection tests with mock certificates
          cargo test --all-features --test '*' -- --nocapture

  publish-dry-run:
    name: Publish Dry Run
    runs-on: ubuntu-latest
    timeout-minutes: 20
    steps:
      - uses: actions/checkout@v5
        with:
          submodules: recursive

      - name: Install Rust toolchain
        uses: dtolnay/rust-toolchain@stable

      - name: Cache dependencies
        uses: Swatinem/rust-cache@v2

      - name: Verify package
        run: |
          cargo package --all-features --verbose
          cargo publish --dry-run --all-features

  status:
    name: CI Status
    runs-on: ubuntu-latest
    needs: [test, docs, security-audit, msrv]
    if: always()
    steps:
      - name: Successful CI
        if: ${{ \!(contains(needs.*.result, 'failure')) }}
        run: exit 0
      - name: Failed CI
        if: ${{ contains(needs.*.result, 'failure') }}
        run: exit 1