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

This commit is contained in:
CRTkafa 2026-10-15 19:58:47 +08:00
parent e7e26db4aa
commit 9d41fcdc50
2 changed files with 19 additions and 28 deletions

View file

@ -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-<sha>, green.json last)

View file

@ -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<void> {
${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<void> {
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<void> {
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