name: CI
on:
push:
branches: [main]
pull_request:
branches: [main]
env:
CARGO_TERM_COLOR: always
RUST_BACKTRACE: 1
jobs:
boundary-lint:
name: Boundary Lint
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Block premium identity markers in OSS surfaces
shell: bash
run: |
set -euo pipefail
SEARCH_PATHS=(
src
tests
.github
benches
)
PATTERNS=(
'workspace\.toml'
'agent\.toml'
'repo\.toml'
'g2_'
)
failed=0
for pattern in "${PATTERNS[@]}"; do
if rg -n --hidden \
--glob '!*.md' \
--glob '!*.json' \
--glob '!CHANGELOG*' \
--glob '!.github/workflows/ci.yml' \
"$pattern" "${SEARCH_PATHS[@]}"; then
echo
echo "Boundary lint violation: found forbidden premium marker pattern '$pattern' in OSS surfaces."
failed=1
fi
done
if [[ "$failed" -ne 0 ]]; then
echo
echo "Premium boundary violation detected. Move identity or workspace-resolution behavior out of OSS."
exit 1
fi
echo "Boundary lint passed."
check:
name: Check
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install Rust toolchain
uses: dtolnay/rust-toolchain@stable
- name: Cache cargo
uses: Swatinem/rust-cache@v2
- name: Run cargo check
run: cargo check --all-features
fmt:
name: Format
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install Rust toolchain
uses: dtolnay/rust-toolchain@stable
with:
components: rustfmt
- name: Check formatting
run: cargo fmt --all --check
clippy:
name: Clippy
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install Rust toolchain
uses: dtolnay/rust-toolchain@stable
with:
components: clippy
- name: Cache cargo
uses: Swatinem/rust-cache@v2
- name: Run clippy
run: |
# Allow certain lints that are common in the codebase
# TODO: Fix these and remove the allows
cargo clippy --all-features -- \
-A clippy::ptr_arg \
-A clippy::too_many_arguments \
-A clippy::if_same_then_else \
-D warnings
test:
name: Test (${{ matrix.os }})
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
os: [ubuntu-latest, macos-latest]
steps:
- uses: actions/checkout@v4
- name: Install Rust toolchain
uses: dtolnay/rust-toolchain@stable
- name: Cache cargo
uses: Swatinem/rust-cache@v2
- name: Run tests
run: cargo test --all-features
test-windows:
name: Test (windows-latest)
runs-on: windows-latest
steps:
- uses: actions/checkout@v4
- name: Install Rust toolchain
uses: dtolnay/rust-toolchain@stable
- name: Cache cargo
uses: Swatinem/rust-cache@v2
- name: Run tests
run: cargo test --all-features
env:
RUSTFLAGS: '-C link-arg=advapi32.lib -C link-arg=/STACK:8388608'
build:
name: Build Release
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install Rust toolchain
uses: dtolnay/rust-toolchain@stable
- name: Cache cargo
uses: Swatinem/rust-cache@v2
- name: Build release
run: cargo build --release
- name: Check binary size
run: |
ls -lh target/release/gr
ls -lh target/release/gitgrip
bench:
name: Benchmarks
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install Rust toolchain
uses: dtolnay/rust-toolchain@stable
- name: Cache cargo
uses: Swatinem/rust-cache@v2
- name: Run benchmarks
run: cargo bench --no-run
integration:
name: Integration Tests
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install Rust toolchain
uses: dtolnay/rust-toolchain@stable
- name: Cache cargo
uses: Swatinem/rust-cache@v2
- name: Install tmux
run: sudo apt-get install -y tmux
- name: Build
run: cargo build
- name: Setup mock gripspace
run: |
mkdir -p .gitgrip
cp agents.toml .gitgrip/agents.toml
- name: Run spawn integration tests
run: GR=./target/debug/gr ./tests/spawn_graceful_shutdown.sh
ci:
name: CI
runs-on: ubuntu-latest
needs: [boundary-lint, check, fmt, clippy, test, build, bench, integration]
if: always()
steps:
- name: Check all required jobs passed
run: |
if [[ "${{ needs.boundary-lint.result }}" != "success" ]] || \
[[ "${{ needs.check.result }}" != "success" ]] || \
[[ "${{ needs.fmt.result }}" != "success" ]] || \
[[ "${{ needs.clippy.result }}" != "success" ]] || \
[[ "${{ needs.test.result }}" != "success" ]] || \
[[ "${{ needs.build.result }}" != "success" ]] || \
[[ "${{ needs.bench.result }}" != "success" ]] || \
[[ "${{ needs.integration.result }}" != "success" ]]; then
echo "One or more required jobs failed"
exit 1
fi
echo "All required jobs passed"