2017-08-02 46 views
3

我正在使用Jenkins声明式管道并希望根据构建状态执行一些发布后生成操作。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 
     } 
    } 
} 

任何想法?

+0

那么你的实际问题是什么?发送电子邮件? – StephenKing

+0

对不起,我意识到我并不那么清楚......我的问题是,我想发送一封电子邮件对每一次失败,但只有一个时,状态转移到成功。我想恢复“在失败的构建和固定构建上接收邮件”功能。 –

+1

事实上,我的问题是更全面的,关于“我怎么能在一个后操作块中写条件” –

回答

3

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

例如,如果你只想发送电子邮件时生成的状态变化:

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方法definiton在shared pipeline library,以便它可以重新使用在其他工作/管道中。

0

例:失败&不稳定,成功

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/

+0

谢谢,这会做到这一点,它看起来很复杂,以前是一个简单的复选框,但它绝对解决了我的问题! –

+0

你是否知道是否可以在发布后的操作中编写条件? “when”语句看起来很有趣,但是不允许在一个post块中使用:( –

+0

这是用于脚本化管道的(在声明中使用脚本块)。 – StephenKing

0

参考这条管道:

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 - >扩展电子邮件配置。

+0

感谢您的回答。事实上,我不想接收邮件每个成功,但只有在一个非成功的构建后的第一个成功。 –

相关问题