Azure devops 当Azure WebJob无法启动/运行时,无法使Azure DevOps发布管道失败

Azure devops 当Azure WebJob无法启动/运行时,无法使Azure DevOps发布管道失败,azure-devops,azure-webjobs,Azure Devops,Azure Webjobs,我要找的是: 我们如何将一个自动解决方案集成到发布管道中,以了解新的WebJob部署是否在“X”时间段内进入运行状态 更多详情: 我们将Azure DevOps发布管道与AzureRMWebAppDelopyment@4任务我们能够将Azure WebJob部署到登台和生产环境 最近,我们发现我们的WebJob实际上并没有启动,因为有一些糟糕的代码。由于WebJob的性质,我们在staging中很难识别它。我们将错误代码部署到生产环境中,几天后,由于错误的警报,得知WebJob未运行,我们的

我要找的是:

  • 我们如何将一个自动解决方案集成到发布管道中,以了解新的WebJob部署是否在“X”时间段内进入运行状态
更多详情:

我们将Azure DevOps发布管道与AzureRMWebAppDelopyment@4任务我们能够将Azure WebJob部署到登台和生产环境

最近,我们发现我们的WebJob实际上并没有启动,因为有一些糟糕的代码。由于WebJob的性质,我们在staging中很难识别它。我们将错误代码部署到生产环境中,几天后,由于错误的警报,得知WebJob未运行,我们的队列严重备份

这个问题是,我们希望/需要发布管道报告每个WebJob启动的失败。API使用运行状况检查来验证部署是否已启动、是否正常以及是否可以正常运行。我们需要在发布管道期间检查WebJob的状态,以便管道失败,这样我们就不会认为一切正常

在我们的研究中,我们发现我们可能会使用Kudu,但如何让它作为发布管道的一部分工作,目前为止已经证明对我们来说是不可行的。

您可以尝试这样做:

您可以创建一个seprate stage,也可以在现有的内部进行。通过添加无代理作业,可以添加延迟任务。之后,您可以调用kudu端点来检查WebJob的历史记录(如图所示)。如果您没有找到令人满意的响应,您可以简单地使用
exit 1
结束脚本,以使发布失败

给你一个

从何而来:

最重要的是,MFA是AAD和用户之间的契约,当它到达Kudu端点时,它只是一个令牌。我想这应该行得通


在综合多种来源的想法后,我们提出了以下解决方案:

在所需阶段的所需Azure发布管道中添加Azure CLI任务。此任务可以接受内嵌PowerShell脚本或PowerShell脚本的路径选择你自己的冒险。我们选择使用包含的脚本(如下)创建一个
检查webjobstatus.ps1
,并将其作为一个工件公开给Azure发布管道

简而言之,此PowerShell脚本的作用:
它最多检查目标WebJob的状态10次(可通过
$totalRuns
配置),在检查之间等待5秒,并等待3个连续的
运行
状态报告

param(
$resourceGroup,
$appServiceName,
$jobName,
$totalRuns=10
)
写入主机“检查$resourceGroup/$appServiceName中$jobName的状态”
$ConcertiveRunningStatus=0
如果($totalRuns-lt 3){
写入错误“totalRuns必须为3或更大”
出口1
}
对于($i=0;$i-lt$totalRuns;$i++){
$jobs=(az webapp webjob连续列表--名称$appServiceName--资源组$resourceGroup |从Json转换)
foreach($jobs中的job){
如果($job.name-eq“$appServiceName/$jobName”){
if($job.status-均衡“运行”){
写入主机“$jobName正在运行!尝试$i”
$连续运行状态++
if($连续运行状态-等式3){
写入主机“$jobName正在连续运行$ConcertiveRunningStatuses次!我们假设这意味着它是稳定的。”
出口0
}
}
否则{
写入主机“$jobName状态为$($job.status)。尝试$i”
$ConcertiveRunningStatus=0
}
}
}
如果($i-ne($totalRuns-1)){
开始睡眠5
}
}
写入主机“$totalRuns检查后,$jobName启动失败”
出口1
为什么连续3次运行状态报告 因为Azure WebJobs状态报告不可靠。当WebJob首次部署时,它进入
启动
状态,然后进入
运行
状态。到目前为止,这似乎很好。但是,如果启动时出现致命错误,如缺少依赖项,则作业将进入
挂起重新启动
状态。在我们的观察中,Azure要么自动尝试再次启动WebJob,要么状态变得异常,并被错误地报告为处于运行状态。然后,WebJob将重新进入
挂起重新启动
状态,并保持该状态,直到下一次明确尝试部署或启动它。在我们的观察中,我们没有发现一个失败的WebJob在相隔5秒的时间内,或者换句话说,在任何15秒的时间窗口内,保持在
运行
状态超过两个连续报告。因此,在脚本中,我们现在假设,如果我们在15秒内获得3个连续的
运行
状态报告,则假定WebJob正在
运行

旁白-我们是如何做到的:

我们使用自己的
azure pipelines.yaml
build配置创建了一个专用的DeployTools repo,该配置只发布包含该PowerShell文件的文件夹。然后在我们想要的Azure发布管道中,我们附加了DeployTools构建中的工件。

那么,我们在自动化过程中使用了哪些凭据?我们对所有需要的账户都有MFA,而且您不应该使用个人信用进行
az登录
。是否有一种方法可以使用您在此处显示的Azure DevOps PowerShell脚本中配置的订阅?@dannydwaren请检查我的编辑。我没有检查这个,但是从我发现的情况来看,KUDU不应该被MFA打断。Krzysztof Madej感谢您的帮助!你的想法激励我们沿着我在接受答案中发布的路线前进。Kudu和publish profile凭证在这种情况下不适合我们。@Dannydwaren非常感谢您的话!我很高兴你解决了你的问题!