在Jenkins管道脚本中隐藏密码

oct*_*ian 25 jenkins jenkins-pipeline

我正试图在我的Jenkins构建中屏蔽密码.

我一直在尝试使用mask-passwords插件.

但是,这似乎不适用于我的Jenkins管道脚本,因为如果我定义密码PASSWD1然后我在脚本中使用它${PASSWD1},我会得到:

No such DSL method '$' found among steps [addToClasspath, ansiColor, ansiblePlaybook, ....]
Run Code Online (Sandbox Code Playgroud)

如果我使用env.PASSWD1,那么它的值将被解析为null.

那么我该如何在Jenkins管道脚本中屏蔽密码呢?

Chr*_*Orr 44

最简单的方法是使用Credentials插件.

在那里,您可以定义不同类型的凭证,无论是单个密码("秘密文本"),还是文件,还是用户名/密码组合.此外,其他插件可以提供其他类型的凭据.

创建凭证时(通过主Jenkins页面上的凭据链接),请确保设置"ID".在下面的例子中,我称之为my-pass.如果你没有设置它,它仍然可以工作,Jenkins将为你分配一个不透明的UUID.

无论如何,您可以使用代码段生成器轻松生成所需的语法.

withCredentials([string(credentialsId: 'my-pass', variable: 'PW1')]) {
    echo "My password is '${PW1}'!"
}
Run Code Online (Sandbox Code Playgroud)

这将使密码仅在此块中的给定变量中可用.如果您尝试打印密码,就像我在这里一样,它将被屏蔽.


Jon*_*n S 15

看看这个问题,https://issues.jenkins-ci.org/browse/JENKINS-27392,您应该可以执行以下操作:

node {
    wrap([$class: 'MaskPasswordsBuildWrapper', varPasswordPairs: [[password: '123ADS', var: 'SECRET']]]) {
        echo env['SECRET'];
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,如果您查看该问题中的最后一条评论它不起作用,似乎是一个错误.但是,如果你知道秘密并且不小心在日志中打印int,它就会被隐藏,如下所示:

node {
        wrap([$class: 'MaskPasswordsBuildWrapper', varPasswordPairs: [[password: '123ADS', var: 'SECRET']]]) {
        echo "123ADS";
    }
}
Run Code Online (Sandbox Code Playgroud)

这会产生:

[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
Run Code Online (Sandbox Code Playgroud)

关于你得到的错误No such DSL method '$' found among steps ...,我只是猜测,但你可能${VAR}直接在管道脚本中使用,${...}只与groovy中的字符串相关.

编辑:或者您可以使用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!"
""";
    }
}
Run Code Online (Sandbox Code Playgroud)

这导致:

[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
Run Code Online (Sandbox Code Playgroud)

请注意,此插件将变量直接绑定到闭包而不是另一个绑定环境,例如,我可以SECRET直接使用变量.

  • 考虑这样的情况:您有密码并且需要通过curl 将其作为base64 发送。那么 Jenkins 不会将 base64 视为密码,也不会隐藏其值。或者构建代理通过环境变量注入密码的情况。也许是轮换,每 30 分钟更换一次。您也不希望该内容出现在日志中。需要有一种方法告诉 Jenkins 某个随机字符串是需要隐藏在日志中的密码。 (4认同)