特拉维斯CI:如何使我的密码失效以使“特拉维斯加密”正常工作?

时间:2019-02-05 15:52:44

标签: bash escaping travis-ci

travis encryption docs提到我必须先对其密码进行bash转义,然后再对其进行加密:

  

有关转义某些符号的说明

     

使用travis加密对敏感数据进行加密时,请务必注意,它将作为bash语句处理。这意味着您要加密的机密在bash解析时不会引起错误。数据不完整会导致bash将错误声明转储到日志中,该日志包含部分敏感数据。

     

因此,您需要转义特殊字符,例如大括号,括号,反斜杠和竖线符号。例如,当您要将字符串6&a(5!1Ab\分配给FOO时,需要执行:

     

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

bash的答案似乎与printf "%q"有关,但是要弄清楚如何将printftravis cli连接起来仍然很复杂。

travis encrypt执行应做的重击一线是什么?

我的意思是,我想粘贴我的变量名及其值,并确保将其正确加密,而不必担心bash转义。假设我想将字符串6&a(5!1Ab\分配给变量FOO,我们可以继续上面的示例。

在我们讨论时,travis env set对应的单线是什么?这将有助于那些解决data too large错误的人。

3 个答案:

答案 0 :(得分:3)

基于Java encrypt AES, PHP decrypt AES

read -r && travis encrypt "$(printf %q "$REPLY")"

然后粘贴您的变量及其值:

FOO=6&a(5!1Ab\

答案 1 :(得分:2)

  

travis encrypt执行应做的重击一线是什么?

     

我的意思是,我想粘贴我的变量名及其值,并确保将其正确加密,而不必担心bash转义。

这通常是不可能的,因为如果要将值插入命令行,则必须使用某种形式的引号,因此必须特别处理至少一个引号字符(如果允许在值中出现)并且不能简单地处理粘贴这就是如果在值中出现'的情况下,将值封闭在' '中的原因(并且肯定会允许在密码中使用')。因此,仅当 单行 的要求被放弃并且该值作为输入提供时,才能满足粘贴该值的要求。
然后,由于travis encrypt命令需要对参数进行额外的引用(也许是因为,如chepner认为的那样,调用了eval),因此我们可以在printf %q中提供此引用,例如G。

read -r
6&a(5!1Ab\
travis encrypt "$(printf %q "FOO=$REPLY")"
(要粘贴的粗线)。

  

如何将VAR=VALUE放在read语句中以将所有内容放在一起? read -r,粘贴FOO=6&a(5!1Ab\ ,最后粘贴travis encrypt "$(printf %q "$REPLY")"

当然也可以。

  

此外,真的没有办法将read -r的结果传递给travis encrypt吗?

如果您的意思是管道,那么不能,就没有办法将某些东西管道传递给仅需要参数的命令。但是,如果您只是想知道我们是否可以连接命令,那么可以,我们也可以编写e。 G。

read -r; travis encrypt "$(printf %q "$REPLY")"
FOO=6&a(5!1Ab\

答案 2 :(得分:1)

仅对字符串进行base64并在构建中对其进行解码要容易得多。使用travis中的转义功能可以节省所有麻烦事。

Travis和任何其他CI / CD服务都允许秘密存储秘密环境变量,以供每次构建使用。在设置项目构建时,添加环境变量选项。要回显cli中用于base64的密码,您仍然需要转义该字符串,因为该字符串需要由bash评估。使用您的密码创建一个临时文件。然后:

cat /tmp/secret | base64 -w 0

复制字符串并将其粘贴到travis ci env var设置的值字段中

.travis.yaml文件中

只需简单地检索机密:

echo $SECRET | base64 -d

虽然可能会有一些极端情况,但这应该可以解决大多数用例。