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
'''