#requires -Version 5 param( [string]$RepoRoot = (Resolve-Path (Join-Path $PSScriptRoot "..\..")).ProviderPath, [string]$BuildType = "release", [string]$AndroidHome = $env:ANDROID_HOME, [switch]$InstallMissing, [switch]$SkipPrepare, [switch]$SkipWorkspaceCleanup, [switch]$PrintOnly, [bool]$PublishToTestDockerDownloads = $true, [switch]$NoRemotePublish, [string]$TestDockerSshAlias = "test-docker", [string]$TestDockerDownloadPath = "/tmp/rap-web-admin/html/downloads", [string]$TestDockerBackendReleasePath = "/tmp/rap-release-0.2.309-latencyaware", [int]$PreparationRetryDelaySeconds = 0, [string]$PortalVerifyBaseUrl = "http://192.168.200.61:18080", [switch]$SkipPortalVerify ) $ErrorActionPreference = "Stop" function Fail([string]$message) { Write-Error $message exit 1 } function Run-Step([string]$name, [scriptblock]$action) { Write-Host "=== $name ===" $global:LASTEXITCODE = 0 try { & $action } catch { Fail "$name failed: $($_.Exception.Message)" } if (-not $?) { Fail "$name failed with script error" } if ($LASTEXITCODE -ne 0) { Fail "$name failed with exit code $LASTEXITCODE" } } $scriptDir = Split-Path -Parent (Resolve-Path $PSCommandPath).ProviderPath $prepareScript = Join-Path $scriptDir "prepare-android-build-environment.ps1" $buildScript = Join-Path $scriptDir "build-android-apk.ps1" $buildTypeNormalized = $BuildType.Trim().ToLower() if ($buildTypeNormalized -notin @("debug","release")) { Fail "BuildType должен быть debug или release" } if (($NoRemotePublish -or -not $PublishToTestDockerDownloads) -and $buildTypeNormalized -eq "release") { Fail "Для Release сборки в этом сценарии требуется публикация в test-docker. Убери -NoRemotePublish и явно не отключай -PublishToTestDockerDownloads." } if (-not (Test-Path $prepareScript)) { Fail "Не найден скрипт подготовки окружения: $prepareScript" } if (-not (Test-Path $buildScript)) { Fail "Не найден скрипт сборки: $buildScript" } if (-not $SkipPrepare) { Run-Step "Подготовка Android окружения" { & $prepareScript -RepoRoot $RepoRoot -AndroidHome $AndroidHome -SetEnvironment -InstallMissing:$InstallMissing } if ($PreparationRetryDelaySeconds -gt 0) { Start-Sleep -Seconds $PreparationRetryDelaySeconds } } else { Write-Host "Подготовка окружения пропущена (-SkipPrepare)." } if ($PrintOnly) { if ($PublishToTestDockerDownloads -and -not $NoRemotePublish) { & $buildScript -RepoRoot $RepoRoot -BuildType $BuildType -AndroidHome $AndroidHome -PrintOnly ` -SkipWorkspaceCleanup:$SkipWorkspaceCleanup ` -PublishToTestDockerDownloads:$true ` -TestDockerSshAlias $TestDockerSshAlias ` -TestDockerDownloadPath $TestDockerDownloadPath ` -TestDockerBackendReleasePath $TestDockerBackendReleasePath } else { & $buildScript -RepoRoot $RepoRoot -BuildType $BuildType -AndroidHome $AndroidHome -PrintOnly ` -SkipWorkspaceCleanup:$SkipWorkspaceCleanup } exit 0 } Run-Step "Сборка и публикация Android APK" { if ($PublishToTestDockerDownloads -and -not $NoRemotePublish) { & $buildScript -RepoRoot $RepoRoot -BuildType $BuildType -AndroidHome $AndroidHome -SkipWorkspaceCleanup:$SkipWorkspaceCleanup ` -PublishToTestDockerDownloads:$true ` -TestDockerSshAlias $TestDockerSshAlias ` -TestDockerDownloadPath $TestDockerDownloadPath ` -TestDockerBackendReleasePath $TestDockerBackendReleasePath } else { & $buildScript -RepoRoot $RepoRoot -BuildType $BuildType -AndroidHome $AndroidHome -SkipWorkspaceCleanup:$SkipWorkspaceCleanup } } if ($SkipPortalVerify) { Write-Host "Сборка выполнена. Проверка публикации пропущена (-SkipPortalVerify)." exit 0 } Run-Step "Проверка манифеста веб-панели" { $manifestPath = Join-Path $RepoRoot "web-admin\deploy\html\downloads\rap-android-vpn-build.json" if (-not (Test-Path $manifestPath)) { Fail "Локальный манифест не найден: $manifestPath" } $manifest = Get-Content $manifestPath -Raw | ConvertFrom-Json if (-not $manifest.version -or -not $manifest.version.name) { Fail "Манифест не содержит version.name: $manifestPath" } Write-Host "Локальный манифест APK версии: $($manifest.version.name) ($($manifest.version.code))" Write-Host "Path: $($manifest.published.path)" Write-Host "Sha256: $($manifest.published.sha256)" if (-not [string]::IsNullOrWhiteSpace($PortalVerifyBaseUrl)) { $manifestUrl = "$PortalVerifyBaseUrl/api/v1/downloads/rap-android-vpn-build.json?_cb=$(Get-Date -Format 'yyyyMMddHHmmss')" try { $remoteManifest = Invoke-RestMethod -Uri $manifestUrl -Method Get if (-not $remoteManifest.version -or -not $remoteManifest.version.name -or $remoteManifest.version.name -ne $manifest.version.name) { Fail "Версия после деплоя не совпадает: локально=$($manifest.version.name), remote=$($remoteManifest.version.name)" } Write-Host "Подтверждено: portal returns version $($remoteManifest.version.name)" } catch { Write-Host "WARN: не удалось прочитать удаленный манифест из $manifestUrl" Write-Host " Проверьте доступность веб-панели и путь/порт вручную." } } } Write-Host "Готово: релиз собран, опубликован и проверен."