Github的“环境”和“仓库”秘钥有什么区别?

66
在 GitHub 的文档中,它说明了密钥的优先顺序从低到高(环境 > 仓库 > 组织),同时指出组织密钥可用于该组织中所有存储库。但它没有提及环境仓库密钥。
我的问题是:
  1. 环境密钥和仓库密钥有什么区别?
  2. 何时应使用环境密钥?
  3. 何时应使用仓库密钥?
3个回答

72

环境密钥是 Github Actions 中特定于环境的,允许您在单个存储库中运行不同的作业配置,例如先部署到暂存区,然后再部署到生产环境。

存储库密钥特定于单个存储库(以及其中使用的所有环境),而组织密钥特定于整个组织和其下的所有存储库。

如果您有特定于环境的密钥,则可以使用环境密钥。

如果您不确定,也可以为所有内容开始使用存储库密钥。如果以后引入需要不同密钥的不同环境,则可以将存储库密钥移动到特定环境中。由于继承链,这对作业应该是透明的。


8
只是确认我是否理解正确,基本上如果我有 developmenttestproduction 的变量,我就会为每个变量创建一个 environment,并将唯一的变量放在其中,然后将公共变量放在 repository 变量中? - Adam
是的,您可以这样使用它。请参考环境文档以及相应的作业和工作流程定义。 - Holger Just
1
我以前在GitHub上设置密钥时总是感到很沮丧,直到今天看到了你的答案。非常感谢! - Huan
@Adam 谢谢你。如果文档中只使用这样简单的句子,而不是一些臃肿无用的废话,那该多好啊。 - Farid

6
为了补充Holger Just的回答,提供一个示例工作流程。GitHub 文档展示了在工作流程中使用jobs.<job_id>.environment选项的示例,但我认为这个示例更为恰当。
name: Some task

on:
  push:
    branches:
      - main

jobs:
  prod-task:
    runs-on: ubuntu-latest
    environment: production
    steps:
      # uses production enviroment secrets over repository secrets
      - name: Run node build process
        run: "NODE_ENV=${{ env.NODE_ENV }} npm run build"
  dev-task:
    runs-on: ubuntu-latest
    environment: development
    steps:
      # uses development enviroment secrets over repository secrets
      - name: Run node build process
        run: "NODE_ENV=${{ env.NODE_ENV }} npm run build"
  task:
    runs-on: ubuntu-latest
    steps:
      # uses repository secrets as no environment is defined
      - name: Run node build process
        run: "NODE_ENV=${{ env.NODE_ENV }} npm run build"

注意:在上面的示例中,您可以看到脚本通过 env context 使用 表达式访问环境变量。
因此,想法是当为作业指定环境时,在该作业中使用的任何密码都将在使用存储库密码之前使用任何特定于环境的密码。
要设置环境密码,请导航到存储库设置下的Environments 部分(即 https://github.com/<owner>/<repo>/settings/environments )。创建或选择一个环境。然后添加您需要的任何机密,如下图所示。请确保在需要访问它的所有必需环境中提供机密,否则该值将从父env范围继承或可能返回''

enter image description here


1
需要更多的演示代码来展示如何使用环境机密。 - xgqfrms
1
请查看帖子的更新。此外,请参阅此文档页面以获取更多解释。 - Nickofthyme

1
我使用环境秘密的主要原因是可以配置环境,使得只有受保护分支中的操作才能在其中运行。这使我可以在那些环境中拥有允许生产部署的秘密,但非受保护分支(如未经审查的PR)即使修改了工作流文件也无法访问这些秘密。
总结一下,我对每个秘密级别的使用如下:
- 组织:与大多数或所有仓库相关的秘密,应该从任何PR都可以访问,例如运行通用CI基础设施的凭据,适用于许多仓库。 - 仓库:仅与一个项目相关的秘密,可以从该项目的任何PR访问,例如允许一种特定的小众CI的凭据。 - 环境:只应由经过审查、合并的PR访问的秘密,例如允许部署的凭据。
不幸的是,没有"组织环境"的概念,所以必须为每个相关仓库单独设置环境秘密。我使用一个访问REST API的脚本来完成这个操作。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接