166 lines
6.0 KiB
PowerShell
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"
|