Release-script controleert registry-login en origin vóór de build
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) <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5
parent
1bf31f04eb
commit
50ed671e97
@@ -274,11 +274,34 @@ Tags:
|
|||||||
x.x.x-dev development — specifieke dev versie
|
x.x.x-dev development — specifieke dev versie
|
||||||
```
|
```
|
||||||
|
|
||||||
Inloggen op registry:
|
Inloggen op de registry:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
docker login vibehoogie.duckdns.org
|
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 = "<gitea-gebruiker>"
|
||||||
|
$env:REGISTRY_TOKEN = "<gitea-token met write:package>"
|
||||||
|
```
|
||||||
|
|
||||||
|
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
|
## Update-notificaties
|
||||||
|
|||||||
@@ -35,6 +35,14 @@
|
|||||||
`node_modules` in de dev-container staan na een upgrade
|
`node_modules` in de dev-container staan na een upgrade
|
||||||
- Vite 8 bundelt met Rolldown: `manualChunks` (object-vorm) vervangen door
|
- Vite 8 bundelt met Rolldown: `manualChunks` (object-vorm) vervangen door
|
||||||
`build.rollupOptions.output.advancedChunks`
|
`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
|
### Toegevoegd
|
||||||
- Testsuite: `backend/test/app.test.js` (11 tests met `node --test`) voor de
|
- Testsuite: `backend/test/app.test.js` (11 tests met `node --test`) voor de
|
||||||
|
|||||||
@@ -89,7 +89,27 @@ Write-Host "========================================" -ForegroundColor Cyan
|
|||||||
Write-Host ""
|
Write-Host ""
|
||||||
|
|
||||||
# Functies
|
# 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 {
|
function Invoke-AppPush {
|
||||||
|
Assert-RegistryLogin
|
||||||
Write-Host "App bouwen en pushen (amd64 + arm64)..." -ForegroundColor White
|
Write-Host "App bouwen en pushen (amd64 + arm64)..." -ForegroundColor White
|
||||||
docker buildx build `
|
docker buildx build `
|
||||||
--platform linux/amd64,linux/arm64 `
|
--platform linux/amd64,linux/arm64 `
|
||||||
@@ -162,3 +182,6 @@ switch ($Action) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Write-Host ""
|
Write-Host ""
|
||||||
|
|
||||||
|
# Expliciete 0: voorkomt dat de exitcode van het laatste docker-commando doorlekt.
|
||||||
|
exit 0
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "vibefinance-frontend",
|
"name": "vibefinance-frontend",
|
||||||
"version": "0.1.6-dev",
|
"version": "0.1.6",
|
||||||
"private": true,
|
"private": true,
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
@@ -22,4 +22,4 @@
|
|||||||
"globals": "^17.12.0",
|
"globals": "^17.12.0",
|
||||||
"vite": "^8.2.2"
|
"vite": "^8.2.2"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
+1
-1
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "vibefinance",
|
"name": "vibefinance",
|
||||||
"version": "0.1.5",
|
"version": "0.1.6",
|
||||||
"description": "VibeFinance — persoonlijk vermogensbeheer",
|
"description": "VibeFinance — persoonlijk vermogensbeheer",
|
||||||
"private": true,
|
"private": true,
|
||||||
"repository": "https://vibehoogie.duckdns.org/vibe/VibeFinance",
|
"repository": "https://vibehoogie.duckdns.org/vibe/VibeFinance",
|
||||||
|
|||||||
+90
-2
@@ -124,7 +124,16 @@ if ($Force) { Write-Host " Mode : FORCE (conflictcontrole overgeslagen)"
|
|||||||
Write-Host "════════════════════════════════════════" -ForegroundColor Cyan
|
Write-Host "════════════════════════════════════════" -ForegroundColor Cyan
|
||||||
|
|
||||||
# ── Stap 1: Conflictcontrole ──────────────────────────────────────────────
|
# ── 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) {
|
if (-not $DryRun -and -not $Force) {
|
||||||
$localTag = git tag --list $gitTag
|
$localTag = git tag --list $gitTag
|
||||||
@@ -133,6 +142,23 @@ if (-not $DryRun -and -not $Force) {
|
|||||||
exit 1
|
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://<host>/<org>/<repo>.git
|
||||||
|
"@
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
|
||||||
$remoteTags = git ls-remote --tags origin "refs/tags/$gitTag"
|
$remoteTags = git ls-remote --tags origin "refs/tags/$gitTag"
|
||||||
if ($remoteTags) {
|
if ($remoteTags) {
|
||||||
Write-Error "Git-tag '$gitTag' bestaat al op origin. Verhoog het versienummer in package.json of gebruik -Force."
|
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
|
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 = "<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.
|
||||||
|
"@
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
# ── Stap 2: Tests ─────────────────────────────────────────────────────────
|
# ── Stap 2: Tests ─────────────────────────────────────────────────────────
|
||||||
if (-not $SkipTests) {
|
if (-not $SkipTests) {
|
||||||
Write-Step "[2/5] Testsuite"
|
Write-Step "[2/5] Testsuite"
|
||||||
@@ -263,9 +346,10 @@ if (-not $releaseApi) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
# ── Klaar ─────────────────────────────────────────────────────────────────
|
# ── Klaar ─────────────────────────────────────────────────────────────────
|
||||||
|
$kop = if ($DryRun) { "DRY-RUN klaar: $appVersion (niets gepubliceerd)" } else { "Gepubliceerd: $appVersion" }
|
||||||
Write-Host ""
|
Write-Host ""
|
||||||
Write-Host "════════════════════════════════════════" -ForegroundColor Cyan
|
Write-Host "════════════════════════════════════════" -ForegroundColor Cyan
|
||||||
Write-Host " Gepubliceerd: $appVersion" -ForegroundColor Green
|
Write-Host " $kop" -ForegroundColor Green
|
||||||
Write-Host ""
|
Write-Host ""
|
||||||
Write-Host " Registry image:" -ForegroundColor Green
|
Write-Host " Registry image:" -ForegroundColor Green
|
||||||
Write-Host " $appVersionTag" -ForegroundColor White
|
Write-Host " $appVersionTag" -ForegroundColor White
|
||||||
@@ -274,3 +358,7 @@ Write-Host ""
|
|||||||
Write-Host " Git-tag: $gitTag -> origin" -ForegroundColor Green
|
Write-Host " Git-tag: $gitTag -> origin" -ForegroundColor Green
|
||||||
Write-Host "════════════════════════════════════════" -ForegroundColor Cyan
|
Write-Host "════════════════════════════════════════" -ForegroundColor Cyan
|
||||||
Write-Host ""
|
Write-Host ""
|
||||||
|
|
||||||
|
# Expliciete 0: anders erft de caller de exitcode van het laatste
|
||||||
|
# docker-commando (bijv. de registry-check).
|
||||||
|
exit 0
|
||||||
|
|||||||
@@ -170,3 +170,6 @@ Write-Host "══════════════════════
|
|||||||
Write-Host " Alle tests geslaagd - $appVersion" -ForegroundColor Green
|
Write-Host " Alle tests geslaagd - $appVersion" -ForegroundColor Green
|
||||||
Write-Host "════════════════════════════════════════" -ForegroundColor Cyan
|
Write-Host "════════════════════════════════════════" -ForegroundColor Cyan
|
||||||
Write-Host ""
|
Write-Host ""
|
||||||
|
|
||||||
|
# Expliciete 0: zie release.ps1 — voorkomt een geërfde exitcode.
|
||||||
|
exit 0
|
||||||
|
|||||||
Reference in New Issue
Block a user