【问题标题】:Jenkins scripted pipeline environment variableJenkins 脚本化管道环境变量
【发布时间】:2021-12-14 06:40:31
【问题描述】:

我正在使用 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 块返回

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 块返回

+ logger TEST_1 **** TEST_2 TEST_3 TEST_4

所以没有警告,也没有时间戳。

有没有办法编写一个不显示警告但仍显示时间戳的脚本化管道?

【问题讨论】:

    标签: jenkins environment-variables jenkins-pipeline pipeline


    【解决方案1】:

    当您在第一个sh 步骤(如"${PASSWORD}")中使用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
    '''
    

    【讨论】:

    • 第一个想法“withEnv”对我很有用,谢谢。但是我如何访问 sh 中的 env.timestamp 呢? env.timestamp = sh (script: 'echo -n (date +%Y%m%d%H%M%S)', returnStdout: true) sh ''' logger TEST_1 "$PASSWORD" TEST_2 TEST_3 $env.timestamp TEST_4 ''' 似乎不起作用。
    • @Someone2 与withEnv 相同。我添加了用法示例。
    猜你喜欢
    • 2021-12-17
    • 2017-08-09
    • 2019-09-24
    • 1970-01-01
    • 2018-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多