Files
sanctum/scripts/publish-release.ps1
harald 4ef0c414fa
Sanctum Release / Build & Release (Windows x86_64) (push) Canceled after 0s
feat(linux): add static musl x86_64 build, packaging, and Freedesktop integration
2026-09-10 17:45:04 +02:00

166 lines
6.0 KiB
PowerShell

param (
[string]$Token,
[string]$GiteaUrl = "https://gitea.pansi.eu",
[string]$Owner = "harald",
[string]$Repo = "sanctum"
)
$ErrorActionPreference = "Stop"
$ScriptDir = Split-Path -Parent $MyInvocation.MyCommand.Path
$ProjectRoot = Split-Path -Parent $ScriptDir
$CargoToml = Get-Content (Join-Path $ProjectRoot "Cargo.toml") -Raw
if ($CargoToml -match 'version\s*=\s*"([^"]+)"') {
$Version = $matches[1]
} else {
Write-Error "Version nicht gefunden."
exit 1
}
$TagName = "v$Version"
$DistDir = Join-Path $ProjectRoot "dist"
$ZipFile = Join-Path $DistDir "sanctum-$TagName-windows-x86_64.zip"
$ChecksumFile = Join-Path $DistDir "SHA256SUMS.txt"
if (-not (Test-Path $ZipFile)) {
Write-Host "Dist-Paket existiert noch nicht. Baue Paket..." -ForegroundColor Yellow
& (Join-Path $ScriptDir "package-release.ps1")
}
# .env-Datei laden falls vorhanden (ist in .gitignore)
$EnvFile = Join-Path $ProjectRoot ".env"
if (Test-Path $EnvFile) {
Get-Content $EnvFile | ForEach-Object {
if ($_ -match '^\s*([A-Za-z_][A-Za-z0-9_]*)\s*=\s*(.*)\s*$') {
$val = $matches[2].Trim('"', "'")
[System.Environment]::SetEnvironmentVariable($matches[1], $val, "Process")
}
}
}
# Token ermitteln (Parameter -> Environment -> Prompt)
if (-not $Token) {
if ($env:GITEA_TOKEN) {
$Token = $env:GITEA_TOKEN
} else {
$SecureToken = Read-Host "Gitea Personal Access Token (mit 'repo'-Scope)" -AsSecureString
$BSTR = [System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($SecureToken)
$Token = [System.Runtime.InteropServices.Marshal]::PtrToStringAuto($BSTR)
}
}
if (-not $Token -or $Token.Trim().Length -eq 0) {
Write-Error "Kein Token angegeben. Abgebrochen."
exit 1
}
Write-Host "============================================================" -ForegroundColor Cyan
Write-Host " Veroeffentliche Release $TagName auf Gitea" -ForegroundColor Cyan
Write-Host " Repository: $Owner/$Repo ($GiteaUrl)" -ForegroundColor Cyan
Write-Host "============================================================" -ForegroundColor Cyan
$Headers = @{
"Authorization" = "token $Token"
"Accept" = "application/json"
}
# Pruefen ob Release bereits existiert
$ExistingReleases = try {
Invoke-RestMethod -Uri "$GiteaUrl/api/v1/repos/$Owner/$Repo/releases" -Headers $Headers -Method Get
} catch {
@()
}
$Release = $ExistingReleases | Where-Object { $_.tag_name -eq $TagName }
if (-not $Release) {
$Utf8NoBom = New-Object System.Text.UTF8Encoding($false)
$Changelog = [System.IO.File]::ReadAllText((Join-Path $ProjectRoot "CHANGELOG.md"), $Utf8NoBom)
$PayloadPath = Join-Path $DistDir "release_req.json"
$Payload = @{
tag_name = $TagName
name = "Sanctum $TagName (Windows x86_64)"
body = $Changelog
draft = $false
prerelease = $false
} | ConvertTo-Json -Depth 5
[System.IO.File]::WriteAllText($PayloadPath, $Payload, $Utf8NoBom)
$CreateResp = & curl.exe -s -X POST "$GiteaUrl/api/v1/repos/$Owner/$Repo/releases" `
-H "Authorization: token $Token" `
-H "Content-Type: application/json; charset=utf-8" `
--data-binary "@$PayloadPath"
Remove-Item $PayloadPath -Force -ErrorAction SilentlyContinue
$Release = $CreateResp | ConvertFrom-Json
if (-not $Release.id) {
Write-Error "Fehler beim Erstellen des Releases: $CreateResp"
exit 1
}
Write-Host "[OK] Release $TagName auf Gitea angelegt (ID: $($Release.id))." -ForegroundColor Green
} else {
Write-Host "[INFO] Release $TagName existiert bereits (ID: $($Release.id))." -ForegroundColor Yellow
}
$UploadUrl = "$GiteaUrl/api/v1/repos/$Owner/$Repo/releases/$($Release.id)/assets"
$AuthHeader = "Authorization: token $Token"
# Hilfsfunktion zum sauberen Hochladen/Ersetzen von Assets
function Upload-ReleaseAsset {
param (
[string]$FilePath,
[string]$AssetName
)
if (-not (Test-Path $FilePath)) {
return
}
Write-Host "Lade $AssetName hoch..." -ForegroundColor Cyan
# Vorhandenes Asset mit gleichem Namen ermitteln und ggf. loeschen
$ExistingAssets = try {
Invoke-RestMethod -Uri $UploadUrl -Headers $Headers -Method Get
} catch {
@()
}
$Duplicate = $ExistingAssets | Where-Object { $_.name -eq $AssetName }
if ($Duplicate) {
Write-Host " [i] Ersetze existierendes Asset '$AssetName' (ID: $($Duplicate.id))..." -ForegroundColor DarkYellow
$DeleteUrl = "$GiteaUrl/api/v1/repos/$Owner/$Repo/releases/$($Release.id)/assets/$($Duplicate.id)"
Invoke-RestMethod -Uri $DeleteUrl -Headers $Headers -Method Delete | Out-Null
}
$PathNorm = $FilePath.Replace('\', '/')
$TargetUrl = "${UploadUrl}?name=$AssetName"
$Result = & curl.exe -sS -X POST $TargetUrl -H $AuthHeader -F "attachment=@$PathNorm"
if ($LASTEXITCODE -ne 0) {
Write-Error "Upload von $AssetName fehlgeschlagen: $Result"
exit 1
}
Write-Host "[OK] $AssetName erfolgreich hochgeladen." -ForegroundColor Green
}
# Windows-Assets hochladen
Upload-ReleaseAsset -FilePath $ZipFile -AssetName "sanctum-$TagName-windows-x86_64.zip"
$ExeFile = Join-Path $ProjectRoot "target\release\sanctum.exe"
Upload-ReleaseAsset -FilePath $ExeFile -AssetName "sanctum.exe"
# Linux-Assets hochladen
$LinuxTar = Join-Path $DistDir "sanctum-$TagName-linux-x86_64.tar.gz"
Upload-ReleaseAsset -FilePath $LinuxTar -AssetName "sanctum-$TagName-linux-x86_64.tar.gz"
$LinuxElf = Join-Path $ProjectRoot "target\x86_64-unknown-linux-musl\release\sanctum"
Upload-ReleaseAsset -FilePath $LinuxElf -AssetName "sanctum"
# SHA256SUMS.txt hochladen
Upload-ReleaseAsset -FilePath $ChecksumFile -AssetName "SHA256SUMS.txt"
Write-Host "`n============================================================" -ForegroundColor Green
Write-Host " Release $TagName erfolgreich auf Gitea veroeffentlicht!" -ForegroundColor Green
Write-Host "============================================================" -ForegroundColor Green
Write-Host " URL: $GiteaUrl/$Owner/$Repo/releases/tag/$TagName`n"