release: Gitea release pipeline on v<CLI version> tags; 1.0.1-rc.1 #15

Merged
james.maes merged 2 commits from ci/release-pipeline into main 2026-11-08 13:43:34 +00:00
Owner

Owner decision 2026-11-08 (Q3): port the full release pipeline, including Homebrew and Scoop.

.gitea/workflows/release.yaml (on v* tags; the tag must equal packages/cli/package.json):

  1. linux (container-build, node 22.23.4, Bun 1.4.4 sha256-pinned): scripts/release.mjs --skip-binaries as the gate (npm ci, generate drift, build, readiness for finals, tests, lint, TUI tests + typecheck, pack dry runs); binaries linux-x64/arm64 (+musl) and darwin-x64 (cross); verify-binary.sh; draft Gitea release with those binaries.
  2. macos (qqq-macos-arm64) and windows (qqq-windows-vm6218): pinned Node (SHASUMS256) + Bun (pinned sha256), npm ci/build/test/lint, native --host binary, verify-binary smoke, upload to the draft. (Inline: the shared macos.yaml/windows.yaml were not on ci-workflows main yet.)
  3. publish: SHA256SUMS from the jobs' checksums; publish the release, then download every asset and sha256sum --check; npm publish the four packages to the QRun-IO Gitea npm registry with PACKAGES_TOKEN (skip a version that already exists; prerelease -> next); update-packaging.mjs; for final versions push to QRun-IO/homebrew-tap and QRun-IO/scoop-bucket when PACKAGES_TOKEN can write them, else attach qqq.rb/qqq.json to the release for a PR.

Also: release.mjs accepts its own tag at HEAD and prints the new path; install.sh, update-packaging(+test), formula and manifest now download from Gitea v<version> releases (Scoop checkver uses the Gitea API); publishConfig -> Gitea; build.yaml branches only; docs/release-runbook.md rewritten. Not automated: macOS/Windows signing (no credentials on runners); no Gitea attestation equivalent.

Versions for the proof tag v1.0.1-rc.1: cli/core 1.0.1-rc.1, client 1.8.1-rc.1 (content changed since 1.0.0), conformance 1.6.0 unchanged. Does not touch the owner's release/1.1.0 branch.

🤖 Generated with Claude Code

Owner decision 2026-11-08 (Q3): port the full release pipeline, including Homebrew and Scoop. **`.gitea/workflows/release.yaml`** (on `v*` tags; the tag must equal `packages/cli/package.json`): 1. `linux` (container-build, node 22.23.4, Bun 1.4.4 sha256-pinned): `scripts/release.mjs --skip-binaries` as the gate (npm ci, generate drift, build, readiness for finals, tests, lint, TUI tests + typecheck, pack dry runs); binaries linux-x64/arm64 (+musl) and darwin-x64 (cross); `verify-binary.sh`; **draft** Gitea release with those binaries. 2. `macos` (`qqq-macos-arm64`) and `windows` (`qqq-windows-vm6218`): pinned Node (SHASUMS256) + Bun (pinned sha256), npm ci/build/test/lint, native `--host` binary, verify-binary smoke, upload to the draft. (Inline: the shared macos.yaml/windows.yaml were not on ci-workflows main yet.) 3. `publish`: SHA256SUMS from the jobs' checksums; publish the release, then download every asset and `sha256sum --check`; npm publish the four packages to the QRun-IO Gitea npm registry with PACKAGES_TOKEN (skip a version that already exists; prerelease -> `next`); `update-packaging.mjs`; for final versions push to QRun-IO/homebrew-tap and QRun-IO/scoop-bucket when PACKAGES_TOKEN can write them, else attach `qqq.rb`/`qqq.json` to the release for a PR. Also: release.mjs accepts its own tag at HEAD and prints the new path; install.sh, update-packaging(+test), formula and manifest now download from Gitea `v<version>` releases (Scoop checkver uses the Gitea API); publishConfig -> Gitea; build.yaml branches only; `docs/release-runbook.md` rewritten. Not automated: macOS/Windows signing (no credentials on runners); no Gitea attestation equivalent. Versions for the proof tag `v1.0.1-rc.1`: cli/core 1.0.1-rc.1, client 1.8.1-rc.1 (content changed since 1.0.0), conformance 1.6.0 unchanged. Does not touch the owner's `release/1.1.0` branch. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
james.maes added 1 commit 2026-11-08 13:37:22 +00:00
release: Gitea release pipeline on v<CLI version> tags; 1.0.1-rc.1
node / node (push) Failing after 45s
build / node (push) Failing after 45s
9890fb1300
.gitea/workflows/release.yaml replaces the orb publish and the GitHub release:
the scripts/release.mjs gate, Linux + darwin-x64 binaries in the container,
darwin-arm64 and windows-x64 built and smoke-tested on the native runners, a
draft Gitea release, SHA256SUMS checked against the published downloads, the
four packages to the QRun-IO Gitea npm registry (an existing version is
skipped, each package's own version picks next/latest), and for final versions
the Homebrew tap and Scoop bucket (pushed when PACKAGES_TOKEN can write them,
else the filled files are attached to the release).

release.mjs accepts its tag when it points at HEAD and prints the new path;
install.sh, update-packaging, the formula and the manifest use Gitea
downloads under v<version>; publishConfig points at the Gitea registry;
build.yaml now runs on branches only; the runbook describes the new path.
Versions: cli and core 1.0.1-rc.1, client 1.8.1-rc.1 (content changed since
1.0.0), conformance 1.6.0 unchanged.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
james.maes added 1 commit 2026-11-08 13:41:50 +00:00
test(cli): the print footer names CLI_VERSION, prerelease versions included
node / node (push) Successful in 1m20s
build / node (push) Successful in 1m19s
61c645d581
The footer assertion only accepted X.Y.Z, so any -rc.N version failed it.
It now compares against CLI_VERSION exactly (port masked), which is stricter.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
james.maes merged commit c9f033192e into main 2026-11-08 13:43:34 +00:00
james.maes deleted branch ci/release-pipeline 2026-11-08 13:43:34 +00:00
Sign in to join this conversation.