您如何延迟和安排一个阶段以仅在 Azure Devops yaml 管道中运行最新版本?

时间:2021-03-10 17:07:59

标签: azure azure-devops azure-devops-pipelines

如何安排一个阶段在一天中的特定时间在多阶段 azure devops 管道中运行,但仅针对最新版本?

例如,假设我有一个组合构建和发布管道...

  • 那天我办理了 4 次签到手续
  • 创建了 4 个管道,每个管道都有一个构建和发布阶段(每次签入 1 个)。代码合并后构建阶段完成
  • 我不想在每次签入后部署,所以我安排发布阶段在夜间运行

一旦到达预定发布时间,它是否会为当天创建的每个管道启动 4 个同时部署?我如何确保它只安排最新的?如果我想确保即使没有代码更改也能运行该部署阶段,该怎么办?

我可以使用经典版本解决这个需求,方法是安排在特定时间使用最新工件创建和部署版本。那么那天运行了多少构建并不重要。

2 个答案:

答案 0 :(得分:1)

我建议将您的管道分解为两个不同的流程:

  1. 构建验证:在每次签入时运行此程序以验证代码的完整性。
  2. 夜间部署:每晚按计划运行完整的构建和部署。

这消除了场景的复杂性,同时仍然在签入时为您提供构建验证。

答案 1 :(得分:1)

<块引用>

如何安排一个阶段在一天中的特定时间在多阶段 azure devops 管道中运行,但仅针对最新版本?

根据您的要求,我建议您可以使用 cron parameters(Scheduled triggers) 来设置部署。然后它可以安排一个阶段在一天中的特定时间运行。

<块引用>

我如何确保它只安排最新的

要使用最新的工件,您可以添加[下载构建/管道工件任务] 2 在您的部署阶段并将版本设置为最新。

同时,您可以使用 condition 来确定要运行的阶段。

这是我的例子:

schedules:
- cron: "0 0 * * *"
  displayName: Daily midnight build
  branches:
    include:
    - main
 
pool:
  vmImage: ubuntu-latest

stages:
- stage: A
  condition: eq(variables['Build.Reason'], 'IndividualCI')
  jobs:
  - job: A1
    steps:
      - task: PublishBuildArtifacts@1
        inputs:
          PathtoPublish: '$(Build.Sourcesdirectory)'
          ArtifactName: 'drop'
          publishLocation: 'Container'


- stage: B
  condition: eq(variables['Build.Reason'], 'Schedule')
  jobs:
  - job: B1
    steps:
      - task: DownloadBuildArtifacts@0
        inputs:
          buildType: 'specific'
          project: 'Googletest'
          pipeline: '507'
          buildVersionToDownload: 'latest'
          downloadType: 'single'
          artifactName: 'drop'
          downloadPath: '$(System.ArtifactsDirectory)'

结果:

当您签入更改并触发构建时,它将运行第一阶段(构建)。

当管道被 Schedule 触发时,它会运行第二阶段(部署)。

enter image description here

部署阶段将下载最新的工件。那么当天运行了多少构建都无关紧要。