You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

自定义Jenkins邮件:流水线MSG_INFO环境变量传递失败问题排查

问题原因及解决办法

你的问题核心是Shell脚本里直接修改env.MSG_INFO无法同步到Jenkins的Groovy环境,而且Shell里的${file}变量未定义,导致即使设置成功内容也不对。具体问题点和修复方案如下:

问题分析

  1. Shell进程是独立于Jenkins Groovy运行时的子进程,在Shell里用env.MSG_INFO=设置的变量只在当前Shell会话有效,无法传递回Jenkins的全局环境变量中。
  2. Shell脚本里的${file}变量没有定义,会被解析为空字符串,就算能传递回去,内容也不符合预期。
  3. 当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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 08:22:53