Jenkins 脚本化管道环境变量
Jenkins scripted pipeline environment variable
我正在使用 Jenkins 脚本管道,自上次更新以来我收到了一个新警告,我想将其静音,这是一个 MWE:
// FROM https://jenkins.io/doc/pipeline/examples/#parallel-multiple-nodes
def labels = []
if (Host == 'true') {
labels.add('<host-slavename>')
}
def builders = [:]
for (x in labels) {
def label = x
builders[label] = {
ansiColor('xterm') {
node(label) {
stage('cleanup') {
deleteDir()
}
stage('build') {
def timestamp = sh (script: 'echo -n `(date +%Y%m%d%H%M%S)`', returnStdout: true)
withCredentials([string(credentialsId: 'TEST_PASSWORD', variable: 'PASSWORD')]){
sh """
logger \
TEST_1 "${PASSWORD}" TEST_2 \
TEST_3 $timestamp TEST_4
"""
sh '''
logger \
TEST_1 "$PASSWORD" TEST_2 \
TEST_3 $timestamp TEST_4
'''
}
}
}
}
}
}
parallel builders
第一个sh
块returns
Warning: A secret was passed to "sh" using Groovy String interpolation, which is insecure.
Affected argument(s) used the following variable(s): [PASSWORD]
See https://jenkins.io/redirect/groovy-string-interpolation for details.
+ logger TEST_1 **** TEST_2 TEST_3 20211029074911 TEST_4
它至少打印了时间戳和密码(它被审查了,但有效),但引发了警告。
第二个sh
块returns
+ logger TEST_1 **** TEST_2 TEST_3 TEST_4
所以没有警告,也没有时间戳。
有没有办法编写一个不显示警告但仍然显示时间戳的脚本化管道?
当您在 sh
的第一个 sh
步骤中使用 Groovy 字符串插值时会出现警告,原因在 Interpolation of Sensitive Environment Variables.
中有解释
这就是为什么您应该始终让 shell 解析环境变量,就像您在第二步 sh
中正确执行的那样。
要使用像 timestamp
这样的非环境变量,请将 sh
步骤包装在 withEnv
步骤中,将它们转换为环境变量:
withEnv(["timestamp=$timestamp"]) {
sh '''
logger \
TEST_1 "$PASSWORD" TEST_2 \
TEST_3 $timestamp TEST_4
'''
}
这将环境变量的范围限制在 withEnv
块。
或者,您可以将成员添加到 env
地图:
env.timestamp = sh (script: 'echo -n `(date +%Y%m%d%H%M%S)`', returnStdout: true)
sh '''
logger \
TEST_1 "$PASSWORD" TEST_2 \
TEST_3 $timestamp TEST_4
'''
我正在使用 Jenkins 脚本管道,自上次更新以来我收到了一个新警告,我想将其静音,这是一个 MWE:
// FROM https://jenkins.io/doc/pipeline/examples/#parallel-multiple-nodes
def labels = []
if (Host == 'true') {
labels.add('<host-slavename>')
}
def builders = [:]
for (x in labels) {
def label = x
builders[label] = {
ansiColor('xterm') {
node(label) {
stage('cleanup') {
deleteDir()
}
stage('build') {
def timestamp = sh (script: 'echo -n `(date +%Y%m%d%H%M%S)`', returnStdout: true)
withCredentials([string(credentialsId: 'TEST_PASSWORD', variable: 'PASSWORD')]){
sh """
logger \
TEST_1 "${PASSWORD}" TEST_2 \
TEST_3 $timestamp TEST_4
"""
sh '''
logger \
TEST_1 "$PASSWORD" TEST_2 \
TEST_3 $timestamp TEST_4
'''
}
}
}
}
}
}
parallel builders
第一个sh
块returns
Warning: A secret was passed to "sh" using Groovy String interpolation, which is insecure.
Affected argument(s) used the following variable(s): [PASSWORD]
See https://jenkins.io/redirect/groovy-string-interpolation for details.
+ logger TEST_1 **** TEST_2 TEST_3 20211029074911 TEST_4
它至少打印了时间戳和密码(它被审查了,但有效),但引发了警告。
第二个sh
块returns
+ logger TEST_1 **** TEST_2 TEST_3 TEST_4
所以没有警告,也没有时间戳。
有没有办法编写一个不显示警告但仍然显示时间戳的脚本化管道?
当您在 sh
的第一个 sh
步骤中使用 Groovy 字符串插值时会出现警告,原因在 Interpolation of Sensitive Environment Variables.
这就是为什么您应该始终让 shell 解析环境变量,就像您在第二步 sh
中正确执行的那样。
要使用像 timestamp
这样的非环境变量,请将 sh
步骤包装在 withEnv
步骤中,将它们转换为环境变量:
withEnv(["timestamp=$timestamp"]) {
sh '''
logger \
TEST_1 "$PASSWORD" TEST_2 \
TEST_3 $timestamp TEST_4
'''
}
这将环境变量的范围限制在 withEnv
块。
或者,您可以将成员添加到 env
地图:
env.timestamp = sh (script: 'echo -n `(date +%Y%m%d%H%M%S)`', returnStdout: true)
sh '''
logger \
TEST_1 "$PASSWORD" TEST_2 \
TEST_3 $timestamp TEST_4
'''