为所有阶段发送电子邮件 - jenkins

问题描述 投票:0回答:1

我有一个问题,我正在詹金斯管道中构建三个测试。我想运行它们,以便如果第二个示例失败,则将执行下一阶段。 此外,我在获取有关所有三个阶段的执行状态的信息时遇到问题。我想发送一封将返回信息的电子邮件,例如

Test 1 - success
Test2 - failure
Test3- success

我有这样的东西:

pipeline {
    agent none
    parameters {
    ...  
    }
    environment {
    ...
    def Test1Status
    def Test2Status
    def Test3Status
    }
    options {
        ansiColor('xterm')
    }
    stages {
        stage('Refresh Jenkins Settings only') {
            when {
                expression {
                    return params.RefreshJenkinsSettings == true
                }
            }
            steps {
                echo "This is Update Only run to refresh parameters and steps"
                echo "System: ${SYSTEM_NAME}"
            }
        }
        stage('Run Test1') {
            agent {
                label '...'
            }
            when {
                expression {
                    return params.RefreshJenkinsSettings == false
                }
            }
            steps {
                catchError(buildResult: 'SUCCESS', stageResult: 'FAILURE') {
                    sh 'python3 scripts/Test1.py  -version "${Version}" ' 
                }
            }
        }
        stage('Test2') {
        agent {
            label '...'
        }
        when {
            expression {
                return params.RefreshJenkinsSettings == false
            }
        }
        steps {
                catchError(buildResult: 'SUCCESS', stageResult: 'FAILURE') {
                    sh 'python Scripts\\\\Test2.py -env "${Env}" -s "${Schema}"'
                } 
        }
    }   
        stage('Test3') {
            agent {
                label '...'
            }
            when {
                expression {
                    return params.RefreshJenkinsSettings == false
                }
            }
            steps {
        bat 'D:\\Pentaho\\Kitchen.bat /rep:git1 /dir:TestCase/Test3 /job:Job "/param:ENV=%Env%" ...'
            }
        }
    }
    
post {
        always {
            script {
                def emailBody = "Test Email\n\n"

                // Check the status of each stage and update the email body accordingly
                if (Test1Status == 'SUCCESS') {
                    emailBody += "Test1: SUCCESS\n"
                } else {
                    emailBody += "Test1: FAILED\n"
                }

                if (Test2Status == 'SUCCESS') {
                    emailBody += "Test2: SUCCESS\n"
                } else {
                    emailBody += "Test2: FAILED\n"
                }

                if (Test3Status == 'SUCCESS') {
                    emailBody += "Test3: SUCCESS\n"
                } else {
                    emailBody += "Test3: FAILED\n"
                }

                // Send the email with the updated content
                emailext to: "[email protected]",
                    subject: "Test Email",
                    body: emailBody,
                    mimeType: 'text/html'
            }
        }
    }
}

jenkins jenkins-pipeline jenkins-groovy
1个回答
0
投票

你可以这样做:

import groovy.transform.Field

@Field // make variable global scope
Map FAILED_STAGES = [:]

def runTest(String stageName, Closure body) {
  catchError(buildResult: 'SUCCESS', stageResult: 'FAILURE') {
    try {
      body() // execute body i.e sh 'smth'
      FAILED_STAGES["${stageName}"] = "SUCCESS"
    } catch (e) {
      FAILED_STAGES["${stageName}"] = "FAILED"
      throw e // propagate error
    }

  }
}

pipeline {
  agent none
  parameters {}
  environment {}

  options {
    ansiColor('xterm')
  }
  stages {
    stage('Refresh Jenkins Settings only') {
      when {
        expression {
          return params.RefreshJenkinsSettings == true
        }
      }
      steps {
        echo "This is Update Only run to refresh parameters and steps"
        echo "System: ${SYSTEM_NAME}"
      }
    }
    stage('Run Test1') {
      agent {
        label '...'
      }
      when {
        expression {
          return params.RefreshJenkinsSettings == false
        }
      }
      steps {
        runTest(env.STAGE_NAME) {
          sh 'python3 scripts/Test1.py  -version "${Version}" '
        }
      }
    }
    stage('Test2') {
    agent {
      label '...'
    }
    when {
      expression {
        return params.RefreshJenkinsSettings == false
      }
    }
    steps {
      runTest(env.STAGE_NAME) {
        sh 'python Scripts\\\\Test2.py -env "${Env}" -s "${Schema}"'
      }
    }
    stage('Test3') {
      agent {
        label '...'
      }
      when {
        expression {
          return params.RefreshJenkinsSettings == false
        }
      }
      steps {
        script {
          runTest(env.STAGE_NAME) {
            bat 'D:\\Pentaho\\Kitchen.bat /rep:git1 /dir:TestCase/Test3 /job:Job "/param:ENV=%Env%" ...'
          }
        }
      }
    }
  }
  post {
    always {
      script {
        def emailBody = "Test Email\n\n"

        FAILED_STAGES.each { String stage_name, String status ->
          emailBody += "${stage_name}: ${status}\n"
        }

        // Send the email with the updated content
        emailext to: "[email protected]",
          subject: "Test Email",
          body: emailBody,
          mimeType: 'text/html'
      }
    }
  }
}

FAILED_STAGES - 存储命令名称和状态

© www.soinside.com 2019 - 2024. All rights reserved.