138 lines
5.9 KiB
PowerShell
138 lines
5.9 KiB
PowerShell
#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 "Готово: релиз собран, опубликован и проверен."
|