为什么不能在詹金斯中嵌入env vars?

时间:2018-02-15 08:37:30

标签: curl jenkins environment-variables jenkins-pipeline

在Jenkins管道中,我无法嵌入env变量:

sh 'curl -d '{"color":"green","message":"${BUILD_NUMBER}","notify":false,"message_format":"text"}' -H 'Content-Type: application/json' http:blahbah.com'

即使我尝试在每个'之前使用转义字符,问题仍然存在。和"目标机器上的输出始终是 $ {BUILD_NUMBER}

在这里应该如何看待正确的卷曲语法?

2 个答案:

答案 0 :(得分:1)

使用${BUILD_NUMBER}而不是使用$BUILD_NUMBER。它会做到这一点。以下是一些示例代码。

  

环境变量可以从Groovy代码中以env.VARNAME的形式访问   或者只是作为VARNAME。你也可以写这些属性(仅限   使用环境。前缀):

env.MYTOOL_VERSION = '1.33'
node {
  sh '/usr/local/mytool-$MYTOOL_VERSION/bin/start'
}
pipeline { 
  agent any 
  stages {
    stage('Build') { 
        steps { 
            sh 'echo "Hello World $BUILD_ID"' 
        }
    }
  }
}

答案 1 :(得分:1)

您的curl -d参数命令包含单引号。

curl -d '{"color":"green","message":"${BUILD_NUMBER}","notify":false,"message_format":"text"}' -H 'Content-Type: application/json' http:blahbah.com'

一般情况下(至少在bash"Single quotes won't interpolate anything, but double quotes will (for example variables, backticks, certain \ escapes, etc...)"

使用Jenkins Pipelines,您需要注意所提供的报价转义。您可以看到记录的一些奇怪行为here

处理这种情况的一种方法是用Groovy中的env.BUILD_NUMBER值替换而不是shell评估。 Groovy的triple-quoted strings也可以帮助字符串引用:

sh """curl -d '{"color":"green","message":"${env.BUILD_NUMBER}","notify":false,"message_format":"text"}' -H 'Content-Type: application/json' http:blahbah.com'"""

我在这里:

  1. """围绕整个命令。双引号用于string interpolation,三引号用于简化curl命令JSON内部的引用。
  2. ${env.BUILD_NUMBER}是Groovy内插到JSON正文