Leesbare foutmeldingen in release.ps1 in plaats van een stacktrace

Invoke-Cmd gooide bij een fout een exception, waardoor je een PowerShell-
stacktrace met het volledige buildx-commando kreeg en de eigenlijke oorzaak
(401 van de registry) wegviel.

- Invoke-Cmd meldt nu "Mislukt: <commando> (exitcode N)" en stopt met exit 1
- Optionele -Uitleg scriptblock per stap: de push-stap test opnieuw of je op de
  registry bent ingelogd en geeft dan de docker login-instructie; de tag-push
  wijst naar git ls-remote en het https-alternatief
- De preflight-meldingen zijn gewone gekleurde regels in plaats van
  Write-Error, dus geen "Write-Error:" voorvoegsel meer
- Elke afbreking sluit af met "Er is niets gepubliceerd."

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
Jordy Hoogeveen
2026-09-04 22:56:19 +02:00
co-authored by Claude Opus 5
parent 50ed671e97
commit cb98262698
2 changed files with 74 additions and 31 deletions
+70 -31
View File
@@ -70,7 +70,11 @@ $appLatestTag = "$appBase`:latest"
# ── Helpers ────────────────────────────────────────────────────────────────
function Invoke-Cmd {
param([string[]]$Cmd)
param(
[string[]]$Cmd,
# Wordt bij een fout uitgevoerd om een gerichte uitleg te geven
[scriptblock]$Uitleg
)
$display = $Cmd -join " "
if ($DryRun) {
Write-Host "[DRY-RUN] $display" -ForegroundColor Yellow
@@ -78,7 +82,17 @@ function Invoke-Cmd {
}
Write-Host "> $display" -ForegroundColor DarkGray
$output = & $Cmd[0] $Cmd[1..($Cmd.Length - 1)]
if ($LASTEXITCODE -ne 0) { throw "Commando mislukt: $display" }
if ($LASTEXITCODE -ne 0) {
# Geen 'throw': dat levert een PowerShell-stacktrace met het hele
# commando erin, wat de eigenlijke oorzaak wegdrukt.
Write-Host ""
Write-Host "Mislukt: $($Cmd[0]) $($Cmd[1]) (exitcode $LASTEXITCODE)" -ForegroundColor Red
if ($Uitleg) { & $Uitleg }
Write-Host ""
Write-Host "Er is niets gepubliceerd. Los het bovenstaande op en draai release.ps1 opnieuw." -ForegroundColor DarkGray
exit 1
}
return $output
}
@@ -145,17 +159,18 @@ if (-not $DryRun -and -not $Force) {
# Toegang tot origin nu controleren; stap 4 pusht de tag en zou anders pas
# na de build stranden.
if (-not (Test-GitPushToegang)) {
$remoteUrl = git remote get-url origin
Write-Host ""
Write-Error @"
Geen toegang tot origin ($(git remote get-url origin)).
Controleer het met:
git ls-remote --heads origin
Bij "Permission denied (publickey)": de SSH-sleutel doet het niet. Snelste
alternatief is pushen over https met hetzelfde Gitea-token als de registry:
git remote set-url origin https://<host>/<org>/<repo>.git
"@
Write-Host "Geen toegang tot origin ($remoteUrl)." -ForegroundColor Red
Write-Host ""
Write-Host "Stap 4 pusht de Git-tag, dus dit moet eerst werken. Controleer met:" -ForegroundColor Yellow
Write-Host " git ls-remote --heads origin" -ForegroundColor White
Write-Host ""
Write-Host "Bij 'Permission denied (publickey)' doet de SSH-sleutel het niet." -ForegroundColor Yellow
Write-Host "Snelste alternatief is https, met hetzelfde Gitea-token als de registry:" -ForegroundColor Yellow
Write-Host " git remote set-url origin https://<host>/<org>/<repo>.git" -ForegroundColor White
Write-Host ""
Write-Host "Er is niets gepubliceerd." -ForegroundColor DarkGray
exit 1
}
@@ -218,23 +233,24 @@ if (-not $NoBuild) {
Write-Host "[DRY-RUN] Niet ingelogd op $registryHost — een echte push zou hier falen." -ForegroundColor Yellow
} else {
Write-Host ""
Write-Error @"
Niet ingelogd op $registryHost — de push zou met 401 Unauthorized falen.
Kies één van deze twee:
1. Eenmalig handmatig inloggen (credential blijft bewaard):
docker login $registryHost
Gebruikersnaam = je Gitea-account, wachtwoord = een Gitea access token
met scope write:package (Settings -> Applications -> Generate New Token).
2. Het script laten inloggen door deze variabelen te zetten:
`$env:REGISTRY_USER = "<gitea-gebruiker>"
`$env:REGISTRY_TOKEN = "<gitea-token met write:package>"
Let op: inloggen op $registryHost zonder poortnummer, en in dezelfde shell
en onder dezelfde Windows-gebruiker als waarin je release.ps1 draait.
"@
Write-Host "Niet ingelogd op $registryHost — de push zou met 401 Unauthorized falen." -ForegroundColor Red
Write-Host ""
Write-Host "Kies een van deze twee:" -ForegroundColor Yellow
Write-Host ""
Write-Host " 1. Eenmalig handmatig inloggen (credential blijft bewaard):" -ForegroundColor Yellow
Write-Host " docker login $registryHost" -ForegroundColor White
Write-Host " Gebruikersnaam = je Gitea-account, wachtwoord = een Gitea access" -ForegroundColor DarkGray
Write-Host " token met scope write:package (Settings > Applications > Generate" -ForegroundColor DarkGray
Write-Host " New Token)." -ForegroundColor DarkGray
Write-Host ""
Write-Host " 2. Het script laten inloggen door deze variabelen te zetten:" -ForegroundColor Yellow
Write-Host ' $env:REGISTRY_USER = "<gitea-gebruiker>"' -ForegroundColor White
Write-Host ' $env:REGISTRY_TOKEN = "<gitea-token met write:package>"' -ForegroundColor White
Write-Host ""
Write-Host "Let op: zonder poortnummer inloggen, en in dezelfde shell en onder" -ForegroundColor DarkGray
Write-Host "dezelfde Windows-gebruiker als waarin je release.ps1 draait." -ForegroundColor DarkGray
Write-Host ""
Write-Host "Er is niets gepubliceerd." -ForegroundColor DarkGray
exit 1
}
}
@@ -270,7 +286,24 @@ if (-not $NoBuild) {
"--build-arg", "VITE_API_URL=$apiUrl",
"--build-arg", "VITE_APP_VERSION=$appVersion",
$PSScriptRoot
)
) -Uitleg {
# Meestal is de build zelf goed en weigert de registry de push.
if (-not (Test-RegistryLogin $appBase)) {
Write-Host "Oorzaak: geen geldige login op $registryHost (de push geeft dan 401 Unauthorized)." -ForegroundColor Yellow
Write-Host ""
Write-Host " docker login $registryHost" -ForegroundColor White
Write-Host " gebruikersnaam : je Gitea-account" -ForegroundColor DarkGray
Write-Host " wachtwoord : Gitea access token met scope write:package" -ForegroundColor DarkGray
Write-Host " (Gitea -> Settings -> Applications -> Generate New Token)" -ForegroundColor DarkGray
Write-Host ""
Write-Host "Of laat het script inloggen:" -ForegroundColor Yellow
Write-Host ' $env:REGISTRY_USER = "<gitea-gebruiker>"' -ForegroundColor White
Write-Host ' $env:REGISTRY_TOKEN = "<gitea-token>"' -ForegroundColor White
} else {
Write-Host "De registry-login is in orde, dus dit is een build- of netwerkfout." -ForegroundColor Yellow
Write-Host "Bekijk de regels boven deze melding; de eerste ERROR wijst de oorzaak aan." -ForegroundColor DarkGray
}
}
} else {
Write-Step "[3/5] Bouwen overgeslagen (-NoBuild)"
}
@@ -293,7 +326,13 @@ Write-Host "Git-tag aanmaken: $gitTag" -ForegroundColor White
Invoke-Cmd @("git", "tag", "-a", $gitTag, "-m", "Release $gitTag")
Write-Host "Git-tag pushen naar origin" -ForegroundColor White
Invoke-Cmd @("git", "push", "origin", "refs/tags/$gitTag")
Invoke-Cmd @("git", "push", "origin", "refs/tags/$gitTag") -Uitleg {
Write-Host "Kon de tag niet naar origin pushen." -ForegroundColor Yellow
Write-Host "Het image staat al in de registry; alleen de tag en de Gitea-release ontbreken." -ForegroundColor DarkGray
Write-Host "Controleer de toegang met: git ls-remote --heads origin" -ForegroundColor White
Write-Host "Bij 'Permission denied (publickey)' is https het snelste alternatief:" -ForegroundColor DarkGray
Write-Host " git remote set-url origin https://<host>/<org>/<repo>.git" -ForegroundColor White
}
# ── Stap 5: Gitea-release aanmaken ────────────────────────────────────────
Write-Step "[5/5] Gitea-release aanmaken"