Abort current build from pipeline in Jenkins

后端 未结 7 1365
时光说笑
时光说笑 2020-12-02 13:06

I have a Jenkins pipeline which has multiple stages, for example:

node(\"nodename\") {
  stage(\"Checkout\") {
    git ....
  }
  stage(\"Check Preconditions         


        
7条回答
  •  伪装坚强ぢ
    2020-12-02 13:35

    Inspired by all the answers I have put all the stuff together into one Scripted Pipeline. Keep in mind this is not a Declarative Pipeline.

    To get this example working you will need:

    • QuickFIX form this answer Jenkins CI Pipeline Scripts not permitted to use method groovy.lang.GroovyObject
    • discord notifier plugin - https://plugins.jenkins.io/discord-notifier/
    • Discord channel webhook url filled in the code

    The idea I had was to abort the pipeline if it is "replayed" vs started by "run button"(in branches tab of Jenskins BlueOcean):

    def isBuildAReplay() {
      // https://stackoverflow.com/questions/51555910/how-to-know-inside-jenkinsfile-script-that-current-build-is-an-replay/52302879#52302879
      def replyClassName = "org.jenkinsci.plugins.workflow.cps.replay.ReplayCause"
      currentBuild.rawBuild.getCauses().any{ cause -> cause.toString().contains(replyClassName) }
    }
    
    node { 
            try {
                    stage('check replay') {
                        if (isBuildAReplay()) {
                            currentBuild.result = 'ABORTED'
                            error 'Biuld REPLAYED going to EXIT (please use RUN button)'
                        } else {
                            echo 'NOT replay'
                        }
                    }
                    stage('simple stage') {
                        echo 'hello from simple stage'
                    }
                    stage('error stage') {
                        //error 'hello from simple error'
                    }
                    stage('unstable stage') {
                        unstable 'hello from simple unstable'
                    }
                    stage('Notify sucess') {
                        //Handle SUCCESS|UNSTABLE
                        discordSend(description: "${currentBuild.currentResult}: Job ${env.JOB_NAME} \nBuild: ${env.BUILD_NUMBER} \nMore info at: \n${env.BUILD_URL}", footer: 'No-Code', unstable: true, link: env.BUILD_URL, result: "${currentBuild.currentResult}", title: "${JOB_NAME} << CLICK", webhookURL: 'https://discordapp.com/api/webhooks/')
    
                    }
    
            } catch (e) {
                    echo 'This will run only if failed'
    
                    if(currentBuild.result == 'ABORTED'){
                        //Handle ABORTED
                        discordSend(description: "${currentBuild.currentResult}: Job ${env.JOB_NAME} \nBuild: ${env.BUILD_NUMBER} \nMore info at: \n${env.BUILD_URL}\n\nERROR.toString():\n"+e.toString()+"\nERROR.printStackTrace():\n"+e.printStackTrace()+" ", footer: 'No-Code', unstable: true, link: env.BUILD_URL, result: "ABORTED", title: "${JOB_NAME} << CLICK", webhookURL: 'https://discordapp.com/api/webhooks/')
                        throw e
                    }else{
                        //Handle FAILURE
                        discordSend(description: "${currentBuild.currentResult}: Job ${env.JOB_NAME} \nBuild: ${env.BUILD_NUMBER} \nMore info at: \n${env.BUILD_URL}\n\nERROR.toString():\n"+e.toString()+"\nERROR.printStackTrace():\n"+e.printStackTrace()+" ", footer: 'No-Code', link: env.BUILD_URL, result: "FAILURE", title: "${JOB_NAME} << CLICK", webhookURL: 'https://discordapp.com/api/webhooks/')
                        throw e
                    }
            } finally {
                    echo 'I will always say Hello again!'
    
            }
    }
    

    Main trick was the order of lines to achive abort state:

    currentBuild.result = 'ABORTED'
    error 'Biuld REPLAYED going to EXIT (please use RUN button)'
    

    First set the state then throw an exception.

    In the catch block both work:

    currentBuild.result
    currentBuild.currentResult
    

提交回复
热议问题