chore(release): v4.2.0 (#79) #227
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*" | |
| workflow_dispatch: | |
| permissions: | |
| contents: write | |
| env: | |
| CARGO_TERM_COLOR: always | |
| jobs: | |
| # ─────────────────────────────────────────────── | |
| # Gate: CI checks must pass before any publishing | |
| # ─────────────────────────────────────────────── | |
| ci: | |
| name: CI Checks | |
| 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 | |
| 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: Check version alignment | |
| run: bash check-version.sh | |
| # - name: Tests | |
| # run: cargo test --workspace --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: [ci, ci-windows] | |
| 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: [ci, ci-windows] | |
| 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 |