Pipeline - How to add an input step, with timeout, that continues if timeout is reached, using a default value

Article ID:230922148
2 minute readKnowledge base

Issue

How do I add an input step, with timeout, that continues if timeout is reached, using a default value, in a Pipeline job?

Environment

  • Jenkins

  • CloudBees Jenkins Enterprise

  • Pipeline plugin

Resolution

You can use a try catch block to achieve this.

The following asks for input, with a timeout of 15 seconds. If the timeout is reached the default is true. An if statement checking the input result (userInput) is used to determine what to do next:

def userInput = true
def didTimeout = false
try {
    timeout(time: 15, unit: 'SECONDS') { // change to a convenient timeout for you
        userInput = input(
        id: 'Proceed1', message: 'Was this successful?', parameters: [
        [$class: 'BooleanParameterDefinition', defaultValue: true, description: '', name: 'Please confirm you agree with this']
        ])
    }
} catch(err) { // timeout reached or input false
    def user = err.getCauses()[0].getUser()
    if('SYSTEM' == user.toString()) { // SYSTEM means timeout.
        didTimeout = true
    } else {
        userInput = false
        echo "Aborted by: [${user}]"
    }
}

node {
    if (didTimeout) {
        // do something on timeout
        echo "no input was received before timeout"
    } else if (userInput == true) {
        // do something
        echo "this was successful"
    } else {
        // do something else
        echo "this was not successful"
        currentBuild.result = 'FAILURE'
    }
}

Note: This code will require you to approve the getCauses() method inside of script security under Manage Jenkins> In-process Script Approval:

catch(err) { // timeout reached or input false
    def user = err.getCauses()[0].getUser()
    if('SYSTEM' == user.toString()) { // SYSTEM means timeout.
        didTimeout = true
    } else {
        userInput = false
        echo "Aborted by: [${user}]"
    }
}

If you do not want to approve that method(or dont have admin permissions) then use this instead:

catch(err) { // timeout reached or input false
    echo "This Job has been Aborted"
}
This article is part of our Knowledge Base and is provided for guidance-based purposes only. The solutions or workarounds described here are not officially supported by CloudBees and may not be applicable in all environments. Use at your own discretion, and test changes in a safe environment before applying them to production systems.