# Build and publish the @deepseek-ai/node-addon-landlock-run package family from the
# harness source of record. Rehearsal and publication consume the same packed
# tarballs; each native binary is built on its matching architecture.
name: Landlock Run Release

on:
  workflow_dispatch:
    inputs:
      publish:
        description: Publish packed tarballs to npm. Must run from a landlock-run-v* tag.
        required: true
        type: boolean
        default: false

permissions:
  contents: read

concurrency:
  # Stable/prerelease dist-tags are shared registry state; serialize release
  # runs so two versions cannot race the final tag assignment.
  group: ${{ github.workflow }}
  cancel-in-progress: false

defaults:
  run:
    working-directory: native/landlock-run

jobs:
  matrix:
    name: Matrix
    runs-on: ubuntu-24.04
    outputs:
      prebuilds: ${{ steps.matrix.outputs.prebuilds }}
    steps:
      - uses: actions/checkout@v4

      - id: matrix
        run: echo "prebuilds=$(node ./scripts/github-matrix.mjs release-prebuild)" >> "$GITHUB_OUTPUT"

  build-prebuilds:
    name: ${{ matrix.package }}
    needs: matrix
    runs-on: ${{ matrix.runner }}
    strategy:
      fail-fast: false
      matrix: ${{ fromJson(needs.matrix.outputs.prebuilds) }}
    steps:
      - uses: actions/checkout@v4

      - uses: pnpm/action-setup@v4
        with:
          package_json_file: package.json

      - uses: actions/setup-node@v4
        with:
          node-version: 24
          cache: pnpm
          cache-dependency-path: pnpm-lock.yaml

      - name: Install dependencies
        run: pnpm install --filter @deepseek-ai/node-addon-landlock-run-workspace... --frozen-lockfile

      - name: Install musl toolchain
        run: |
          sudo apt-get update -q
          sudo apt-get install -yq musl-tools

      - name: Build native binaries
        run: pnpm build:native

      - name: Verify binary metadata
        run: node ./scripts/verify-launcher-binary.mjs ${{ matrix.dir }}

      - name: Upload prebuild artifact
        uses: actions/upload-artifact@v4
        with:
          name: ${{ matrix.artifact }}
          path: native/landlock-run/${{ matrix.dir }}/bin/*
          if-no-files-found: error
          retention-days: 7

  pack:
    name: Pack npm tarballs
    needs: build-prebuilds
    runs-on: ubuntu-24.04
    steps:
      - uses: actions/checkout@v4

      - uses: pnpm/action-setup@v4
        with:
          package_json_file: package.json

      - uses: actions/setup-node@v4
        with:
          node-version: 24
          cache: pnpm
          cache-dependency-path: pnpm-lock.yaml

      - name: Install dependencies
        run: pnpm install --filter @deepseek-ai/node-addon-landlock-run-workspace... --frozen-lockfile

      - name: Build TypeScript
        run: pnpm build:ts

      - name: Verify release version
        run: node ./scripts/verify-release.mjs
        env:
          RELEASE_PUBLISH: ${{ inputs.publish }}

      - name: Download prebuild artifacts
        uses: actions/download-artifact@v4
        with:
          pattern: prebuild-*
          path: native/landlock-run/.release/prebuild-artifacts

      - name: Assemble and verify prebuilds
        run: node ./scripts/assemble-prebuilds.mjs .release/prebuild-artifacts

      - name: Verify release payload
        run: node ./scripts/verify-release.mjs --prebuilds
        env:
          RELEASE_PUBLISH: ${{ inputs.publish }}

      - name: Pack release tarballs
        run: node ./scripts/pack-release.mjs dist/npm

      - name: Verify packed install
        run: node ./scripts/verify-packed-install.mjs dist/npm
        env:
          NALR_REQUIRE_LANDLOCK: 1

      - name: Upload npm tarballs
        uses: actions/upload-artifact@v4
        with:
          name: npm-tarballs
          path: native/landlock-run/dist/npm/*
          if-no-files-found: error
          retention-days: 7

  publish:
    name: Publish to npm
    if: inputs.publish
    needs: pack
    runs-on: ubuntu-24.04
    environment: npm-publish
    permissions:
      contents: read
      id-token: write
    steps:
      # The publish script is the only repository file this job needs, and it
      # imports nothing outside Node's builtins, so there is no install step.
      - uses: actions/checkout@v4
        with:
          persist-credentials: false

      - uses: actions/setup-node@v4
        with:
          node-version: 24
          registry-url: https://registry.npmjs.org

      - name: Download npm tarballs
        uses: actions/download-artifact@v4
        with:
          name: npm-tarballs
          path: native/landlock-run/dist/npm

      - name: Configure npm token fallback
        env:
          NPM_TOKEN: ${{ secrets.NPM_TOKEN }}
        run: |
          if [[ -n "$NPM_TOKEN" ]]; then
            echo "NODE_AUTH_TOKEN=$NPM_TOKEN" >> "$GITHUB_ENV"
          fi

      - name: Publish tarballs
        # Publication is decided per package against the registry, so re-running
        # this job over the same artifact skips what already landed instead of
        # failing on it. A bare `npm publish` loop could not be retried: the
        # registry answers a repeat of an existing version permanently.
        run: node ./scripts/publish-release.mjs dist/npm
