jenkins - CHANGE_AUTHOR_EMAIL 和 CHANGE_ID 环境变量返回 "No such property: ..."

标签 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 可以工作...

<小时/>

更新:这可能是一个 Unresolved 错误... https://issues.jenkins-ci.org/browse/JENKINS-40486 :-(
有什么解决方法可以获取这些值吗?

最佳答案

您需要小心如何引用环境变量,具体取决于它是 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}"

关于jenkins - CHANGE_AUTHOR_EMAIL 和 CHANGE_ID 环境变量返回 "No such property: ...",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42681184/

相关文章:

jenkins - Jenkins 应该运行多少个线程?

mysql - 无法链接 Jenkins 管道中的两个 "sidecar"容器

即使定义了变量,Jenkins 管道也会为后期阶段提供 "No such property"

jenkins - (字符串问题)如何使用数据字符串进行curl POST 调用?

.net - NUnit 和与 Jenkins 的持续集成 : which NUnit-files are needed?

android - 在 Jenkins 中构建 Android 项目 "requires Maven version 3.1.1"

java - Maven 正在尝试从不同目标的中心下载父 pom

jenkins - 在 jenkins 管道节点内时,Sonarqube 质量门卡在待处理状态

maven - 在管道中传递MAVEN_OPTS

docker - ssh-agent 不在 jenkins 管道上工作