在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}
在这里应该如何看待正确的卷曲语法?
答案 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'"""
我在这里:
"""
围绕整个命令。双引号用于string interpolation,三引号用于简化curl
命令JSON内部的引用。${env.BUILD_NUMBER}
是Groovy内插到JSON正文