From 1dca505e3cb1c3d254215ee3f88c0e5371d06daa Mon Sep 17 00:00:00 2001 From: MrMaho Date: Wed, 28 Oct 2026 19:04:15 +0100 Subject: [PATCH] Release beim Bauen hochladen (wie MSCO) - dotnet publish -p:BsoRelease=true (Launcher, Server) bzw. build.ps1 -Release (Mod) signiert und laedt hoch - Changelog aus CHANGELOG.md, Ordner werden gezippt, Token/URL auch aus Windows-Benutzervariablen Co-Authored-By: Claude Opus 5.5 --- CHANGELOG.md | 14 ++++++++++++++ build.ps1 | 7 +++++++ release.ps1 | 50 ++++++++++++++++++++++++++++++++++++++++++-------- 3 files changed, 63 insertions(+), 8 deletions(-) create mode 100644 CHANGELOG.md diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..f5b84a6 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,14 @@ +# Changelog – BSO Mod + +Neue Version: hier einen Abschnitt `## ` anlegen, `` in `BSO.csproj` und `Bootstrap.ModVersion` +erhöhen, dann `.\build.ps1 -Release`. + +## 0.4.0 +- Mitspieler in der Welt: Bus bzw. Spielfigur mit Namensschild und Entfernung, weich bewegt +- BSO-Konto: ohne Start über den Launcher kein Multiplayer, der Name im Spiel kommt aus dem Konto +- Beitreten über den Server-Browser im Launcher (verbindet automatisch) + +## 0.2.0 +- Mitspieler-Liste: Name, zu Fuß/Bus, Entfernung, Tempo +- Verbinden per IP mit F8 oder automatisch über den Launcher +- Vollbild im Fenster (F11) diff --git a/build.ps1 b/build.ps1 index 8c55c7d..990aa07 100644 --- a/build.ps1 +++ b/build.ps1 @@ -2,7 +2,9 @@ # dist\dinput8.dll -> in den Spielordner (Bin_High_Win64) # dist\BSO\BSO.dll + *.json -> nach Bin_High_Win64\BSO # dist\BSO-Mod.zip -> Release-Paket fuer den Launcher (release.ps1 -Product mod) +# -Release: danach signieren und auf die Website laden (Version aus BSO.csproj, Changelog aus CHANGELOG.md) # Voraussetzungen: Visual Studio mit C++, .NET 10 SDK. +param([switch]$Release) $ErrorActionPreference = "Stop" $root = $PSScriptRoot $dist = Join-Path $root "dist" @@ -45,3 +47,8 @@ try { finally { $archive.Dispose() } Write-Host "Fertig: $dist" + +if ($Release) { + $version = ([xml](Get-Content (Join-Path $root "BSO.csproj"))).Project.PropertyGroup.Version | Where-Object { $_ } | Select-Object -First 1 + & (Join-Path $root "release.ps1") -Product mod -Version $version -File $zip +} diff --git a/release.ps1 b/release.ps1 index 4a3273d..cd7ce65 100644 --- a/release.ps1 +++ b/release.ps1 @@ -1,7 +1,10 @@ -# Signiert ein Release und laedt es auf den BSO Master (wie release.ps1 bei MSCO). +# Signiert ein Release und laedt es auf die BSO-Website (wie release.ps1 bei MSCO). # .\release.ps1 -Product mod|launcher|server -Version 0.2.0 -File dist\BSO-Mod.zip [-Changelog "..."] -# Braucht: Release-Schluessel (BSO-Launcher\new-release-key.ps1), BSO_RELEASE_TOKEN (= RELEASE_TOKEN des Masters), -# optional BSO_MASTER_URL (Standard https://bso.mbm.wtf). +# Laeuft auch automatisch bei "dotnet publish -p:BsoRelease=true" (Launcher und Server, siehe .csproj). +# - Ohne -Changelog: der Abschnitt "## " aus CHANGELOG.md neben diesem Skript. +# - Ist -File ein Ordner (Server: publish\), wird er ohne .pdb-Dateien gezippt. +# Braucht: Release-Schluessel (BSO-Launcher\new-release-key.ps1), BSO_RELEASE_TOKEN (= RELEASE_TOKEN der Website), +# optional BSO_MASTER_URL (Standard https://bso.mbm.wtf). Beide auch als Windows-Benutzervariable. # Signiert wird "BSO-RELEASE|produkt|version|sha256" - der Launcher prueft das mit dem eingebauten oeffentlichen Schluessel. param( [Parameter(Mandatory)][ValidateSet("mod", "launcher", "server")][string]$Product, @@ -13,13 +16,44 @@ $ErrorActionPreference = "Stop" Add-Type -AssemblyName System.Security Add-Type -AssemblyName System.Net.Http -$master = ($env:BSO_MASTER_URL, "https://bso.mbm.wtf" | Where-Object { $_ } | Select-Object -First 1).TrimEnd('/') -$token = $env:BSO_RELEASE_TOKEN +# Aus der Umgebung - sonst die Windows-Benutzervariable (z.B. wenn Visual Studio vor dem Setzen gestartet wurde) +function Setting([string]$name) { + $v = [Environment]::GetEnvironmentVariable($name) + if (-not $v) { $v = [Environment]::GetEnvironmentVariable($name, "User") } + return $v +} +$master = ((Setting "BSO_MASTER_URL"), "https://bso.mbm.wtf" | Where-Object { $_ } | Select-Object -First 1).TrimEnd('/') +$token = Setting "BSO_RELEASE_TOKEN" if (-not $token) { Write-Host "BSO_RELEASE_TOKEN nicht gesetzt - nicht hochgeladen"; return } $keyFile = Join-Path $env:APPDATA "BSO\release-key.dpapi" if (-not (Test-Path $keyFile)) { throw "Kein Release-Schluessel ($keyFile) - erst new-release-key.ps1 im BSO-Launcher-Repo" } +$Version = $Version.Split('+')[0] -$data = [IO.File]::ReadAllBytes((Resolve-Path $File)) +# Changelog aus CHANGELOG.md: alles unter "## " bis zur naechsten "## "-Zeile +if (-not $Changelog) { + $md = Join-Path $PSScriptRoot "CHANGELOG.md" + if (Test-Path $md) { + $lines = [IO.File]::ReadAllLines($md) + $start = [Array]::FindIndex($lines, [Predicate[string]] { param($l) $l -match "^##\s+v?$([regex]::Escape($Version))(\s|$)" }) + if ($start -ge 0) { + $section = @() + for ($i = $start + 1; $i -lt $lines.Length -and $lines[$i] -notmatch '^##\s'; $i++) { $section += $lines[$i] } + $Changelog = ($section -join "`n").Trim() + } + } + if ($Changelog) { Write-Host "Changelog aus CHANGELOG.md ($Version)" } else { Write-Host "Kein Changelog fuer $Version in CHANGELOG.md" } +} + +# Ordner (dotnet publish) -> zip +$path = (Resolve-Path $File).Path +if (Test-Path $path -PathType Container) { + $zip = Join-Path $env:TEMP "BSO-$Product-$Version.zip" + Remove-Item $zip -ErrorAction SilentlyContinue + Compress-Archive -Path (Get-ChildItem $path -File | Where-Object Extension -ne ".pdb").FullName -DestinationPath $zip + $path = $zip +} + +$data = [IO.File]::ReadAllBytes($path) $sha = ([System.Security.Cryptography.SHA256]::Create().ComputeHash($data) | ForEach-Object { $_.ToString("x2") }) -join "" $private = [System.Security.Cryptography.ProtectedData]::Unprotect([IO.File]::ReadAllBytes($keyFile), $null, [System.Security.Cryptography.DataProtectionScope]::CurrentUser) @@ -37,9 +71,9 @@ foreach ($pair in @(@("product", $Product), @("version", $Version), @("changelog $form.Add((New-Object System.Net.Http.StringContent($pair[1])), "`"$($pair[0])`"") } $content = New-Object System.Net.Http.ByteArrayContent(, $data) -$form.Add($content, "`"file`"", "`"$(Split-Path $File -Leaf)`"") +$form.Add($content, "`"file`"", "`"$(Split-Path $path -Leaf)`"") $res = $http.PostAsync("$master/api/releases/upload", $form).Result $body = $res.Content.ReadAsStringAsync().Result -if ($res.StatusCode -eq [Net.HttpStatusCode]::Conflict) { Write-Host "$Product $Version gibt es schon auf $master"; return } +if ($res.StatusCode -eq [Net.HttpStatusCode]::Conflict) { Write-Host "$Product $Version gibt es schon auf $master - Version in der .csproj erhoehen"; return } if (-not $res.IsSuccessStatusCode) { throw "Hochladen fehlgeschlagen ($([int]$res.StatusCode)): $body" } Write-Host "$Product $Version hochgeladen nach $master (sha256 $sha)"