'How to check if Jenkins build is waiting for input?

In Jenkins' Groovy, how can I detect that some other build is waiting for user input, as triggered by statements like input message: 'Retry?' ok: 'Restart'?

I checked the Executor and Build API docus, but couldn't identify something that matches. executor.isParking() sounded promising, but returns false.



Solution 1:[1]

The problem with Florian's answer is that if the input is waiting for a while, possibly across restarts of Jenkins, it might not be the last line in the log.

This is better:

import org.jenkinsci.plugins.workflow.job.WorkflowJob
import org.jenkinsci.plugins.workflow.support.steps.input.InputAction

def jobs = Jenkins.instance.getAllItems(WorkflowJob.class)

jobs.each { job ->
  job.builds.each { build ->
    if (build.isBuilding() && build.actions.last() instanceof InputAction) {   
      println "$job.fullName #$build.number"
    }
  }
}

This one is looking specifically for WorkflowJob jobs but you could change the class to be FreeStyleProject or whatever other kind of thing you want to look for. But checking that the last action is input seems like a good way to know if it's waiting for input.

Solution 2:[2]

Stupid as it may be, this is the only hack I found so far:

def isWaitingForInput(WorkflowRun otherBuild) {
    def otherBuildsLog = otherBuild.getLog()
    return otherBuildsLog.lastIndexOf("0mAbort") >= otherBuildsLog .length() - 8
}

0mAbort is the piece of code that defines the Abort link that the user can click to abort the build while it is waiting for input.

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 ZombieDev
Solution 2 Florian