55 lines
2.5 KiB
PowerShell
55 lines
2.5 KiB
PowerShell
<#
|
||
场景脚本公用:计时、记下每一步断言,结束时(通过或失败)请闭环观察台生成场景报告。
|
||
报告是观察台截取这段时间窗里的每一跳、状态变化、iXserver 日志,连同断言与部署版本存成的单文件 HTML,
|
||
放在 run\reports\(不进 git),列表在 http://127.0.0.1:<Ports.Console>/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
|
||
}
|
||
}
|