Jenkins Groovy将变量传递到并行运行

Jenkins Groovy将变量传递到并行运行,jenkins,groovy,jenkins-pipeline,Jenkins,Groovy,Jenkins Pipeline,在下面的Jenkins groovy脚本中,我很难理解如何将一些变量传递到并行运行中: #!/usr/bin/env groovy def call(version, project) { sh '''#!/bin/bash [[ ! -e ${WORKSPACE}/target/rpm/${project}/RPMS/ ]] && mkdir -p ${WORKSPACE}/target/rpm/${project}/RPMS/ (( $(ls ${

在下面的Jenkins groovy脚本中,我很难理解如何将一些变量传递到并行运行中:

#!/usr/bin/env groovy

def call(version, project) {

    sh '''#!/bin/bash
    [[ ! -e ${WORKSPACE}/target/rpm/${project}/RPMS/ ]] && mkdir -p ${WORKSPACE}/target/rpm/${project}/RPMS/
    (( $(ls ${WORKSPACE}/target/rpm/${project}/RPMS/*.rpm | wc -l) != 0 )) && rm ${WORKSPACE}/target/rpm/${project}/RPMS/*.rpm
    cd ${WORKSPACE}/scripts/fpm_requirements && bundle install && bundle show fpm
    '''

    parallel (
        "package foo": {
            sh '''#!/bin/bash
            export PATH=$PATH:~/bin:~/.gem/ruby/gems
            cd ${WORKSPACE}/scripts/fpm_requirements
            echo Project is ${project}
            echo Version is ${version}
            echo Iteration is $(echo ${version} | cut -d . -f 3)
            '''
        },
        "package bar": {
            sh '''#!/bin/bash
            export PATH=$PATH:~/bin:~/.gem/ruby/gems
            cd ${WORKSPACE}/scripts/fpm_requirements
            echo Project is ${project}
            echo Version is ${version}
            echo Iteration is $(echo ${version} | cut -d . -f 3)
            '''
        }
    )
}
因此,版本和项目变量在调用的第一个shell中填充,但是当它们到达两个并行运行时,它们不会被拉入

我尝试过几种不同的方法来传递它们,但没有一种有效


有人有任何相关的想法可以帮助您吗?

您应该将
'
更改为
'
。在Groovy中,单引号/三引号内的字符串不会触发字符串插值,但单引号/三引号内的字符串会触发字符串插值

因此,Shell脚本中的
${version}
${project}
将被视为Shell上下文中的变量,但实际上它们存在于Groovy上下文中

关于Groovy字符串的更多信息,请参见下面的选项2,它更适合您的问题

选项1)使用

注意:需要在
${WORKSPACE}
$(echo..)
之前退出
$
,因为我们希望插值后保留
$

选项2)使用
'
'
并将
版本
项目
注入Shell上下文的环境变量中

def call(version, project) {
    env.version=version
    env.project=project
    // Groovy env api used to inject groovy value into environment variable
    // so that you can refer groovy value later in shell script

    // still use ''' in following code, no need to change
    ...

您应该将
'
更改为
'
。在Groovy中,单引号/三引号内的字符串不会触发字符串插值,但单引号/三引号内的字符串会触发字符串插值

因此,Shell脚本中的
${version}
${project}
将被视为Shell上下文中的变量,但实际上它们存在于Groovy上下文中

关于Groovy字符串的更多信息,请参见下面的选项2,它更适合您的问题

选项1)使用

注意:需要在
${WORKSPACE}
$(echo..)
之前退出
$
,因为我们希望插值后保留
$

选项2)使用
'
'
并将
版本
项目
注入Shell上下文的环境变量中

def call(version, project) {
    env.version=version
    env.project=project
    // Groovy env api used to inject groovy value into environment variable
    // so that you can refer groovy value later in shell script

    // still use ''' in following code, no need to change
    ...

因此,我尝试了这个方法,但在项目/版本迭代中失败:“命令替换:第9行:意外标记附近的语法错误”表明版本变量为空。我忘了使用
“”“
在第二个shell脚本中,我更新了它。请再试一次。我注意到您使用的shell脚本复杂而冗长,因此我发布了选项2来解决您的问题,这更简单,只需再添加两行代码即可将groovy值注入:
version
project
到环境变量中,通过
env.xxx
添加env.version和env.project就是答案。然后脚本继续运行“fpm”,它抛出一些不同的错误,但这完美地回答了问题!因此,我尝试了这个方法,但在项目/版本迭代中失败:“命令替换:第9行:意外标记附近的语法错误”表明版本变量为空。我忘了使用
“”“
在第二个shell脚本中,我更新了它。请再试一次。我注意到您使用的shell脚本复杂而冗长,因此我发布了选项2来解决您的问题,这更简单,只需再添加两行代码即可将groovy值注入:
version
project
到环境变量中,通过
env.xxx
添加env.version和env.project就是答案。然后脚本继续运行“fpm”,它抛出一些不同的错误,但这完美地回答了问题!