GitHub Actions 如何用环境保护规则控制部署审批
GitHub Actions 的生产部署审批不需要把“等待人工确认”写成一个脚本步骤。更稳妥的做法是:先给仓库创建 production 环境,在环境上设置必须审批人、禁止自批与可部署分支,然后让部署 job 通过 environment 引用它。这样保护规则没有通过时,job 不会被发送到 runner,也不能读取该环境里的密钥。
官方操作说明可从下面两个地址核对:
# 环境创建与保护规则
https://docs.github.com/en/actions/how-tos/deploy/configure-and-manage-deployments/manage-environments
# 审批或拒绝等待中的部署
https://docs.github.com/en/actions/how-tos/deploy/configure-and-manage-deployments/review-deployments
先确认功能范围:公有仓库在当前 GitHub 计划中普遍可使用环境、环境密钥和部署保护规则;私有或内部仓库需要相应付费计划,而 Required reviewers、Wait timer 等规则的可用性还会受到计划与仓库可见性影响。若界面中没有本文选项,应先查看官方页面的 “Who can use this feature”,不要用脚本绕过。
一、审批门禁实际控制什么
环境保护规则作用在“引用环境的 job”上,而不是作用在整个工作流文件上。假设工作流先构建、再部署,只有 deploy job 写了 environment: production,那么构建可以正常完成,部署会在保护规则处暂停。审批通过后,部署 job 才获得以下条件:
- 进入 runner 队列并开始执行步骤;
- 读取
production环境中保存的 secrets; - 创建与该环境关联的 deployment 和 deployment status。
这个边界很重要:只在工作流名称、job 名称或脚本参数里写“production”不会自动触发审批,必须使用 job 级 environment 字段。
二、步骤一:创建 production 环境
- 进入目标仓库主页,点击仓库顶部的 Settings。看不到 Settings 时,可先展开仓库导航的下拉菜单。
- 在左侧栏点击 Environments。
- 点击 New environment。
- 名称输入
production,点击 Configure environment。

环境名称不区分大小写,但工作流中的名称最好与界面保持完全一致,减少排查时的歧义。不要依赖“运行时自动创建环境”:官方说明指出,工作流引用一个不存在的环境时可能自动创建它,但这个新环境通常没有保护规则和密钥,不能替代管理员预先配置。
三、步骤二:设置必须审批与禁止自批
在 production 的配置页找到 Deployment protection rules,按下面顺序操作:
- 勾选 Required reviewers。
- 搜索并加入负责发布的用户或团队,例如
release-managers。 - 勾选 Prevent self-review,避免工作流触发者审批自己的部署。
- 点击 Save protection rules。

当前官方规则允许最多加入 6 个用户或团队,只要其中一名 required reviewer 批准,审批条件就通过。因此,“加入两组 reviewer”并不等于必须双人会签。如果你的制度要求两人分别确认,需要通过组织流程或自定义部署保护规则另行实现,不能把默认 Required reviewers 误解成多签。
页面若提供 Wait timer,还可以设置批准前必须等待的分钟数;如果希望管理员也不能越过保护规则,可取消 Allow administrators to bypass configured protection rules。这两项是否出现同样取决于计划与仓库类型。
四、步骤三:限制允许部署的分支或标签
审批解决“谁允许部署”,分支规则解决“哪段代码允许部署”。仍在 production 环境页,找到 Deployment branches and tags:
- 在下拉框选择 Selected branches and tags。
- 点击 Add deployment branch or tag rule。
- Ref type 选择 Branch,名称模式输入
main。 - 点击 Add rule。

