Travis-CI加密变量

前言

原文: Encryption keys

这里有单独的关于加密文件的文档。

仓库Repository中的.travis.yml文件可以具有“加密值”,例如环境变量,通知设置和部署apikey。这些加密后的值可以由任何人添加,但只能由Travis CI解密读取。仓库Repository拥有者不保留任何加密key

请注意,加密的环境变量不适用于pull requests

加密方案

Travis CI 使用非对称密码学. 对于每个注册过的仓库Repository, Travis CI 会生成一对RSA密钥对.
Travis CI 拥有私钥, 但是可以让每个人都可以使用该公钥.

例如, GitHub仓库foo/bar 的公钥可以在https://api.travis-ci.org/repos/foo/bar/key获取. 任何人都可以在任何仓库Repository运行travis encrypt, 使用公钥来加密参数.
因此, foo/bar加密后的值可以被Travis CI使用foo/bar私钥解密, 但这些加密后的值不能被任何人解密, 即使是加密这些值的人, 或者是仓库的拥有者, 任何人都不能解密.

用法

使用公钥加密某些东西的最简单方法是使用Travis CLI工具。 这个工具是用Ruby编写的,并以gem的形式发布。 首先,你需要安装gem:

1
2
3
4
5
6
# 译者追加
$ yum install -y gcc ruby ruby-devel # 安装gcc和ruby环境
$ gem sources --add https://gems.ruby-china.org/ --remove https://rubygems.org/ # 改为国内gem源

# 原文
$ gem install travis

然后, 你可以使用encrypt命令去加密数据( 这个例子假设你的工作目录pwd是在仓库Repository下面, 如果不是, 请追加-r 用户名/项目名 )

1
2
3
4
5
# 译者追加
$ travis encrypt 变量名="待加密的值"

# 原文
$ travis encrypt SOMEVAR="secretvalue"

这将输出一个字符串,如下所示:

1
2
3
4
5
# 译者追加
secure: "加密后的值"

# 原文
secure: ".... encrypted data ...."

现在你可以把它放在.travis.yml文件中.
你也可以跳过上面的步骤, 直接追加参数--add, 自动添加到.travis.yml文件中.

1
$ travis encrypt SOMEVAR="secretvalue" --add

请注意,环境变量的名称及其值都由travis encrypt生成的字符串进行编码。您必须将生成的secure: ".... encrypted data ...."添加到您的.travis.yml中。这样您的程序就可以使用环境变量SOMEVAR

您可以使用多个加密变量, 添加到您的.travis.yml文件中。它们都可用于您的程序。

加密后的值可用于secure environment variables in the build matrix 和notifications.

1
2
3
4
5
6
# 译者追加
# .travis.yml
env:
global:
- secure: 执行travis encrypt得到的加密值
- secure: 可以存在多个加密变量

关于转义某些符号的注意事项

当你使用travis encrypt去加密敏感数据时, 请注意travis encrypt将作为bash语句处理.
这意味着你正在加密的数据不能出现bash语法错误.
不完整的数据会导致bash将错误statement 语句存储到日志文件中, 这个日志文件会包含你的敏感数据. 并且是明文显示.

所以你需要对特殊字符进行转义, 就像{}()\|之类的特殊字符.

例如,当您想要将字符串6&a(5!1Ab\分配到FOO变量中,您需要执行:

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

travis加密了字符串FOO=6\&a\(5\!1Ab\\,然后bash使用加密后的字符串在构建环境中evaluate.
你也可以这样做, 这和上面的加密语句等价.

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

Notifications 例子

我们想要添加一个campfire notifications.travis.yml文件中, 但是我们不想暴露我们的API token.
应该在.travis.yml中使用以下格式:

1
2
3
notifications:
campfire:
rooms: [subdomain]:[api token]@[room id]

举个例子, 比如rooms: somedomain:abcxyz@14
我们加密这个字符串somedomain:abcxyz@14

1
$ travis encrypt somedomain:abcxyz@14

会输出以下内容

1
2
Please add the following to your .travis.yml file:
secure: "ABC5OwLpwB7L6Ca...."

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

1
2
3
4
notifications:
campfire:
rooms:
secure: "ABC5OwLpwB7L6Ca...."

这样就完成了

详细讨论

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

所以会发生如下变化

1
2
3
4
5
6
7
8
notifications:
campfire:
rooms:
secure: "加密后的值"
# 变成
notifications:
campfire:
rooms: "解密后的值"
1
2
3
4
5
6
7
8
9
notifications:
campfire:
rooms:
- secure: "加密后的值"
# 变成
notifications:
campfire:
rooms:
- "解密后的值"

如果是环境变量, 则会发生如下变化

1
2
3
4
5
env:
- secure: "加密后的值"
# 变成
env:
- "解密后的值"

为您的仓库Repository获取公钥

你可以通过Travis API获取公钥, 使用/repos/用户名/仓库名/key或者/repos/:id/key来获取公钥

1
https://api.travis-ci.org/repos/travis-ci/travis-ci/key

你也可以使用travis pubkey命令行获取公钥.
如果你不在项目文件夹下, 则使用travis pubkey -r 用户名/项目名获取指定项目的公钥.

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