Release #172
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 -- -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 -- -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 |