当前位置:首页 > 文章列表 > 文章 > 软件教程 > GitHub Actions 怎样按环境保护部署任务

GitHub Actions 怎样按环境保护部署任务

来源:17golang原创 2026-10-17 23:13:54 0浏览 收藏

如果 staging 和 production 共用一个部署任务,最容易出现的风险是:代码已经合并,production job 也已经启动,审批却只能靠口头约定。GitHub Actions 的环境(Environment)可以把审批、分支范围和配置作用域放到同一个边界里。实际做法是先在仓库设置中创建 production,再给部署 job 写入 environment: production;配置了必需审查者后,job 会先处于等待状态,通过审批后才进入 runner。

官方文档:https://docs.github.com/en/actions/concepts/workflows-and-actions/deployment-environments

下面用一个“合并到 main 后部署 production”的场景说明设置路径。文中的界面图是原创操作说明图,不是 GitHub 实际截图。

先把 production 变成一个受保护环境

进入仓库的 Settings → Environments,点击 New environment,创建名为 production 的环境。环境名称要和工作流中的值完全一致;prod、production 是两个不同的名称。

在 production 的配置页,优先设置三类边界:

  • Required reviewers:选择真正有发布权限的个人或团队。部署 job 在批准前不会开始。
  • Deployment branches and tags:限制只有 main 或受保护分支可以进入 production。
  • Environment secrets and variables:把 production 专用配置放在环境下,而不是复制到每个仓库级任务。
GitHub Actions production 环境的保护规则、分支限制和配置区域原创界面说明图
图1:操作说明图,展示 production 环境把审查者、分支范围和环境配置收在同一个设置边界内。

保存后,读者应能在环境页看到 Required reviewers 已列出审查者、允许分支已生效,并能区分 Environment secrets 与 Environment variables。这一步只负责定义规则,还没有让任何工作流使用它。

只给部署 job 绑定环境

打开仓库中的工作流文件,在部署 job 级别添加 environment。测试 job 不必绑定 production,这样测试仍可以正常运行,而发布动作会被环境保护规则拦住:

name: deploy

on:
  push:
    branches: [main] # 只让 main 分支触发这个示例

jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4 # 拉取待测试的提交
      - name: Run tests
        run: ./scripts/test.sh # 测试失败时不要进入部署 job

  deploy-production:
    needs: test # 先通过测试,再等待 production 规则
    runs-on: ubuntu-latest
    environment:
      name: production # 绑定仓库中已经配置的环境
      url: https://example.com/ # 可选:在部署记录中显示目标地址
    steps:
      - uses: actions/checkout@v4 # 部署前取得同一份代码
      - name: Deploy
        env:
          DEPLOY_TOKEN: ${{ secrets.DEPLOY_TOKEN }} # secret 由环境审批后提供
          API_BASE: ${{ vars.API_BASE }} # 非敏感地址使用变量
        run: ./scripts/deploy.sh # 脚本中不要打印 DEPLOY_TOKEN

这里的关键位置是 jobs.deploy-production.environment。把它写在 step 里,或者只在 workflow 顶层写一个同名字段,都不能替代 job 对环境的引用。needs: test 负责测试依赖,environment: production 负责部署保护,两者解决的是不同问题。

在 Actions 页面确认审批真的卡住部署

提交工作流文件后,进入仓库的 Actions,打开对应运行记录。正确的可见状态是:测试 job 先执行;部署 job 显示等待环境审批,而不是已经显示 runner 日志。点击 Review deployments,选择 production,填写必要说明后点击 Approve and deploy,部署 job 才会继续。

GitHub Actions 工作流等待 production 审批并准备批准部署的原创界面说明图
图2:操作说明图,展示 Actions 运行记录中的 Waiting 状态、production 环境和批准入口。

批准前看不到部署步骤的 runner 输出,通常就是保护规则正在生效;批准后才会看到部署 step。若 job 已经直接运行,先检查它是否确实引用了正确的环境名称,以及环境的审查规则是否保存成功。

变量和 secret 要按敏感程度分开

环境变量适合放部署目标名、区域标识或公开 API 地址;secret 适合放令牌、密码和私钥。工作流只引用名称,不把真实值写进 YAML:

  • ${{ vars.API_BASE }}:读取环境变量,值不应被当作凭据。
  • ${{ secrets.DEPLOY_TOKEN }}:读取环境 secret,批准前 job 不应获得它。
  • 不要用 echo 输出 secret,也不要把 secret 拼接到命令行参数中;必须传给脚本时,优先使用环境变量。

