Azure devops 每晚在调度程序上执行DevOps发布管道中的一个阶段

Azure devops 每晚在调度程序上执行DevOps发布管道中的一个阶段,azure-devops,azure-pipelines,monitoring,devops,pipeline,Azure Devops,Azure Pipelines,Monitoring,Devops,Pipeline,我在以下设置中拥有Azure DevOps CI构建和发布管道: CI构建与develope分支中的每个新提交一起运行,并创建构建删除(工件) 发布管道与每个新工件一起运行,并部署到INT,最终部署到PROD(在手动批准后) 我想添加一个第三阶段(称为MONITOR),该阶段将在PROD发布后每晚运行,使用与PROD阶段相同的下拉菜单,模式如下: [Build Drop]->[INT]->手动批准:[PROD]->夜间调度程序:[MONITOR] 这对我来说似乎是不可能的,你知道如何实现这个

我在以下设置中拥有Azure DevOps CI构建和发布管道:

  • CI构建与
    develope
    分支中的每个新提交一起运行,并创建构建删除(工件)
  • 发布管道与每个新工件一起运行,并部署到INT,最终部署到PROD(在手动批准后)
我想添加一个第三阶段(称为MONITOR),该阶段将在PROD发布后每晚运行,使用与PROD阶段相同的下拉菜单,模式如下:

[Build Drop]->[INT]->手动批准:[PROD]->夜间调度程序:[MONITOR]

这对我来说似乎是不可能的,你知道如何实现这个目标吗?

以下几点对我来说至关重要:

  • 监视器和PROD始终从完全相同的工件运行
  • 仅当PROD成功时才执行监视器
  • 如果有一个更新的PROD版本,则不再执行旧的监视器,而是使用使其成为PROD的最新工件来执行最新的监视器
到目前为止,我尝试了以下几点:

  • 当提交到PROD时,将
    develope
    合并到
    master
    ,然后将
    master
    的计划夜间构建与MONITOR阶段一起使用-它可以工作,但MONITOR使用的工件与PROD不同,因此对我来说不可用
  • 在PROD后使用监视器的计划触发器-不工作,监视器在计划时间仅执行一次,不再执行
  • 基于特定工件版本创建了额外的发布管道,并有一个预定的触发器-这是可行的,但我必须在每次成功的产品发布时手动维护特定工件版本。另一个警告是,我必须使用两个单独的管道,这使得概述不那么好。(但是,到目前为止,我实现的最佳解决方案)

你有更好的主意吗?非常感谢

您是否使用YAML模板,如果是,您是否使用了cron时间表

如果使用classic Release UI,我认为您可以将定义触发器安排在时间表上,但这会将整个定义排队。您可能需要创造性地使用变量,可能需要创建“isScheduled=true”,并使用它来确定是否应该跳过任务

其他想法: 创建调用RESTAPI的逻辑应用程序或函数应用程序?示例应用程序和github链接如下:


Azure Devops AZ CLI扩展可能更简单,不过:

我要做的是有两个独立的发布管道

这允许您在不生成新工件(计划构建)的情况下计划发布

然后,我将执行@Soccerjoshj07中建议的一些操作,即在监视器管道/阶段上的任务中调用RESTAPI

我将对端点进行RESTAPI调用,以获取
releasedefinitionid=x
top=1
版本。然后使用端点获取该最新版本id的产品环境。有了该环境,请检查
成功的状态。如果没有,发布失败

根据评论中概述的新要求进行编辑 当触发
MONITOR
时,假定
PROD.1
成功
PROD.2
失败,则
PROD.1
中的工件应用于
MONITOR

根据这个标准,我会改变一些事情。与其让
MONITOR
去挖掘最新的
PROD
版本,如果最新版本失败,我会将successfulPROD stage标记为构建工件,并在监视器管道上使用

标记可以通过或使用中的标记生成或发布任务进行,可能如下所示:


除了设置两个发布管道外,如果您只想在一个阶段使用计划触发器,恐怕没有现成的方法来实现这一点,计划触发器只适用于整个管道

作为一种解决方法,您可以为
MONITOR
stage的作业添加一个

例如,在yaml中:

- stage: MONITOR
   jobs:      
   - job:
     condition: and(always(), eq(variables['Release.Reason'], 'Schedule'))
     steps:
在UI中,您可以在代理作业的
运行此作业
中设置:

在这种情况下,仅当定时触发器触发释放时才执行阶段。如果释放是由其他原因触发的,将跳过
监视器
阶段

此解决方案的限制是,当您的管道由计划触发器触发时,还将执行另外两个阶段

或者使用
powershell
任务(在INT/PROD阶段)编写脚本,以确定
Release.Reason
是否为
Schedule
。如果是,则跳过当前阶段


有关如何获取
PROD
的最新工件版本并确定
PROD
的部署状态,您可以参考上面的两个答案。

谢谢,这是一个有趣的方法。我看到一个警告——只有在最后一次PROD部署成功的情况下,它才会运行。但是类似的方法也可以工作——如果成功的话,PROD阶段将根据API将Drop版本设置为FOO-Monitor。这样,FOO监视器将始终使用最新成功的PROD Drop。您的问题没有指定给定的
PROD.1
是成功的,
PROD.2
Monitor
触发计划结束时失败
Monitor
应该使用
PROD.1
中的工件运行。我明白了,是的,您是对的。你的第二个建议很好,正是我们需要的!这是一个比为管道调用API更好的解决方案。谢谢你的详细回答!我们同时使用YAML和UI,不确定哪一个更好。如果我是正确的,cron也可以只启动整个定义,对吗?所以在这种情况下,如果计划的话,我需要使用变量跳过INT和PROD。我想这会管用的,很好的方法。我也看到了另一种变化