Azure devops 如何在Azure DevOps管道中安排阶段部署?

Azure devops 如何在Azure DevOps管道中安排阶段部署?,azure-devops,azure-pipelines,Azure Devops,Azure Pipelines,使用经典的Azure DevOps发布管道,我们的发布流程非常容易设置。 我们有一个构建管道在白天运行了很多次。成功后,将其部署到我们的开发环境中。每晚,在部署到UAT之前,我们的测试环境(运行数小时的自动测试)中都会发布最新的成功部署到dev。但是,如果我们有一个新的变化需要直接进入测试或UAT,我们通常也需要在白天部署以进行测试。经典管道允许我们跳过一个阶段,或者在前一个阶段仅部分成功的情况下进行部署 1) Development - automatic 2) Test - nightly

使用经典的Azure DevOps发布管道,我们的发布流程非常容易设置。 我们有一个构建管道在白天运行了很多次。成功后,将其部署到我们的开发环境中。每晚,在部署到UAT之前,我们的测试环境(运行数小时的自动测试)中都会发布最新的成功部署到dev。但是,如果我们有一个新的变化需要直接进入测试或UAT,我们通常也需要在白天部署以进行测试。经典管道允许我们跳过一个阶段,或者在前一个阶段仅部分成功的情况下进行部署

1) Development - automatic
2) Test - nightly or manually
3) UAT - nightly or manually
4) Staging - manual approval
5) Production - manual approval
对于多级管道,同样的流量似乎很难实现。至少在将其作为单个部署管道时是这样。第一部分很好。我们可以让构建触发开发部署。但是,我们如何将测试环境的发布推迟到凌晨0:30,同时仍然保留手动发布的能力呢?如果我创建了一个单独的测试环境管道,那么如果它没有触发器,只有一个时间表,它就可以工作。 与UAT一样,由于我们还需要灵活地手动运行UAT部署,因此它也需要进入自己的管道。发布到我们的暂存和生产环境时,我们可以通过手动批准来“把关”,这很好

虽然这在技术上是可行的,但如果我们将部署管道拆分为多个管道,那么管理“发布”就变得非常困难。更不用说,如果我们在每个阶段创建一个单独的管道,这有点违背了整个多阶段管道原则


但由于在经典管道中这样设置非常容易,因此我无法想象其他公司没有遇到同样的限制。是我看不见光,还是这真的不能通过多级管道来完成?

对于计划作业:您可以在YAML中使用类似的内容:

(从Microsoft文档中复制)

时间表:
-cron:string#cron语法定义计划
displayName:string#指定给特定计划的友好名称
分支机构:
包括:[string]#明细表适用于哪些分支
排除:[string]#要从计划中排除的分支
always:boolean#是始终运行管道,还是仅在自上次成功计划运行以来源代码发生更改时才运行管道。默认值为false。
对于手动作业,可以使用“创建发布”按钮手动创建和部署发布。请注意,有时这会与计划产生冲突。此外,若要“阻止发布”,请在发布上放置审批人,然后在审批时,推迟发布:

注意,它是UTC格式,默认为明天-您可以将其更改为以后的任何时间

手动运行UAT部署

我们可以在yaml构建中添加Azure DevOps多阶段管道批准策略

步骤:

打开“环境”选项卡,然后单击按钮“新建环境”->单击按钮“批准和检查”->“我的环境名称是”
TEST

然后在yaml管道中使用它(只是一个示例):

结果:

我们还可以配置
调度触发器
,并在多级管道中使用它们


注意:
schedule触发器
批准策略
正在阶段级别使用。

您好,现在请检查此问题是否仍在阻碍您?对此问题有任何更新吗?我们最终得到了环境批准设置,但各阶段之间没有依赖关系(它们只依赖于构建)。通过这种方式,我们可以(知道我们不应该)直接手动发布到特定阶段,同时仍然获得批准。但如果不是手动启动(通过批准),仍然无法安排阶段。据我所知,如果在阶段上使用计划触发和批准,并将其安排在凌晨2点,那么批准人必须在凌晨2点这样做才能开始。能够使用这一点会很好,但据我在文档中看到的,那么计划只能用于管道本身,而不能用于各个阶段:
trigger: none
 
pool:
  vmImage: 'ubuntu-latest'
 
stages:
- stage: A
  jobs:
  - deployment: 'MyDeployment'
    displayName: MyDeployment
    environment: 'TEST'
  - job: A1
    steps:
     - script: echo "##vso[task.setvariable variable=skipsubsequent;isOutput=true]false"
       name: printvar
 
- stage: B
  condition: and(succeeded(), ne(stageDependencies.A.A1.outputs['printvar.skipsubsequent'], 'true'))
  dependsOn: A
  jobs:
  - job: B1
    steps:
    - script: echo hello from Stage B