rts-alloc 4.0.0

Shared memory allocator intended for small frequent allocations
Documentation
name: Release

on:
  workflow_dispatch:
    inputs:
      crate:
        description: "Crate to release"
        required: true
        type: choice
        options:
          - rts-alloc
      ref:
        description: "git ref to tag (can be a branch or a commit hash)"
        required: true
        default: "main"
        type: string

jobs:
  check:
    runs-on: ubuntu-latest
    outputs:
      tag: ${{ steps.meta.outputs.tag }}
      ref: ${{ steps.meta.outputs.ref }}
    steps:
      - uses: actions/checkout@v6
        with:
          ref: ${{ inputs.ref }}
          persist-credentials: false

      - name: Compute metadata
        id: meta
        run: |

          version="$(cargo metadata --format-version 1 --no-deps | jq -r '.packages[] | select(.name == "'"${CRATE_NAME}"'") | .version')"
          if [ -z "${version}" ] || [ "${version}" = "null" ]; then
            echo "Could not resolve version for crate: ${CRATE_NAME}"
            exit 1
          fi

          tag="v${version}"
          ref="$(git rev-parse HEAD)"

          echo "tag=${tag}" >> "${GITHUB_OUTPUT}"
          echo "ref=${ref}" >> "${GITHUB_OUTPUT}"
        env:
          CRATE_NAME: ${{ inputs.crate }}

      - name: Check tag does not exist
        run: |
          echo "checking: refs/tags/${TAG}"
          if git ls-remote --exit-code --tags origin "refs/tags/${TAG}" >/dev/null 2>&1; then
            echo "Tag already exists: ${TAG}. Please bump the version first (or delete the existing tag) and retry."
            echo "Tag exists: ${TAG}" >> "${GITHUB_STEP_SUMMARY}"
            exit 1
          fi
        env:
          TAG: ${{ steps.meta.outputs.tag }}

      - name: Cargo publish dry run
        run: |
          cargo publish -p "${CRATE_NAME}" --dry-run
        env:
          CRATE_NAME: ${{ inputs.crate }}

      - name: Summary
        run: |
          echo "Tag: ${TAG}" >> "${GITHUB_STEP_SUMMARY}"
          echo "Ref: ${REF} (https://github.com/${{ github.repository }}/commit/${REF})" >> "${GITHUB_STEP_SUMMARY}"
        env:
          TAG: ${{ steps.meta.outputs.tag }}
          REF: ${{ steps.meta.outputs.ref }}

  publish:
    runs-on: ubuntu-latest
    environment: prod
    needs: check
    permissions:
      id-token: write
      contents: write
      attestations: write
      artifact-metadata: write
    steps:
      - uses: actions/create-github-app-token@v2
        id: app-token
        with:
          app-id: ${{ vars.APP_ID }}
          private-key: ${{ secrets.PRIVATE_KEY }}

      - name: Set git config
        run: |
          git config --global user.email "github-actions@github.com"
          git config --global user.name "github-actions"
          git config --global url."https://x-access-token:${GITHUB_TOKEN}@github.com/".insteadOf https://github.com/
        env:
          GITHUB_TOKEN: ${{ steps.app-token.outputs.token }}

      - uses: actions/checkout@v6
        with:
          token: ${{ steps.app-token.outputs.token }}
          persist-credentials: false
          ref: ${{ needs.check.outputs.ref }}

      - run: |
          git tag -a "${TAG}" -m "Release ${TAG}"
          git push --tags
        env:
          TAG: ${{ needs.check.outputs.tag }}

      - name: Package crate
        run: cargo package -p "${CRATE_NAME}"
        env:
          CRATE_NAME: ${{ inputs.crate }}

      - name: Generate SLSA provenance
        uses: actions/attest-build-provenance@v3
        with:
          subject-path: target/package/*.crate

      - uses: rust-lang/crates-io-auth-action@v1
        id: auth

      - run: cargo publish -p "${CRATE_NAME}"
        env:
          CRATE_NAME: ${{ inputs.crate }}
          CARGO_REGISTRY_TOKEN: ${{ steps.auth.outputs.token }}

      - name: Create Github Release
        run: |
          gh release create "${TAG}" --title "${TAG}" --generate-notes
        env:
          TAG: ${{ needs.check.outputs.tag }}
          GITHUB_TOKEN: ${{ steps.app-token.outputs.token }}