# ── VibeFinance release script (PowerShell) ────────────────────────────── # Productie release: bouwt multi-platform, pusht naar registry, # maakt een Git-tag aan en pusht naar origin. # # Gebruik: # .\release.ps1 # bouw + push images + Git-tag # .\release.ps1 -NoBuild # sla docker build over, alleen Git-tag # .\release.ps1 -DryRun # toon alle commando's zonder iets uit te voeren # .\release.ps1 -Force # sla conflictcontrole over, overschrijf bestaande tags # # Vereisten: # - Docker Desktop actief # - Ingelogd op de registry: docker login # - docker buildx builder actief: docker buildx create --use # - Git geïnstalleerd en working directory is de repo root # - root package.json bevat een schoon versienummer ZONDER -dev suffix param( [switch]$NoBuild, [switch]$DryRun, [switch]$Force ) $ErrorActionPreference = "Stop" # ════════════════════════════════════════════════════════════════════════════ # ── PROJECTCONFIGURATIE — pas alleen dit blok aan voor een nieuw project ── # ════════════════════════════════════════════════════════════════════════════ $appName = "VibeFinance" $registry = "vibehoogie.duckdns.org/vibe" $backendImage = "vibefinance-backend" $frontendImage = "vibefinance-frontend" $apiUrl = "/api" # ════════════════════════════════════════════════════════════════════════════ # ── Versie uit root package.json ─────────────────────────────────────────── $rootPkg = Get-Content (Join-Path $PSScriptRoot "package.json") -Raw | ConvertFrom-Json $appVersion = $rootPkg.version if (-not $appVersion) { Write-Error "Kon versienummer niet lezen uit package.json" exit 1 } if ($appVersion -match "-dev$") { Write-Error "Versienummer '$appVersion' bevat '-dev' suffix. Verwijder de suffix voor een productie-release." exit 1 } # ── Versie synchroniseren naar frontend/package.json ────────────────────── $frontendPkgPath = Join-Path $PSScriptRoot "frontend/package.json" $frontendPkg = Get-Content $frontendPkgPath -Raw | ConvertFrom-Json if ($frontendPkg.version -ne $appVersion) { $frontendPkg.version = $appVersion [System.IO.File]::WriteAllText($frontendPkgPath, ($frontendPkg | ConvertTo-Json -Depth 10)) Write-Host "Versie gesynchroniseerd naar frontend: $appVersion" -ForegroundColor Green } $gitTag = "$appVersion" # ── Registry tags ────────────────────────────────────────────────────────── $backendBase = "$registry/$backendImage" $frontendBase = "$registry/$frontendImage" $backendVersionTag = "$backendBase`:$appVersion" $frontendVersionTag = "$frontendBase`:$appVersion" $backendLatestTag = "$backendBase`:latest" $frontendLatestTag = "$frontendBase`:latest" # ── Helpers ──────────────────────────────────────────────────────────────── function Invoke-Cmd { param([string[]]$Cmd) $display = $Cmd -join " " if ($DryRun) { Write-Host "[DRY-RUN] $display" -ForegroundColor Yellow return "" } Write-Host "> $display" -ForegroundColor DarkGray $output = & $Cmd[0] $Cmd[1..($Cmd.Length - 1)] if ($LASTEXITCODE -ne 0) { throw "Commando mislukt: $display" } return $output } function Write-Step { param([string]$Label) Write-Host "" Write-Host "── $Label" -ForegroundColor Cyan } # ── Samenvatting ─────────────────────────────────────────────────────────── Write-Host "" Write-Host "════════════════════════════════════════" -ForegroundColor Cyan Write-Host " $appName Release" -ForegroundColor Cyan Write-Host " Versie : $appVersion" -ForegroundColor Green Write-Host " Git-tag : $gitTag" -ForegroundColor Green Write-Host " Registry: $registry" -ForegroundColor Green if ($DryRun) { Write-Host " Mode : DRY-RUN (geen wijzigingen)" -ForegroundColor Yellow } if ($NoBuild) { Write-Host " Mode : SKIP BUILD" -ForegroundColor Yellow } if ($Force) { Write-Host " Mode : FORCE (conflictcontrole overgeslagen)" -ForegroundColor Red } Write-Host "════════════════════════════════════════" -ForegroundColor Cyan # ── Stap 1: Conflictcontrole ────────────────────────────────────────────── Write-Step "[1/3] Conflictcontrole" if (-not $DryRun -and -not $Force) { $localTag = git tag --list $gitTag if ($localTag) { Write-Error "Git-tag '$gitTag' bestaat al lokaal. Verhoog het versienummer in package.json of gebruik -Force." 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." exit 1 } Write-Host "Controleer registry: $backendVersionTag" -ForegroundColor DarkGray $ErrorActionPreference = "SilentlyContinue" docker manifest inspect $backendVersionTag 2>$null $backendExists = $LASTEXITCODE -eq 0 $ErrorActionPreference = "Stop" if ($backendExists) { Write-Error "Registry-tag '$backendVersionTag' bestaat al. Verhoog het versienummer in package.json of gebruik -Force." exit 1 } Write-Host "Controleer registry: $frontendVersionTag" -ForegroundColor DarkGray $ErrorActionPreference = "SilentlyContinue" docker manifest inspect $frontendVersionTag 2>$null $frontendExists = $LASTEXITCODE -eq 0 $ErrorActionPreference = "Stop" if ($frontendExists) { Write-Error "Registry-tag '$frontendVersionTag' bestaat al. Verhoog het versienummer in package.json of gebruik -Force." exit 1 } Write-Host "Geen conflicten gevonden." -ForegroundColor Green } elseif ($Force) { Write-Host "Conflictcontrole overgeslagen (-Force)" -ForegroundColor Yellow } else { Write-Host "[DRY-RUN] Conflictcontrole overgeslagen" -ForegroundColor Yellow } # ── Stap 2: Bouwen en pushen ────────────────────────────────────────────── if (-not $NoBuild) { Write-Step "[2/3] Multi-platform bouwen en pushen" Write-Host "Backend bouwen en pushen..." -ForegroundColor White Invoke-Cmd @( "docker", "buildx", "build", "--platform", "linux/amd64,linux/arm64", "--push", "-t", $backendVersionTag, "-t", $backendLatestTag, "--build-arg", "APP_VERSION=$appVersion", (Join-Path $PSScriptRoot "backend") ) Write-Host "Frontend bouwen en pushen..." -ForegroundColor White Invoke-Cmd @( "docker", "buildx", "build", "--platform", "linux/amd64,linux/arm64", "--push", "-t", $frontendVersionTag, "-t", $frontendLatestTag, "--build-arg", "APP_VERSION=$appVersion", "--build-arg", "VITE_API_URL=$apiUrl", (Join-Path $PSScriptRoot "frontend") ) } else { Write-Step "[2/3] Bouwen overgeslagen (-NoBuild)" } # ── Stap 3: Git-tag aanmaken en pushen ──────────────────────────────────── Write-Step "[3/3] Git-tag aanmaken en pushen" if ($Force) { Write-Host "Bestaande lokale tag verwijderen (indien aanwezig)..." -ForegroundColor Yellow $ErrorActionPreference = "SilentlyContinue" git tag -d $gitTag 2>$null | Out-Null $ErrorActionPreference = "Stop" Write-Host "Bestaande remote tag verwijderen (indien aanwezig)..." -ForegroundColor Yellow $ErrorActionPreference = "SilentlyContinue" git push origin ":refs/tags/$gitTag" 2>$null | Out-Null $ErrorActionPreference = "Stop" } 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") # ── Klaar ───────────────────────────────────────────────────────────────── Write-Host "" Write-Host "════════════════════════════════════════" -ForegroundColor Cyan Write-Host " Gepubliceerd: $appVersion" -ForegroundColor Green Write-Host "" Write-Host " Registry images:" -ForegroundColor Green Write-Host " $backendVersionTag" -ForegroundColor White Write-Host " $backendLatestTag" -ForegroundColor White Write-Host " $frontendVersionTag" -ForegroundColor White Write-Host " $frontendLatestTag" -ForegroundColor White Write-Host "" Write-Host " Git-tag: $gitTag -> origin" -ForegroundColor Green Write-Host "════════════════════════════════════════" -ForegroundColor Cyan Write-Host ""