`mdrs selfupdate` replaced the running binary with whatever the release endpoint returned, checking only that the transport succeeded. Nothing proved the archive was the one the release publishes. - Compare the downloaded archive against the release's `.sha256` asset and abort the update on a mismatch. - Report a release that publishes no checksum as unverified, rather than letting its absence pass for a verified download. - Exclude `.sha256` assets when matching the archive for the build target: those assets carry the target name too. - Write and upload a checksum beside every archive, from the Gitea release workflow and the three local build scripts.
107 lines
3.7 KiB
PowerShell
107 lines
3.7 KiB
PowerShell
# Build release archive for Windows (x86_64-pc-windows-msvc).
|
|
#
|
|
# Usage:
|
|
# .\scripts\build-release-windows.ps1 [-Version <VERSION>]
|
|
#
|
|
# If -Version is not provided, it is read from Cargo.toml.
|
|
# Set GITEA_TOKEN (and optionally GITEA_SERVER_URL / GITEA_REPOSITORY)
|
|
# to upload the archive to a Gitea release automatically.
|
|
# These can be provided via scripts\.env.
|
|
|
|
param(
|
|
[string]$Version = ""
|
|
)
|
|
|
|
Set-StrictMode -Version Latest
|
|
$ErrorActionPreference = "Stop"
|
|
|
|
$ScriptDir = Split-Path -Parent $MyInvocation.MyCommand.Path
|
|
$RepoRoot = Split-Path -Parent $ScriptDir
|
|
|
|
# Load .env if present (existing env vars take precedence)
|
|
$EnvFile = Join-Path $ScriptDir ".env"
|
|
if (Test-Path $EnvFile) {
|
|
Get-Content $EnvFile | ForEach-Object {
|
|
if ($_ -match '^\s*#' -or $_ -match '^\s*$') { return }
|
|
$parts = $_ -split '=', 2
|
|
$key = $parts[0].Trim()
|
|
$value = $parts[1].Trim()
|
|
if (-not [System.Environment]::GetEnvironmentVariable($key)) {
|
|
[System.Environment]::SetEnvironmentVariable($key, $value, "Process")
|
|
}
|
|
}
|
|
}
|
|
|
|
# Determine version
|
|
if (-not $Version) {
|
|
$cargoToml = Get-Content (Join-Path $RepoRoot "Cargo.toml") -Raw
|
|
if ($cargoToml -match 'version\s*=\s*"([^"]+)"') {
|
|
$Version = $Matches[1]
|
|
} else {
|
|
Write-Error "Could not determine version from Cargo.toml"
|
|
exit 1
|
|
}
|
|
}
|
|
|
|
$Tag = "v$Version"
|
|
$Target = "x86_64-pc-windows-msvc"
|
|
|
|
Set-Location $RepoRoot
|
|
|
|
Write-Host "==> Building mdrs $Version for Windows ($Target)"
|
|
|
|
rustup target add $Target
|
|
cargo build --release --target $Target
|
|
|
|
$Archive = "mdrs-$Version-$Target.zip"
|
|
Compress-Archive -Force -Path "target\$Target\release\mdrs.exe" -DestinationPath $Archive
|
|
# Written alongside the archive so `mdrs selfupdate` can check what it fetched.
|
|
$Checksum = "$Archive.sha256"
|
|
$Hash = (Get-FileHash -Algorithm SHA256 -Path $Archive).Hash.ToLower()
|
|
"$Hash $Archive" | Set-Content -NoNewline -Encoding ascii $Checksum
|
|
Write-Host " Created: $Archive"
|
|
|
|
# Upload to Gitea if token is provided
|
|
$GiteaToken = [System.Environment]::GetEnvironmentVariable("GITEA_TOKEN")
|
|
if (-not $GiteaToken) {
|
|
Write-Host ""
|
|
Write-Host "GITEA_TOKEN not set -- skipping upload."
|
|
Write-Host "Set GITEA_TOKEN (and GITEA_SERVER_URL, GITEA_REPOSITORY) in scripts\.env to enable upload."
|
|
exit 0
|
|
}
|
|
|
|
$ServerUrl = [System.Environment]::GetEnvironmentVariable("GITEA_SERVER_URL")
|
|
$Repository = [System.Environment]::GetEnvironmentVariable("GITEA_REPOSITORY")
|
|
if (-not $ServerUrl) { Write-Error "GITEA_SERVER_URL is required for upload"; exit 1 }
|
|
if (-not $Repository) { Write-Error "GITEA_REPOSITORY is required for upload"; exit 1 }
|
|
|
|
$Headers = @{ Authorization = "Bearer $GiteaToken"; "Content-Type" = "application/json" }
|
|
|
|
Write-Host ""
|
|
Write-Host "==> Creating Gitea release $Tag ..."
|
|
try {
|
|
Invoke-RestMethod -Method Post -Uri "$ServerUrl/api/v1/repos/$Repository/releases" `
|
|
-Headers $Headers `
|
|
-Body (ConvertTo-Json @{ tag_name = $Tag; name = $Tag }) | Out-Null
|
|
} catch {
|
|
# Release may already exist; continue
|
|
}
|
|
|
|
$Release = Invoke-RestMethod -Method Get -Uri "$ServerUrl/api/v1/repos/$Repository/releases/tags/$Tag" `
|
|
-Headers @{ Authorization = "Bearer $GiteaToken" }
|
|
$ReleaseId = $Release.id
|
|
|
|
foreach ($Name in @($Archive, $Checksum)) {
|
|
Write-Host "==> Uploading $Name (release id: $ReleaseId) ..."
|
|
$AssetPath = Join-Path $RepoRoot $Name
|
|
& curl.exe -sf -X POST `
|
|
-H "Authorization: Bearer $GiteaToken" `
|
|
-F "attachment=@$AssetPath" `
|
|
"$ServerUrl/api/v1/repos/$Repository/releases/$ReleaseId/assets" | Out-Null
|
|
if ($LASTEXITCODE -ne 0) { Write-Error "Upload failed (exit code $LASTEXITCODE)"; exit 1 }
|
|
Write-Host " Done."
|
|
}
|
|
|
|
Write-Host ""
|
|
Write-Host "==> Upload complete: $ServerUrl/$Repository/releases/tag/$Tag"
|