我创建了一个包含3个作业的发布管道:
1.第一个作业尝试通过自托管代理部署组运行快速部署-但如果该部署组中的代理脱机(VM已关闭),此操作预计会失败,并显示错误“无法部署到目标”,因为目标脱机。"
这种失败是即时的-甚至在任何任务运行之前。因此,“continueOnError”属性在这里什么也不做,因为这是任务的一个特性,如果作业在运行任务之前失败,它就不起作用了。
1.我有第二个作业,只有在第一个作业失败时才运行:Azure托管的代理作业,它调用Azure CLI以通过服务主体启动代理VM(az vm start ...
)。
1.第三个作业(也仅在第一个作业失败时运行)是第一个作业的副本,现在保证VM正在运行。
据我所知,整个发布现在已经成功了,但由于第一个作业失败而显示为“失败”。有没有什么日志命令或其他技巧可以让发布显示为“成功”或至少是“成功但失败”?
我试过的其他方法
1.让代理VM一直处于打开状态。这太贵了。我们更喜欢让它每天晚上自动关闭,周末和节假日以及我们只是在做代码搅动以外的事情的日子。
1.始终首先检查虚拟机是否在线
我不总是运行作业来使用Azure CLI启动代理VM的原因是它很慢-即使代理VM已经在运行。
Azure CLI脚本必须在“Microsoft托管”代理池上运行,在队列中等待1-10分钟(空闲层,与其他项目共享),即使作业获得主机并启动,在运行az vm show --query powerState
以检查VM状态时,也已经过了几分钟。
但如果自托管VM代理已在运行,它会立即响应,作业1将在10秒内成功。虚拟机每天只需启动一次,因此我们宁愿让大多数CD部署花费10秒,并让一天中的第一个人为地出现失败,而不是让它们都花费3-5分钟进行预检查。
1.以不同的方式预先检查座席是否在线
我尝试使用“无代理作业”在https://dev.azure.com/<organization>/_apis/distributedtask/pools/<pid>/agents/<aid>
上调用REST API并获取status
属性。这在我的机器上工作,以判断它是否已经在线,但我找不到任何方法从DevOps管道调用此请求而不会获得某种身份验证失败。
我得到的最接近的是在请求中使用$(System.AccessToken)
(OAuth令牌),但代理得到的响应与我得到的不同。当一个人可以访问有问题的组织,但缺少查看工作池信息的角色时,它会得到“No agent found for pool <pid> with identifier <aid>
“响应。
1条答案
按热度按时间t5fffqht1#
根据设计,如果一个作业失败,则阶段的状态为“失败”。stage的状态对应REST API Releases - Get Release中
deploySteps
的status
,无法手动更改。也许你可以在任务中使用
Continue on error
选项,这将在第一个作业中失败。此作业将显示为部分成功。
但如果这样做,第二个和第三个作业就不能基于第一个作业的失败运行,而应该在第一个作业的状态为“partiallySucceeded”时运行。
由于没有这样的默认功能,如果您想自定义阶段的状态,您可以在以下位置提交功能请求:https://developercommunity.visualstudio.com/report?space=21&entry=suggestion .通过将客户影响整合到一个反馈中,投票有助于提高问题的优先级。