Search code examples
jenkinsjenkins-pipeline

Jenkins timeout/abort exception


We have a Jenkins pipeline script that requests approval from the user after all the preparatory steps are complete, before it actually applies the changes.

We want to add a timeout to this step, so that if there is no input from the user then the build is aborted, and are currently working on using this kind of method:

    try {
      timeout(time: 30, unit: 'SECONDS') {
        userInput = input("Apply changes?")
      }
    } catch(err) {
      def user = err.getCauses()[0].getUser()

      if (user.toString == 'SYSTEM') {  // if it's system it's a timeout
        didTimeout = true
        echo "Build timed out at approval step"
      } else if (userInput == false) {  // if not and input is false it's the user
        echo "Build aborted by: [${user}]"
      }
    }

This code is based on examples found here: https://support.cloudbees.com/hc/en-us/articles/226554067-Pipeline-How-to-add-an-input-step-with-timeout-that-continues-if-timeout-is-reached-using-a-default-value and other places online, but I really dislike catching all errors then working out what's caused the exception using err.getCauses()[0].getUser(). I'd rather explicitly catch(TimeoutException) or something like that.

So my question is, what are the actual exceptions that would be thrown by either the approval step timing out or the userInput being false? I haven't been able to find anything in the docs or Jenkins codebase so far about this.


Solution

  • The exception class they are referring to is org.jenkinsci.plugins.workflow.steps.FlowInterruptedException.

    Cannot believe that this is an example provided by CloudBeeds.

    Most (or probably all?) other exceptions won't even have the getCauses() method which of course would throw another exception then from within the catch block.

    Furthermore as you already mentioned it is not a good idea to just catch all exceptions.

    Edit: By the way: Scrolling further down that post - in the comments - there you'll find an example catching a FlowInterruptedException.