我在 Azure DevOps 项目中的一个阶段遇到问题,该阶段在我们不需要的时候执行。可能是
canRun
参数问题。
我们有一个 YAML 模板管道,可将先前构建的映像部署到我们环境之一中的 Kubernetes。该模板从另一个 YAML 管道多次调用,依次为每个环境调用一次,有条件地:来自
main
分支的构建被部署到开发和 QC,而来自任何 release/*
分支的构建被部署到测试,然后生产,然后是应急,它应该反映生产。发布系列的 YAML 如下:
- template: deploy-pipeline-job-template.yml
parameters:
canRun: and(not(or(failed(), canceled())), startsWith(variables['resources.pipeline.buildPipeline.sourceBranch'], 'refs/heads/release/'))
stageName: Test
variableGroup: myproj-web-variables-test
buildPipelineId: ${{ parameters.buildPipelineId }}
devOpsEnvironment: myproj-test
kubernetesServiceConnection: myproj-dev-kubeconfig
- template: deploy-pipeline-job-template.yml
parameters:
canRun: and(not(or(failed(), canceled())), startsWith(variables['resources.pipeline.buildPipeline.sourceBranch'], 'refs/heads/release/'))
stageName: Production
variableGroup: myproj-web-variables-prod
buildPipelineId: ${{ parameters.buildPipelineId }}
devOpsEnvironment: myproj-prod
kubernetesServiceConnection: myproj-prod-kubeconfig
- template: deploy-pipeline-job-template.yml
parameters:
canRun: and(not(or(failed(), canceled())), startsWith(variables['resources.pipeline.buildPipeline.sourceBranch'], 'refs/heads/release/'))
stageName: Contingency
variableGroup: myproj-web-variables-cont
buildPipelineId: ${{ parameters.buildPipelineId }}
devOpsEnvironment: myproj-cont
kubernetesServiceConnection: myproj-cont-kubeconfig
QC、测试和生产配置为需要批准。在批准者批准将发布版本部署到测试并收到批准部署到生产的提示后,应该会发生以下情况:
其中第一个发生:提交生产批准后,生产阶段开始运行,紧接着是应急阶段。
问题出在第二种情况。 DevOps 对批准的等待期施加 30 天的限制。实际发生的情况是,当等待期到期时,构建虽然没有部署到生产,但会部署到应急项目,因此应急项目不再镜像生产,而是托管尚未批准的版本,并且可能会永远不会被批准。 在这种情况下有没有办法防止部署到应急情况?我可以在模板调用中的
canRun
参数中添加一些内容来实现此目的吗?似乎没有
skipped()
与 failed()
和 canceled()
一起出现。在最糟糕的情况下,我们可以添加对应急方案的批准要求,然后批准者只需记住每次部署到生产时,他们都必须在几秒钟后跳转到传入的提示,以批准应急方案,但我不想添加额外的批准步骤。canrun
参数应该是一个stage的条件。
您可以按以下方式更改应急阶段,以确保应急阶段仅在生产阶段成功后运行。- template: deploy-pipeline-job-template.yml
parameters:
canRun: and(succeeded(), startsWith(variables['resources.pipeline.buildPipeline.sourceBranch'], 'refs/heads/release/'))
stageName: Contingency
variableGroup: myproj-web-variables-cont
buildPipelineId: ${{ parameters.buildPipelineId }}
devOpsEnvironment: myproj-cont
kubernetesServiceConnection: myproj-cont-kubeconfig