From 50ed671e97ea00ba8f2610b932c5c5e6032657a3 Mon Sep 17 00:00:00 2001 From: Jordy Hoogeveen Date: Fri, 4 Sep 2026 22:47:48 +0200 Subject: [PATCH] =?UTF-8?q?Release-script=20controleert=20registry-login?= =?UTF-8?q?=20en=20origin=20v=C3=B3=C3=B3r=20de=20build?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit De release strandde pas na een volledige multi-arch build op "401 Unauthorized" van de registry, en bleef daarvoor minuten hangen op een SSH-wachtwoordprompt bij de tag-controle. Beide checks staan nu vooraan. - Stap 1 heet nu "Controles (tags + registry-login)" en test achtereenvolgens: bestaat de tag al lokaal, is origin bereikbaar, bestaat de tag al op origin, bestaat het image al, en is er een geldige registry-login - Registry-login: wanneer REGISTRY_USER en REGISTRY_TOKEN (of GITEA_TOKEN) gezet zijn logt het script zelf in via --password-stdin, anders stopt het met instructies. dev.ps1 push doet dezelfde controle - Git draait met GIT_SSH_COMMAND="ssh -o BatchMode=yes -o ConnectTimeout=10", dus geen hangende prompts meer; bij geen toegang een uitleg met het https-alternatief - Scripts eindigen expliciet met exit 0 (anders lekt de exitcode van het laatste docker-commando door), en een -DryRun meldt in de slotregel dat er niets is gepubliceerd - BEHEER.md: registry-login met token en de REGISTRY_USER/REGISTRY_TOKEN route Co-Authored-By: Claude Opus 5 (1M context) --- BEHEER.md | 25 +++++++++++- Changelog.md | 8 ++++ dev.ps1 | 23 +++++++++++ frontend/package.json | 4 +- package.json | 2 +- release.ps1 | 92 ++++++++++++++++++++++++++++++++++++++++++- test.ps1 | 3 ++ 7 files changed, 151 insertions(+), 6 deletions(-) diff --git a/BEHEER.md b/BEHEER.md index 46c28b1..193ade9 100644 --- a/BEHEER.md +++ b/BEHEER.md @@ -274,11 +274,34 @@ Tags: x.x.x-dev development — specifieke dev versie ``` -Inloggen op registry: +Inloggen op de registry: + ```bash docker login vibehoogie.duckdns.org ``` +Gebruikersnaam is je Gitea-account, wachtwoord een **access token** met scope +`write:package` (Gitea → Settings → Applications → Generate New Token). Zonder +login faalt een push met `401 Unauthorized`; `release.ps1` en `dev.ps1 push` +controleren dit vóór de build en stoppen dan meteen. + +Liever niet handmatig inloggen? Zet deze variabelen, dan logt het script zelf in: + +```powershell +$env:REGISTRY_USER = "" +$env:REGISTRY_TOKEN = "" +``` + +Twee valkuilen: log in op `vibehoogie.duckdns.org` **zonder** `:3000` (dat is een +aparte sleutel in de credential store), en doe het als dezelfde Windows-gebruiker +in dezelfde shell — Docker-credentials zijn per gebruikersprofiel. + +Controleren wat er is opgeslagen: + +```powershell +docker-credential-desktop list +``` + --- ## Update-notificaties diff --git a/Changelog.md b/Changelog.md index a938093..c801d0c 100644 --- a/Changelog.md +++ b/Changelog.md @@ -35,6 +35,14 @@ `node_modules` in de dev-container staan na een upgrade - Vite 8 bundelt met Rolldown: `manualChunks` (object-vorm) vervangen door `build.rollupOptions.output.advancedChunks` +- `release.ps1` controleert vóór de build of origin bereikbaar is en of je op de + registry bent ingelogd, in plaats van pas na een multi-arch build te stranden + op `401 Unauthorized`. Logt zelf in met `REGISTRY_USER` + `REGISTRY_TOKEN` + wanneer die gezet zijn; `dev.ps1 push` doet dezelfde controle +- Git-commando's in `release.ps1` draaien met `BatchMode=yes`, zodat het script + 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 ### Toegevoegd - Testsuite: `backend/test/app.test.js` (11 tests met `node --test`) voor de diff --git a/dev.ps1 b/dev.ps1 index 2ce2888..93eac8f 100644 --- a/dev.ps1 +++ b/dev.ps1 @@ -89,7 +89,27 @@ Write-Host "========================================" -ForegroundColor Cyan Write-Host "" # Functies +# Zonder registry-login klapt een push pas ná de hele build met 401. +$registryHost = $registry.Split("/")[0] + +function Assert-RegistryLogin { + $uitvoer = (docker buildx imagetools inspect "${appBase}:latest-dev" 2>&1 | Out-String) + if ($uitvoer -notmatch "401|[Uu]nauthorized|authentication required") { return } + + $gebruiker = $env:REGISTRY_USER + $token = if ($env:REGISTRY_TOKEN) { $env:REGISTRY_TOKEN } else { $env:GITEA_TOKEN } + if ($gebruiker -and $token) { + Write-Host "Inloggen op $registryHost als $gebruiker..." -ForegroundColor White + $token | docker login $registryHost -u $gebruiker --password-stdin + if ($LASTEXITCODE -eq 0) { return } + } + + Write-Error "Niet ingelogd op $registryHost. Doe eerst: docker login $registryHost (Gitea-token met scope write:package), of zet REGISTRY_USER en REGISTRY_TOKEN." + exit 1 +} + function Invoke-AppPush { + Assert-RegistryLogin Write-Host "App bouwen en pushen (amd64 + arm64)..." -ForegroundColor White docker buildx build ` --platform linux/amd64,linux/arm64 ` @@ -162,3 +182,6 @@ switch ($Action) { } Write-Host "" + +# Expliciete 0: voorkomt dat de exitcode van het laatste docker-commando doorlekt. +exit 0 diff --git a/frontend/package.json b/frontend/package.json index 061b932..9333fc7 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -1,6 +1,6 @@ { "name": "vibefinance-frontend", - "version": "0.1.6-dev", + "version": "0.1.6", "private": true, "type": "module", "scripts": { @@ -22,4 +22,4 @@ "globals": "^17.12.0", "vite": "^8.2.2" } -} +} \ No newline at end of file diff --git a/package.json b/package.json index 6f4f72c..3d253b0 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "vibefinance", - "version": "0.1.5", + "version": "0.1.6", "description": "VibeFinance — persoonlijk vermogensbeheer", "private": true, "repository": "https://vibehoogie.duckdns.org/vibe/VibeFinance", diff --git a/release.ps1 b/release.ps1 index 8ea1247..f77c655 100644 --- a/release.ps1 +++ b/release.ps1 @@ -124,7 +124,16 @@ if ($Force) { Write-Host " Mode : FORCE (conflictcontrole overgeslagen)" Write-Host "════════════════════════════════════════" -ForegroundColor Cyan # ── Stap 1: Conflictcontrole ────────────────────────────────────────────── -Write-Step "[1/5] Conflictcontrole" +Write-Step "[1/5] Controles (tags + registry-login)" + +# Git praat zonder prompt met origin: anders blijft het script hangen op een +# wachtwoordvraag wanneer de SSH-sleutel of -agent niet werkt. +$env:GIT_SSH_COMMAND = "ssh -o BatchMode=yes -o ConnectTimeout=10" + +function Test-GitPushToegang { + git ls-remote --heads origin 2>&1 | Out-Null + return ($LASTEXITCODE -eq 0) +} if (-not $DryRun -and -not $Force) { $localTag = git tag --list $gitTag @@ -133,6 +142,23 @@ if (-not $DryRun -and -not $Force) { exit 1 } + # Toegang tot origin nu controleren; stap 4 pusht de tag en zou anders pas + # na de build stranden. + if (-not (Test-GitPushToegang)) { + 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 +"@ + exit 1 + } + $remoteTags = git ls-remote --tags origin "refs/tags/$gitTag" if ($remoteTags) { Write-Error "Git-tag '$gitTag' bestaat al op origin. Verhoog het versienummer in package.json of gebruik -Force." @@ -156,6 +182,63 @@ if (-not $DryRun -and -not $Force) { Write-Host "[DRY-RUN] Conflictcontrole overgeslagen" -ForegroundColor Yellow } +# ── Registry-login ───────────────────────────────────────────────────────── +# Zonder geldige credentials klapt `buildx --push` pas ná de hele build met +# "401 Unauthorized". Daarom vooraf controleren, en zelf inloggen wanneer er +# een token in de omgeving staat. +$registryHost = $registry.Split("/")[0] + +function Test-RegistryLogin { + param([string]$Repo) + # imagetools inspect praat rechtstreeks met de registry: 401 = niet + # ingelogd, "not found" = wél ingelogd maar tag bestaat (nog) niet. + $uitvoer = (docker buildx imagetools inspect "${Repo}:latest" 2>&1 | Out-String) + if ($uitvoer -match "401|[Uu]nauthorized|authentication required") { return $false } + return $true +} + +function Connect-Registry { + $gebruiker = $env:REGISTRY_USER + $token = if ($env:REGISTRY_TOKEN) { $env:REGISTRY_TOKEN } else { $env:GITEA_TOKEN } + + if (-not ($gebruiker -and $token)) { return $false } + + Write-Host "Inloggen op $registryHost als $gebruiker..." -ForegroundColor White + # Via stdin, zodat het token niet in de commandoregel of logs belandt. + $token | docker login $registryHost -u $gebruiker --password-stdin + return ($LASTEXITCODE -eq 0) +} + +if (-not $NoBuild) { + if (Test-RegistryLogin $appBase) { + Write-Host "Registry-login in orde ($registryHost)." -ForegroundColor Green + } elseif (Connect-Registry) { + Write-Host "Ingelogd op $registryHost." -ForegroundColor Green + } elseif ($DryRun) { + 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. +"@ + exit 1 + } +} + # ── Stap 2: Tests ───────────────────────────────────────────────────────── if (-not $SkipTests) { Write-Step "[2/5] Testsuite" @@ -263,9 +346,10 @@ if (-not $releaseApi) { } # ── Klaar ───────────────────────────────────────────────────────────────── +$kop = if ($DryRun) { "DRY-RUN klaar: $appVersion (niets gepubliceerd)" } else { "Gepubliceerd: $appVersion" } Write-Host "" Write-Host "════════════════════════════════════════" -ForegroundColor Cyan -Write-Host " Gepubliceerd: $appVersion" -ForegroundColor Green +Write-Host " $kop" -ForegroundColor Green Write-Host "" Write-Host " Registry image:" -ForegroundColor Green Write-Host " $appVersionTag" -ForegroundColor White @@ -274,3 +358,7 @@ Write-Host "" Write-Host " Git-tag: $gitTag -> origin" -ForegroundColor Green Write-Host "════════════════════════════════════════" -ForegroundColor Cyan Write-Host "" + +# Expliciete 0: anders erft de caller de exitcode van het laatste +# docker-commando (bijv. de registry-check). +exit 0 diff --git a/test.ps1 b/test.ps1 index 322fe88..bd7fbca 100644 --- a/test.ps1 +++ b/test.ps1 @@ -170,3 +170,6 @@ Write-Host "══════════════════════ Write-Host " Alle tests geslaagd - $appVersion" -ForegroundColor Green Write-Host "════════════════════════════════════════" -ForegroundColor Cyan Write-Host "" + +# Expliciete 0: zie release.ps1 — voorkomt een geërfde exitcode. +exit 0