I did a kind of similar but not equally implementation. The important bit 
is to try/catch and ensure the last true/false command is in the right 
logic, please read the below:

My use case was to run a certain Integration Test, then if it failed for 
whatever reason, prompt to the user whether to rerun them again with a 
certain timeout to avoid infinite waits.

    stage('TestCase') {
      steps {
        script {
          def filter = 'all'
          waitUntil {
            def bRun = build job: 'jobX', propagate: false  // To avoid 
failfast/propagate errors
            if 
(bRun.getRawBuild().result.isWorseOrEqualTo(hudson.model.Result.FAILURE)) {
              def userInput = true
              def didTimeout = false
              def inputValue
              try {
                // Timeout in case to avoid running this forever
                timeout(time: 60, unit: 'SECONDS') {
                  inputValue = input(
                  id: 'userInput', message: 'jobX failed let\'s rerun it?', 
parameters: [
                    [$class: 'BooleanParameterDefinition', defaultValue: 
true, description: '', name: 'Please confirm you agree with this']
                  ])
                }
              } catch(err) { // timeout reached or input false
                echo err.toString()
                def user = err.getCauses()[0].getUser()
                if('SYSTEM' == user.toString()) { // SYSTEM means timeout.
                  didTimeout = true
                } else {
                  userInput = false
                  echo "Aborted by: [${user}]"
                }
              }
              if (didTimeout) {
                echo "no input was received before timeout"
                false // false will cause infinite loops but it's a way to 
keep retrying, otherwise use true and will exit the loop
              } else if (userInput == true) {
                echo "this was successful"
                false // if user answered then iterate through the loop 
again
              } else {
                echo "this was not successful"
                currentBuild.result = 'ABORTED'
                true  // if user aborted the input then exit the loop
              }
            } else {
              currentBuild.result = 'SUCCESS'
              true  // if build finished successfully as expected then exit 
the loop
            }
          }
        }
      }
    }

The above snippet was based on the below how-to:
- 
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

I hope it helps

-- 
You received this message because you are subscribed to the Google Groups 
"Jenkins Users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/jenkinsci-users/dc49bafb-5772-4f03-9ff3-81bb465a8953%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to