mirror of
https://github.com/SAP/jenkins-library.git
synced 2024-12-12 10:55:20 +02:00
4d945c8557
* handlePipelineStepErrors - allow step timeouts This adds another resilience option: A timeout can be configured for steps in order to stop step execution, continue with the pipeline while setting build status to "UNSTABLE"
165 lines
5.3 KiB
Groovy
165 lines
5.3 KiB
Groovy
#!groovy
|
|
import hudson.AbortException
|
|
|
|
import static org.hamcrest.Matchers.is
|
|
import static org.hamcrest.Matchers.not
|
|
import static org.hamcrest.Matchers.containsString
|
|
|
|
import org.junit.Rule
|
|
import org.junit.Test
|
|
import org.junit.rules.ExpectedException
|
|
import org.junit.rules.RuleChain
|
|
import static org.junit.Assert.assertThat
|
|
|
|
import util.BasePiperTest
|
|
import util.JenkinsLoggingRule
|
|
import util.JenkinsReadYamlRule
|
|
import util.JenkinsStepRule
|
|
import util.Rules
|
|
|
|
class HandlePipelineStepErrorsTest extends BasePiperTest {
|
|
private JenkinsStepRule stepRule = new JenkinsStepRule(this)
|
|
private JenkinsLoggingRule loggingRule = new JenkinsLoggingRule(this)
|
|
private ExpectedException thrown = ExpectedException.none()
|
|
|
|
@Rule
|
|
public RuleChain rules = Rules
|
|
.getCommonRules(this)
|
|
.around(new JenkinsReadYamlRule(this))
|
|
.around(loggingRule)
|
|
.around(stepRule)
|
|
.around(thrown)
|
|
|
|
@Test
|
|
void testBeginAndEndMessage() {
|
|
def isExecuted
|
|
stepRule.step.handlePipelineStepErrors([
|
|
stepName: 'testStep',
|
|
stepParameters: ['something': 'anything']
|
|
]) {
|
|
isExecuted = true
|
|
}
|
|
// asserts
|
|
assertThat(isExecuted, is(true))
|
|
assertThat(loggingRule.log, containsString('--- Begin library step of: testStep'))
|
|
assertThat(loggingRule.log, containsString('--- End library step of: testStep'))
|
|
}
|
|
|
|
@Test
|
|
void testNonVerbose() {
|
|
try {
|
|
stepRule.step.handlePipelineStepErrors([
|
|
stepName: 'testStep',
|
|
stepParameters: ['something': 'anything'],
|
|
echoDetails: false
|
|
]) {
|
|
throw new Exception('TestError')
|
|
}
|
|
} catch (ignore) {
|
|
} finally {
|
|
// asserts
|
|
assertThat(loggingRule.log, not(containsString('--- Begin library step of: testStep')))
|
|
assertThat(loggingRule.log, not(containsString('--- End library step: testStep')))
|
|
assertThat(loggingRule.log, not(containsString('--- An error occurred in the library step: testStep')))
|
|
}
|
|
}
|
|
|
|
@Test
|
|
void testErrorsMessage() {
|
|
def isReported
|
|
try {
|
|
stepRule.step.handlePipelineStepErrors([
|
|
stepName: 'testStep',
|
|
stepParameters: ['something': 'anything']
|
|
]) {
|
|
throw new Exception('TestError')
|
|
}
|
|
} catch (ignore) {
|
|
isReported = true
|
|
} finally {
|
|
// asserts
|
|
assertThat(isReported, is(true))
|
|
assertThat(loggingRule.log, containsString('--- An error occurred in the library step: testStep'))
|
|
assertThat(loggingRule.log, containsString('[something:anything]'))
|
|
}
|
|
}
|
|
|
|
@Test
|
|
void testHandleErrorsIgnoreFailure() {
|
|
def errorOccured = false
|
|
try {
|
|
stepRule.step.handlePipelineStepErrors([
|
|
stepName: 'test',
|
|
stepParameters: [jenkinsUtilsStub: jenkinsUtils, script: nullScript],
|
|
failOnError: false
|
|
]) {
|
|
throw new AbortException('TestError')
|
|
}
|
|
} catch (err) {
|
|
errorOccured = true
|
|
}
|
|
assertThat(errorOccured, is(false))
|
|
assertThat(nullScript.currentBuild.result, is('UNSTABLE'))
|
|
}
|
|
|
|
@Test
|
|
void testHandleErrorsIgnoreFailureBlacklist() {
|
|
def errorOccured = false
|
|
|
|
//define blacklist in defaults
|
|
helper.registerAllowedMethod("readYaml", [Map], { Map m ->
|
|
return [steps: [handlePipelineStepErrors: [mandatorySteps: ['step1', 'test']]]]
|
|
})
|
|
|
|
try {
|
|
stepRule.step.handlePipelineStepErrors([
|
|
stepName: 'test',
|
|
stepParameters: [jenkinsUtilsStub: jenkinsUtils, script: nullScript],
|
|
failOnError: false
|
|
]) {
|
|
throw new AbortException('TestError')
|
|
}
|
|
} catch (err) {
|
|
errorOccured = true
|
|
}
|
|
assertThat(errorOccured, is(true))
|
|
}
|
|
|
|
@Test
|
|
void testHandleErrorsIgnoreFailureNoScript() {
|
|
def errorOccured = false
|
|
try {
|
|
stepRule.step.handlePipelineStepErrors([
|
|
stepName: 'test',
|
|
stepParameters: [jenkinsUtilsStub: jenkinsUtils],
|
|
failOnError: false
|
|
]) {
|
|
throw new AbortException('TestError')
|
|
}
|
|
} catch (err) {
|
|
errorOccured = true
|
|
}
|
|
assertThat(errorOccured, is(false))
|
|
}
|
|
|
|
@Test
|
|
void testHandleErrorsTimeout() {
|
|
def timeout = 0
|
|
helper.registerAllowedMethod('timeout', [Map.class, Closure.class], {m, body ->
|
|
timeout = m.time
|
|
throw new org.jenkinsci.plugins.workflow.steps.FlowInterruptedException(hudson.model.Result.ABORTED, new jenkins.model.CauseOfInterruption.UserInterruption('Test'))
|
|
})
|
|
|
|
stepRule.step.handlePipelineStepErrors([
|
|
stepName: 'test',
|
|
stepParameters: [jenkinsUtilsStub: jenkinsUtils, script: nullScript],
|
|
failOnError: false,
|
|
stepTimeouts: [test: 10]
|
|
]) {
|
|
//do something
|
|
}
|
|
assertThat(timeout, is(10))
|
|
assertThat(nullScript.currentBuild.result, is('UNSTABLE'))
|
|
}
|
|
}
|