2017-08-02 96 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

感謝您的回答。事實上,我不想接收郵件每個成功,但只有在一個非成功的構建後的第一個成功。 –

相關問題