我试图在我的Jenkins构建中屏蔽密码。
我一直在尝试the mask-passwords plugin。
但是,这似乎不适用于我的Jenkins管道脚本,因为如果我定义了密码PASSWD1
然后我在脚本中使用它${PASSWD1}
,我会得到:
No such DSL method '$' found among steps [addToClasspath, ansiColor, ansiblePlaybook, ....]
如果我使用env.PASSWD1
,则其值将解析为null
。
那么我应该如何在Jenkins管道脚本中屏蔽密码?
答案 0 :(得分:37)
最简单的方法是使用Credentials Plugin。
在那里,您可以定义不同类型的凭证,无论是单个密码(“秘密文本”),还是文件,还是用户名/密码组合。另外,其他插件可以提供其他类型的凭据。
创建凭证时(通过主Jenkins页面上的凭据链接),请确保设置“ID”。在下面的示例中,我称之为my-pass
。如果你没有设置它,它仍然可以工作,Jenkins会为你分配一个不透明的UUID。
在任何情况下,您都可以使用snippet generator轻松生成所需的语法。
withCredentials([string(credentialsId: 'my-pass', variable: 'PW1')]) {
echo "My password is '${PW1}'!"
}
这将使密码仅在此块中的给定变量中可用。如果您尝试打印密码,就像我在这里一样,它将被屏蔽。
答案 1 :(得分:15)
查看此问题https://issues.jenkins-ci.org/browse/JENKINS-27392,您应该可以执行以下操作:
node {
wrap([$class: 'MaskPasswordsBuildWrapper', varPasswordPairs: [[password: '123ADS', var: 'SECRET']]]) {
echo env['SECRET'];
}
}
但是,如果你查看该问题的最后评论它不起作用,似乎是一个错误。但是,如果你知道秘密并且不小心在日志中打印int,它就会被隐藏,如下所示:
node {
wrap([$class: 'MaskPasswordsBuildWrapper', varPasswordPairs: [[password: '123ADS', var: 'SECRET']]]) {
echo "123ADS";
}
}
这会产生:
[Pipeline] node
Running on master in workspace/pl
[Pipeline] {
[Pipeline] wrap
[Pipeline] {
[Pipeline] echo
********
[Pipeline] }
[Pipeline] // wrap
[Pipeline] }
[Pipeline] // node
[Pipeline] End of Pipeline
Finished: SUCCESS
关于您收到的错误No such DSL method '$' found among steps ...
,我只是猜测,但您可能直接在管道脚本中使用${VAR}
,${...}
仅与字符串中的字符串相关常规
编辑:
或者您可以使用Credentails Plugin
和管道步骤withCredentials
:
// Credential d389273c-03a0-45af-a847-166092b77bda is set to a string secret in Jenkins config.
node {
withCredentials([string(credentialsId: 'd389273c-03a0-45af-a847-166092b77bda', variable: 'SECRET')]) {
bat """
if ["${SECRET}"] == ["123ASD"] echo "Equal!"
""";
}
}
这导致:
[Pipeline] node
Running on master in workspace/pl
[Pipeline] {
[Pipeline] withCredentials
[Pipeline] {
[Pipeline] bat
[pl] Running batch script
workspace/pl>if ["****"] == ["****"] echo "Equal!"
"Equal!"
[Pipeline] }
[Pipeline] // withCredentials
[Pipeline] }
[Pipeline] // node
[Pipeline] End of Pipeline
Finished: SUCCESS
请注意,此插件将变量直接绑定到闭包,而不是将环境绑定到另一个,例如我可以直接使用变量SECRET
。