Merge pull request #16 from A3S-Lab/codex/integrate-code-5.3.6-20260719 #26
Workflow file for this run
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| name: Release | |
| on: | |
| push: | |
| tags: | |
| - "v*" | |
| permissions: | |
| contents: write | |
| env: | |
| CARGO_TERM_COLOR: always | |
| CARGO_INCREMENTAL: 0 | |
| CARGO_PROFILE_DEV_DEBUG: 0 | |
| CARGO_PROFILE_TEST_DEBUG: 0 | |
| jobs: | |
| # ─────────────────────────────────────────────── | |
| # Gate: CI checks must pass before any publishing | |
| # ─────────────────────────────────────────────── | |
| ci: | |
| name: CI Checks | |
| runs-on: ubuntu-latest | |
| steps: | |
| - uses: actions/checkout@v4 | |
| with: | |
| fetch-depth: 0 | |
| - name: Setup workspace context | |
| run: bash .github/setup-workspace.sh | |
| - name: Install Rust | |
| uses: dtolnay/rust-toolchain@stable | |
| with: | |
| components: rustfmt, clippy | |
| - name: Install protobuf compiler | |
| run: sudo apt-get update && sudo apt-get install -y protobuf-compiler | |
| - name: Format check | |
| run: cargo fmt --all -- --check | |
| - name: Clippy | |
| run: cargo clippy --workspace --lib --bins -- -D warnings | |
| - name: Validate release tag and version alignment | |
| shell: bash | |
| run: | | |
| set -euo pipefail | |
| case "$GITHUB_REF" in | |
| refs/tags/v*) ;; | |
| *) echo "Release publishing requires a v* tag" >&2; exit 1 ;; | |
| esac | |
| VERSION="${GITHUB_REF_NAME#v}" | |
| test -n "$VERSION" | |
| bash check-version.sh "$VERSION" | |
| - name: Check public API compatibility with v5.3.5 | |
| run: | | |
| cargo install cargo-semver-checks --version 0.48.0 --locked | |
| bash scripts/check_semver.sh 5.3.5 | |
| - name: Check SDK protocol and API alignment | |
| run: | | |
| node scripts/generate_event_protocol_artifacts.mjs --check | |
| node scripts/sdk_api_alignment_check.mjs | |
| - name: Check Node SDK | |
| run: cargo check --manifest-path sdk/node/Cargo.toml | |
| - name: Check Python SDK | |
| run: cargo check --manifest-path sdk/python/Cargo.toml | |
| - name: Reclaim build space before tests | |
| run: | | |
| cargo clean --manifest-path sdk/node/Cargo.toml | |
| cargo clean --manifest-path sdk/python/Cargo.toml | |
| cargo clean | |
| - name: Default tests | |
| run: cargo test --workspace | |
| - name: Feature-gated library tests | |
| run: cargo test --workspace --all-features --lib | |
| # ─────────────────────────────────────────────── | |
| # Windows cross-compile check | |
| # ─────────────────────────────────────────────── | |
| ci-windows: | |
| name: CI Checks (Windows) | |
| runs-on: windows-latest | |
| steps: | |
| - uses: actions/checkout@v4 | |
| - name: Setup workspace context | |
| shell: bash | |
| run: bash .github/setup-workspace.sh | |
| - name: Install Rust | |
| uses: dtolnay/rust-toolchain@stable | |
| - name: Clippy (Windows) | |
| run: cargo clippy --workspace --lib --bins -- -D warnings | |
| - name: Tests (Windows) | |
| run: cargo test --workspace --lib | |
| # ─────────────────────────────────────────────── | |
| # Publish a3s-code-core to crates.io | |
| # ─────────────────────────────────────────────── | |
| publish-crate: | |
| name: Publish to crates.io | |
| needs: [ci, ci-windows] | |
| runs-on: ubuntu-latest | |
| steps: | |
| - uses: actions/checkout@v4 | |
| - name: Setup workspace context | |
| run: bash .github/setup-workspace.sh | |
| - name: Install Rust | |
| uses: dtolnay/rust-toolchain@stable | |
| - name: Install protobuf compiler | |
| run: sudo apt-get update && sudo apt-get install -y protobuf-compiler | |
| - name: Publish a3s-code-core | |
| working-directory: core | |
| env: | |
| CARGO_REGISTRY_TOKEN: ${{ secrets.CARGO_TOKEN }} | |
| run: | | |
| VERSION=$(cargo metadata --no-deps --format-version 1 | python3 -c 'import json,sys; print(json.load(sys.stdin)["packages"][0]["version"])') | |
| if curl -fsSL "https://crates.io/api/v1/crates/a3s-code-core/${VERSION}" >/dev/null 2>&1; then | |
| echo "a3s-code-core ${VERSION} already exists on crates.io, skipping publish." | |
| exit 0 | |
| fi | |
| set +e | |
| OUTPUT=$(cargo publish --allow-dirty 2>&1) | |
| STATUS=$? | |
| set -e | |
| echo "$OUTPUT" | |
| if [ "$STATUS" -ne 0 ]; then | |
| if echo "$OUTPUT" | grep -Eqi "already (uploaded|exists)"; then | |
| echo "a3s-code-core ${VERSION} was already published, treating as success." | |
| exit 0 | |
| fi | |
| exit "$STATUS" | |
| fi | |
| # ─────────────────────────────────────────────── | |
| # Build and publish Node native SDK (reusable) | |
| # ─────────────────────────────────────────────── | |
| publish-node: | |
| name: Node SDK | |
| needs: [publish-crate] | |
| uses: ./.github/workflows/publish-node.yml | |
| secrets: inherit | |
| # ─────────────────────────────────────────────── | |
| # Build native Python wheels and attach to GitHub Release (reusable). | |
| # No longer pushes to PyPI — the per-project size cap made that | |
| # impractical. GH Release is the canonical wheel host. | |
| # ─────────────────────────────────────────────── | |
| publish-python: | |
| name: Python SDK (native wheels → GH Release) | |
| needs: [publish-crate] | |
| uses: ./.github/workflows/publish-python.yml | |
| secrets: inherit | |
| # ─────────────────────────────────────────────── | |
| # Publish the pure-Python bootstrap to PyPI so `pip install a3s-code` | |
| # still works. Needs the native wheels to be on GH Release first. | |
| # ─────────────────────────────────────────────── | |
| publish-python-bootstrap: | |
| name: Python SDK (bootstrap → PyPI) | |
| needs: [publish-python] | |
| uses: ./.github/workflows/publish-python-bootstrap.yml | |
| secrets: inherit | |
| # ─────────────────────────────────────────────── | |
| # Create GitHub Release | |
| # ─────────────────────────────────────────────── | |
| github-release: | |
| name: GitHub Release | |
| needs: [publish-crate, publish-node, publish-python, publish-python-bootstrap] | |
| runs-on: ubuntu-latest | |
| steps: | |
| - uses: actions/checkout@v4 | |
| with: | |
| fetch-depth: 0 | |
| - name: Generate release notes | |
| run: | | |
| PREV_TAG=$(git tag --sort=-v:refname | grep '^v' | head -2 | tail -1) | |
| if [ -z "$PREV_TAG" ]; then | |
| echo "Initial release" > /tmp/release-notes.md | |
| else | |
| git log "${PREV_TAG}..HEAD" --oneline --no-merges --pretty=format:"- %s" | head -50 > /tmp/release-notes.md | |
| fi | |
| - name: Create release | |
| env: | |
| GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} | |
| run: | | |
| if gh release view "$GITHUB_REF_NAME" &>/dev/null; then | |
| gh release edit "$GITHUB_REF_NAME" \ | |
| --title "$GITHUB_REF_NAME" \ | |
| --notes-file /tmp/release-notes.md | |
| else | |
| gh release create "$GITHUB_REF_NAME" \ | |
| --title "$GITHUB_REF_NAME" \ | |
| --notes-file /tmp/release-notes.md | |
| fi |