name: CI on: push: branches: - '**' pull_request: types: [opened, synchronize, reopened] jobs: build-and-test: name: Build & Test runs-on: ubuntu-latest steps: - name: Checkout code uses: actions/checkout@v4 - name: Setup Rust toolchain uses: actions-rust-lang/setup-rust-toolchain@v1 with: toolchain: stable components: rustfmt, clippy - name: Cache cargo registry uses: actions/cache@v4 with: path: ~/.cargo/registry key: ${{ runner.os }}-cargo-registry-${{ hashFiles('**/Cargo.lock') }} restore-keys: | ${{ runner.os }}-cargo-registry- - name: Cache cargo index uses: actions/cache@v4 with: path: ~/.cargo/git key: ${{ runner.os }}-cargo-index-${{ hashFiles('**/Cargo.lock') }} restore-keys: | ${{ runner.os }}-cargo-index- - name: Cache cargo build uses: actions/cache@v4 with: path: target key: ${{ runner.os }}-cargo-build-target-${{ hashFiles('**/Cargo.lock') }} restore-keys: | ${{ runner.os }}-cargo-build-target- # ๐Ÿ” Check only crates under bin/ - name: Check code (all crates under bin/) run: | set -euo pipefail find bin -name Cargo.toml -print0 | while IFS= read -r -d '' manifest; do echo "=== cargo check --manifest-path $manifest ===" cargo check --manifest-path "$manifest" --verbose done # โœ… Run tests only for crates under bin/ - name: Run tests (all crates under bin/) run: | set -euo pipefail find bin -name Cargo.toml -print0 | while IFS= read -r -d '' manifest; do echo "=== cargo test --manifest-path $manifest ===" cargo test --manifest-path "$manifest" --verbose done # ๐Ÿงน Clippy only for crates under bin/ - name: Run clippy (all crates under bin/) run: | set -euo pipefail find bin -name Cargo.toml -print0 | while IFS= read -r -d '' manifest; do echo "=== cargo clippy --manifest-path $manifest ===" cargo clippy --manifest-path "$manifest" -- -D warnings done # Formatting can safely stay workspace-wide - name: Check formatting run: cargo fmt --all -- --check # ๐Ÿ— Build release binaries only for crates under bin/ - name: Build release binaries (all crates under bin/) run: | set -euo pipefail find bin -name Cargo.toml -print0 | while IFS= read -r -d '' manifest; do echo "=== cargo build --manifest-path $manifest --release ===" cargo build --manifest-path "$manifest" --release --verbose done - name: List built binaries run: | echo "Built binaries:" ls -lh target/release/ | grep -E '^-.*x.*' - name: Upload build artifacts uses: actions/upload-artifact@v4 with: name: binaries-${{ github.sha }} path: | target/release/supervisor target/release/coordinator target/release/horus target/release/osiris target/release/herorunner target/release/runner_osiris target/release/runner_sal retention-days: 7 if-no-files-found: warn