Jenkins流水线报错:unexpected token: JELLY_SCRIPT原因排查求助
问题分析与解决方案
这个错误的核心原因是Groovy字符串插值和Email Extension插件的Jelly脚本标签冲突了,具体来说:
- 在Jenkins Pipeline的Groovy语法中,
${}是用来解析Groovy环境变量或自定义变量的语法,比如你代码里的${env.JOB_NAME}就是Groovy在执行时替换成实际的任务名称。 - 而
${JELLY_SCRIPT,template="testResults.jelly"}是Email Extension插件专属的标签,它不是Groovy变量,Groovy会把它当成一个非法的Groovy表达式去解析,自然就抛出了unexpected token: JELLY_SCRIPT的语法错误。
两种可行的修复方案
方案1:改用单引号包裹邮件正文
Groovy中,单引号包裹的字符串是纯字符串,不会解析里面的${}语法,这样Email Extension插件就能正常识别并处理JELLY_SCRIPT标签。如果你的正文里还有Groovy变量,需要手动拼接字符串:
修改后的success阶段emailext代码示例:
success { emailext ( subject: "SUCCESSFUL: Job '${env.JOB_NAME} [${env.BUILD_NUMBER}]'", to: '$EMAIL_LIST', attachmentsPattern: '**/results/*', attachLog: true, body: '<p>SUCCESSFUL: Job \'' + env.JOB_NAME + ' [' + env.BUILD_NUMBER + ']\'</p> ' + '<p>Check console output at ;<a href=\'' + env.BUILD_URL + '\'>' + env.JOB_NAME + ' [' + env.BUILD_NUMBER + ']</a></p> ' + '<br> Unit test: ' + env.UNIT_TEST + ' <br> Integration test: ' + env.INTEGRATION_TEST + ' <br> Upgrader test: ' + env.UPGRADER_TEST + ' <br> ' + '<h1>Unit Test Report</h1> ' + env.UNIT_TEST_REPORT + ' <br> ' + env.UPGRADER_REPORT + ' <br> ' + '<h3>Find Upgrader Logs in following location : </h3><br> ' + env.FTP_PATH + ' <br> ' + env.FTP_LOCATION + ' <br> ' + env.EMAIL_CONTENT + '${JELLY_SCRIPT,template="testResults.jelly"}', recipientProviders: [[$class: 'UpstreamComitterRecipientProvider']] ) cleanWs() }
方案2:转义JELLY_SCRIPT的${}
如果你想继续使用三重引号的多行字符串(保留Groovy变量的便捷插值),只需要把JELLY_SCRIPT标签里的${}转义成\${},这样Groovy就会把它当成普通字符串内容,不会尝试解析,而是直接传给Email Extension插件处理:
修改后的body部分示例:
body: """<p>SUCCESSFUL: Job '${env.JOB_NAME} [${env.BUILD_NUMBER}]'</p> <p>Check console output at ;<a href='${env.BUILD_URL}'>${env.JOB_NAME} [${env.BUILD_NUMBER}]</a></p> <br> Unit test: ${env.UNIT_TEST} <br> Integration test: ${env.INTEGRATION_TEST} <br> Upgrader test: ${env.UPGRADER_TEST} <br> <h1>Unit Test Report</h1> ${env.UNIT_TEST_REPORT} <br> ${env.UPGRADER_REPORT} <br> <h3>Find Upgrader Logs in following location : </h3><br> ${env.FTP_PATH} <br> ${env.FTP_LOCATION} <br> ${env.EMAIL_CONTENT} \${JELLY_SCRIPT,template="testResults.jelly"}""",
这样修改后,Groovy就不会再把JELLY_SCRIPT当成非法的Groovy表达式,Email Extension插件也能正确识别并渲染你指定的Jelly模板了。
内容的提问来源于stack exchange,提问作者Viraj Amarasinghe - Resiliz
相关产品推荐
相关产品推荐

