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:
Jordy Hoogeveen
2026-09-04 22:47:48 +02:00
co-authored by Claude Opus 5
parent 1bf31f04eb
commit 50ed671e97
7 changed files with 151 additions and 6 deletions
+90 -2
View File
@@ -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://<host>/<org>/<repo>.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 = "<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 ─────────────────────────────────────────────────────────
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