Skip to content

Release

Release #181

Workflow file for this run

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 and publish Python native SDK (reusable)
# ───────────────────────────────────────────────
publish-python:
name: Python SDK
needs: [ci, ci-windows]
uses: ./.github/workflows/publish-python.yml
secrets: inherit
# ───────────────────────────────────────────────
# Create GitHub Release
# ───────────────────────────────────────────────
github-release:
name: GitHub Release
needs: [publish-crate, publish-node, publish-python]
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