iXserverLoopEnv/scenarios/_lib.ps1

55 lines
2.5 KiB
PowerShell
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

<#
场景脚本公用:计时、记下每一步断言,结束时(通过或失败)请闭环观察台生成场景报告。
报告是观察台截取这段时间窗里的每一跳、状态变化、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
}
}