Files
rdp-proxy/scripts/prepare-local-build-workstation.ps1
T
2026-05-12 21:02:29 +03:00

246 lines
9.1 KiB
PowerShell

#requires -Version 5
param(
[string]$AndroidHome = "C:\Android\Sdk",
[switch]$InstallMissing,
[switch]$SetEnvironment,
[switch]$NoColor
)
$ErrorActionPreference = "Stop"
function Write-Info([string]$message) {
if ($NoColor) { Write-Host $message; return }
Write-Host $message -ForegroundColor Cyan
}
function Write-Ok([string]$message) {
if ($NoColor) { Write-Host ("OK: " + $message); return }
Write-Host ("OK: " + $message) -ForegroundColor Green
}
function Write-Warn([string]$message) {
if ($NoColor) { Write-Host ("WARN: " + $message); return }
Write-Host ("WARN: " + $message) -ForegroundColor Yellow
}
function Write-Err([string]$message) {
if ($NoColor) { Write-Host ("ERR: " + $message); return }
Write-Host ("ERR: " + $message) -ForegroundColor Red
}
function Fail([string]$message) {
Write-Err $message
exit 1
}
function Command-Version([string]$name) {
$cmd = Get-Command $name -ErrorAction SilentlyContinue
if (-not $cmd) { return $null }
try {
$probe = & $cmd.Source --version 2>&1
if (-not $probe) {
return "found (no version output)"
}
return ($probe | Select-Object -First 1)
}
catch {
return "found"
}
}
function Assert-Command {
param(
[string]$Name,
[string]$InstallSuggestion,
[bool]$Required = $true,
[scriptblock]$ValueChecker,
[scriptblock]$VersionCommand
)
$command = Get-Command $Name -ErrorAction SilentlyContinue
if (-not $command) {
Write-Warn "${Name}: не найден"
if ($InstallMissing) {
if (Get-Command choco -ErrorAction SilentlyContinue) {
Write-Info "-> Пробуем установить $Name через choco..."
$expr = "choco install -y $InstallSuggestion"
Write-Info $expr
Invoke-Expression $expr
} elseif (Get-Command winget -ErrorAction SilentlyContinue) {
Write-Info "-> Пробуем установить $Name через winget..."
$expr = "winget install --id $InstallSuggestion --source winget -h"
Write-Info $expr
Invoke-Expression $expr
} else {
Write-Err "Нет choco/winget, установите $Name вручную: $InstallSuggestion"
if ($Required) { $global:failed = $true }
return
}
} else {
if ($Required) { $global:failed = $true }
}
return
}
if ($ValueChecker) {
try {
& $ValueChecker | Out-Null
} catch {
Write-Warn "${Name}: найден, но не прошел валидацию ($($_.Exception.Message))"
if ($Required) { $global:failed = $true }
return
}
}
if ($VersionCommand) {
try {
$version = (& $VersionCommand | Out-String).Trim()
if (-not $version) { $version = $command.Source }
} catch {
$version = $command.Source
}
} else {
$version = (& $command.Source --version 2>&1 | Select-Object -First 1)
if ([string]::IsNullOrWhiteSpace($version)) {
$version = $command.Source
}
}
Write-Ok "${Name}: $version"
}
function Check-Java([int]$minVersion = 17) {
$java = Get-Command java -ErrorAction SilentlyContinue
if (-not $java) {
return
}
$tmpStdout = [IO.Path]::GetTempFileName()
$tmpStderr = [IO.Path]::GetTempFileName()
try {
$javaProc = Start-Process -FilePath $java.Source -ArgumentList "-version" -NoNewWindow -PassThru -Wait `
-RedirectStandardOutput $tmpStdout -RedirectStandardError $tmpStderr
$versionOutput = ((Get-Content -Raw $tmpStdout) + "`n" + (Get-Content -Raw $tmpStderr)).Trim()
if ($javaProc.ExitCode -ne 0) {
Write-Warn "java: ошибка запуска `"-version`" (exit code=$($javaProc.ExitCode))"
$global:failed = $true
return
}
} catch {
Write-Warn "java: не удалось определить версию ($($_.Exception.Message))"
$global:failed = $true
return
} finally {
Remove-Item -ErrorAction SilentlyContinue $tmpStdout, $tmpStderr
}
if ([string]::IsNullOrWhiteSpace($versionOutput)) {
Write-Warn "java: не удалось прочитать версию"
$global:failed = $true
return
}
$line = ($versionOutput -split "`r?`n" | Select-Object -First 1).Trim()
if ($line -match "version\s+`"(\d+)\.") {
$major = [int]$matches[1]
if ($major -lt $minVersion) {
Write-Warn "java: версия $major, нужен JDK $minVersion+"
$global:failed = $true
} else {
Write-Ok "java: $line"
}
} else {
Write-Ok "java: $line"
}
}
$global:failed = $false
Write-Info "=== RAP: аудит локальной рабочей станции сборки ==="
Write-Info "Путь репозитория: $PSScriptRoot\..\.."
# Базовые тулзы платформы
Assert-Command -Name "git" -InstallSuggestion "git" -Required $true
Assert-Command -Name "go" -InstallSuggestion "golang" -Required $true -VersionCommand { (& go version | Select-Object -First 1) }
Assert-Command -Name "node" -InstallSuggestion "nodejs-lts" -Required $false
Assert-Command -Name "npm" -InstallSuggestion "nodejs-lts" -Required $false
Assert-Command -Name "docker" -InstallSuggestion "docker-desktop" -Required $true
Check-Java -minVersion 17
Assert-Command -Name "gradle" -InstallSuggestion "gradle" -Required $true -VersionCommand { "gradle из PATH" }
# Android SDK
Write-Info "Android SDK: $AndroidHome"
if (-not (Test-Path $AndroidHome)) {
if (-not $InstallMissing) {
Write-Warn "Android SDK не найден: $AndroidHome"
$global:failed = $true
} else {
Write-Err "Не могу автоматически установить Android SDK: $AndroidHome не существует."
Write-Info "Установи Android Studio или Android SDK вручную, затем повтори."
$global:failed = $true
}
} else {
$sdkManagerPath = Join-Path $AndroidHome "cmdline-tools\latest\bin\sdkmanager.bat"
$platformTools = Join-Path $AndroidHome "platform-tools"
if (-not (Test-Path $sdkManagerPath)) {
Write-Warn "Android cmdline-tools: не найден $sdkManagerPath"
} else {
Write-Ok "Android cmdline-tools: найден"
}
if (-not (Test-Path $platformTools)) {
Write-Warn "platform-tools: не найден"
} else {
Write-Ok "platform-tools: найден"
}
$buildTools = Join-Path $AndroidHome "build-tools\35.0.1"
if (-not (Test-Path $buildTools)) {
Write-Warn "build-tools 35.0.1: отсутствует (рекомендуется установить)"
if ($InstallMissing -and (Test-Path $sdkManagerPath)) {
& $sdkManagerPath --sdk_root=$AndroidHome "build-tools;35.0.1" "platforms;android-35" "platform-tools"
}
} else {
Write-Ok "build-tools 35.0.1: найден"
}
if (-not (Test-Path (Join-Path $AndroidHome "platforms\android-35"))) {
Write-Warn "platforms;android-35: отсутствует (рекомендуется установить)"
if ($InstallMissing -and (Test-Path $sdkManagerPath)) {
& $sdkManagerPath --sdk_root=$AndroidHome "platforms;android-35"
}
} else {
Write-Ok "platforms;android-35: найден"
}
}
# Критичные для Android клиента бинарные утилиты
Assert-Command -Name "adb" -InstallSuggestion "platform-tools" -Required $false
# Дополнительные для сборки web/смоук-тестов
Assert-Command -Name "python" -InstallSuggestion "python" -Required $false
Assert-Command -Name "dotnet" -InstallSuggestion "dotnet-sdk" -Required $false
if ($SetEnvironment) {
[Environment]::SetEnvironmentVariable("ANDROID_HOME", $AndroidHome, "User")
[Environment]::SetEnvironmentVariable("ANDROID_SDK_ROOT", $AndroidHome, "User")
[Environment]::SetEnvironmentVariable("JAVA_HOME", $(Split-Path (Split-Path (Get-Command java).Source)), "User")
Write-Ok "Переменные ANDROID_HOME / ANDROID_SDK_ROOT сохранены для текущего пользователя."
}
if ($global:failed) {
Write-Warn "Найдены недостающие/некорректные зависимости."
Write-Info "Запусти скрипт с -InstallMissing для попытки автоматической установки."
exit 1
}
Write-Host ""
Write-Ok "Локальная среда сборки готова."
Write-Info "Рекомендуемый следующий шаг:"
Write-Info " pwsh -ExecutionPolicy Bypass -File scripts\android\prepare-android-build-environment.ps1 -SetEnvironment"
Write-Info " pwsh -ExecutionPolicy Bypass -File scripts\android\build-android-apk.ps1 -NoPrepare -BuildType debug -SkipWorkspaceCleanup"