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- # ๐Ÿ‘‡ Don't fail CI on hero-runner's warnings - name: Check code (all crates under bin/) env: RUSTFLAGS: "--cap-lints=warn" 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 # ๐Ÿ‘‡ Same trick for tests, otherwise theyโ€™d fail for the same reason - name: Run tests (all crates under bin/) env: RUSTFLAGS: "--cap-lints=warn" 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 stays strict (still uses -D warnings for clippy lints). # If this later fails because of hero-runner, we can also add RUSTFLAGS here. - 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 - name: Check formatting run: cargo fmt --all -- --check # Build was already succeeding; leaving it without cap-lints is fine. - 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