2017-03-08 37 views
0

鉴于以下管道:CHANGE_AUTHOR_EMAIL和CHANGE_ID环境变量返回“没有这样的属性:......”

stages { 
    stage ("Checkout SCM") { 
     steps { 
      checkout scm 

      sh "echo ${CHANGE_AUTHOR_EMAIL}" 
      sh "echo ${CHANGE_ID}" 
     } 
    } 
} 

为什么这些变量无法解析,并提供价值?

最后,我想用这些环境变量来发送电子邮件和合并拉请求:

post { 
    failure { 
     emailext (
     attachLog: true, 
     subject: '[Jenkins] $PROJECT_NAME :: Build #$BUILD_NUMBER :: build failure', 
     to: '$CHANGE_AUTHOR_EMAIL', 
     replyTo: '[email protected]', 
     body: '''<p>You are receiving this email because your pull request was involved in a failed build. Check the attached log file, or the console output at: $BUILD_URL to view the build results.</p>''' 
    ) 
    } 
} 

sh "curl -X PUT -d '{\'commit_title\': \'Merge pull request\'}' <git url>/pulls/${CHANGE_ID}/merge?access_token=<token>" 

奇怪的是,$PROJECT_NAME$BUILD_NUMBER$BUILD_URL做的工作......


更新:这可能是一个开放的bug ... https://issues.jenkins-ci.org/browse/JENKINS-40486 :-(
是否有任何解决方法来获取这些值?

回答

2

对于任何可能遇到此问题的人,只有在选中了构建原始PR(与基本分支合并)复选框(此属于多分支作业)后,这些变量才可用。

查看更多在这个其他詹金斯问题:https://issues.jenkins-ci.org/browse/JENKINS-39838

+0

这个复选框在哪里?我无法在我的多分支作业中找到它 – SILENCE

+0

插件已被更新,此答案不是有效的。需要更新自己,所以我可以更新答案 –

3

你需要小心你如何引用环境变量取决于它是否是壳或Groovy代码,以及你是如何引用。

当你做sh "echo ${CHANGE_ID}",实际发生的事情是,Groovy会先插字符串,通过与Groovy的财产CHANGE_ID更换${CHANGE_ID},而这也正是你的错误信息是从。在Groovy中,环境变量包装在env中。

如果要直接从shell脚本引用环境变量,则必须使用env插入,使用单引号或转义美元符号。以下所有方式应该可以工作:

sh 'echo $CHANGE_ID' 
sh "echo \$CHANGE_ID" 
sh "echo ${env.CHANGE_ID}" 
+0

感谢伟大的信息,谢谢! –

+0

如何使用不在sh脚本中的变量,如emailext插件,slack插件等内容?我已经用emailext的一个例子更新了这个问题。 –

+0

在这种情况下,我收到“发送到以下无效地址的错误:$ CHANGE_AUTHOR_EMAIL” –

相关问题