自定义Jenkins邮件:流水线MSG_INFO环境变量传递失败问题排查
问题原因及解决办法
你的问题核心是Shell脚本里直接修改env.MSG_INFO无法同步到Jenkins的Groovy环境,而且Shell里的${file}变量未定义,导致即使设置成功内容也不对。具体问题点和修复方案如下:
问题分析
- Shell进程是独立于Jenkins Groovy运行时的子进程,在Shell里用
env.MSG_INFO=设置的变量只在当前Shell会话有效,无法传递回Jenkins的全局环境变量中。 - Shell脚本里的
${file}变量没有定义,会被解析为空字符串,就算能传递回去,内容也不符合预期。 - 当Shell脚本
exit 1触发构建失败后,Jenkins会直接进入post的failure阶段,但此时Groovy的env.MSG_INFO还是初始的空值,你看到的"fail"大概率是Jenkins默认的错误占位输出。
修复方案
方案1:用Groovy逻辑替代部分Shell代码(推荐)
把判断文件是否存在的逻辑移到Groovy里,直接修改Jenkins环境变量,确保变量值能正确传递到post阶段:
#!/usr/bin/env groovy pipeline { agent any environment { MSG_INFO = "" } stages{ stage('Fetch_sonar_analysis') { steps { container('tools') { script { // 用Groovy查找csv文件 def csvFiles = findFiles(glob: '**/*.csv') if (csvFiles.isEmpty()) { env.MSG_INFO = "CSV file doesn't exist" error("CSV file not found, triggering failure") } } // 保留需要的Shell命令 sh 'ls -l' } } } } post { success { emailext attachmentsPattern: '**/*.csv', body: "Hi,\nPASS : ${env.BUILD_URL}.\nPlease find the csv attached to this email.\nThank you.", subject: "Sonar_Report_csv :: Pipeline Build JOB : ${env.BUILD_NUMBER}-- Status: SUCCESS", mimeType: 'text/plain', to: "mail.com" } failure { mail to: 'mail.com', subject: "Sonar_Report_csv :: Pipeline Build JOB : ${env.BUILD_NUMBER}-- Status: FAILED", body: "Hi,\n ${env.MSG_INFO} \nSomething is wrong Here : ${env.BUILD_URL}.\nThank you." } } }
方案2:保留Shell脚本,通过返回值传递信息
如果必须用Shell逻辑,可以通过捕获Shell输出的方式,在Groovy里设置环境变量:
#!/usr/bin/env groovy pipeline { agent any environment { MSG_INFO = "" } stages{ stage('Fetch_sonar_analysis') { steps { container('tools') { script { // 执行Shell并捕获输出和状态 def output = sh( script: ''' ls -l csv_file_path=$(find . -name *.csv) if [ -z "$csv_file_path" ]; then echo "CSV file doesn't exist" exit 1 fi ''', returnStdout: true, returnStatus: true ) // 判断是否触发错误,设置环境变量 if (output instanceof Integer && output != 0) { // 单独捕获错误提示 def errorMsg = sh(script: 'find . -name *.csv || echo "CSV file doesn\'t exist"', returnStdout: true).trim() env.MSG_INFO = errorMsg error("CSV file not found") } } } } } } post { success { emailext attachmentsPattern: '**/*.csv', body: "Hi,\nPASS : ${env.BUILD_URL}.\nPlease find the csv attached to this email.\nThank you.", subject: "Sonar_Report_csv :: Pipeline Build JOB : ${env.BUILD_NUMBER}-- Status: SUCCESS", mimeType: 'text/plain', to: "mail.com" } failure { mail to: 'mail.com', subject: "Sonar_Report_csv :: Pipeline Build JOB : ${env.BUILD_NUMBER}-- Status: FAILED", body: "Hi,\n ${env.MSG_INFO} \nSomething is wrong Here : ${env.BUILD_URL}.\nThank you." } } }
关键修改点说明
- 用Groovy的
findFiles或者捕获Shell输出的方式,直接在Groovy脚本块里修改env.MSG_INFO,确保变量能被Jenkins全局环境识别。 - 移除了Shell里无效的
env.MSG_INFO=赋值,改用Groovy层面的变量设置。 - 修正了未定义的
${file}变量,明确为"CSV file doesn't exist",如果需要具体文件名,可以根据查找逻辑调整。
内容的提问来源于stack exchange,提问作者Sharon John D'Souza
相关产品推荐
相关产品推荐

