hermes-hub/installer/build_installer.ps1
Hermes Team 57e7ca2edd fix: проверка готовности всегда врала, установщик показывал зашитую версию
Три дефекта, найденные при установке владельцем на две машины.

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>
2026-08-24 09:47:00 +07:00

78 lines
4.1 KiB
PowerShell
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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