每晚在调度程序上执行DevOps Release管道中的阶段

时间:2020-02-07 20:46:25

标签: azure-devops azure-pipelines monitoring devops pipeline

在以下设置中,我有一个Azure DevOps CI Build和Release管道:

  • CI Build随develop分支中的每个新提交运行,并创建一个Build Drop(Artifact)
  • 发布管道随每个新的工件一起运行,并部署到INT并最终部署到PROD(在手动批准之后)

我想添加一个第三阶段(称为MONITOR),该阶段将在PROD发行后每晚运行,使用与所使用的PROD阶段相同的位置,并具有以下模式:

[Build Drop] -> [INT] -> manual approval: [PROD] -> nightly scheduler: [MONITOR]

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

关注对我至关重要:

  • MONITOR和PROD始终从完全相同的工件中运行
  • 仅当PROD成功时才执行MONITOR
  • 如果有较新的PROD版本,则不再执行旧的MONITOR,而是使用将其添加到PROD的最新工件来执行最新的MONITOR

到目前为止,我尝试了以下操作:

    当提交提交到PROD时,
  • develop合并到master。然后在MONITOR阶段使用master的预定每晚构建-可以工作,但是MONITOR使用的工件不同于PROD,因此对我不可用
  • 在PROD之后用于MONITOR的计划的触发器-不起作用,MONITOR仅在计划的时间执行一次,并且不再执行
  • 根据具有预定触发器的特定Artifact版本创建了额外的发布管道-这行得通,但我必须在每次成功发布PROD时手动维护特定Artifact版本。另一个需要注意的是,我必须使用2个独立的管道,这使得概览不太好。 (但到目前为止,这是我实现的最佳解决方案)

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

3 个答案:

答案 0 :(得分:1)

您是否在使用YAML模板,如果是,那么您是否使用了cron时间表? https://docs.microsoft.com/en-us/azure/devops/pipelines/build/triggers?view=azure-devops&tabs=yaml#scheduled-triggers

如果使用经典的Release UI,我认为您可以按计划安排定义触发器,但这会使整个定义排队。您可能需要让变量具有创造力,并可能创建'isScheduled = true'并使用它来确定是否应跳过任务。

其他想法: 是否创建调用REST API的逻辑应用程序或功能应用程序?示例应用程序和github链接在这里:https://oshamrai.wordpress.com/2019/04/22/azure-devops-rest-api-19-queue-builds-and-download-build-results/

Azure-Devops AZ CLI扩展可能更容易,但是:https://docs.microsoft.com/en-us/cli/azure/ext/azure-devops/pipelines/build?view=azure-cli-latest#ext-azure-devops-az-pipelines-build-queue

答案 1 :(得分:1)

我要做的是有2条单独的发布管道。

enter image description here

enter image description here enter image description here

这使您可以计划发布而不产生新的工件(计划的构建)。

然后,我将执行@ Soccerjoshj07建议的一些操作,以在MONITOR管道/阶段的任务中调用REST api。

我将对Releases端点进行REST api调用,以获取top=1的{​​{1}}版本。然后使用Release Environment端点获取该最新发行版ID的PROD环境。掌握好环境后,检查releasedefinitionid=x的状态。如果不是,则使发布失败。

根据评论中概述的新要求进行编辑

在触发succeeded时,假设PROD.1成功 并且PROD.2 失败,则{{1} }应该用于MONITOR

有了这个标准,我会改变一些事情。与其让PROD.1挖掘最新的MONITOR版本,如果最新的版本失败而失败,我不如使成功 PROD阶段标记为其构建工件并使用{{ 3}}。

可以通过artifact filters进行标记,也可以使用REST api中的标记生成或发布任务来进行标记,

Colin's ALM Corner Build & Release Tools enter image description here

答案 2 :(得分:0)

除了设置两个发布管道之外,如果您只想在一个Stage上使用计划的触发器,恐怕没有现成的方法可以实现这一目标,计划的触发器仅适用于整个管道。

作为解决方法,您可以为MONITOR阶段的工作添加custom condition

例如yaml:

- stage: MONITOR
   jobs:      
   - job:
     condition: and(always(), eq(variables['Release.Reason'], 'Schedule'))
     steps:

在UI中,您可以在代理作业的Run this job中进行设置:

enter image description here

在这种情况下,该阶段仅在计划触发器触发释放时执行。如果释放是由其他原因触发的,则将跳过MONITOR阶段。

此替代方法的局限性在于,当管道由预定触发器触发时,还将执行另外两个阶段。

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

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