From cb9826269861ab3ee3f475e113e1115e2bf06ff0 Mon Sep 17 00:00:00 2001 From: Jordy Hoogeveen Date: Fri, 4 Sep 2026 22:56:19 +0200 Subject: [PATCH] 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: (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) --- Changelog.md | 4 ++ release.ps1 | 101 +++++++++++++++++++++++++++++++++++---------------- 2 files changed, 74 insertions(+), 31 deletions(-) diff --git a/Changelog.md b/Changelog.md index c801d0c..fc45597 100644 --- a/Changelog.md +++ b/Changelog.md @@ -43,6 +43,10 @@ niet blijft hangen op een wachtwoordprompt van SSH - `release.ps1`, `dev.ps1` en `test.ps1` eindigen expliciet met exitcode 0, en de slotregel van een `-DryRun` zegt nu dat er niets is gepubliceerd +- Mislukte stappen in `release.ps1` geven geen PowerShell-stacktrace meer maar + een gerichte melding: bij een mislukte push wordt de registry-login opnieuw + getest en volgt de bijbehorende instructie, bij een mislukte tag-push het + https-alternatief ### Toegevoegd - Testsuite: `backend/test/app.test.js` (11 tests met `node --test`) voor de diff --git a/release.ps1 b/release.ps1 index f77c655..d3aed57 100644 --- a/release.ps1 +++ b/release.ps1 @@ -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:////.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:////.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 = "" - `$env:REGISTRY_TOKEN = "" - -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 = ""' -ForegroundColor White + Write-Host ' $env:REGISTRY_TOKEN = ""' -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 = ""' -ForegroundColor White + Write-Host ' $env:REGISTRY_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:////.git" -ForegroundColor White +} # ── Stap 5: Gitea-release aanmaken ──────────────────────────────────────── Write-Step "[5/5] Gitea-release aanmaken"