从Jenkins管道中的shell步骤访问Groovy变量

7rfyedvj  于 2022-11-21  发布在  Jenkins
关注(0)|答案(5)|浏览(209)

使用Pipeline plugin in Jenkins 2.x,如何访问在sh步骤中的阶段级或节点级定义的Groovy变量?
简单示例:

node {
    stage('Test Stage') {
        some_var = 'Hello World' // this is Groovy
        echo some_var // printing via Groovy works
        sh 'echo $some_var' // printing in shell does not work
    }
}

在Jenkins输出页面上提供以下内容:

[Pipeline] {
[Pipeline] stage
[Pipeline] { (Test Stage)
[Pipeline] echo
Hello World
[Pipeline] sh
[test] Running shell script
+ echo

[Pipeline] }
[Pipeline] // stage
[Pipeline] }
[Pipeline] // node
[Pipeline] End of Pipeline
Finished: SUCCESS

可以看到,sh步骤中的echo打印了一个空字符串。
解决方法是通过

env.some_var = 'Hello World'

并通过

sh 'echo ${env.some_var}'

但是,这种滥用环境的行为对这项任务的影响范围很大。

v09wglhw

v09wglhw1#

若要使用可模板化的字符串(其中变量被替换为字符串),请使用双引号。

sh "echo $some_var"
pdsfdshx

pdsfdshx2#

我添加了@佩德罗的评论作为回答,因为我认为这很重要。
对于sh env变量,我们必须使用

sh "echo \$some_var"
mhd8tkvw

mhd8tkvw3#

如果需要bash脚本,则需要执行如下操作:
在全局或局部(函数)级别设置此变量,sh脚本可以从这些级别访问此变量:

def stageOneWorkSpace = "/path/test1"
def stageTwoWorkSpace = "/path/test2"

在shell脚本中调用它们,如下所示

sh '''
echo ''' +stageOneWorkSpace+ '''
echo ''' +stageTwoWorkSpace+ '''
cp -r ''' +stageOneWorkSpace+'''/qa/folder1/* ''' +stageOneWorkSpace+'''/qa/folder2
'''

确保sh以三个引号开始和结束,如'''

uyhoqukh

uyhoqukh4#

我想在这个讨论中加入另一个场景。我在同一个脚本中使用了shell环境变量和groovy变量。

format='html'
    for file in *.txt; 
        do mv  -- "\$file" "\${file%.txt}.$format";
    done

因此,在这里,我所做的是只对shell环境变量使用$,而对groovy变量使用$。

9fkzdhlc

9fkzdhlc5#

这是对@Dave Bacher答案的扩展。我在Groovy文件中运行多个shell命令,并希望将一个shell命令的输出作为groovy变量用于下一个命令。在shell命令中使用双引号,groovy将变量从一个命令传递到另一个命令,但使用单引号则无效,它返回null。
因此,请在双引号中使用如下shell命令:sh "echo ${FOLDER_NAME}"

FOLDER_NAME = sh(script: $/
    awk -F '=' '/CODE_COVERAGE_FOLDER/ {gsub("\"","");print$2}' ${WORKSPACE}/test.cfg
  /$, returnStdout: true).trim()

echo "Folder: ${FOLDER_NAME}" // print folder name in groovy console

sh "mkdir -p ${WORKSPACE}/${FOLDER_NAME} && chmod 777 ${WORKSPACE}/${FOLDER_NAME}"

相关问题