bugfix
This commit is contained in:
+166
-51
@@ -9,6 +9,16 @@
|
||||
# .\release.ps1 -SkipTests # sla de testsuite over (niet aanbevolen)
|
||||
# .\release.ps1 -DryRun # toon alle commando's zonder iets uit te voeren
|
||||
# .\release.ps1 -Force # sla conflictcontrole over, overschrijf tags
|
||||
# .\release.ps1 -NoChangelog # publiceer bewust zonder release-notes
|
||||
#
|
||||
# Het script werkt zelf vier dingen bij, dus die hoef je niet met de hand te
|
||||
# doen: de changelog-kop `## [Niet vrijgegeven]` -> `## [x.x.x] - datum`, de
|
||||
# versie in frontend/package.json, de versiebadge in README.md, en ná het
|
||||
# publiceren de versie in de root package.json -> `x.x.(x+1)-dev`.
|
||||
#
|
||||
# LET OP bij -Force: dat verwijdert de bestaande tag lokaal en op origin, en
|
||||
# Gitea gooit de bijbehorende release daarmee weg. Onder -DryRun wordt dat
|
||||
# alleen gemeld (dat was eerder niet zo — zie stap 4).
|
||||
#
|
||||
# Vereisten:
|
||||
# - Docker Desktop actief
|
||||
@@ -16,6 +26,9 @@
|
||||
# - docker buildx builder actief: docker buildx create --use
|
||||
# - Git geinstalleerd en working directory is de repo root
|
||||
# - root package.json bevat een schoon versienummer ZONDER -dev suffix
|
||||
# - Changelog.md beschrijft deze versie, onder `## [Niet vrijgegeven]` of
|
||||
# onder een kop `## [x.x.x]`; anders breekt het script af (-NoChangelog
|
||||
# omzeilt dat)
|
||||
# - GITEA_TOKEN in de omgeving (token met release-rechten) voor stap 5,
|
||||
# de Gitea-release waar de update-melding in de app op afgaat
|
||||
|
||||
@@ -23,7 +36,10 @@ param(
|
||||
[switch]$NoBuild,
|
||||
[switch]$SkipTests,
|
||||
[switch]$DryRun,
|
||||
[switch]$Force
|
||||
[switch]$Force,
|
||||
# Releasen zonder inhoudelijke release-notes. Zonder deze switch breekt het
|
||||
# script af wanneer de changelog niets over deze versie zegt.
|
||||
[switch]$NoChangelog
|
||||
)
|
||||
|
||||
$ErrorActionPreference = "Stop"
|
||||
@@ -75,41 +91,6 @@ if ($appVersion -match "-dev$") {
|
||||
exit 1
|
||||
}
|
||||
|
||||
# ── Versie synchroniseren naar frontend/package.json ──────────────────────
|
||||
# Een droogloop schrijft hier niet: anders laat -DryRun een gewijzigd bestand
|
||||
# achter, en tagt de echte release daarna een vervuilde working tree.
|
||||
$frontendPkgPath = Join-Path $PSScriptRoot "frontend/package.json"
|
||||
$frontendPkg = Get-Content $frontendPkgPath -Raw | ConvertFrom-Json
|
||||
if ($frontendPkg.version -ne $appVersion) {
|
||||
if ($DryRun) {
|
||||
Write-Host "[DRY-RUN] Versie naar frontend synchroniseren: $($frontendPkg.version) -> $appVersion" -ForegroundColor Yellow
|
||||
} else {
|
||||
$frontendPkg.version = $appVersion
|
||||
[System.IO.File]::WriteAllText($frontendPkgPath, ($frontendPkg | ConvertTo-Json -Depth 10))
|
||||
Write-Host "Versie gesynchroniseerd naar frontend: $appVersion" -ForegroundColor Green
|
||||
}
|
||||
}
|
||||
|
||||
# ── Versiebadge in README.md ──────────────────────────────────────────────
|
||||
# Anders loopt die badge stil achter: hij stond drie releases achter voordat
|
||||
# dit erin zat, en het script kent het nummer toch al. Zelfde regel als
|
||||
# hierboven: een droogloop meldt het, maar schrijft niet.
|
||||
$readmePath = Join-Path $PSScriptRoot "README.md"
|
||||
if (Test-Path $readmePath) {
|
||||
$readme = [System.IO.File]::ReadAllText($readmePath)
|
||||
$patroon = "badge/versie-[^-]+-"
|
||||
$nieuw = "badge/versie-$appVersion-"
|
||||
$huidig = [regex]::Match($readme, $patroon)
|
||||
if ($huidig.Success -and $huidig.Value -ne $nieuw) {
|
||||
if ($DryRun) {
|
||||
Write-Host "[DRY-RUN] Versiebadge in README.md: $($huidig.Value) -> $nieuw" -ForegroundColor Yellow
|
||||
} else {
|
||||
[System.IO.File]::WriteAllText($readmePath, ($readme -replace $patroon, $nieuw))
|
||||
Write-Host "Versiebadge in README.md bijgewerkt: $appVersion" -ForegroundColor Green
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$gitTag = "$appVersion"
|
||||
|
||||
# ── Registry tags (één image voor frontend + backend) ─────────────────────
|
||||
@@ -151,12 +132,13 @@ function Write-Step {
|
||||
Write-Host "── $Label" -ForegroundColor Cyan
|
||||
}
|
||||
|
||||
# Haalt de sectie van deze versie uit Changelog.md als release-notes.
|
||||
function Get-ChangelogSection {
|
||||
param([string]$Version)
|
||||
$path = Join-Path $PSScriptRoot "Changelog.md"
|
||||
if (-not (Test-Path $path)) { return "" }
|
||||
$lines = Get-Content $path
|
||||
# Haalt de sectie van deze versie uit changelog-tekst. Werkt op een string en
|
||||
# niet op het bestand, zodat een droogloop kan valideren tegen de kop die hij
|
||||
# zou schrijven zonder die daadwerkelijk te schrijven.
|
||||
function Get-ChangelogSectionFromText {
|
||||
param([string]$Text, [string]$Version)
|
||||
if (-not $Text) { return "" }
|
||||
$lines = $Text -split "\r?\n"
|
||||
$start = -1
|
||||
$needle = "^##\s*\[" + [regex]::Escape($Version) + "\]"
|
||||
for ($i = 0; $i -lt $lines.Count; $i++) {
|
||||
@@ -172,6 +154,94 @@ function Get-ChangelogSection {
|
||||
return (($out -join "`n").Trim())
|
||||
}
|
||||
|
||||
# ── Changelog-kop vrijgeven ───────────────────────────────────────────────
|
||||
# De release-notes komen uit de sectie `## [x.x.x]` in Changelog.md. Stond het
|
||||
# werk nog onder `## [Niet vrijgegeven]`, dan vond het script niets en werd stil
|
||||
# de placeholder "Release x.x.x" gepubliceerd — dat gebeurde bij 0.1.9 en 1.0.2,
|
||||
# en is achteraf alleen met een PATCH op de release te herstellen. Daarom zet het
|
||||
# script de kop nu zelf om, en breekt het af als er niets te melden valt.
|
||||
# Zelfde regel als bij de andere auto-updates: een droogloop meldt, maar schrijft
|
||||
# niet.
|
||||
$changelogPath = Join-Path $PSScriptRoot "Changelog.md"
|
||||
$nieuweKop = "## [$appVersion] - $(Get-Date -Format 'yyyy-MM-dd')"
|
||||
$changelogTxt = if (Test-Path $changelogPath) { [System.IO.File]::ReadAllText($changelogPath) } else { "" }
|
||||
|
||||
$kopPatroon = "(?m)^##\s*\[" + [regex]::Escape($appVersion) + "\]"
|
||||
$onderwegPatroon = "(?m)^##\s*\[\s*Niet vrijgegeven\s*\]\s*$"
|
||||
|
||||
# Eerst alleen in het geheugen omzetten. Schrijven gebeurt na de controle
|
||||
# hieronder: bij een lege `[Niet vrijgegeven]`-sectie zou de kop anders al
|
||||
# vervangen zijn terwijl het script daarna afbreekt, en dan blijft er een
|
||||
# aangepaste changelog achter bij een release die niet doorging.
|
||||
$kopOmzetten = ($changelogTxt -notmatch $kopPatroon -and $changelogTxt -match $onderwegPatroon)
|
||||
if ($kopOmzetten) {
|
||||
# $nieuweKop bevat geen '$', dus veilig als vervangingstekst.
|
||||
$changelogTxt = [regex]::Replace($changelogTxt, $onderwegPatroon, $nieuweKop)
|
||||
}
|
||||
|
||||
if (-not (Get-ChangelogSectionFromText $changelogTxt $appVersion) -and -not $NoChangelog) {
|
||||
Write-Host ""
|
||||
Write-Host "Changelog.md zegt niets over $appVersion." -ForegroundColor Red
|
||||
Write-Host ""
|
||||
Write-Host "Zonder notes komt er alleen de tekst 'Release $appVersion' in de Gitea-release," -ForegroundColor Yellow
|
||||
Write-Host "en dat is achteraf alleen met een PATCH op de release te herstellen." -ForegroundColor Yellow
|
||||
Write-Host ""
|
||||
Write-Host "Zet je wijzigingen in Changelog.md onder een kop:" -ForegroundColor White
|
||||
Write-Host " ## [Niet vrijgegeven]" -ForegroundColor White
|
||||
Write-Host "Die zet dit script bij de volgende run zelf om naar '$nieuweKop'." -ForegroundColor White
|
||||
Write-Host ""
|
||||
Write-Host "Bewust zonder release-notes publiceren? Draai met -NoChangelog." -ForegroundColor DarkGray
|
||||
Write-Host ""
|
||||
Write-Host "Er is niets gepubliceerd." -ForegroundColor DarkGray
|
||||
exit 1
|
||||
}
|
||||
|
||||
# De controle is doorstaan, dus nu pas schrijven.
|
||||
if ($kopOmzetten) {
|
||||
if ($DryRun) {
|
||||
Write-Host "[DRY-RUN] Changelog-kop vrijgeven: '## [Niet vrijgegeven]' -> '$nieuweKop'" -ForegroundColor Yellow
|
||||
} else {
|
||||
[System.IO.File]::WriteAllText($changelogPath, $changelogTxt)
|
||||
Write-Host "Changelog-kop vrijgegeven: $nieuweKop" -ForegroundColor Green
|
||||
}
|
||||
}
|
||||
|
||||
# ── Versie synchroniseren naar frontend/package.json ──────────────────────
|
||||
# Staat na de changelog-controle: anders laat een afgebroken release wél een
|
||||
# gewijzigde working tree achter terwijl hij "niets gepubliceerd" meldt.
|
||||
# Een droogloop schrijft hier niet, om dezelfde reden.
|
||||
$frontendPkgPath = Join-Path $PSScriptRoot "frontend/package.json"
|
||||
$frontendPkg = Get-Content $frontendPkgPath -Raw | ConvertFrom-Json
|
||||
if ($frontendPkg.version -ne $appVersion) {
|
||||
if ($DryRun) {
|
||||
Write-Host "[DRY-RUN] Versie naar frontend synchroniseren: $($frontendPkg.version) -> $appVersion" -ForegroundColor Yellow
|
||||
} else {
|
||||
$frontendPkg.version = $appVersion
|
||||
[System.IO.File]::WriteAllText($frontendPkgPath, ($frontendPkg | ConvertTo-Json -Depth 10))
|
||||
Write-Host "Versie gesynchroniseerd naar frontend: $appVersion" -ForegroundColor Green
|
||||
}
|
||||
}
|
||||
|
||||
# ── Versiebadge in README.md ──────────────────────────────────────────────
|
||||
# Anders loopt die badge stil achter: hij stond drie releases achter voordat
|
||||
# dit erin zat, en het script kent het nummer toch al. Zelfde regel als
|
||||
# hierboven: een droogloop meldt het, maar schrijft niet.
|
||||
$readmePath = Join-Path $PSScriptRoot "README.md"
|
||||
if (Test-Path $readmePath) {
|
||||
$readme = [System.IO.File]::ReadAllText($readmePath)
|
||||
$patroon = "badge/versie-[^-]+-"
|
||||
$nieuw = "badge/versie-$appVersion-"
|
||||
$huidig = [regex]::Match($readme, $patroon)
|
||||
if ($huidig.Success -and $huidig.Value -ne $nieuw) {
|
||||
if ($DryRun) {
|
||||
Write-Host "[DRY-RUN] Versiebadge in README.md: $($huidig.Value) -> $nieuw" -ForegroundColor Yellow
|
||||
} else {
|
||||
[System.IO.File]::WriteAllText($readmePath, ($readme -replace $patroon, $nieuw))
|
||||
Write-Host "Versiebadge in README.md bijgewerkt: $appVersion" -ForegroundColor Green
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
# ── Samenvatting ───────────────────────────────────────────────────────────
|
||||
Write-Host ""
|
||||
Write-Host "════════════════════════════════════════" -ForegroundColor Cyan
|
||||
@@ -365,14 +435,24 @@ if (-not $NoBuild) {
|
||||
Write-Step "[4/5] 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"
|
||||
# LET OP: deze twee commando's gingen niet via Invoke-Cmd en hadden dus geen
|
||||
# -DryRun-controle. Een `-DryRun -Force` verwijderde daardoor écht de tag,
|
||||
# lokaal en op origin — en Gitea ruimt de release op zodra de tag verdwijnt.
|
||||
# Zo is de release van 1.0.2 verloren gegaan.
|
||||
if ($DryRun) {
|
||||
Write-Host "[DRY-RUN] git tag -d $gitTag" -ForegroundColor Yellow
|
||||
Write-Host "[DRY-RUN] git push origin :refs/tags/$gitTag" -ForegroundColor Yellow
|
||||
} else {
|
||||
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
|
||||
Write-Host " Gitea verwijdert de bijbehorende release mee." -ForegroundColor DarkGray
|
||||
$ErrorActionPreference = "SilentlyContinue"
|
||||
git push origin ":refs/tags/$gitTag" 2>$null | Out-Null
|
||||
$ErrorActionPreference = "Stop"
|
||||
}
|
||||
}
|
||||
|
||||
Write-Host "Git-tag aanmaken: $gitTag" -ForegroundColor White
|
||||
@@ -405,7 +485,10 @@ if (-not $releaseApi) {
|
||||
Write-Host "Geen GITEA_TOKEN in de omgeving — release overgeslagen." -ForegroundColor Yellow
|
||||
Write-Host " Zonder release ziet de app geen update-melding voor $appVersion." -ForegroundColor DarkGray
|
||||
} else {
|
||||
$notes = Get-ChangelogSection $appVersion
|
||||
# Uit $changelogTxt en niet opnieuw van schijf: in een droogloop is de kop
|
||||
# nog niet geschreven, en dan zou de payload hier de placeholder tonen —
|
||||
# precies wat je met een droogloop wilt uitsluiten.
|
||||
$notes = Get-ChangelogSectionFromText $changelogTxt $appVersion
|
||||
if (-not $notes) { $notes = "Release $appVersion" }
|
||||
$payload = @{
|
||||
tag_name = $gitTag
|
||||
@@ -451,6 +534,38 @@ Write-Host " Git-tag: $gitTag -> origin" -ForegroundColor Green
|
||||
Write-Host "════════════════════════════════════════" -ForegroundColor Cyan
|
||||
Write-Host ""
|
||||
|
||||
# ── Versie naar de volgende dev-cyclus ────────────────────────────────────
|
||||
# Was voorheen stap 4 met de hand. Gebeurt hier, ná het publiceren, zodat een
|
||||
# afgebroken release het versienummer niet vooruit zet. Bijkomend voordeel: de
|
||||
# `-dev` suffix laat dezelfde release niet nog eens draaien (de controle boven
|
||||
# in dit script weigert een `-dev` versie), dus een dubbele publicatie is
|
||||
# meteen uitgesloten. Wil je bewust opnieuw releasen, zet het nummer dan zelf
|
||||
# terug.
|
||||
if ($appVersion -match '^(\d+)\.(\d+)\.(\d+)$') {
|
||||
$volgende = "{0}.{1}.{2}-dev" -f $Matches[1], $Matches[2], ([int]$Matches[3] + 1)
|
||||
$rootPkgPath = Join-Path $PSScriptRoot "package.json"
|
||||
|
||||
if ($DryRun) {
|
||||
Write-Host "[DRY-RUN] Versie in package.json: $appVersion -> $volgende" -ForegroundColor Yellow
|
||||
} else {
|
||||
# Gerichte tekstvervanging in plaats van ConvertTo-Json: dat zou het hele
|
||||
# bestand herschrijven en de opmaak van de andere velden aantasten.
|
||||
$rootTxt = [System.IO.File]::ReadAllText($rootPkgPath)
|
||||
$treffer = [regex]::Match($rootTxt, '"version"\s*:\s*"' + [regex]::Escape($appVersion) + '"')
|
||||
if ($treffer.Success) {
|
||||
$rootTxt = $rootTxt.Remove($treffer.Index, $treffer.Length).Insert($treffer.Index, '"version": "' + $volgende + '"')
|
||||
[System.IO.File]::WriteAllText($rootPkgPath, $rootTxt)
|
||||
Write-Host "Versie in package.json naar de volgende cyclus: $volgende" -ForegroundColor Green
|
||||
Write-Host " Commit dit mee, samen met de changelog-kop en de README-badge." -ForegroundColor DarkGray
|
||||
Write-Host ""
|
||||
} else {
|
||||
Write-Host "Kon '$appVersion' niet terugvinden in package.json — versie niet bijgewerkt." -ForegroundColor Yellow
|
||||
}
|
||||
}
|
||||
} else {
|
||||
Write-Host "Versie '$appVersion' is geen x.y.z — volgende dev-versie niet automatisch gezet." -ForegroundColor Yellow
|
||||
}
|
||||
|
||||
# Expliciete 0: anders erft de caller de exitcode van het laatste
|
||||
# docker-commando (bijv. de registry-check).
|
||||
exit 0
|
||||
|
||||
Reference in New Issue
Block a user