分支与标签规则必须分别创建。若团队通过版本标签发版,可以再添加 Ref type 为 Tag 的规则,例如 v*;不要只写一个看似同时匹配分支与标签的模式。
五、步骤四:让 deploy job 引用 production
把部署工作流放在仓库的 .github/workflows 目录。下面示例使用手动触发,重点是 deploy job 的 environment 字段:
name: deploy-production
on:
workflow_dispatch:
jobs:
deploy:
runs-on: ubuntu-latest
# 名称必须对应 Settings > Environments 中的 production
environment:
name: production
steps:
- name: Checkout source
uses: actions/checkout@v4
- name: Deploy
# 示例命令仅表示部署入口,请替换为项目自己的安全脚本
run: ./scripts/deploy.sh
如果只需要环境名称,也可以简写为:
jobs:
deploy:
runs-on: ubuntu-latest
# 简写与 environment.name: production 等价
environment: production
steps:
- name: Deploy
run: ./scripts/deploy.sh
工作流语法还支持在环境对象中加入 url,用于把部署地址写入 deployment status。审批门禁本身只依赖环境名称,不必为了审批额外填写 URL。
六、步骤五:在运行页批准或拒绝
- 进入仓库的 Actions,打开
deploy-production。 - 点击 Run workflow,从符合环境分支规则的分支触发。
- 构建完成后,deploy job 显示 Waiting,页面出现审核通知。
- 审批人点击 Review deployments。
- 勾选
production,可填写评论,然后选择 Approve and deploy 或 Reject。

