0

下面是我的 jenkins 管道脚本,我在其中一个阶段更改 env 值之一,并在邮件正文中使用这些自定义 env。

pipeline {
    agent none
    environment {
                ENV_STAGE = 'dev'
                UNTTST_SNRSCN = 'false'
                SNRSCN_OUTPUT = ''  
                BRANCHNAME = 'development'
                EMAIL_RECIPIENTS = 'abc@xyz.com'    
                }

    stages {
        stage("Sonar-api"){
            when{
                    expression { params.UNTTST_SNRSCN == 'true' }
                }
                        agent{ label "worker" }
                        stages{
                            stage('SonarQube analysis') {
                                steps {
                                    script {
                                        scannerHome = tool 'sonar-scanner';
                                    }

                                    withSonarQubeEnv('sonarqube9000') { 
                                        git branch: '${BRANCHNAME}', credentialsId: '', url: ''
                                        dir ("$WORKSPACE/api/") {
                                        sh "npm install && npm install -D typescript"
                                        sh "npm run test"
                                        sh """/opt/sonar-scanner/bin/sonar-scanner"""
                                        sh "sleep 20"
                                        }
                                    }
                                }
                            }
                        stage ("Clearing Workspace"){
                                steps{
                                    cleanWs()
                                }   
                            }
                        }
                    }

        stage("Build and deploy"){
                        agent{ label 'worker' }

                        stages {

                                stage("Checkout Sourcecode") {
                                steps{
                                    git branch: "${BRANCHNAME}", credentialsId: '', url: ''
                                                                    }
                                }
                                stage ("Set scan output"){
                                        steps {
                                            script {
                                                if (env.UNTTST_SNRSCN == 'true') {
                                                def SNRSCN_OUTPUT = 'Unit test and sonar scanning performed.'
                                                sh "echo $SNRSCN_OUTPUT"
                                                } else if (env.UNTTST_SNRSCN == 'false') {
                                                def SNRSCN_OUTPUT = 'Unit test and sonar scanning not performed.'
                                                sh "echo $SNRSCN_OUTPUT"
                                                }
                                            }
                                        }
                                }

                                stage ("Clearing Workspace"){
                                steps{
                                    cleanWs()
                                }   
                                }
                              }                     
                            }
                            }

   post {
    failure {
        emailext body: """Hi,
Env stage ${env.ENV_STAGE} deployment failed. Please check jenkins error logs and redeploy.
${env.SNRSCN_OUTPUT}

Regards,
DT""", subject: "Deployment #${BUILD_NUMBER} - ${currentBuild.currentResult}", to: "${env.EMAIL_RECIPIENTS}"
    }
}                       
}

我期待电子邮件中 ​​SNRSCN_OUTPUT 的值,但我一直将其设为空。我如何实现这一目标?我希望“设置扫描输出”阶段的 SNRSCN_OUTPUT 的新值显示在电子邮件中。感谢您的宝贵意见。

Subject: Deployment #26 - FAILURE

Hi,
Env stage dev deployment failed. Please check jenkins error logs and redeploy.
null

Regards,
DT
4

2 回答 2

0

您可以在脚本中进行以下更改,以在 jenkins 管道的后期阶段将自定义 env 值传递给电子邮件正文:

阶段变化:设置扫描输出

stage ("Set scan output"){
                                    steps {
                                        script {
                                            if (env.UNTTST_SNRSCN == 'true') {
                                            def SNRSCN_OUTPUT = 'Unit test and sonar scanning performed.'
                                            sh "echo $SNRSCN_OUTPUT"
                                            env.SNRSCN_OUTPUT = SNRSCN_OUTPUT
                                            } else if (env.UNTTST_SNRSCN == 'false') {
                                            def SNRSCN_OUTPUT = 'Unit test and sonar scanning not performed.'
                                            sh "echo $SNRSCN_OUTPUT"
                                            env.SNRSCN_OUTPUT = SNRSCN_OUTPUT
                                            }
                                        }
                                    }
                            }

不要在后期构建步骤中进行任何更改。

可能这会解决您的问题。

于 2020-06-08T11:29:05.793 回答
0

阶段构建完成后,分配变量值不会传递给构建后操作。作为一种解决方案,您可以将所需的值传递给文件,然后通过使用 Environment Inject Plugin 您可以在后期操作中访问该值。环境注入插件作业配置。插件设置

pipeline {
    agent any
    environment {
                ENV_STAGE = 'dev'
                UNTTST_SNRSCN = 'false'
                SNRSCN_OUTPUT = ''  
                BRANCHNAME = 'development'
                EMAIL_RECIPIENTS = 'abc@xyz.com'    
                }

    stages {
        stage ("Set scan output"){
           steps {
                script {
                    if (env.UNTTST_SNRSCN == 'true') {
                       def SNRSCN_OUTPUT = 'Unit test and sonar scanning performed.'
                       sh "echo $SNRSCN_OUTPUT"
                       writeFile file: 'result.txt', text: SNRSCN_OUTPUT
                    } else if (env.UNTTST_SNRSCN == 'false') {
                        def SNRSCN_OUTPUT = 'Unit test and sonar scanning not performed.'
                        sh "echo $SNRSCN_OUTPUT"
                        writeFile file: 'result.txt', text: SNRSCN_OUTPUT
                    }

                }
            }
        }
    }

   post {
       always{
        script {
            def readContent = readFile 'result.txt'
            echo "The result is ${readContent}"    
       }
     }
   }
}
于 2020-06-04T19:24:36.303 回答