name: Pact record deployment

# Records a production deployment of nextcloud-mcp-server in the Pact Broker
# (ADR-029). This is the missing half of the can-i-deploy loop: can-i-deploy
# checks the candidate against whatever is currently in `production`, and this
# workflow tells the broker what `production` now contains.
#
# Trigger: tag push (v*). The release pipeline (bump-version -> tag -> docker /
# app-store publish) cuts a tag for every shipped version, so a tag push is the
# repo-controlled signal that this version is going to production.
#
# Version identity: on a tag-push event GITHUB_SHA is the commit the tag points
# to (the "bump: version ..." commit). pact.yml publishes consumer pacts and
# provider verification results keyed by that same SHA when the bump commit
# lands on master, so recording the deployment with ${{ github.sha }} links the
# deployed version to its already-verified pacts. Recording the tag string
# instead would NOT match and can-i-deploy would stay red.
#
# The broker is only reachable over Tailscale; the step no-ops when the broker
# secrets are absent (e.g. forks).
#
# Required repo/org secrets:
#   TS_OAUTH_CLIENT_ID / TS_OAUTH_SECRET  - Tailscale github-runner OAuth client
#   PACT_BROKER / PACT_USERNAME / PACT_PASSWORD  - broker URL + basic auth

on:
  push:
    tags:
      - "v*"

# A re-tag (e.g. after a botched release) could push the same/overlapping tag
# twice; don't cancel an in-flight recording — let it complete.
concurrency:
  group: pact-record-deployment-${{ github.ref }}
  cancel-in-progress: false

env:
  PACT_BROKER: ${{ secrets.PACT_BROKER }}
  PACT_USERNAME: ${{ secrets.PACT_USERNAME }}
  PACT_PASSWORD: ${{ secrets.PACT_PASSWORD }}

jobs:
  record-deployment:
    name: Record production deployment
    runs-on: ubuntu-latest
    # Least-privilege: scope the token at job level (GitHub Actions S8264).
    permissions:
      contents: read
    timeout-minutes: 5
    steps:
      - name: Join tailnet
        if: ${{ env.PACT_BROKER != '' }}
        uses: tailscale/github-action@306e68a486fd2350f2bfc3b19fcd143891a4a2d8 # v4
        with:
          oauth-client-id: ${{ secrets.TS_OAUTH_CLIENT_ID }}
          oauth-secret: ${{ secrets.TS_OAUTH_SECRET }}
          tags: tag:github-runner

      - name: Install Pact CLI
        if: ${{ env.PACT_BROKER != '' }}
        run: |
          curl -fsSL https://raw.githubusercontent.com/pact-foundation/pact-ruby-standalone/f03e620e7552239b6ca59438c9beed9d1038c949/install.sh | bash # v2.6.1
          echo "$PWD/pact/bin" >> "$GITHUB_PATH"

      - name: Record deployment to production
        if: ${{ env.PACT_BROKER != '' }}
        run: |
          pact-broker record-deployment \
            --broker-base-url "$PACT_BROKER" \
            --broker-username "$PACT_USERNAME" \
            --broker-password "$PACT_PASSWORD" \
            --pacticipant nextcloud-mcp-server \
            --version "$GITHUB_SHA" \
            --environment production
