将变量传递给jenkins管道作业中的bash脚本

Nab*_*ane 7 linux parameters bash shell jenkins

我有一个Jenkins管道作业,我在其中使用名为setup.sh的bash脚本配置我的环境,如下所示:

#!/bin/bash
export ARCH=$1
echo "architecture = " ${ARCH}
Run Code Online (Sandbox Code Playgroud)

在Jenkins管道脚本中,使用以下命令调用setup.sh脚本:

def lib_arch='linux-ubuntu-14.04-x86_64-gcc4.8.4'
sh ". /opt/setup.sh ${lib_arch}"
Run Code Online (Sandbox Code Playgroud)

不幸的是,似乎NO变量传递给setup.sh脚本,echo $ {ARCH}返回一个空字符串!我尝试改为:sh"source /opt/setup.sh $ {lib_arch}",这也失败了"源未找到"消息.我也尝试将脚本的第一行更改为

#!/bin/sh
Run Code Online (Sandbox Code Playgroud)

但它没有帮助.那么如何在Jenkins管道脚本中将参数传递给我的bash脚本呢?谢谢你的帮助.

更新:Bert Jan Schrijve在此主题中提出了一个解决方法(见下文):

sh "bash -c \" source /opt/setup.sh ${lib_arch}\"" 
Run Code Online (Sandbox Code Playgroud)

Ton*_*ony 13

如果您使用带有三个撇号的多行 shell 脚本,则必须使用以下语法:

sh '''
 echo '''+varToPrint+'''
 other commands...
'''
Run Code Online (Sandbox Code Playgroud)

(来自https://medium.com/devopslinks/a-hacky-hackers-guide-to-hacking-together-jenkins-scripted-pipelines-part-3-aca73bd33eaa


小智 8

遇到了同样的问题,并且发布的解决方案对我不起作用。使用环境变量就达到了目的:

env.someVar='someVal'
sh "echo  ${env.someVar}"
Run Code Online (Sandbox Code Playgroud)

  • 我不知道为什么这遭到了否决。这似乎是解决OP问题的一种方式。猜猜我会投票赞成;-) (2认同)

Ber*_*ver 7

下面的例子有效:

void updateApplicationVersionMaven(String version) {
    sh "mvn -B versions:set -DnewVersion=$version"
}
Run Code Online (Sandbox Code Playgroud)

以及一个完整的管道脚本(在 Jenkins 2.7.3 上测试):

node {
    stage('test') {
        def testVar='foo'
        sh "echo $testVar"    
    }
}
Run Code Online (Sandbox Code Playgroud)

编辑(评论后):啊,测试了更多,可以重现这个问题。这是因为您使用“./opt/setup.sh”获取脚本。这会影响 shell 环境,在这种情况下会破坏 Jenkins 变量注入。有趣的。

EDIT2(评论后):我相信这是正在使用的默认 shell(由 Jenkins 或由操作系统)的问题。我可以从评论中重现这个问题,并且能够通过显式使用 bash 作为 shell 来解决它:

def testVar='foo3'
sh "bash -c \". /var/jenkins_home/test.sh $testVar && echo \$ARCH\""
Run Code Online (Sandbox Code Playgroud)

最后一个 echo 现在回显 testVar 的内容,该内容作为参数传递给脚本,随后由脚本设置为环境变量。