Azure devops 在YAML部署作业中部署后检查应用程序运行状况终结点的最佳方法?

Azure devops 在YAML部署作业中部署后检查应用程序运行状况终结点的最佳方法?,azure-devops,azure-pipelines,Azure Devops,Azure Pipelines,在你喊“盖茨”之前,请先读一读 在prem IIS服务器场上,我为每个服务器场(开发、测试、生产)创建了一个VM环境。在我的所有应用程序中,我都有一张CD YAML,如下所示: -阶段:部署测试 工作: -部署:ApideployTestisFarm displayName:部署API以测试IIS 环境: 名称:测试 资源类型:虚拟机 战略: 跳动: 部署: 步骤: 因为我有20个不同的应用都针对相同的环境,我不能使用盖茨功能。并非所有应用程序都具有完全相同的/health端点 我目前正在制作

在你喊“盖茨”之前,请先读一读

在prem IIS服务器场上,我为每个服务器场(开发、测试、生产)创建了一个VM环境。在我的所有应用程序中,我都有一张CD YAML,如下所示:

-阶段:部署测试
工作:
-部署:ApideployTestisFarm
displayName:部署API以测试IIS
环境:
名称:测试
资源类型:虚拟机
战略:
跳动:
部署:
步骤:
因为我有20个不同的应用都针对相同的环境,我不能使用盖茨功能。并非所有应用程序都具有完全相同的
/health
端点

我目前正在制作一个powershell命令,只需调用/health,如果“不健康”,可能会抛出结果。虽然与HTTP门相比,这听起来非常难看,HTTP门只需检查200,而且我打赌它也具有容错/弹性。毕竟,IIS站点在部署后第一次命中时需要一秒钟的时间来启动


打开我尚未看到的其他想法或任务。

我的解决方案是创建一个容错PowerShell脚本来ping运行状况端点。我进一步将其包装在一个模板中,该模板可以插入到主CI/CD模板中。通过这样做,我可以与我选择的IDE(VSCode)隔离地开发和测试PS脚本,还可以将其作为标准任务重新使用,这要归功于模板,或者在Azure管道之外使用它

剧本 脚本注意事项:脚本最终通过
写入错误
失败TDERR:true
组合来决定任务是否失败PowerShell@2
我们稍后将看到的任务

##基本代码借用自https://karask.com/retry-powershell-invoke-webrequest/
##稍微修改以删除文件记录之类的内容。
param(
[字符串]$URI,
[string]$Method='GET',
[string]$SuccessTextContent='Health',
[字符串]$Retries=1,
[字符串]$SecondsDelay=2,
[字符串]$TimeoutSec=120
)
写入输出“$Method”“$URI”“重试次数:$Retries,SecondsDelay$SecondsDelay,TimeoutSec$TimeoutSec”;
函数请求{
Param(
[参数(必需=$True)]
[哈希表]$Params,
[int]$Retries=1,
[int]$secondsdlay=2
)
$Params.Add('UserAgent','azagent powershell任务')
$method=$Params['method']
$url=$Params['Uri']
$cmd={Write Host“$method$url…”-NoNewline;Invoke WebRequest@Params}
$retryCount=0
$completed=$false
$response=$null
而(-未完成$){
试一试{
$response=Invoke命令$cmd-ArgumentList$Params
如果($response.StatusCode-ne 200){
抛出“预期响应代码200,was:$($response.StatusCode)”
}
$completed=$true
}抓住{
写入输出“$(获取日期-格式G):对$url的请求失败。$\
if($retrycount-ge$Retries){
写入错误“对$url的请求未通过$retryCount的最大次数。”
投
}否则{
写入警告“对$url的请求失败。请在$SecondsDelay秒后重试。”
启动睡眠$seconds播放
$retrycount++
}
}
}
写入主机“确定($($response.StatusCode))”
返回$response
}
$res=Req-Retries$Retries-SecondsDelay$SecondsDelay-Params@{'Method'=$Method;'Uri'=$Uri;'TimeoutSec'=$TimeoutSec;'UseBasicParsing'=$true}
如果($res.Content-ne“$SuccessTextContent”)
{
写入错误$response.Content
}
其他的
{
写入主机“Helath检查验证成功”
}
样板 模板注释:此任务有一个很容易忽略的微妙细节<代码>-签出:模板。这将实际签出在插入该模板的模板中定义的存储库资源。这似乎有点明显,因为模板是插入的,一旦完成,它就会像一个yaml一样执行

参数:
-名称:URI
类型:字符串
-名称:方法
类型:字符串
默认值:“获取”
-名称:SuccessTextContent
类型:字符串
默认值:“健康”
-名称:重试
类型:编号
默认值:5
-姓名:SecondsDelay
类型:编号
默认值:2
-姓名:TimeoutSec
类型:编号
默认值:120
步骤:
-签出:模板
-任务:PowerShell@2
displayName:“${{parameters.Method}}${{{parameters.URI}}}…”
投入:
failOnStderr:true
targetType:“文件路径”
文件路径:$(System.DefaultWorkingDirectory)\InvokeRequestWithRetry.ps1
参数:>#使用此选项可避免多行字符串中的换行符
-URI“${{parameters.URI}}”
-方法“${parameters.Method}”
-SuccessTextContent“${{parameters.SuccessTextContent}}”
-重试${parameters.Retries}
-SecondsDelay${{parameters.SecondsDelay}}
-TimeoutSec${{parameters.TimeoutSec}}
父CI/CD YAML 关于父YAML的注释:最后,我们有了用法。我选择将其作为自己的专用部署作业,以便在一切失败时手动单击“重试”,而不必重新运行整个部署。此外,我希望PS能够在防火墙后面的虚拟机环境中运行

资源:
存储库:
-存储库:模板
类型:git
名称:IAMM/azure管道模板
参考:参考文件/标签/v0.4
## ...
##为简洁起见,请删除
## ...
-部署:myapphealthdevis
dependsOn:myappdeployevis
displayName:“继续前点击/运行状况/查看终结点”
环境:
名称:发展
资源类型:虚拟机
战略:
跳动:
部署:
步骤:
-模板:模板/健康检查。yaml@templates
参数:
URI:'https://$(iisHostName)//$(iisTargetApplication)/health/views'
硒