加密密钥

我们有关于加密文件的单独文档。

存储库的.travis.yml文件可以包含“加密值”,例如环境变量、通知设置和部署 API 密钥。这些加密值可以由任何人添加,但只有 Travis CI 可以读取。存储库所有者不会保留任何密钥材料。

存储库设置 - 分支 #

从 2022 年 3 月 1 日起,可以使用 Git 分支存储库的存储库安全设置。

对于 Git 存储库,您可以管理每个存储库在 Travis CI 中处理环境变量自定义 SSH 密钥的方式,当构建作为从分支存储库提交拉取请求的结果触发时。为此目的提供了两个设置,允许您自定义安全与协作设置。

  • **基础存储库** - 由其他人分支的 Git 存储库
  • **分支**或**分支存储库** - 从**基础存储库**分支的任何 Git 存储库
  • **PR** - 拉取请求(例如在 GitHub、BitBucket、GitLab 中)或合并请求(在 Assembla 中)

请注意:在**2022 年 3 月 1 日**之前在Travis CI中激活的存储库将Share encrypted environment variables with forks (PRs)设置为关闭。如有必要,请验证您的协作模型(尤其是在公共存储库中)。Share SSH keys with forks (PRs)将为私有存储库设置为开启,以免破坏过多的协作设置。对于在Travis CI中激活的任何存储库,存储库设置将默认设置为关闭,时间为**2022 年 3 月 1 日**之后。对于在 2022 年 3 月 1 日之后在 Travis CI 中激活的存储库,您可能需要根据您的协作模型考虑更改默认设置。

与分支共享加密环境变量 (PRs) #

此设置决定是否将基础存储库的加密环境变量与分支存储库中的分支到基础拉取请求共享(分支存储库将更改合并到基础存储库)。

在基础到基础拉取请求的情况下(更改从**基础存储库**合并到自身),加密环境变量始终可用。这允许协作者使用存储库加密环境变量提交拉取请求,并保留已配置的现有检查,例如在 GitHub 中。

在分支到分支拉取请求的情况下(更改从**分支存储库**合并到自身),**基础存储库**的加密环境变量将永远不可用。因此,需要直接在**分支存储库**中替换或绕过它们。

在分支到基础拉取请求的情况下

  • 如果此设置开启,则加密环境变量将可用于分支存储库,这意味着**分支存储库**中的构建将能够访问**基础存储库**的加密环境变量。这可能是一种安全性较低的方法,但允许使用分支和拉取请求 (PRs) 进行协作。
  • 如果此设置关闭且构建依赖于任何加密环境变量,则来自**分支**到**基础存储库**的 PR 将失败。这可以通过限制从**分支**访问它们来保护您的**基础存储库**加密环境变量。

请注意:在travis-ci.com环境中,自定义 SSH 密钥仅适用于私有存储库。阅读有关自定义 SSH 密钥的更多信息。

从 2021 年 6 月起,travis-ci.org 已禁用,因此不再受支持。请使用 travis-ci.com。

加密方案 #

Travis CI 使用非对称加密。对于每个注册的存储库,Travis CI 都生成一个 RSA 密钥对。Travis CI 保留私钥的私密性,但会使存储库的公钥可供有权访问存储库的人员使用。

一旦公钥可用,任何人都(包括那些没有推送权限访问存储库的人)都可以加密数据,这些数据只能由 Travis CI 使用相应的私钥解密。

获取公钥 #

获取公钥的方法取决于目标存储库所在的存储位置以及您使用的 API 版本。

此外,根据存储库的位置和可见性以及使用的 API 版本,请求可能需要通过Authorization: token标头进行授权。

授权标头要求
存储库可见性和位置 API 服务器 API v1 API v3
/repos/OWNER/REPO/key /v3/repo/OWNER%2fREPO/key_pair/generated
在 .com 上公开 https://api.travis-ci.com

在 .com 上私有 https://api.travis-ci.com

请注意,上面的 API v3 端点显示存储库名称为%2f

如果需要Authorization: token标头,您可以通过访问帐户页面获取令牌

示例 #

