如何将参数传递给 Jenkins DSL 内联 shell 脚本?

How do I pass arguments to a Jenkins DSL inline shell script?

我有一个 Jenkins 步骤需要 运行 内联 shell 脚本。该脚本需要几个参数,这些参数包含在配置中。这样做的正确方法是什么? shell 脚本确实需要内联并且不能在单独的文件中。 我已经尝试过类似的方法,但它不起作用。

stage('Build Image') {              
    steps {
        script {
            docker.withRegistry('.......', 'Gitlab') {
                CHECK_SHA_RESULT = sh '''
                    ARG1=
                    ARG2=
                    // Do other stuff and output a result
                ''' ${config.var1} ${config.var2}
            }
        }
    }
}

传递值有两种选择:

  1. 字符串插值
  2. 展开环境变量

字符串插值

您可以通过在 Groovy 个字符串中扩展变量来传递值:

sh """\
    ARG1=${config.var1}
    ARG2=${config.var2}
    echo $ARG1
    echo $ARG2
"""

(使用双引号而不是单引号)

你一定要小心,因为值先展开,然后执行代码。这意味着您可以注入代码。示例:

  • 配置文件:
    var1=text; cat /etc/passwd
    var2=hello
    
  • 执行代码:
    ARG1=text; cat /etc/passwd
    ARG2=hello
    echo $ARG1
    echo $ARG2
    

环境变量

您可以使用环境变量注入值。它更安全,因为值由 shell 进程扩展(防止命令注入)。

withEnv([
    "ARG1=${config.var1}",
    "ARG2=${config.var2}"
]) {
    sh '''\
        echo $ARG1
        echo $ARG2
    '''
}

(sh 脚本使用单引号定义)

示例:

  • 配置文件:
    var1=text; cat /etc/passwd
    var2=hello
    
  • 可用的环境变量:
    • ARG1 = text; cat /etc/passwd
    • ARG2 = hello
  • 执行代码:
    echo $ARG1
    echo $ARG2