使用密钥

所有自动化工作流中非常重要的一部分是处理机密信息。无论是部署应用程序还是访问 API,您总是需要凭证或密钥,这些都必须小心处理。

在 GitHub 中,您可以在存储库级别、组织级别或环境级别安全地存储机密。机密信息会被加密存储和传输,并且不会出现在日志中。

对于组织级别的机密,您可以定义哪些存储库可以访问该机密。对于环境级别的机密,您可以定义所需的审查者:只有在他们批准工作流后,才能访问机密。

机密名称不区分大小写,且只能包含普通字符([a-z] 和 [A-Z])、数字([0-9])和下划线字符(_)。它们不能以 GITHUB_ 或数字开头。 最佳实践是使用大写字母命名机密,单词之间用下划线(_)分隔。

存储密钥

要存储加密的机密信息,您必须是存储库的管理员角色。可以通过网页或 GitHub CLI 创建机密。

要创建新的机密,导航到 Settings | Secrets。机密信息被分为 Actions(默认)、CodespacesDependabot 类别。要创建新机密,点击 New repository secret 并输入名称和机密信息(见图 6.1):

image 2024 12 27 12 09 32 166
Figure 1. 图 6.1 – 管理存储库机密

组织级别的机密处理方式大致相同。在 Settings | Secrets | New organization secret 下创建机密,并设置访问策略为以下之一:

  • 所有存储库

  • 私有存储库

  • 选定存储库

当选择 Selected repositories 时,您可以授予对单个存储库的访问权限。

如果您更喜欢使用 GitHub CLI,可以使用 gh secret set 命令来创建新的机密。

$ gh secret set secret-name

您将被提示输入机密信息。您也可以从文件中读取机密信息,通过管道传递给命令,或将其指定为正文(-b--body):

$ gh secret set secret-name < secret.txt
$ gh secret set secret-name --body secret

如果机密是针对某个环境的,您可以使用 --env-e)参数来指定它。

对于组织级别的机密,您可以设置其可见性(--visibility-v)为 allprivateselected。对于 selected,您必须使用 --repos-r)指定一个或多个存储库:

$ gh secret set secret-name --env environment-name
$ gh secret set secret-name --org org -v private
$ gh secret set secret-name --org org -v selected -r repo

访问密钥

您可以通过 secrets 上下文在工作流中访问机密。可以在工作流文件的步骤中将其作为输入(with:)或环境变量(env:)添加。

组织和存储库级别的机密在工作流运行排队时读取,而环境级别的机密在引用该环境的作业启动时读取。

GitHub 会自动从日志中删除机密。但请小心在步骤中处理机密信息!

根据您的 shell 和环境,访问环境变量的语法有所不同。

  • Bash 中,语法是 $SECRET-NAME

  • PowerShell 中,语法是 $env:SECRET-NAME

  • cmd.exe 中,语法是 %SECRET-NAME%

以下是如何在不同的 shell 中将机密作为输入或环境变量访问的示例:

steps:
  - name: Set secret as input
    shell: bash
    with:
      MY_SECRET: ${{ secrets.secret-name }}
    run: |
      dosomething "$MY_SECRET "
  - name: Set secret as environment variable
    shell: cmd
    env:
      MY_SECRET: ${{ secrets.secret-name }}
    run: |
      dosomething.exe "%MY_SECRET%"

这些只是示例,向您展示如何将机密传递给操作。如果您的工作流步骤是 run: 步骤,您也可以直接访问机密上下文 ${{secrets.secret-name}}。如果您希望避免脚本注入,建议不要这样做。但由于只有管理员才能添加机密,如果您考虑到工作流的可读性,您可以考虑这种方式。

GITHUB_TOKEN 密钥

一个特殊的机密是 GITHUB_TOKEN 机密。GITHUB_TOKEN 机密会自动创建,并可以通过 github.tokensecrets.GITHUB_TOKEN 上下文进行访问。即使工作流没有将其作为输入或环境变量提供,GitHub 操作也可以访问该令牌。此令牌可用于在访问 GitHub 资源时进行身份验证。默认权限可以设置为开放或限制,尽管这些权限可以在工作流中进行调整。

on: pull_request_target

permissions:
  contents: read
  pull-requests: write

jobs:
  triage:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/labeler@v2
        with:
          repo-token: ${{ secrets.GITHUB_TOKEN }}

有关 GITHUB_TOKEN 机密的更多信息,请参见: https://docs.github.com/en/actions/reference/authentication-in-a-workflow。