如何一键自动化审批并部署50+条生产环境Release Pipeline?
一键自动化审批并批量部署生产Release Pipeline的方案
绝对有办法解决这个重复繁琐的手动审批问题!作为常年和CI/CD流水线打交道的开发者,我来给你分享几个主流平台下的实操方案,都是经过生产环境验证的:
一、Azure DevOps环境下的实现
如果你的流水线基于Azure DevOps,最直接的方式是用REST API + 脚本批量处理审批和部署:
步骤1:准备权限
生成一个拥有「Release读取、审批、执行」权限的个人访问令牌(PAT),确保它能访问所有目标生产流水线。
步骤2:编写批量处理脚本
用PowerShell或Python写一个脚本,核心逻辑是拉取待审批的生产发布、自动完成审批、触发部署流程。这里给你一个PowerShell示例片段:
$orgName = "你的组织名" $projName = "你的项目名" $pat = "你的PAT令牌" $headers = @{Authorization = "Basic " + [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes(":$pat"))} # 获取所有待审批的生产发布 $releasesUrl = "https://dev.azure.com/$orgName/$projName/_apis/release/releases?status=active&`$expand=approvals&api-version=7.1-preview.8" $releases = Invoke-RestMethod -Uri $releasesUrl -Headers $headers -Method Get foreach ($release in $releases.value) { # 只处理生产环境的发布(根据你的环境名称过滤) if ($release.environments.name -eq "Production") { foreach ($approval in $release.approvals) { if ($approval.status -eq "pending") { # 发送审批请求 $approveUrl = "https://dev.azure.com/$orgName/$projName/_apis/release/approvals/$($approval.id)?api-version=7.1-preview.3" $approveBody = @{ status = "approved" comments = "Automated production approval via script" } | ConvertTo-Json Invoke-RestMethod -Uri $approveUrl -Headers $headers -Method Patch -Body $approveBody -ContentType "application/json" # 触发部署(如果审批后需要手动触发) $deployUrl = "https://dev.azure.com/$orgName/$projName/_apis/release/releases/$($release.id)/environments/$($release.environments.id)?api-version=7.1-preview.7" $deployBody = @{status = "inProgress"} | ConvertTo-Json Invoke-RestMethod -Uri $deployUrl -Headers $headers -Method Patch -Body $deployBody -ContentType "application/json" } } } }
二、Jenkins环境下的实现
如果用的是Jenkins,可以通过Groovy脚本+Jenkins API或者自定义主流水线实现批量操作:
方案1:自定义主流水线
创建一个专门的「生产批量部署」流水线,遍历所有目标生产流水线,自动完成审批和触发:
// 替换成你的生产流水线名称列表 def productionPipelines = ["OrderService-Prod", "UserService-Prod", "..."] pipeline { agent any stages { stage("批量审批并部署") { steps { script { productionPipelines.each { pipelineName -> def job = Jenkins.instance.getItemByFullName(pipelineName) // 获取最新的待审批构建 def pendingBuild = job.getBuilds().find { build -> def inputAction = build.getAction(org.jenkinsci.plugins.workflow.support.steps.input.InputAction) inputAction != null && inputAction.getInputs().any { it.isPending() } } if (pendingBuild) { // 自动审批输入步骤 def inputAction = pendingBuild.getAction(org.jenkinsci.plugins.workflow.support.steps.input.InputAction) inputAction.getInputs().each { input -> input.proceed("Automated production approval", null) } // 恢复构建流程(触发部署) pendingBuild.doResume() echo "已完成${pipelineName}的审批和部署触发" } } } } } } }
方案2:使用插件辅助
可以借助Pipeline Aggregator或MultiJob Plugin管理多个流水线,设置统一的触发和审批规则,一键触发所有关联的生产部署。
三、通用跨平台方案:统一编排层
如果你的流水线分散在不同平台,或者想要更灵活的控制,可以引入统一编排工具(比如Argo CD、Spinnaker):
- 将所有生产Release Pipeline纳入编排工具管理
- 配置自动化审批规则:比如必须通过所有测试、合规检查、代码扫描
- 提供一键触发入口,满足条件后自动完成所有流水线的审批和部署
四、关键安全注意事项
生产环境的自动化审批必须谨慎,一定要做好这些防护:
- 权限管控:只有指定的运维/发布角色才能执行一键操作,操作需要二次验证(比如MFA)
- 前置校验:脚本/工具必须先检查所有流水线是否通过预发布的所有校验(测试、扫描等),不满足条件则终止操作
- 审计日志:记录每一次自动化操作的执行人、时间、涉及的流水线列表,方便追溯
- 灰度验证:先在测试环境用少量流水线验证脚本,确认无误后再推广到所有生产流水线
内容的提问来源于stack exchange,提问作者Kamlesh Joshi




