在Jenkins管道脚本中隐藏密码

zphenhs4  于 12个月前  发布在  Jenkins
关注(0)|答案(3)|浏览(188)

我想在我的Jenkins构建中隐藏一个密码。
我一直在尝试mask-passwords插件。
然而,这似乎不适用于我的Jenkins管道脚本,因为如果我定义密码PASSWD1,然后在脚本中使用它,就像这样${PASSWD1},我得到:

No such DSL method '$' found among steps [addToClasspath, ansiColor, ansiblePlaybook, ....]

字符串
如果我使用env.PASSWD1,那么它的值将被解析为null
那么我应该如何在Jenkins管道脚本中屏蔽密码呢?

nue99wik

nue99wik1#

最简单的方法就是使用Credentials Plugin
在这里你可以定义不同类型的凭证,无论是一个密码(“密文”),一个文件,还是一个用户名/密码的组合。
当你创建一个凭证(通过Jenkins主页上的Credentials链接)时,请确保你设置了一个“ID”。在下面的例子中,我将其命名为my-pass。如果你不设置它,它仍然可以工作,Jenkins将为你分配一个不透明的UUID。
在任何情况下,您都可以使用代码段生成器轻松地生成所需的语法。

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

字符串
这将使密码只在这个块中的给定变量中可用。如果你试图打印密码,就像我在这里做的那样,它将被屏蔽。

agxfikkp

agxfikkp2#

看看这个问题,https://issues.jenkins-ci.org/browse/JENKINS-27392,你应该能够做到以下几点:

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

字符串
然而,如果你看一下这个问题的最后一条评论,它不起作用,似乎是一个bug。然而,如果你知道这个秘密,不小心在日志中打印了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}${...}只与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!"
""";
    }
}


这将导致:

[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

nbewdwxp

nbewdwxp3#

def pass="123456"
maskPasswords(varPasswordPairs: [[password: "${pass}"]]){
  sh "echo password is: ${pass}"
}

字符串
产出:

password is: **********


使用var:

def pass="123456"
maskPasswords(varPasswordPairs: [[var: 'pass']]){
  sh "echo password is: ${pass}"
}

相关问题