rts-alloc 5.1.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@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
        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@bcd2ba49218906704ab6c1aa796996da409d3eb1 # v3.2.0
        id: app-token
        with:
          client-id: ${{ vars.CLIENT_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@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
        with:
          token: ${{ steps.app-token.outputs.token }}
          persist-credentials: false
          ref: ${{ needs.check.outputs.ref }}
          # Default depth is 1. We need Entire history
          # for git-cliff to view the history to generate
          # the changelog
          fetch-depth: 0

      - 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@4d101475d8b20a2381f78447822ac1eab6504dd8 # v4.2.2
        with:
          subject-path: target/package/*.crate

      - uses: rust-lang/crates-io-auth-action@c6f97d42243bad5fab37ca0427f495c86d5b1a18 # v1.0.5
        id: auth

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

      - name: Generate changelog
        uses: orhun/git-cliff-action@f50e11560dce63f7c33227798f90b924471a88b5 # v4.8.0
        with:
          config: cliff.toml
          args: --latest --strip header
        env:
          OUTPUT: CHANGELOG.md

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