3

I have a stage in my Jenkins declarative pipeline that looks like:

stage('Step Tests') {
  steps {
    dir('test') {
      catchError(catchInterruptions: true, buildResult: 'FAILURE') {
        timeout(time: 5, unit: 'MINUTES', activity: true) {
          sh "yarn step-tests"
        }
      }
    }
  }
}

The timeout activates if my tests don't output anything to the console for 5 minutes, and subsequent stages still execute, which is what I want. However, the build is still marked as aborted instead of failed, which I thought the buildResult parameter was for.

How do I catch a timeout and mark the build as unstable or failed, instead of aborted?

c32hedge
  • 145
  • 1
  • 2
  • 8

1 Answers1

4

I've done something similar to this in the past:

stage('Step Tests') {
  steps {
    dir('test') {
      script {
        try {
          timeout(time: 5, unit: 'MINUTES', activity: true) {
            sh "yarn step-tests"
          }
        } catch (Exception e) {
          currentBuild.result = 'FAILURE'
        }
      }
    }
  }
}

I haven't tested this code exactly as I wrote it here, so think of this more as a kind of rough sketch rather than polished final product.

jayhendren
  • 2,952
  • 7
  • 15
  • 1
    Thanks, this worked. Interesting that catchError has different behavior. I also ended up using the unstable step instead of currentBuild.result = 'UNSTABLE due to https://issues.jenkins-ci.org/browse/JENKINS-45579 – c32hedge Nov 05 '19 at 16:14