使用密钥
所有自动化工作流中非常重要的一部分是处理机密信息。无论是部署应用程序还是访问 API,您总是需要凭证或密钥,这些都必须小心处理。
在 GitHub 中,您可以在存储库级别、组织级别或环境级别安全地存储机密。机密信息会被加密存储和传输,并且不会出现在日志中。
对于组织级别的机密,您可以定义哪些存储库可以访问该机密。对于环境级别的机密,您可以定义所需的审查者:只有在他们批准工作流后,才能访问机密。
机密名称不区分大小写,且只能包含普通字符([a-z] 和 [A-Z])、数字([0-9])和下划线字符( |
存储密钥
要存储加密的机密信息,您必须是存储库的管理员角色。可以通过网页或 GitHub CLI 创建机密。
要创建新的机密,导航到 Settings | Secrets。机密信息被分为 Actions(默认)、Codespaces 和 Dependabot 类别。要创建新机密,点击 New repository secret 并输入名称和机密信息(见图 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
)为 all、private 或 selected。对于 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.token
或 secrets.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。