我们的解决方案由相互调用和支持的微服务组成。
为简化起见,请考虑以下依赖关系图:
MS1 --> MS2
--> MS3 --> MS4
目标:部署期间的停机时间为零
当前,我们正在分析解决以下两种情况的可能方法:
按顺序部署所有微服务,以确保所有端到端测试均通过。这意味着首先部署MS4,然后部署MS3,MS2,MS1,然后运行测试(所有这些都在插槽中),然后在一切都通过后切换插槽。
分别部署任何服务(其他服务完全没有更改),运行测试(再次插入插槽),然后在一切成功的情况下切换插槽。
我们的第一种方法是拥有一个(大型)管道,每个微服务具有独立的阶段,并检查该微服务是否已更改以部署它。如果未检测到微服务的更改,那么我们想取消该阶段并继续进行下一个。 该管道包含每个阶段的模板,例如:
- 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
我们认为这将涵盖所描述的方案。 “取消命令”应放在template / ms1-check-changes.yml文件中
问题在于,我们没有在文档中找到如何取消完整的舞台。这让我认为也许我们完整的方法是错误的。 我们还没有找到如何取消一个工作或一组工作的方法,因为我们也怀疑每个微服务是否应该具有阶段。
您可以看到,我们是新手。
您能否针对所描述的方案提供一些好的策略建议?
答案 0 :(得分: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')
)