209 lines
9.8 KiB
PowerShell
209 lines
9.8 KiB
PowerShell
|
|
# ── 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 <registry>
|
||
|
|
# - 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 = "10.0.3.108:3000/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 ""
|