注:GitHub Enterprise Server 2.22 上的 GitHub Actions 支持是有限的公测版。 测试已结束。 GitHub Actions 现在一般可用于 GitHub Enterprise Server 3.0 或更新版本。 更多信息请参阅 GitHub Enterprise Server 3.0 发行说明。
- 有关升级到 GitHub Enterprise Server 3.0 或更新版本的更多信息,请参阅“升级 GitHub Enterprise Server”。
- 有关在升级后配置 GitHub Actions 的更多信息,请参阅 GitHub Enterprise Server 3.0 的文档。
注: GitHub 托管的运行器目前在 GitHub Enterprise Server 上不受支持。 您可以在 GitHub 公共路线图 上查看有关未来支持计划的更多信息。
关于加密密码
机密是您在组织 或仓库 中创建的加密环境变量。 您创建的机密可用于 GitHub Actions 工作流程。 在机密到达 GitHub 之前,GitHub 使用 libsodium 密封盒对机密加密,并且在您于工作流程中使用它们之前一直保持加密状态。
对于存储在组织级别的密码,可以使用访问策略来控制哪些仓库可以使用组织密码。 组织级密码允许在多个仓库之间共享密码,从而减少创建重复密码的需要。 在一个位置更新组织密码还可确保更改在使用该密码的所有仓库工作流程中生效。
命名您的密码
以下规则适用于密码名称:
-
密码名称只能包含字母数字字符(
[a-z]
、[A-Z]
、[0-9]
)或下划线 (_
)。 不允许空格。 -
密码名称不能以
GITHUB_
前缀开头。 -
密码名称不能以数字开头。
-
机密名称不区分大小写。
-
密码名称在所创建的级别上必须是唯一的。
例如,在仓库级别创建的机密必须在该仓库中具有唯一的名称,而在组织级别创建的机密必须在该级别具有独特的名称。
如果具有相同名称的机密存在于多个级别,则较低级别的机密优先。 例如,如果组织级别密码的名称与仓库级别的密码相同,则仓库级别的密码优先。
为帮助确保 GitHub 在日志中编写密码,请勿将结构化数据用作密码的值。 例如,避免创建包含 JSON 或编码 Git blob 的密码。
访问您的密码
为使密码用于操作,必须将密码设置为工作流程文件中的输入或环境变量。 查看操作的自述文件以了解操作预期的输入和环境变量。 更多信息请参阅“GitHub Actions 的工作流程语法”。
如果您拥有编辑文件的权限,便可在工作流程文件中使用和读取加密密码。 更多信息请参阅“GitHub 上的访问权限”。
警告:GitHub 自动将密码编写到日志,但您应避免有意将密码打印到日志。
您还可以使用 REST API 管理密码。 更多信息请参阅“密码”。
限制凭据权限
生成凭据时,建议尽可能授予最低的权限。 例如,不使用个人凭据,而使用部署密钥或服务帐户。 请考虑授予只读权限(如果这是所需的全部权限)并尽可能限制访问。 生成个人访问令牌 (PAT) 时,选择所需的最小范围。
Note: You can use the REST API to manage secrets. 更多信息请参阅“GitHub Actions 密码 API”。
为仓库创建加密密码
要为用户帐户仓库创建密码,您必须是仓库所有者。 要为组织仓库创建密码,您必须具有管理员
访问权限。
- 在 GitHub Enterprise Server 上,导航到仓库的主页面。
- 在仓库名称下,单击 Settings(设置)。
- 在左侧边栏中,单击 Secrets(密码)。
- 单击 New repository secret(新仓库机密)。
- 在 Name(名称)输入框中键入密码的名称。
- 输入密码的值。
- 单击 Add secret(添加密码)。
如果您的仓库 可以访问父组织中的机密,则这些机密也会列入本页。
To learn more about GitHub CLI, see "About GitHub CLI."
To add a repository secret, use the gh secret set
subcommand. Replace secret-name
with the name of your secret.
gh secret set secret-name
The CLI will prompt you to enter a secret value. Alternatively, you can read the value of the secret from a file.
gh secret set secret-name < secret.txt
To list all secrets for the repository, use the gh secret list
subcommand.
为组织创建加密密码
在组织中创建密码时,可以使用策略来限制可以访问该密码的仓库。 例如,您可以将访问权限授予所有仓库,也可以限制仅私有仓库或指定的仓库列表拥有访问权限。
要在组织级别创建密码,必须具有管理员
访问权限。
- 在 GitHub Enterprise Server 上,导航到组织的主页面。
- 在组织名称下,单击 Settings.
- 在左侧边栏中,单击 Secrets(密码)。
- 单击 New organization secret(新组织机密)。
- 在 Name(名称)输入框中键入密码的名称。
- 输入密码的 Value(值)。
- 从 Repository access(仓库访问权限)下拉列表,选择访问策略。
- 单击 Add secret(添加密码)。
Note: By default, GitHub CLI authenticates with the repo
and read:org
scopes. To manage organization secrets, you must additionally authorize the admin:org
scope.
gh auth login --scopes "admin:org"
To add a secret for an organization, use the gh secret set
subcommand with the --org
or -o
flag followed by the organization name.
gh secret set --org organization-name secret-name
By default, the secret is only available to private repositories. To specify that the secret should be available to all repositories within the organization, use the --visibility
or -v
flag.
gh secret set --org organization-name secret-name --visibility all
To specify that the secret should be available to selected repositories within the organization, use the --repos
or -r
flag.
gh secret set --org organization-name secret-name --repos repo-name-1,repo-name-2"
To list all secrets for an organization, use the gh secret list
subcommand with the --org
or -o
flag followed by the organization name.
gh secret list --org organization-name
审查对组织级别密码的访问权限
您可以检查哪些访问策略正被应用于组织中的密码。
- 在 GitHub Enterprise Server 上,导航到组织的主页面。
- 在组织名称下,单击 Settings.
- 在左侧边栏中,单击 Secrets(密码)。
- 密码列表包括任何已配置的权限和策略。 例如:
- 有关已为每个密码配置的权限的更多信息,请单击 Update(更新)。
在工作流程中使用加密密码
注:除了 GITHUB_TOKEN
以外,从复刻的仓库触发工作流程时密码不会传递给运行程序。
要提供以密码作为输入或环境变量的操作,可以使用 secrets
上下文访问您在仓库中创建的密码。 For more information, see "Contexts" and "Workflow syntax for GitHub Actions."
steps:
- name: Hello world action
with: # Set the secret as an input
super_secret: ${{ secrets.SuperSecret }}
env: # Or as an environment variable
super_secret: ${{ secrets.SuperSecret }}
尽可能避免使用命令行在进程之间传递密码。 命令行进程可能对其他用户可见(使用 ps
命令)或通过安全审计事件获取。 为帮助保护密码,请考虑使用环境变量 STDIN
或目标进程支持的其他机制。
如果必须在命令行中传递密码,则将它们包含在适当的引用规则中。 密码通常包含可能意外影响 shell 的特殊字符。 要转义这些特殊字符,请引用环境变量。 例如:
使用 Bash 的示例
steps:
- shell: bash
env:
SUPER_SECRET: ${{ secrets.SuperSecret }}
run: |
example-command "$SUPER_SECRET"
使用 PowerShell 的示例
steps:
- shell: pwsh
env:
SUPER_SECRET: ${{ secrets.SuperSecret }}
run: |
example-command "$env:SUPER_SECRET"
使用 Cmd.exe 的示例
steps:
- shell: cmd
env:
SUPER_SECRET: ${{ secrets.SuperSecret }}
run: |
example-command "%SUPER_SECRET%"
密码的限制
您可以存储最多 1,000 个组织密钥 以及 100 个仓库密钥。
在仓库中创建的工作流程可以访问以下数量的密钥:
- 所有100个仓库密钥。
- 如果分配仓库访问超过 100 个组织密钥,则工作流程只能使用前 100 个组织密钥(按密钥名称字母顺序排序)。
密码大小限于 64 KB。 要使用大于 64 KB 的密码,可以将加密的密码存储在仓库中,并将解密短语在 GitHub 上存储为密码。 例如,在将文件检入您在 GitHub 上的仓库之前,可以使用 gpg
在本地对您的凭据加密。 更多信息请参阅“gpg manpage”。
警告:请注意,您的密码在操作运行时不会印出。 使用此解决方法时,GitHub 不会编写日志中印出的密码。
-
从终端运行以下命令,以使用
gpg
和 AES256 密码算法对my_secret.json
文件加密。$ gpg --symmetric --cipher-algo AES256 my_secret.json
-
将会提示您输入密码短语。 请记住该密码短语,因为需要在使用该密码短语作为值的 GitHub 上创建新密码。
-
创建包含密码短语的新密码。 例如,使用名称
LARGE_SECRET_PASSPHRASE
创建新密码,并将密码的值设为上一步所选的密码短语。 -
将加密的文件复制到仓库并提交。 在本例中,加密的文件是
my_secret.json.gpg
。 -
创建 shell 脚本对密码解密。 将此文件另存为
decrypt_secret.sh
。#!/bin/sh # Decrypt the file mkdir $HOME/secrets # --batch to prevent interactive command # --yes to assume "yes" for questions gpg --quiet --batch --yes --decrypt --passphrase="$LARGE_SECRET_PASSPHRASE" \ --output $HOME/secrets/my_secret.json my_secret.json.gpg
-
确保 shell 脚本在检入仓库之前可执行。
$ chmod +x decrypt_secret.sh $ git add decrypt_secret.sh $ git commit -m "Add new decryption script" $ git push
-
从工作流程使用
step
调用 shell 脚本并对密码解密。 要在工作流程运行的环境中创建仓库的副本,需要使用actions/checkout
操作。 使用与仓库根目录相关的run
命令引用 shell 脚本。name: Workflows with large secrets on: push jobs: my-job: name: My Job runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 - name: Decrypt large secret run: ./.github/scripts/decrypt_secret.sh env: LARGE_SECRET_PASSPHRASE: ${{ secrets.LARGE_SECRET_PASSPHRASE }} # This command is just an example to show your secret being printed # Ensure you remove any print statements of your secrets. GitHub does # not hide secrets that use this workaround. - name: Test printing your secret (Remove this step in production) run: cat $HOME/secrets/my_secret.json