CHANGE_AUTHOR_EMAIL和CHANGE_ID环境变量返回"没有这样的属性:..."

时间:2017-03-08 20:20:43

标签: jenkins jenkins-pipeline

鉴于以下渠道:

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: 'iadar@...',
        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确实有用......

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

2 个答案:

答案 0 :(得分:5)

您需要注意如何引用环境变量,具体取决于它是shell还是Groovy代码,以及引用方式。

执行sh "echo ${CHANGE_ID}"时,实际发生的是Groovy将首先插入字符串,将${CHANGE_ID}替换为Groovy属性CHANGE_ID,这就是您的错误消息所在的位置。在Groovy中,环境变量包含在env

如果要直接从shell脚本引用环境变量,则必须使用env进行插值,使用单引号或转义美元符号。以下所有内容都应该有效:

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

答案 1 :(得分:2)

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

在其他Jenkins问题中查看更多内容:https://issues.jenkins-ci.org/browse/JENKINS-39838