在以下设置中,我有一个Azure DevOps CI Build和Release管道:
develop
分支中的每个新提交运行,并创建一个Build Drop(Artifact)我想添加一个第三阶段(称为MONITOR),该阶段将在PROD发行后每晚运行,使用与所使用的PROD阶段相同的位置,并具有以下模式:
[Build Drop] -> [INT] -> manual approval: [PROD] -> nightly scheduler: [MONITOR]
这对我来说似乎是不可能的,您知道如何实现这一目标吗?
关注对我至关重要:
到目前为止,我尝试了以下操作:
develop
合并到master
。然后在MONITOR阶段使用master
的预定每晚构建-可以工作,但是MONITOR使用的工件不同于PROD,因此对我不可用您有更好的主意吗?非常感谢
答案 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条单独的发布管道。
这使您可以计划发布而不产生新的工件(计划的构建)。
然后,我将执行@ 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中的标记生成或发布任务来进行标记,
答案 2 :(得分:0)
除了设置两个发布管道之外,如果您只想在一个Stage上使用计划的触发器,恐怕没有现成的方法可以实现这一目标,计划的触发器仅适用于整个管道。
作为解决方法,您可以为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
的部署状态,可以参考上面的两个答案。