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

Execute a stage in DevOps Release pipeline every night on scheduler

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

我想添加一个第 3 阶段(称为 MONITOR),每晚 运行 在 PROD 发布后 使用与 PROD 阶段相同的掉落使用,具有以下架构:

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

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

以下内容对我来说很重要:

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

你有更好的想法吗?非常感谢

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

如果使用经典版本 UI,我认为您可以让定义触发器按计划进行,但这会使整个定义排队。您可能需要在变量方面发挥创意,也许可以创建 'isScheduled=true' 并使用它来确定是否应该跳过任务。

其他想法: 创建调用 REST API?示例应用程序和 github link 此处: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

我会做的是有 2 个独立的发布管道。

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

然后,我将执行@Soccerjoshj07 建议的一些操作,即我将在 MONITOR pipeline/stage.

上的任务中调用 REST api

我将对 Releases endpoint to get the top=1 releases for releasedefinitionid=x. Then use the Release Environment 端点进行 REST api 调用,以获取该最新版本 ID 的 PROD 环境。有了环境,检查 succeeded 的状态。如果不是,发布失败。

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

给定 PROD.1 成功 并且 PROD.2 失败MONITOR 被触发时,那么来自 PROD.1 的工件应该用于 MONITOR.

根据这个标准,我会改变一些东西。与其让 MONITOR 去挖掘最新的 PROD 版本,如果最新版本失败则失败,我会将 successful PROD 阶段标记为构建工件并且在 Monitor 管道上使用 artifact filters

标记可以通过 REST api or using the Tag Build or Release Task from Colin's ALM Corner Build & Release Tools 进行,可能如下所示:

除了设置两个发布管道外,如果你只想对一个阶段使用预定触发器,恐怕没有这种开箱即用的方法来实现,预定触发器只适用于整个管道。

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

例如在 yaml 中:

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

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

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

此解决方法的局限性在于,当您的管道被计划的触发器触发时,还会执行其他两个阶段。

或者用powershell任务写一个脚本(分INT/PROD个阶段)判断Release.Reason是否是Schedule。如果是,则跳过当前阶段。

如何获取PROD的最新神器版本和判断PROD的部署状态,可以参考上面两个回答