Fix: Release als Draft anlegen, erst nach Asset-Upload veroeffentlichen (Auto-Update-Race)

User-Report: Auto-Update schlug mit "Setup-Asset nicht gefunden" fehl, wenn der Update-Check
waehrend des Asset-Uploads eines neuen Releases feuerte. Ursache: release:gitea pushte Tag +
erstellte das Release (draft:false) VOR dem Asset-Upload → das "latest"-Release war den ganzen
Upload ueber sichtbar, aber ohne latest.yml (Gitea-Assets haben keinen digest → der Updater
holt den Integritaets-Hash aus latest.yml, das zuletzt hochgeladen wird). Fix: Release als
draft:true anlegen → alle Assets hochladen → dann PATCH draft:false. Der Updater ueberspringt
Drafts und sieht das Release erst, wenn es komplett ist.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Sucukdeluxe 2026-05-31 20:21:37 +02:00
parent 2ad08fda05
commit 254fce8736

View File

@ -256,7 +256,10 @@ async function createOrGetRelease(baseApi, tag, authHeader, notes) {
target_commitish: "main",
name: tag,
body: notes || `Release ${tag}`,
draft: false,
// Als Draft anlegen — der Auto-Updater ueberspringt Drafts. So wird das Release erst
// NACH dem Asset-Upload (unten via PATCH draft:false) "latest"; ein Update-Check kann
// nie ein Release ohne Setup/latest.yml sehen ("Setup-Asset nicht gefunden").
draft: true,
prerelease: false
};
const created = await apiRequest("POST", `${baseApi}/releases`, authHeader, JSON.stringify(payload));
@ -363,6 +366,14 @@ async function main() {
const release = await createOrGetRelease(baseApi, tag, authHeader, releaseNotes);
await uploadReleaseAssets(baseApi, release.id, authHeader, assets.releaseDir, assets.files);
// Erst JETZT veroeffentlichen (draft:false), nachdem ALLE Assets oben hochgeladen sind.
// Davor war das Release den ganzen Upload ueber sichtbar, aber ohne latest.yml/Setup →
// Auto-Update-Checks in diesem Fenster scheiterten mit "Setup-Asset nicht gefunden".
const published = await apiRequest("PATCH", `${baseApi}/releases/${release.id}`, authHeader, JSON.stringify({ draft: false }));
if (!published.ok) {
throw new Error(`Failed to publish release (${published.status}): ${JSON.stringify(published.body)}`);
}
process.stdout.write(`Release published: ${release.html_url || `${repo.baseUrl}/${repo.owner}/${repo.repo}/releases/tag/${tag}`}\n`);
}