<# 场景脚本公用:计时、记下每一步断言,结束时(通过或失败)请闭环观察台生成场景报告。 报告是观察台截取这段时间窗里的每一跳、状态变化、iXserver 日志,连同断言与部署版本存成的单文件 HTML, 放在 run\reports\(不进 git),列表在 http://127.0.0.1:/reports/。 用法(在场景脚本里点源): . (Join-Path $PSScriptRoot '_lib.ps1') Start-LoopRun 'S1' 'IG 文本 → 第三方 echo → IG' Add-LoopStep 'iXserver 收 webhook' $true 'HTTP 200' Set-LoopTicket 1973133303 Save-LoopReport -Passed $true # 或 Save-LoopReport -Passed $false -Reason '…' 脚本带 -NoReport 时设 $LoopNoReport = $true 就只断言不出报告(省掉等日志落盘的几秒)。 #> $LoopCfg = Import-PowerShellDataFile (Join-Path $PSScriptRoot '..\config\loop.psd1') $script:LoopRun = $null function Start-LoopRun([string]$Scenario, [string]$Title = '') { $script:LoopRun = [ordered]@{ scenario = $Scenario title = $Title startedAt = (Get-Date).ToUniversalTime().ToString('o') steps = New-Object System.Collections.ArrayList ticketId = '' } } function Add-LoopStep([string]$Name, [bool]$Ok, [string]$Detail = '') { if (-not $script:LoopRun) { return } [void]$script:LoopRun.steps.Add([ordered]@{ name = $Name; ok = $Ok; detail = $Detail }) } function Set-LoopTicket($TicketId) { if ($script:LoopRun -and $TicketId) { $script:LoopRun.ticketId = [string]$TicketId } } function Save-LoopReport([bool]$Passed, [string]$Reason = '') { $run = $script:LoopRun if (-not $run -or $LoopNoReport) { return } $run.endedAt = (Get-Date).ToUniversalTime().ToString('o') $run.passed = $Passed $run.reason = $Reason $console = "http://127.0.0.1:$($LoopCfg.Ports.Console)" try { $body = [Text.Encoding]::UTF8.GetBytes(($run | ConvertTo-Json -Depth 6 -Compress)) # 观察台要等 iXserver 日志落盘、库轮询跟上才截取,这一步会停几秒 $r = Invoke-RestMethod "$console/_api/report" -Method Post -ContentType 'application/json; charset=utf-8' -Body $body -TimeoutSec 60 Write-Host "报告:$($r.file)($($r.hops) 跳 / $($r.logs) 条日志;观察台里打开 $console$($r.url))" } catch { # 报告是附带的:观察台没在跑不影响场景本身的结果 Write-Host "没有生成报告(观察台没在跑?.\loop.ps1 up -Only console):$($_.Exception.Message)" -ForegroundColor Yellow } }