点击 Approve and deploy 后,只有在其他保护规则也通过时 job 才继续,并从此刻起能够访问环境密钥;点击 Reject 会使工作流失败。启用了 Prevent self-review 时,触发该 workflow run 的账号不能完成自己的审批,应由另一名 required reviewer 操作。
七、如何确认配置真的生效
完成一次测试运行后,至少核对下面四个可观察结果:
- 审批前:deploy job 是 Waiting,而不是已经在 runner 中执行。
- 审批入口:运行页出现 Review deployments,并能选择 production。
- 批准后:job 状态从 Waiting 进入 Queued 或 In progress,随后执行部署步骤。
- 拒绝后:job 不执行部署脚本,workflow run 以失败状态结束。
不要用“页面上出现 production 字样”作为唯一成功标准。真正的门禁证据是 job 在审批前没有进入 runner,环境密钥也没有提前提供。
八、常见问题排查
1. 工作流直接开始部署,没有等待审批
先打开工作流 YAML,确认 environment 写在执行部署的 job 下,而不是全局 env、步骤参数或普通字符串中。再确认环境名称为 production,并且该环境已经保存 Required reviewers。
2. 找不到 Required reviewers
检查仓库是公有、私有还是内部仓库,并核对当前 GitHub 计划。官方页面明确提示:环境的基础能力、私有仓库可用性以及 Required reviewers、Wait timer 等保护规则的可用性并不完全相同。
3. 自己看得到审批按钮,但不能批准
如果该账号触发了本次运行,而环境启用了 Prevent self-review,这是预期行为。让另一名被列为 required reviewer 的用户或团队成员审批,不要关闭规则来绕过制度。
4. 显示分支不允许部署
检查运行使用的 Git ref 是否匹配 Deployment branches and tags。手动触发时要在 Run workflow 下拉框选择允许的分支;分支规则和标签规则分开匹配。
5. 审批前读不到环境 secret
这正是环境保护边界:引用环境的 job 只有在保护规则通过后才能访问环境 secrets。若构建阶段需要公共配置,应使用仓库变量或构建 job 自己的权限模型,不应提前暴露生产密钥。
九、结论
GitHub Actions 的生产审批可以归纳为三层:environment 绑定部署对象、protection rules 决定谁能放行、deployment branches and tags 决定哪些引用可进入。只要 deploy job 明确引用 production,审批前 Waiting、审批后才进 runner,并且生产密钥直到规则通过才可用,这套门禁就形成了完整闭环。
最后建议把“禁止自批、只允许 main、管理员是否可绕过、审批评论规范”写进团队发布制度。界面规则负责强制执行,制度负责解释何时批准、何时拒绝,两者结合才能让部署审批既安全又可追溯。
Redis 向量查询怎样组合标签过滤与距离排序
- 上一篇
- Redis 向量查询怎样组合标签过滤与距离排序
- 下一篇
- 证书链通过验证却不满足策略 OID 是什么原因
-
- 文章 · 软件教程 | 5小时前 | DNS · 软件教程 · Wireshark 显示过滤器 DNS 查询 dns.qry.name dns.id pcapng 导出
- Wireshark 如何用显示过滤器追踪一次 DNS 查询
- 190浏览 收藏
-
- 文章 · 软件教程 | 8小时前 | chrome · Chrome DevTools 前端联调 Local Overrides 覆盖网络响应 XHR fetch
- Chrome DevTools 如何覆盖网络响应做前端联调
- 152浏览 收藏
-
- 文章 · 软件教程 | 10小时前 | obsidian · 软件教程 · 笔记元数据 Obsidian属性 Properties view 全局重命名
- Obsidian 如何用属性视图批量整理笔记元数据
- 494浏览 收藏
-
- 文章 · 软件教程 | 12小时前 |
- Figma 如何用变量模式切换浅色与深色主题
- 477浏览 收藏
-
- 文章 · 软件教程 | 14小时前 |
- Postman 如何用变量范围隔离测试与生产环境
- 176浏览 收藏
-
- 文章 · 软件教程 | 16小时前 | jdk · 软件教程 · Java工具链 JetBrains IDE Gradle JVM Gradle Toolchain 自动下载JDK Download JDK
- JetBrains IDE 怎样让 Gradle Toolchain 自动下载缺失 JDK
- 364浏览 收藏
-
- 文章 · 软件教程 | 18小时前 | 开发工具 · 软件教程 · Docker Desktop磁盘占用 容器磁盘空间 docker system df Disk usage limit Docker卷大小
- Docker Desktop 如何查看并限制容器磁盘占用
- 136浏览 收藏
-
- 文章 · 软件教程 | 21小时前 |
- GitHub Desktop 如何比较两个分支并只恢复一个文件
- 341浏览 收藏
-
- 文章 · 软件教程 | 22小时前 | vs code · VS Code 软件设置 扩展管理 扩展自动更新 extensions.autoUpdateDelay
- VS Code 怎样为扩展自动更新设置延迟窗口
- 190浏览 收藏
-
- 文章 · 软件教程 | 1天前 | vs code · SSH VS Code Dev Containers Remote-SSH 远程容器
- VS Code 如何把远程 Dev Container 会话接入 SSH 项目
- 332浏览 收藏
-
- 文章 · 软件教程 | 1天前 | 软件教程 · 接口调试 · firefox 网络请求 浏览器开发者工具 HAR Edit and Resend
- 浏览器开发者工具保存并重放网络请求的实用方法
- 222浏览 收藏
-
- 文章 · 软件教程 | 1天前 | shell · 开发环境 云开发环境 Shell配置 GitHub Codespaces dotfiles install.sh
- GitHub Codespaces 用 dotfiles 初始化个人开发环境
- 109浏览 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 516次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 500次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 485次学习
-
- PubMedQA
- 深入了解PubMedQA生物医学问答数据集,涵盖其核心功能、使用方法及在临床决策、药物研发等场景的应用,助力提升NLP模型性能。
- 395次使用
-
- H2O EvalGPT
- H2O EvalGPT是H2O.ai推出的开源LLM评估平台,提供详细的大模型性能排行榜、行业特定基准测试及A/B测试功能,助您快速选择最适合项目的高性能大语言模型。
- 475次使用
-
- LMArena
- LMArena是加州大学伯克利分校推出的AI模型匿名评测平台。通过盲测投票机制,用户可对比不同大模型回答并生成实时排行榜,助力开发者优化模型及用户选择最佳AI工具。
- 479次使用
-
- HELM
- 深入了解斯坦福推出的HELM(Holistic Evaluation of Language Models)大模型评测体系。本文解析其核心功能、安装配置步骤及应用场景,涵盖准确性、公平性、鲁棒性等多维度指标,助力开发者全面优化语言模型性能。
- 425次使用
-
- MMBench
- MMBench是由上海人工智能实验室等机构联合推出的多模态基准测试平台,提供细粒度能力评估、大规模数据集及VLMEvalKit工具。本文详细介绍其核心功能、安装使用方法及应用场景,助力开发者全面评估多模态模型性能。
- 251次使用
-
- Go 项目用 GitHub Actions 自托管 runner:版本强制执行前该怎么整理 CI
- 2026-07-09 340浏览
-
- VS Code Dev Containers 实战:用容器搭建一致开发环境
- 2026-06-12 182浏览
-
- Docker Compose 本地多服务环境实战:MySQL、Redis、Nginx 一键启动
- 2026-06-12 250浏览
-
- Git worktree 实战:一套仓库并行修 Bug 和开发新功能
- 2026-06-12 447浏览
-
- Nginx 本地 HTTPS 反向代理实战:前后端联调不再改端口
- 2026-06-12 373浏览

