Три дефекта, найденные при установке владельцем на две машины. 1. Linux: лаунчер писал «Web server failed to respond», хотя сервер поднимался нормально — в логе старт API, планировщик квот и прогрев кэша без ошибок. Причина в самой проверке: sys импортировался ТОЛЬКО внутри except, а использовался в успешной ветке. На здоровом ответе возникал NameError, его ловил тот же except, и проверка всегда возвращала отказ. Доказано исполнением на живом сервере: старая логика -> код 1, новая -> код 0. 2. Windows: при нечитаемом манифесте мастер показывал зашитые InstalledVersion = "0.1.0" и InstalledDate = "19.08.2026" как факт. Владелец видел «старую версию» на свежей установке, хотя проверка показала правильный путь и версию 0.1.1. Заглушки заменены на «не определена» — выдуманный факт хуже отсутствующего. 3. Манифест писался одним File.WriteAllText: прерванная запись оставляла пустой файл, и разбор версии падал на первом символе — ровно это и случилось у владельца (JSONDecodeError, char 0). Запись переведена на временный файл с переносом. Попутно: git_commit в манифесте был зашит как "8cddc9f", то есть манифест сообщал неправду о происхождении сборки. Теперь сборщик проставляет фактический коммит. Тесты: 373 passed, ruff чисто. Установщик пересобран. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
78 lines
4.1 KiB
PowerShell
78 lines
4.1 KiB
PowerShell
# Compile HermesHubSetup.exe and package dist release
|
||
|
||
$CscPath = "C:\Windows\Microsoft.NET\Framework64\v4.0.30319\csc.exe"
|
||
if (-not (Test-Path $CscPath)) {
|
||
$CscPath = "C:\Windows\Microsoft.NET\Framework\v4.0.30319\csc.exe"
|
||
}
|
||
|
||
$ScriptDir = Split-Path -Parent $MyInvocation.MyCommand.Definition
|
||
$RepoRoot = Split-Path -Parent $ScriptDir
|
||
$SourceFile = Join-Path $ScriptDir "HermesHubSetup.cs"
|
||
$DistDir = Join-Path $RepoRoot "dist"
|
||
New-Item -ItemType Directory -Path $DistDir -Force | Out-Null
|
||
$OutFile = Join-Path $DistDir "HermesHubSetup.exe"
|
||
|
||
$LauncherDir = Join-Path $RepoRoot "launcher"
|
||
$HubCs = Join-Path $LauncherDir "HermesHub.cs"
|
||
$HubWebCs = Join-Path $LauncherDir "HermesHubWeb.cs"
|
||
|
||
Write-Host "Compiling native launchers..." -ForegroundColor Cyan
|
||
if (Test-Path $HubCs) {
|
||
$HubExe = Join-Path $LauncherDir "HermesHub.exe"
|
||
& $CscPath /target:winexe /out:"$HubExe" /r:System.Windows.Forms.dll /r:System.Drawing.dll "$HubCs"
|
||
}
|
||
if (Test-Path $HubWebCs) {
|
||
$HubWebExe = Join-Path $LauncherDir "HermesHubWeb.exe"
|
||
& $CscPath /target:winexe /out:"$HubWebExe" /r:System.Windows.Forms.dll /r:System.Drawing.dll "$HubWebCs"
|
||
}
|
||
|
||
# Собираем полезную нагрузку: всё, что нужно PerformInstall на целевой машине.
|
||
# Она вшивается в exe ресурсом, чтобы установщик был одним файлом и не требовал
|
||
# копировать репозиторий.
|
||
# Проставляем фактический коммит в исходник установщика, чтобы манифест
|
||
# развёртывания не сообщал неправду о происхождении сборки.
|
||
$GitSha = (git -C $RepoRoot rev-parse --short HEAD 2>$null)
|
||
if ($GitSha) {
|
||
$csText = Get-Content $SourceFile -Raw -Encoding UTF8
|
||
$csText = [regex]::Replace($csText, 'public const string BuildCommit = "[^"]*";', "public const string BuildCommit = `"$GitSha`";")
|
||
Set-Content $SourceFile -Value $csText -Encoding UTF8 -NoNewline
|
||
Write-Host "Build commit: $GitSha" -ForegroundColor Gray
|
||
}
|
||
|
||
Write-Host "Packing payload..." -ForegroundColor Cyan
|
||
$PayloadDir = Join-Path $env:TEMP ("hubpayload_" + [guid]::NewGuid().ToString("N").Substring(0,8))
|
||
New-Item -ItemType Directory -Force $PayloadDir | Out-Null
|
||
foreach ($item in @("src", "launcher", "assets", "config", "scripts")) {
|
||
$srcPath = Join-Path $RepoRoot $item
|
||
if (Test-Path $srcPath) {
|
||
Copy-Item $srcPath -Destination (Join-Path $PayloadDir $item) -Recurse -Force
|
||
}
|
||
}
|
||
# Каталоги сборки и кеши в дистрибутив не нужны.
|
||
Get-ChildItem $PayloadDir -Recurse -Directory -Include "__pycache__", ".venv", "node_modules" -ErrorAction SilentlyContinue |
|
||
Remove-Item -Recurse -Force -ErrorAction SilentlyContinue
|
||
$PayloadZip = Join-Path $env:TEMP "hub_payload.zip"
|
||
if (Test-Path $PayloadZip) { Remove-Item $PayloadZip -Force }
|
||
Compress-Archive -Path (Join-Path $PayloadDir "*") -DestinationPath $PayloadZip -CompressionLevel Optimal
|
||
$payloadKB = [int]((Get-Item $PayloadZip).Length / 1KB)
|
||
Write-Host "Payload packed: $payloadKB KB" -ForegroundColor Gray
|
||
|
||
Write-Host "Compiling HermesHubSetup.exe..." -ForegroundColor Cyan
|
||
& $CscPath /target:winexe /out:"$OutFile" /r:System.Windows.Forms.dll /r:System.Drawing.dll /r:System.IO.Compression.FileSystem.dll /resource:"$PayloadZip",payload "$SourceFile"
|
||
|
||
if ($LASTEXITCODE -eq 0) {
|
||
Write-Host "Installer compiled successfully: $OutFile" -ForegroundColor Green
|
||
|
||
# Generate SHA256 Checksums
|
||
$sha256 = (Get-FileHash -Path $OutFile -Algorithm SHA256).Hash
|
||
$checksumContent = "$sha256 HermesHubSetup.exe"
|
||
$checksumFile = Join-Path $DistDir "checksums.txt"
|
||
Set-Content -Path $checksumFile -Value $checksumContent -Encoding UTF8
|
||
Write-Host "Generated checksum: $checksumFile" -ForegroundColor Green
|
||
Write-Host "SHA256: $sha256" -ForegroundColor Gray
|
||
} else {
|
||
Write-Error "Installer compilation FAILED with exit code $LASTEXITCODE"
|
||
}
|
||
|
||
Remove-Item $PayloadDir -Recurse -Force -ErrorAction SilentlyContinue
|
||
Remove-Item $PayloadZip -Force -ErrorAction SilentlyContinue
|