craftz

CI

Checks every pull request and every push to main with pnpm run verify, the same script Cloudflare runs before each deploy. It doesn't deploy. The Worker's Git integration does that. The job is named ci, the check that branch protection requires.

name: CI

on:
  push:
    branches: [main]
  # A label added or taken off runs it again, for the check below.
  pull_request:
    branches: [main]
    types: [opened, synchronize, reopened, labeled, unlabeled]

concurrency:
  group: ${{ github.workflow }}-${{ github.ref }}
  cancel-in-progress: true

permissions:
  contents: read

jobs:
  ci:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v7
      # Reads the pnpm version from package.json's `packageManager`.
      - uses: pnpm/action-setup@v6
      - uses: actions/setup-node@v7
        with:
          node-version-file: package.json
          cache: pnpm

#One label

A package's release notes are grouped by the label on each pull request, so a pull request without one can't merge. The labels are the ones its .github/release.yml names, which only a package has, so a site or a tool skips this. It runs before the install, to fail fast.

      - name: Label
        if: github.event_name == 'pull_request' && hashFiles('.github/release.yml') != ''
        env:
          LABELS: ${{ toJSON(github.event.pull_request.labels.*.name) }}
        run: |
          node -e '
            const notes = require("node:fs").readFileSync(".github/release.yml", "utf8");
            const known = [...notes.matchAll(/labels: \[(\w+)\]|^ +- (\w+)$/gm)].map((m) => m[1] ?? m[2]);
            const have = JSON.parse(process.env.LABELS).filter((label) => known.includes(label));
            if (have.length !== 1) {
              const found = have.length ? have.join(", ") : "none";
              console.error(`::error::Label this pull request with one of ${known.join(", ")}. It has ${found}.`);
              process.exit(1);
            }
          '

      - run: pnpm install --frozen-lockfile

      - name: Verify
        run: pnpm run verify