如何使Azure Pipelines独占锁在审批等待时不释放直至全流程结束?
解决Azure Pipelines整个流水线独占锁直至完成的问题
核心方案:绑定同一环境并配置lockBehavior: run
要让流水线从启动到所有阶段完成全程持有独占锁,需完成以下配置:
- 将两个阶段(A/Plan、B/Apply)关联到同一个Azure Pipelines环境
- 显式设置锁行为为
run,即整个流水线生命周期持有锁
YAML配置示例
stages: - stage: A displayName: Plan (CI) jobs: - job: Plan_Job # 绑定目标环境并设置锁行为为流水线全程持有 environment: name: 'Terraform-Prod-Env' lockBehavior: run steps: - script: terraform init -backend-config=backend.tfvars displayName: 'Terraform Init' - script: terraform plan -out=tfplan displayName: 'Terraform Plan' - stage: B displayName: Apply (CD) dependsOn: A jobs: - job: Apply_Job # 关联同一环境,继承run级锁行为 environment: 'Terraform-Prod-Env' steps: - script: terraform apply tfplan displayName: 'Terraform Apply'
处理检查优先级问题
尽管UI无法调整环境检查的优先级顺序,但lockBehavior: run的特性可直接规避该问题:
- 流水线启动时会立即尝试获取环境独占锁,此时手动审批等其他检查尚未触发
- 流水线1成功获取锁后,流水线2会被直接阻塞在锁检查环节,无法进入任何阶段执行
- 只有当流水线1完成所有阶段(包括B阶段的Apply)并释放锁,流水线2才会启动执行
关键验证点
- 确保目标环境已启用独占锁:在Azure Pipelines环境的「检查」中添加「独占锁」并设为「必需」
- 禁止仅在B阶段配置环境锁:若仅B阶段关联环境,锁只会在B阶段Job执行时持有,等待审批时会自动释放
- 优先使用YAML显式配置:部分场景下UI的「整个流水线」锁设置可能因阶段未关联环境失效,YAML配置更可靠
内容的提问来源于stack exchange,提问作者Markus Peterson
相关产品推荐
相关产品推荐

