【问题标题】:Jenkins declarative pipeline conditional post actionJenkins 声明性管道条件后操作
【发布时间】:2021-10-07 19:25:28
【问题描述】:

我正在使用 Jenkins 声明式管道,并希望根据构建状态执行一些构建后操作。

更准确地说,我想在构建状态发生变化时发送一封电子邮件(从成功到失败,或者从成功到不稳定,或者从失败到成功)。

这是我的管道:

pipeline {
    agent none
    stages {
        stage('test') {
            agent any
            steps {                
                sh './tests.sh'
            }
        }
    }
    post {
        changed {
            // Send different emails depending on build status
            // Success       -> anything else
            // Anything else -> Success
        }
    }
}

有什么想法吗?

【问题讨论】:

  • 那么您的实际问题是什么?发送电子邮件?
  • 对不起,我意识到我不是很清楚......我的问题是我想在每次失败时发送一封电子邮件,但只有当状态变为成功时才会发送一封电子邮件。我想恢复“在构建失败和修复构建时接收邮件”的功能。
  • 事实上,我的问题更笼统,关于“如何在后操作块中编写条件”
  • 您在问题中提到了changed。你为什么不用那个?
  • 我希望在除成功之外的所有状态上都有通知(即,我希望在每次失败时收到一封新电子邮件)。但你是对的,我终于完全使用了我发布的 sn-p 并接受了这个。我有另一个用例,我只需要在某些分支上执行一些发布操作,但是您对脚本块的其他响应也解决了这个问题!感谢您的帮助!

标签: jenkins jenkins-pipeline


【解决方案1】:

对于编写条件,您可以定义自己的方法。

例如,如果您只想在构建状态更改时发送电子邮件:

def notifyStatusChangeViaEmail(buildStatus) {
    def status

    switch (buildStatus) {
        case 'SUCCESS':
            status = 'is now green again!'
            break

        case 'UNSTABLE':
            status = 'has become unstable..'
            break

        case 'FAILURE':
            status = 'has turned RED :('
            break
    }

    emailext (
        subject: "Job '${env.JOB_NAME}' ${status}",
        body: "See ${env.BUILD_URL} for more details",
        recipientProviders: [
            [$class: 'DevelopersRecipientProvider'], 
            [$class: 'RequesterRecipientProvider']
        ]
    )
}

pipeline {
    ...

    post {
        changed {
            // Will trigger only when job status changes: GREEN -> RED, RED -> GREEN, etc
            notifyStatusChangeViaEmail(currentBuild.currentResult)
        }
    }
}

理想情况下,您还希望将 notifyStatusChangeViaEmail 方法定义放在您的 shared pipeline library 中,以便在其他作业/管道中重复使用。

【讨论】:

    【解决方案2】:

    参考这个管道:

    post {
            success {
                emailext ( 
                    subject: '${DEFAULT_SUBJECT}'+'SUCESSFUL', 
                    body: '${DEFAULT_CONTENT}',
                    to: '${EMAIL_RECIPIENTS}'
                    );
                    slackSend (color: 'good', message: ":csp_operational: ${env.JOB_NAME} - #${env.BUILD_NUMBER} Success (<${env.BUILD_URL}|Open>)");
    
    
            }
            failure {
                emailext ( 
                    subject: '${DEFAULT_SUBJECT}'+'FAILED!', 
                    body: '${DEFAULT_CONTENT}',
                    to: '${EMAIL_RECIPIENTS}'
                    );
                    slackSend (color: 'danger', message: ":x: ${env.JOB_NAME} - #${env.BUILD_NUMBER} Failure (<${env.BUILD_URL}|Open>)");
    
    
            }
    
        }
    

    您可以使用扩展电子邮件插件,Jenkins-> 配置 Jenkins -> 扩展电子邮件配置来设置默认电子邮件参数。

    【讨论】:

    • 感谢您的回答。事实上,我不希望收到关于每次成功的邮件,而只希望在构建不成功后的第一次成功时收到邮件。
    【解决方案3】:

    例子:失败和不稳定到成功

    if (currentBuild.result == 'SUCCESS') {  if(hudson.model.Result.FAILURE.equals(currentBuild.rawBuild.getPreviousBuild()?.getResult()) || hudson.model.Result.UNSTABLE.equals(currentBuild.rawBuild.getPreviousBuild()?.getResult())) {
    SEND MAIL()
    }
    }
    

    用于发送电子邮件:https://jenkins.io/blog/2017/02/15/declarative-notifications/

    【讨论】:

    • 谢谢,这样就行了,以前的简单复选框看起来很复杂,但它绝对解决了我的问题!
    • 您知道是否可以在 post 操作中编写条件? "when" 语句看起来很有趣,但不允许在 post 块中使用 :(
    • 这用于脚本化管道(在声明中使用 script 块)。
    【解决方案4】:

    @psalvi 在正确的轨道上恕我直言,但@mikael-gibert 在他的评论中希望只收到第一个固定版本的通知。 Jenkins 声明式管道可以做到这一点,请参阅 https://www.jenkins.io/doc/book/pipeline/syntax/#post。举个例子:

    pipeline {
        // [...]
        post {
            always {
                script {
                    // Examples of stuff you could do, based on some custom parameters and functions
                    if (params.buildAndPublish && branchIsMain()) {
                        currentBuild.description = 'NOT promoted '
                    }
    
                    currentBuild.description = (currentBuild.description ?: '') + '[' + (params.customArtifactVersion ?: mavenArtifactVersion) + ']'
    
                    if (params.buildAndPublish) {
                        // Tell Bitbucket about this build and its result
                        notifyBitbucket(credentialsId: config.credentialsId)
    
                        // Archive test results
                        junit(allowEmptyResults: true, testResults: "**/target/surefire-reports/**.xml,**/target/failsafe-reports/**.xml")
                    }
                }
            }
    
            failure {
                emailext recipientProviders: [culprits(), requestor()],
                        subject: "[Jenkins] Build failed: ${env.JOB_NAME} #${env.BUILD_NUMBER}",
                        body: "Hello,\n\nBuild failed: ${env.JOB_NAME} / ${env.BRANCH_NAME} #${env.BUILD_NUMBER}.\nDetails: ${env.BUILD_URL}\n\nJenkins"
            }
    
            fixed {
                emailext recipientProviders: [culprits(), requestor()],
                        subject: "[Jenkins] Build fixed: ${env.JOB_NAME} #${env.BUILD_NUMBER}",
                        body: "Hello,\n\nBuild fixed: ${env.JOB_NAME} / ${env.BRANCH_NAME} #${env.BUILD_NUMBER}.\nDetails: ${env.BUILD_URL}\n\nJenkins"
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-16
      • 1970-01-01
      • 2022-12-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-10
      • 1970-01-01
      相关资源
      最近更新 更多