name: CI
on:
push:
branches: [ main, develop ]
pull_request:
branches: [ main, develop ]
schedule:
- cron: '0 2 * * *'
env:
RUST_BACKTRACE: 1
CARGO_TERM_COLOR: always
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
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