从jenkinsfile

时间:2019-09-12 06:33:51

标签: jenkins-pipeline dsl jenkins-groovy

我正在尝试从jenkinsfile执行命令集。 问题是,当我尝试将stdout的值分配给变量时,它不起作用。 我尝试了双引号和单引号的不同组合,但到目前为止还算不上运气。

在这里,我使用最新版本的jenkinsfile和旧版本执行了脚本。将shell命令放入“””“””中是不允许创建新变量的,并且给出错误,例如client_name命令不存在。

String nodeLabel = env.PrimaryNode ? env.PrimaryNode : "slave1"
echo "Running on node [${nodeLabel}]"

node("${nodeLabel}"){

    sh "p4 print -q -o config.yml //c/test/gradle/hk/config.yml"
    def config = readYaml file: 'devops-config.yml'
    def out = sh (script:"client_name=${config.BasicVars.p4_client}; " +
    'echo "client name: $client_name"' +
    " cmd_output = p4 clients -e $client_name" +
    ' echo "out variable: $cmd_output"',returnStdout: true)
}

我想将命令p4 client -e $ client_name的stdout分配给变量cmd_output。

但是当我执行代码时,抛出的错误是:

  

NoSuchPropertyException:在行cmd_output = p4客户端-e $ client_name上未定义client_name

我在这里想念什么?

1 个答案:

答案 0 :(得分:1)

您的问题是,当字符串用双引号引起来时,所有的$都由jenkins解释。因此前两次没有问题,因为第一个变量来自jenkins,第二次是单引号字符串。 第三个变量在双引号字符串中,因此jenkins尝试用其值替换该变量,但找不到它,因为它仅在执行shell脚本时生成。

解决方案是在$ client_name中转义$(或在环境块中定义client_name)。

我重写了该块:

String nodeLabel = env.PrimaryNode ? env.PrimaryNode : "slave1"
echo "Running on node [${nodeLabel}]"

node("${nodeLabel}"){
    sh "p4 print -q -o config.yml //c/test/gradle/hk/config.yml"
    def config = readYaml file: 'devops-config.yml'
    def out = sh (script: """
        client_name=${config.BasicVars.p4_client}
        echo "client name: \$client_name"
        cmd_output = p4 clients -e \$client_name
        echo "out variable: \$cmd_output"
    """, returnStdout: true)
}