如果同名变量同时存在于组织、仓库和环境层级,环境层级的变量优先;但环境变量是在 job 启动后才进入 runner,不能拿它去替换 job 派发前就要解析的配置。

两个容易误判的边界

  • 审批不是分支保护的替代品:环境可以限制允许部署的分支,但合并前的代码评审仍应由分支保护规则负责。
  • 并发不是环境自带的锁:如果需要同一时间只允许一个 production 部署,应另外配置 workflow 或 job 的 concurrency,并使用稳定的组名。
  • 测试 job 不会自动继承 production 配置:只有引用环境的 job 才会受该环境规则和配置影响。

常见问题

为什么已经批准了,部署 job 仍然失败?

先分开看两件事:审批只说明环境保护规则通过,不代表部署脚本、runner 网络或凭据本身正确。查看 job 的第一条失败 step,并确认 secret 名称、分支限制和 runner 访问目标都没有写错。

为什么变量在表达式里读不到?

环境级变量只有在引用该环境的 job 启动后才可用。若配置是在 job 派发前解析的字段中使用,应改用仓库或组织层级配置,或者把值放到 job 启动后的 step 中读取。

最终可以用一句话验收:测试可以独立完成,production 部署在 Actions 中先显示等待审批,批准后才进入 runner,并且部署脚本只通过 secrets 和 vars 获取 production 配置。这样环境保护和变量范围才真正形成了同一条部署边界。

版本声明
本文转载于:17golang原创 如有侵犯,请联系study_golang@163.com删除
VS Code 怎样按文件筛选问题列表VS Code 怎样按文件筛选问题列表
上一篇
VS Code 怎样按文件筛选问题列表
GitHub 怎样让不同目录匹配不同审查人
下一篇
GitHub 怎样让不同目录匹配不同审查人
查看更多
最新文章
查看更多
课程推荐
  • 前端进阶之JavaScript设计模式
    前端进阶之JavaScript设计模式
    设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
    543次学习
  • GO语言核心编程课程
    GO语言核心编程课程
    本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
    516次学习
  • 简单聊聊mysql8与网络通信
    简单聊聊mysql8与网络通信
    如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
    500次学习
  • JavaScript正则表达式基础与实战
    JavaScript正则表达式基础与实战
    在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
    487次学习
  • 从零制作响应式网站—Grid布局
    从零制作响应式网站—Grid布局
    本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
    485次学习
查看更多
AI推荐
  • PubMedQA数据集详解:生物医学问答基准、功能与应用指南
    PubMedQA
    深入了解PubMedQA生物医学问答数据集,涵盖其核心功能、使用方法及在临床决策、药物研发等场景的应用,助力提升NLP模型性能。
    507次使用
  • H2O EvalGPT:开源LLM大模型评估与排行榜工具
    H2O EvalGPT
    H2O EvalGPT是H2O.ai推出的开源LLM评估平台,提供详细的大模型性能排行榜、行业特定基准测试及A/B测试功能,助您快速选择最适合项目的高性能大语言模型。
    569次使用
  • LMArena是什么?伯克利AI模型评估平台使用指南与功能解析
    LMArena
    LMArena是加州大学伯克利分校推出的AI模型匿名评测平台。通过盲测投票机制,用户可对比不同大模型回答并生成实时排行榜,助力开发者优化模型及用户选择最佳AI工具。
    593次使用
  • 斯坦福HELM:大语言模型Holistic Evaluation整体评估框架详解
    HELM
    深入了解斯坦福推出的HELM(Holistic Evaluation of Language Models)大模型评测体系。本文解析其核心功能、安装配置步骤及应用场景,涵盖准确性、公平性、鲁棒性等多维度指标,助力开发者全面优化语言模型性能。
    546次使用
  • MMBench详解:多模态大模型基准测试、功能特点与使用指南
    MMBench
    MMBench是由上海人工智能实验室等机构联合推出的多模态基准测试平台,提供细粒度能力评估、大规模数据集及VLMEvalKit工具。本文详细介绍其核心功能、安装使用方法及应用场景,助力开发者全面评估多模态模型性能。
    364次使用