Travis-CI加密变量
前言
原文: Encryption keys
这里有单独的关于加密文件的文档。
仓库Repository
中的.travis.yml
文件可以具有“加密值”,例如环境变量,通知设置和部署api
的key
。这些加密后的值可以由任何人添加,但只能由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 | # 译者追加 |
然后, 你可以使用encrypt
命令去加密数据( 这个例子假设你的工作目录pwd
是在仓库Repository
下面, 如果不是, 请追加-r 用户名/项目名
)
1 | # 译者追加 |
这将输出一个字符串,如下所示:
1 | # 译者追加 |
现在你可以把它放在.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 | # 译者追加 |
关于转义某些符号的注意事项
当你使用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 | notifications: |
举个例子, 比如rooms: somedomain:abcxyz@14
我们加密这个字符串somedomain:abcxyz@14
1 | $ travis encrypt somedomain:abcxyz@14 |
会输出以下内容
1 | Please add the following to your .travis.yml file: |
我们将其加入到.travis.yml
文件中
1 | notifications: |
这样就完成了
详细讨论
安全变量系统在配置YAML
中采用{ 'secure' => 'encrypted string' }
形式的值,并将其替换为解密后的字符串。
所以会发生如下变化
1 | notifications: |
1 | notifications: |
如果是环境变量, 则会发生如下变化
1 | 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
来检查), 如果您重命名您的仓库或将您的仓库移动到另一个用户/组织,则可能需要对其进行更改。