From 9d41fcdc50a24c66a6c3aa60610bdf14a0f83ca8 Mon Sep 17 00:00:00 2001 From: CRT Date: Thu, 15 Oct 2026 19:58:47 +0800 Subject: [PATCH] no CI, no acceptance runs (the owner's decision): Forgejo's ci and acceptance jobs are off (if: false), the record job needs only the Linux / Windows installers; release.ts skips ci:quick, the macOS acceptance matrix and its report (TESTS = false); build, signing, notarization, privacy scans and verify stay --- .forgejo/workflows/ci.yml | 22 ++++------------------ tools/release.ts | 25 +++++++++++++++---------- 2 files changed, 19 insertions(+), 28 deletions(-) diff --git a/.forgejo/workflows/ci.yml b/.forgejo/workflows/ci.yml index e37e533..ddf4ff2 100644 --- a/.forgejo/workflows/ci.yml +++ b/.forgejo/workflows/ci.yml @@ -55,9 +55,10 @@ jobs: export PATH="$HOME/.bun/bin:$PATH" bun tools/release-candidate.ts gate --sha "$SHA" --wait 40 + # off by the owner's decision (2026-10-15: no CI, no acceptance runs); the jobs stay for a manual comeback ci: needs: gate - if: needs.gate.outputs.reuse != 'true' + if: false # runner label: ubuntu-22.04:docker://ghcr.io/catthehacker/ubuntu:act-22.04 runs-on: ubuntu-22.04 timeout-minutes: 60 @@ -77,7 +78,7 @@ jobs: # (tools/release.ts, cached per CLI key). acceptance: needs: gate - if: needs.gate.outputs.reuse != 'true' + if: false strategy: fail-fast: false matrix: @@ -288,7 +289,7 @@ jobs: record: needs: [gate, ci, acceptance, linux, windows] - if: ${{ always() && github.event_name != 'pull_request' && needs.gate.result == 'success' && needs.linux.result == 'success' && needs.windows.result == 'success' && ((needs.gate.outputs.reuse == 'true' && needs.ci.result == 'skipped' && needs.acceptance.result == 'skipped') || (needs.ci.result == 'success' && needs.acceptance.result == 'success')) }} + if: ${{ always() && github.event_name != 'pull_request' && needs.gate.result == 'success' && needs.linux.result == 'success' && needs.windows.result == 'success' }} runs-on: ubuntu-22.04 timeout-minutes: 30 env: @@ -315,21 +316,6 @@ jobs: with: name: storebound-desktop-windows path: cand - - uses: actions/download-artifact@v3 - if: ${{ needs.gate.outputs.reuse != 'true' }} - with: - path: runs - - name: Acceptance runs (this run's, or the version-only parent's) - run: | - mkdir -p cand/acceptance - if [ "$REUSE" = true ]; then - bun tools/release-candidate.ts fetch --sha "$FROM" --dir cand/acceptance --only '^acceptance-.*\.json$' - else - find runs -path '*acceptance-*' -name '*.json' -exec cp {} cand/acceptance/ \; - fi - ls cand/acceptance - V=$(bun tools/desktop-version.ts --print) - bun tools/acceptance.ts report cand/acceptance --md "cand/storebound_${V}_acceptance.md" --expect 6 --strict - name: Checksums file of the build jobs is not shipped as is run: rm -f cand/SHA256SUMS - name: Record the candidate (draft rc-, green.json last) diff --git a/tools/release.ts b/tools/release.ts index 1207b4d..43c868f 100644 --- a/tools/release.ts +++ b/tools/release.ts @@ -46,6 +46,9 @@ const KEYS = process.env.STOREBOUND_KEYS_DIR ?? join(HOME, '.storebound-keys'); const ACC_CACHE = join(RELEASES, 'acceptance-cache'); const APP_ID = 'dev.storebound.desktop'; const HEARTBEAT_MS = 30_000; +/** The owner's decision (2026-10-15): no CI and no acceptance runs in a release (no ci:quick, no macOS matrix, no + * matrix report); the build, signing, notarization, privacy scans and verify stay. */ +const TESTS = false; // --------------------------------------------------------------------------------------------------------------------- // Pure parts (tests/release.test.ts) @@ -270,7 +273,7 @@ async function main(): Promise { ${rehearsal ? 'app copied to a scratch folder; then the tag, release, candidates, branch and storebound.dev files of the rehearsal are deleted' : 'update /Applications/storebound.app; print npm publish + npm deprecate'}`); if (!yes) { console.log('\ndry run: nothing changed (--yes to release)'); return; } - const accP = phase('macOS acceptance (cache or 3 runs)', () => macAcceptance(key, logDir)); + const accP = TESTS ? phase('macOS acceptance (cache or 3 runs)', () => macAcceptance(key, logDir)) : Promise.resolve(''); accP.catch(() => undefined); // ---------------------------------------------------------------- 2. + 3. bump, gate, commit, push @@ -280,7 +283,7 @@ async function main(): Promise { if (rehearsal) sh(['git', 'checkout', '-q', '-b', branch]); setVersion(version); if (!rehearsal) writeFileSync(join(ROOT, 'CHANGELOG.md'), cutChangelog(readFileSync(join(ROOT, 'CHANGELOG.md'), 'utf8'), version, new Date().toISOString().slice(0, 10))); - const code = await bg('ci:quick', ['bun', 'run', 'ci:quick'], join(logDir, 'ci-quick.log'), { timeoutMs: 15 * 60_000 }); + const code = TESTS ? await bg('ci:quick', ['bun', 'run', 'ci:quick'], join(logDir, 'ci-quick.log'), { timeoutMs: 15 * 60_000 }) : 0; if (code !== 0) { // nothing was committed or pushed: put the checkout back as it was sh(['git', 'checkout', '-q', '--', '.']); @@ -320,15 +323,17 @@ async function main(): Promise { await phase('add Linux / Windows + acceptance matrix + verify', async () => { const files = readdirSync(dl).filter(f => /\.(AppImage|deb|exe)$/.test(f)).map(f => join(dl, f)); sh(['bun', 'tools/desktop-release.ts', 'add', '--out', out, '--commit', sha, '--run', cand.record.run, ...files]); - const accDir = mkdtempSync(join(tmpdir(), 'sb-acc-')); - for (const f of readdirSync(dl).filter(f => /^acceptance-.*\.json$/.test(f))) writeFileSync(join(accDir, f), readFileSync(join(dl, f))); - const macDir = await accP; - for (const r of RUNTIMES) writeFileSync(join(accDir, r.file), readFileSync(join(macDir, r.file))); - const md = join(logDir, `storebound_${version}_acceptance.md`); - sh(['bun', 'tools/acceptance.ts', 'report', accDir, '--md', md, '--expect', '9', '--strict']); - rmSync(accDir, { recursive: true, force: true }); + if (TESTS) { + const accDir = mkdtempSync(join(tmpdir(), 'sb-acc-')); + for (const f of readdirSync(dl).filter(f => /^acceptance-.*\.json$/.test(f))) writeFileSync(join(accDir, f), readFileSync(join(dl, f))); + const macDir = await accP; + for (const r of RUNTIMES) writeFileSync(join(accDir, r.file), readFileSync(join(macDir, r.file))); + const md = join(logDir, `storebound_${version}_acceptance.md`); + sh(['bun', 'tools/acceptance.ts', 'report', accDir, '--md', md, '--expect', '9', '--strict']); + rmSync(accDir, { recursive: true, force: true }); + await upsert({ tag, files: [md], create: false, yes: true }); + } sh(['bun', 'tools/desktop-release.ts', 'verify', '--out', out]); - await upsert({ tag, files: [md], create: false, yes: true }); }); // ---------------------------------------------------------------- 6. publish