以下是一些获取公钥的curl命令示例。

  1. 使用 API v1 的 travis-ci.com 上的公共存储库

    curl https://api.travis-ci.com/repos/travis-ci/travis-build/key
    
  2. 使用 API v3 的 travis-ci.com 上的公共存储库

    curl -H "Authorization: token **TOKEN**" https://api.travis-ci.com/v3/repo/travis-ci%2ftravis-build/key_pair/generated
    
  3. 使用 API v3 的 travis-ci.com 上的私有存储库

    curl -H "Authorization: token **TOKEN**" https://api.travis-ci.com/v3/repo/OWNER%2fREPO/key_pair/generated
    

用法 #

使用公钥加密内容最简单的方法是使用 Travis CLI。此工具是用 Ruby 编写的,并作为 gem 发布。首先,您需要安装 gem

gem install travis

如果您使用的是travis-ci.com,则需要先登录

travis login --pro

然后,您可以使用encrypt命令加密数据(此示例假设您在项目目录中运行命令。如果不是,请添加-r owner/project

travis encrypt SOMEVAR="secretvalue"

或者,如果您使用的是travis-ci.com,则需要将--pro添加到 CLI

travis encrypt --pro SOMEVAR="secretvalue"

这将输出一个类似于以下内容的字符串

secure: ".... encrypted data ...."

现在您可以将其放在.travis.yml文件中。

您也可以跳过上述步骤,并通过运行以下命令自动添加它

travis encrypt SOMEVAR="secretvalue" --add

请注意,环境变量的名称和值都编码在“travis encrypt”生成的字符串中。您必须使用密钥“secure”(在“env”密钥下方)将条目添加到您的 .travis.yml 中。这使得环境变量 SOMEVAR 具有值“secretvalue”可供您的程序使用。

您可以使用密钥“secure”将多个条目添加到您的 .travis.yml 中。它们都将可供您的程序使用。

加密值可用于构建矩阵中的安全环境变量通知

关于转义某些符号的说明 #

当您使用travis encrypt加密敏感数据时,请注意它将被视为bash语句。这意味着您加密的密钥在bash解析时不应导致错误。不完整的数据会导致bash将错误语句转储到日志中,其中包含部分敏感数据。

因此,您需要转义特殊字符,例如大括号、圆括号、反斜杠和管道符号。

例如,您会将ma&w!doc输入为ma\&w\!doc

要将字符串6&a(5!1Ab\赋值给FOO

travis encrypt "FOO=6\\&a\\(5\\!1Ab\\\\"

travis加密字符串FOO=6\&a\(5\!1Ab\\,然后bash在构建环境中使用它进行评估。

等效地,您可以执行以下操作

travis encrypt 'FOO=6\&a\(5\!1Ab\\'

通知示例 #

我们希望将Campfire通知添加到我们的.travis.yml文件中,但我们不想公开我们的API令牌。

条目应采用此格式

notifications:
  campfire:
    rooms: "[subdomain]:[api token]@[room id]"

对我们来说,那就是somedomain:abcxyz@14。

我们加密此字符串

travis encrypt somedomain:abcxyz@14

生成类似以下内容

Please add the following to your .travis.yml file:

  secure: "ABC5OwLpwB7L6Ca...."

我们将其添加到.travis.yml文件中

notifications:
  campfire:
    rooms:
      secure: "ABC5OwLpwB7L6Ca...."

我们完成了。

详细讨论 #

安全变量系统在(解析后的YAML)配置中采用{ 'secure' => 'encrypted string' }形式的值,并将其替换为解密后的字符串。

所以

notifications:
  campfire:
    rooms:
      secure: "encrypted string"

变成

notifications:
  campfire:
    rooms: "decrypted string"

notifications:
  campfire:
    rooms:
      - secure: "encrypted string"

变成

notifications:
  campfire:
    rooms:
      - "decrypted string"

在安全环境变量的情况下

env:
  - secure: "encrypted string"

变成

env:
  - "decrypted string"

获取您的存储库的公钥 #

您可以使用Travis API获取公钥,使用/repos/:owner/:name/key/repos/:id/key端点,例如

https://api.travis-ci.com/repos/travis-ci/travis-ci/key

您还可以使用travis工具检索该密钥

travis pubkey

或者,如果您不在项目目录中

travis pubkey -r owner/project

请注意,travis在您的项目中使用travis.slug来确定端点(如果存在,请使用git config --local travis.slug检查),如果您重命名存储库或将存储库移动到另一个用户/组织,您可能需要更改它。