我有一个基于Jenkinsfile
的参数化Jenkins管道。一些参数包含敏感的密码,我不想出现在作业的构建日志中。
所以我的问题是:我可以在Jenkinsfile
内以某种方式注册一个字符串,然后将其替换为**********
-每当它出现在日志输出中吗?
我知道withCredentials
步骤,但是我不能使用它,因为凭据没有存储在Jenkins凭据存储中(而是在运行时作为参数提供)。
我在https://stackoverflow.com/a/42372859/1549950处找到了这个答案,并尝试了如下操作:
def secrets = [
[password: firstPassword, var: 'SECRET'],
[password: secondPassword, var: 'SECRET'],
[password: thirdPassword, var: 'SECRET']
]
node() {
wrap([$class: 'MaskPasswordsBuildWrapper', varPasswordPairs: secrets]) {
// my stages containing steps...
}
}
其中firstPassword
,secondPassword
,thirdPassword
是包含我的密码的变量。但是我仍然得到firstPassword
...的内容...在日志输出中显示为纯文本。
我在Jenkins上安装了Mask Password plugin,版本为2.12.0。
基本上,我正在搜索以下内容:https://issues.jenkins-ci.org/browse/JENKINS-27486-票证已解决,但未提供最终实现的示例摘录。
答案 0 :(得分:1)
我认为您正在寻找JENKINS-36007?
答案 1 :(得分:1)
您可以看看https://github.com/jenkinsci/log-file-filter-plugin
此插件允许通过正则表达式过滤Jenkins的控制台输出。如果某些模式匹配,则匹配的字符串将替换为可为配置中的每个模式指定的字符串。
当前,该插件不支持从jenkins文件添加过滤器模式,而仅支持从Jenkins全局设置添加过滤器模式。
答案 2 :(得分:1)
实际上我不知道为什么这首先没有奏效,但这是解决问题的方法。
使用要隐藏的秘密定义数组,如下所示:
def splunkPassword = 'verySecretPa55w0rd'
def basicAuthPassword = 'my8asicAuthPa55w0rd'
def getSecrets() {
[
[password: splunkPassword, var: 'SECRET'],
[password: basicAuthPassword, var: 'SECRET']
]
}
免责声明:我不知道SECRET
值是否具有重要作用,请从某些代码段复制并粘贴它,然后按预期方式工作:)
之后,您可以将所有呼叫包装在脚本化管道中,如下所示:
node {
wrap([$class: 'MaskPasswordsBuildWrapper', varPasswordPairs: getSecrets()]) {
stage 'First Stage' { ... }
stage 'Second Stage' { ... }
}
}
getSecrets()
数组中提供的所有密码将在构建输出中被屏蔽,如下所示:
SPLUNK_PASSWORD: ********
BASIC_AUTH_ADMIN_PASSWORD: ********
答案 3 :(得分:0)
高度残酷的解决方法。
编写一个简单的脚本,例如bash,然后将参数凭据回显到任意格式的文件中,直到您的回显方法为止。
例如基本的shell脚本:
$ cat executor/obfuscate.sh
#!/bin/bash
echo "PASSWORD: ${AWX_PW}" > ./executor/credential.yml
然后在您的管道中:
stages {
stage('Placing') {
steps {
**sh './executor/obfuscate.sh'** }
[...]
< something reading credential.yml>
}
}
结果,控制台中什么也没显示:
答案 4 :(得分:0)
我发现了一种变通办法,虽然有点破解,但似乎效果很好。诀窍是使用withCredentials
,但使用参数覆盖变量。
下面是一个示例,该示例使用environment指令的credentials()
帮助方法填充环境变量,然后覆盖自动定义(并在日志中屏蔽)的两个其他环境变量。
首先,创建一个虚拟Username with password
凭据。 Username
和Password
的值无关紧要,我们只需要一个凭据即可用作占位符。输入ID,例如dummy-credentials
。
然后使用虚拟凭据定义一个环境变量,并使用参数(在此示例中为MYUSERNAME
和MYPASSWORD
)覆盖自动定义的变量:
environment {
MY_CREDS = credentials('dummy-credentials')
MY_CREDS_USR = "${params.MYUSERNAME}"
MY_CREDS_PSW = "${params.MYPASSWORD}"
}
在需要引用机密信息的地方使用MY_CREDS_USR
和MY_CREDS_PSW
环境变量。它们的内容将在控制台日志中被屏蔽。
sh '''
echo "Username: ${MY_CREDS_USR}"
echo "Password: ${MY_CREDS_PSW}"
'''