如何配置Infra与Code流水线实现分阶段触发联动?
问题描述
我有两条流水线:Infra和Code,共享同一个代码库:
- Infra流水线:仅在Bicep代码变更时触发,负责重新部署Azure资源
- Code流水线:仅在应用代码变更时触发,负责更新函数应用等
这个架构的目的是优化运行时长,避免无Infra变更时执行不必要的资源部署。
两条流水线都包含Dev环境和Prod环境两个阶段,Prod阶段设有审批环节——如果只需要在Dev环境测试代码,我会驳回Prod的审批请求。
当前遇到的问题:当Infra变更时,函数应用代码会被清空,因此Code流水线必须始终在Infra流水线之后运行。但如果我驳回Prod审批,Infra流水线无法完成整个流程,导致依赖它的Code流水线触发机制失效。
现有流水线YAML配置如下:
Infra流水线配置
# infra pipeline yaml stages: - stage: Dev jobs: - template: 'deployInfraToEnv.yaml' parameters: ... - stage: Prod jobs: - template: 'deployInfraToEnv.yaml' parameters: ...
Code流水线配置
# code pipeline yaml resources: pipelines: - pipeline: Infra source: 'Infra pipeline' trigger: true # run after infra pipeline completes stages: - stage: Dev jobs: - template: 'deployCodeToEnv.yaml' parameters: ... - stage: Prod jobs: - template: 'deployCodeToEnv.yaml' parameters: ...
我想实现的目标是:
Infra流水线Dev阶段完成 -> 触发Code流水线Dev阶段运行 Infra流水线Prod阶段完成 -> 触发Code流水线Prod阶段运行
请问是否可以通过配置实现这个目标?还是必须放弃现有架构,将Infra与Code部署合并为一条流水线?
解决方案
完全不需要合并流水线,通过以下配置可以实现分阶段触发的需求:
1. 修改Infra流水线,添加阶段级触发任务
在Infra流水线的每个阶段末尾,新增一个触发Code对应阶段的任务,确保该阶段完成后立即触发Code的对应环节:
# infra pipeline yaml stages: - stage: Dev jobs: - template: 'deployInfraToEnv.yaml' parameters: ... - job: TriggerCodeDev dependsOn: deployInfraToEnv # 依赖Dev阶段的部署任务 steps: - task: TriggerPipeline@2 inputs: pipeline: 'Code pipeline' # 指定Code流水线名称 branch: '$(Build.SourceBranchName)' parameters: '{"targetStage": "Dev"}' # 传递目标阶段参数 waitForCompletion: false - stage: Prod jobs: - template: 'deployInfraToEnv.yaml' parameters: ... - job: TriggerCodeProd dependsOn: deployInfraToEnv # 依赖Prod阶段的部署任务 steps: - task: TriggerPipeline@2 inputs: pipeline: 'Code pipeline' branch: '$(Build.SourceBranchName)' parameters: '{"targetStage": "Prod"}' waitForCompletion: false
2. 修改Code流水线,支持按需运行指定阶段
为Code流水线添加参数控制,允许只运行指定的阶段,避免默认执行全流程:
# code pipeline yaml parameters: - name: targetStage type: string default: 'All' # 默认运行所有阶段 # 保留代码变更触发逻辑(可选) trigger: paths: include: - 'app-code/**' # 仅应用代码变更时触发全流程 stages: - ${{ if or(eq(parameters.targetStage, 'All'), eq(parameters.targetStage, 'Dev')) }}: - stage: Dev jobs: - template: 'deployCodeToEnv.yaml' parameters: ... - ${{ if or(eq(parameters.targetStage, 'All'), eq(parameters.targetStage, 'Prod')) }}: - stage: Prod jobs: - template: 'deployCodeToEnv.yaml' parameters: ...
3. 关闭Code流水线的全局流水线触发
原Code流水线中基于Infra流水线完成的全局触发可以关闭,改用上述阶段级触发:
# 移除或注释原有全局触发配置 # resources: # pipelines: # - pipeline: Infra # source: 'Infra pipeline' # trigger: true
配置完成后,即可实现:
- Infra的Dev阶段部署完成后,自动触发Code的Dev阶段运行
- Infra的Prod阶段通过审批并部署完成后,自动触发Code的Prod阶段运行
- 应用代码变更时,Code流水线仍能自动触发全流程测试部署
- 驳回Prod审批时,Infra的Prod阶段不会执行,自然也不会触发Code的Prod阶段,完全匹配你的需求。
内容的提问来源于stack exchange,提问作者tonsteri
相关产品推荐
相关产品推荐

