131 lines
3.7 KiB
PowerShell
131 lines
3.7 KiB
PowerShell
param(
|
|
[string[]]$WatchPaths = @(
|
|
"plugins/1c/agent",
|
|
"core/deploy/docker/1c-agent/compose.yaml",
|
|
"scripts/deploy_onec_agent_test.ps1",
|
|
"scripts/smoke_onec_agent_api.py"
|
|
),
|
|
[int]$PollSeconds = 5,
|
|
[int]$DebounceSeconds = 2,
|
|
[int]$MaxCycles = 0,
|
|
[switch]$WithTurnCheck,
|
|
[switch]$NoBuild,
|
|
[int]$HealthTimeoutSec = 60,
|
|
[int]$SmokeTimeoutSec = 5
|
|
)
|
|
|
|
$ErrorActionPreference = "Stop"
|
|
$scriptDir = Split-Path -Parent $MyInvocation.MyCommand.Path
|
|
$repoRoot = Split-Path -Parent $scriptDir
|
|
$deployScript = Join-Path $scriptDir "deploy_onec_agent_test.ps1"
|
|
|
|
function Resolve-WatchPath {
|
|
param([string]$Path)
|
|
if ([System.IO.Path]::IsPathRooted($Path)) {
|
|
return $Path
|
|
}
|
|
return Join-Path $repoRoot $Path
|
|
}
|
|
|
|
function Get-Signature {
|
|
param([string[]]$Paths)
|
|
|
|
$entries = @()
|
|
|
|
foreach ($path in $Paths) {
|
|
$path = Resolve-WatchPath ($path.Trim())
|
|
if (-not (Test-Path -LiteralPath $path)) {
|
|
Write-Host "[warn] path not found: $path"
|
|
continue
|
|
}
|
|
|
|
$item = Get-Item -LiteralPath $path
|
|
if ($item.PSIsContainer) {
|
|
$items = Get-ChildItem -LiteralPath $path -Recurse -File -Force |
|
|
Where-Object {
|
|
$parts = $_.FullName -split "[\\/]"
|
|
$parts -notcontains ".git" -and
|
|
$parts -notcontains "__pycache__" -and
|
|
$parts -notcontains ".pytest_cache" -and
|
|
$parts -notcontains ".ruff_cache" -and
|
|
$parts -notcontains ".venv"
|
|
} |
|
|
ForEach-Object {
|
|
"$($_.FullName)|$($_.Length)|$($_.LastWriteTimeUtc.Ticks)"
|
|
}
|
|
$entries += $items
|
|
} else {
|
|
$parts = $item.FullName -split "[\\/]"
|
|
if (
|
|
$parts -notcontains ".git" -and
|
|
$parts -notcontains "__pycache__" -and
|
|
$parts -notcontains ".pytest_cache" -and
|
|
$parts -notcontains ".ruff_cache" -and
|
|
$parts -notcontains ".venv"
|
|
) {
|
|
$entries += "$($item.FullName)|$($item.Length)|$($item.LastWriteTimeUtc.Ticks)"
|
|
}
|
|
}
|
|
}
|
|
|
|
return @($entries | Sort-Object -Unique)
|
|
}
|
|
|
|
function Invoke-Deploy {
|
|
param()
|
|
|
|
$deployArgs = @(
|
|
"-NoProfile",
|
|
"-ExecutionPolicy", "Bypass",
|
|
"-File", $deployScript,
|
|
"-HealthTimeoutSec", $HealthTimeoutSec,
|
|
"-SmokeTimeoutSec", $SmokeTimeoutSec
|
|
)
|
|
|
|
if ($WithTurnCheck) {
|
|
$deployArgs += "-WithTurnCheck"
|
|
}
|
|
if ($NoBuild) {
|
|
$deployArgs += "-NoBuild"
|
|
}
|
|
|
|
Write-Host "[run] deploy: $deployScript"
|
|
& powershell @deployArgs
|
|
if ($LASTEXITCODE -ne 0) {
|
|
throw "onec-agent deploy script exited with code $LASTEXITCODE"
|
|
}
|
|
}
|
|
|
|
Write-Host "[watch] onec-agent hot-deploy watcher started"
|
|
Write-Host "[watch] paths: $($WatchPaths -join ', ')"
|
|
Write-Host "[watch] poll=${PollSeconds}s, debounce=${DebounceSeconds}s, no-build=$NoBuild"
|
|
|
|
$prev = Get-Signature -Paths $WatchPaths
|
|
$lastChange = Get-Date
|
|
|
|
try {
|
|
Invoke-Deploy
|
|
|
|
$cycles = 0
|
|
while ($MaxCycles -eq 0 -or $cycles -lt $MaxCycles) {
|
|
Start-Sleep -Seconds $PollSeconds
|
|
$cycles += 1
|
|
$curr = Get-Signature -Paths $WatchPaths
|
|
if ((Compare-Object -ReferenceObject $prev -DifferenceObject $curr -SyncWindow 0).Count -eq 0) {
|
|
continue
|
|
}
|
|
|
|
if ((((Get-Date) - $lastChange).TotalSeconds) -lt $DebounceSeconds) {
|
|
continue
|
|
}
|
|
|
|
$lastChange = Get-Date
|
|
Write-Host "[watch] change detected, redeploying onec-agent..."
|
|
Invoke-Deploy
|
|
$prev = $curr
|
|
}
|
|
} catch {
|
|
Write-Error $_
|
|
throw
|
|
}
|