angzarr-client 0.2.0

Ergonomic Rust client for Angzarr CQRS/ES framework
Documentation
name: Release

on:
  push:
    tags:
      - 'v*.*.*'

env:
  REGISTRY: ghcr.io
  RUST_IMAGE: ghcr.io/angzarr-io/angzarr-rust:latest

permissions:
  contents: write
  packages: read

jobs:
  release:
    name: Release to crates.io
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4

      - name: Log in to Container Registry
        uses: docker/login-action@v3
        with:
          registry: ${{ env.REGISTRY }}
          username: ${{ github.actor }}
          password: ${{ secrets.GITHUB_TOKEN }}

      - name: Verify version matches tag
        run: |
          CARGO_VERSION=$(grep '^version = ' Cargo.toml | head -1 | sed 's/version = "\(.*\)"/\1/')
          TAG_VERSION=${GITHUB_REF#refs/tags/v}
          if [ "$CARGO_VERSION" != "$TAG_VERSION" ]; then
            echo "ERROR: Cargo.toml version ($CARGO_VERSION) does not match tag ($TAG_VERSION)"
            exit 1
          fi

      - name: Install buf CLI
        uses: bufbuild/buf-action@v1
        with:
          setup_only: true

      - name: Export protos from Buf registry
        env:
          BUF_TOKEN: ${{ secrets.BUF_TOKEN }}
        run: |
          mkdir -p proto
          buf export buf.build/angzarr/angzarr -o proto

      - name: Build
        run: |
          docker run --rm \
            -v "${{ github.workspace }}:/workspace" \
            -w /workspace \
            -e ANGZARR_PROTO_ROOT=/workspace/proto \
            ${{ env.RUST_IMAGE }} \
            cargo build --release

      - name: Test
        run: |
          docker run --rm \
            -v "${{ github.workspace }}:/workspace" \
            -w /workspace \
            -e ANGZARR_PROTO_ROOT=/workspace/proto \
            ${{ env.RUST_IMAGE }} \
            cargo test --lib

      - name: Publish angzarr-macros to crates.io
        run: |
          docker run --rm \
            -v "${{ github.workspace }}:/workspace" \
            -w /workspace/angzarr-macros \
            -e CARGO_REGISTRY_TOKEN=${{ secrets.CARGO_REGISTRY_TOKEN }} \
            ${{ env.RUST_IMAGE }} \
            cargo publish || echo "macros already published or failed"

      - name: Wait for crates.io index update
        run: sleep 30

      - name: Publish angzarr-client to crates.io
        run: |
          docker run --rm \
            -v "${{ github.workspace }}:/workspace" \
            -w /workspace \
            -e ANGZARR_PROTO_ROOT=/workspace/proto \
            -e CARGO_REGISTRY_TOKEN=${{ secrets.CARGO_REGISTRY_TOKEN }} \
            ${{ env.RUST_IMAGE }} \
            cargo publish --allow-dirty