【问题标题】:Manage dependencies in Azure YAML Devops Pipelines在 Azure YAML Devops Pipelines 中管理依赖项
【发布时间】:2020-12-12 19:36:58
【问题描述】:

我们的解决方案由几个相互调用和支持的微服务组成。

为了简化,请考虑这个依赖图:

 MS1 --> MS2
     --> MS3 --> MS4
  • MS1 依赖于 MS2 和 MS3
  • MS3 依赖于 MS4
  • MS4 是独立的

目标:部署期间的零停机时间

目前我们正在分析解决以下几种情况的可能方法:

  1. 按顺序部署所有微服务,以确保所有端到端测试通过。这意味着首先部署 MS4,然后部署 MS3、MS2、MS1,然后运行测试(所有这些都在插槽中),如果一切通过则切换插槽

  2. 单独部署任何服务(其他根本没有改变),运行测试(再次插槽),然后如果一切成功则切换插槽

我们的第一种方法是使用单个(大)管道,每个微服务具有单独的阶段,并检查该微服务是否已更改以部署它。如果微服务没有检测到变化,那么我们想取消阶段并继续下一个阶段。 此管道包含每个阶段的模板,例如:

- stage: MS1
  jobs:
  - job: CheckMS1Changes
    steps:
    - template: templates/ms1-check-changes.yml

  - job: BuildMS1
    dependsOn: CheckMS1Changes
    displayName: Build MS1
    - template: templates/ms1-build.yml

  - job: ReleaseMS1
    dependsOn: BuildMS1
    displayName: Release MS1
    - template: templates/ms1-release.yml

我们认为这将涵盖所描述的场景。 “取消命令”应该放在 templates/ms1-check-changes.yml 文件中

问题是我们没有在文档中找到如何取消一个完整的阶段。这让我觉得也许我们的完整方法是错误的。 我们还没有找到如何取消一个作业或一组作业,因为我们也怀疑我们是否应该为每个微服务设置阶段。

你可以看到,我们对这些东西很陌生。

您能否就所描述的场景提供一些建议?

【问题讨论】:

    标签: azure-devops release continuous-delivery azure-devops-yaml


    【解决方案1】:

    基于您的管道。我认为您可以将CheckChanges 工作移到单独的阶段。然后使用logging commands##vso[task.setvariable variable=MS1;isOutput=true]true 设置输出标志变量(即MS1),指示是否检测到每个微服务的更改。然后你可以在条件表达式中使用这些标志dependencies.dependencyStageName.outputs['dependencyStageJobName.taskName.varialbeName']

    您可以在此阶段进行以下阶段dependsOn。并添加conditions 以决定跳过或运行此阶段。看下面的简单例子:

    stages:
    - stage: ChangeStage
      pool: 
        vmImage:  windows-latest
      jobs:
      - job: ChangeJob
        steps:
        - powershell: |
            echo "##vso[task.setvariable variable=MS1;isOutput=true]true" #set MS1 flag to true if changes made to MS1 
            echo "##vso[task.setvariable variable=MS2;isOutput=true]true"
            echo "##vso[task.setvariable variable=MS3;isOutput=true]true"
          name: ChangeTask
    
    - stage: MS3Stage
      dependsOn: ChangeStage
      condition: eq(dependencies.ChangeStage.outputs['ChangeJob.ChangeTask.MS3'], 'true')
      pool: 
        vmImage:  windows-latest
      jobs:
      - template: ...
    
    - stage: MS2Stage
      dependsOn: 
      - MS3Stage
      - ChangeStage
      condition: |
        and 
        (
         eq(dependencies.ChangeStage.outputs['ChangeJob.ChangeTask.MS2'], 'true'),
         in(dependencies.MS3Stage.result, 'Succeeded', 'Canceled', 'Skipped')
        )
      pool: 
        vmImage:  windows-latest
      jobs:
      - template: ...   
    
    - stage: MS1Stage
      dependsOn: 
      - MS2Stage
      - ChangeStage
      condition: |
         and 
        (
         eq(dependencies.ChangeStage.outputs['ChangeJob.ChangeTask.MS1'], 'true'),
         in(dependencies.MS2Stage.result, 'Succeeded', 'Canceled', 'Skipped')
        )
      pool: 
        vmImage:  windows-latest
      jobs:
      - template: ...  
      
    

    在上述管道中。顶层阶段(即ChangeStage)将首先运行并检查是否对微服务进行了更改,并将输出变量相应地设置为true。

    MS2Stage 依赖于 MS3Stage。 MS2Stage 的条件如下:这意味着 MS2Stage 将仅在输出标志 MS2 为真并且 MS3Stage 成功、跳过或取消的条件下运行。

    MS3Stage 和 MS1Stage 与 MS2Stage 类似。

    condition: |
        and 
        (
         eq(dependencies.ChangeStage.outputs['ChangeJob.ChangeTask.MS2'], 'true'),
         in(dependencies.MS3Stage.result, 'Succeeded', 'Canceled', 'Skipped')
        )
    

    【讨论】:

    • 优秀。我们将遵循这种方法,初步测试您的建议很有希望。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-01
    • 2020-09-15
    • 2021-02-26
    • 1970-01-01
    • 1970-01-01
    • 2019-02-20
    • 1970-01-01
    相关资源
    最近更新 更多