首页/开发/CI/CD 与发布速查/GitHub Actions secrets 与 vars
工具链要点63 条

GitHub Actions secrets 与 vars

仓库/组织/环境三级配置:secrets 存敏感值(日志掩码),vars 存普通配置;作业容器经上下文引用,环境级在对应环境生效。

CI/CD 与发布速查开发更新于 2026-10-13

secrets 与 vars 怎么分工

GitHub Actions 把配置分成两类:secrets 存敏感值(凭据、令牌),引用为 ${{ secrets.NAME }},运行时注入并在日志里自动打码;vars 存非敏感的普通配置(区域、域名、开关),引用为 ${{ vars.NAME }}。两者都支持组织 / 仓库 / 环境三级,同名时更靠近作业的一级生效(环境优先于仓库、仓库优先于组织)。环境级配置与环境的保护规则联动:配了审批要求的环境,只有审批通过后作业才能拿到对应 secrets,适合把生产凭据与预发凭据分开管理。secrets 不能直接写在 if 条件表达式里,需要条件判断时先赋给 env 再引用。

基本信息

secrets 引用${{ secrets.NAME }},日志自动掩码
vars 引用${{ vars.NAME }},普通配置
层级组织 → 仓库 → 环境,就近覆盖
条件判断secrets 不能直接用于 if,先赋给 env
环境联动环境级 secrets 受环境保护规则约束

典型使用场景

  • 注入部署凭据:registry token、云厂商访问密钥放 secrets,workflow 文件里不出现明文。
  • 多环境区分:staging 与 prod 各配环境级 secrets,同名不同值,作业引用方式不变。
  • 普通参数集中管理:区域、实例规格、通知频道 ID 放 vars,调整时不用改动 workflow。
  • 组织级共享:多个仓库共用同一套镜像仓库与通知配置时放组织级,减少逐仓库维护。
  • 替代长期密钥:云上优先用 OIDC 换取短期凭据,secrets 里不再存长期访问密钥。
  • 轮换演练:定期轮换 secrets 并跑一遍流水线,避免到期当天才发现依赖它的作业全挂。

经 env 使用

经 env 使用
env:
  REGION: ${{ vars.REGION }}  # 普通配置直接引用
steps:
  - run: deploy --region $REGION
    env:
      TOKEN: ${{ secrets.REGISTRY_TOKEN }}  # 敏感值经 env 注入
  - if: env.TOKEN != ''  # 条件判断走 env 变量
    run: echo token-ready

secrets 与 vars 对比

维度secretsvars
内容凭据、令牌等敏感值区域、开关等普通配置
日志显示自动掩码原样显示
条件表达式不能直接用于 if可直接用于 if
环境保护环境级受审批规则约束同样支持三级
轮换要求定期轮换并演练随配置管理惯例
打码不是万能保护:掩码只对原值生效,把秘密编码、拼接后再输出仍可能泄露,调试输出前先确认内容。
Fork 仓库的 PR 默认拿不到 secrets:外部贡献者的作业只应跑无凭据部分,需要凭据的步骤放在可信事件里执行。
环境级 secrets 的价值在保护规则:没配审批与限制分支的环境,作用等同于仓库级。

易错点

  • 把 secrets 直接写进 if 表达式:解析失败或永远为假,先赋给 env 再判断。
  • 以为日志掩码绝对安全:输出变换过的值(编码、前缀截取)不会被掩码,避免打印任何派生值。
  • 组织级 secrets 可见范围放太宽:任何仓库的 workflow 都能读取,按最小可见性收紧或改用环境级。
  • 环境没配保护规则:环境级 secrets 退化为仓库级,加审批与分支限制才有隔离意义。
  • 长期令牌不做轮换:泄露后长期有效,改用 OIDC 短期凭据或排期轮换。

数据来源与参考

  • GitHub Docs《Using secrets in GitHub Actions》
  • GitHub Docs《Variables》
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