name: Publish to crates.io
on:
push:
tags:
- 'v*'
env:
CARGO_TERM_COLOR: always
SF_USE_PUBLISHED_DEPS: "1"
jobs:
publish:
if: ${{ github.server_url == 'https://github.com' }}
name: Publish
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install Rust
uses: dtolnay/rust-toolchain@stable
with:
components: rustfmt, clippy
- name: Verify release metadata
shell: bash
run: |
EXPECTED_VERSION="${GITHUB_REF#refs/tags/v}"
MANIFEST_VERSION=$(sed -n 's/^version = "\(.*\)"/\1/p' Cargo.toml | head -1)
PACKAGE_JSON_VERSION=$(sed -n 's/.*"version": "\(.*\)".*/\1/p' package.json | head -1)
if [ "$MANIFEST_VERSION" != "$EXPECTED_VERSION" ]; then
echo "::error::Cargo.toml version ${MANIFEST_VERSION} does not match tag ${EXPECTED_VERSION}"
exit 1
fi
if [ "$PACKAGE_JSON_VERSION" != "$EXPECTED_VERSION" ]; then
echo "::error::package.json version ${PACKAGE_JSON_VERSION} does not match tag ${EXPECTED_VERSION}"
exit 1
fi
cargo metadata --locked --format-version 1 >/dev/null
- name: Cache Rust artifacts
uses: Swatinem/rust-cache@v2
- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: "3.11"
- name: Install pre-commit
shell: bash
run: python -m pip install --upgrade pip pre-commit
- name: Set up Node
uses: actions/setup-node@v4
with:
node-version: "22"
cache: npm
cache-dependency-path: package-lock.json
- name: Install Node dependencies
run: npm ci
- name: Install Playwright Chromium
run: make install-e2e
- name: Check formatting
run: cargo fmt --all -- --check
- name: Run clippy
run: cargo clippy --all-targets -- -D warnings
- name: Build CLI
run: cargo build --locked
- name: Run CLI unit tests
run: cargo test --locked --bin solverforge
- name: Run scaffold contract tests
run: cargo test --locked --test scaffold_test -- --nocapture --test-threads=1
- name: Run pre-commit
run: make pre-commit
- name: Run full integration validation
run: make test-full
- name: Publish solverforge-cli
run: cargo publish --locked --token ${{ secrets.CARGO_REGISTRY_TOKEN }}