📖 Scenario: You are working as a DevOps engineer for a software team. Your team uses Jenkins to automate building and testing their code. To keep the code quality high, you want Jenkins to stop the build process and mark it as failed whenever any test fails.This helps the team quickly find and fix problems before the code is released.
🎯 Goal: Set up a Jenkins pipeline script that runs tests and fails the build if any test fails.You will create a simple Jenkinsfile that runs a test command and marks the build as failed if tests do not pass.
📋 What You'll Learn
Create a Jenkins pipeline script with a pipeline block
Add a stage named Test that runs a test command
Use the sh step to run exit 1 to simulate a test failure
Make sure the build fails when the test command fails
Print a message indicating the build failed due to test failure
💡 Why This Matters
🌍 Real World
In real software projects, automated tests run on every code change. Jenkins pipelines help catch test failures early by failing the build immediately.
💼 Career
DevOps engineers and build managers use Jenkins pipelines to automate testing and ensure only good code is deployed. Knowing how to fail builds on test failures is essential.
Progress0 / 4 steps
1
Create a basic Jenkins pipeline
Create a Jenkins pipeline script with a pipeline block and an agent any directive.
Jenkins
Hint
The pipeline block is the main structure. agent any tells Jenkins to run on any available agent.
2
Add a Test stage with a failing command
Inside the pipeline block, add a stages block with a stage named Test. Inside this stage, use the sh step to run exit 1 to simulate a test failure.
Jenkins
Hint
The sh step runs shell commands. exit 1 simulates a failing test.
3
Add a post block to handle failure
Add a post block inside the pipeline block. Inside post, add a failure block that uses echo to print 'Build failed due to test failure.'.
Jenkins
Hint
The post block runs steps after the pipeline stages. The failure block runs only if the build fails.
4
Print the failure message on build failure
Run the pipeline script. The build should fail because of exit 1. The console output should include Build failed due to test failure.. Write a echo statement inside the failure block to print this message.
Jenkins
Hint
When the test command fails, Jenkins marks the build as failed and runs the failure block to print the message.
Practice
(1/5)
1. What happens to a Jenkins build if a test command returns a failure exit code?
easy
A. The build restarts the test command automatically.
B. The build ignores the test failure and continues.
C. The build pauses and waits for manual approval.
D. The build fails automatically to indicate test failure.
Solution
Step 1: Understand Jenkins build behavior on command failure
Jenkins treats any shell or batch command that returns a non-zero exit code as a failure.
Step 2: Relate test command failure to build status
If tests fail and return a failure code, Jenkins marks the entire build as failed automatically.
Final Answer:
The build fails automatically to indicate test failure. -> Option D
Quick Check:
Test failure exit code causes build failure [OK]
Hint: Non-zero exit code from tests fails the build [OK]
Common Mistakes:
Thinking Jenkins ignores test failures by default
Assuming manual intervention is needed on test failure
Believing Jenkins retries failed test commands automatically
2. Which of the following Jenkins pipeline syntax snippets correctly fails the build if tests fail?
easy
A. sh 'run_tests.sh & wait' // runs tests in background
B. sh 'run_tests.sh || true' // ignores test failures
C. sh 'run_tests.sh' // fails build if script exits non-zero
D. sh 'run_tests.sh; echo done' // always succeeds
Solution
Step 1: Analyze each shell command's effect on build status
sh 'run_tests.sh' // fails build if script exits non-zero runs the test script normally; if it exits non-zero, Jenkins fails the build.
Step 2: Identify commands that ignore failure
sh 'run_tests.sh || true' // ignores test failures uses '|| true' which forces success, ignoring failures; C runs in background, not failing build; D always succeeds due to echo.
Final Answer:
sh 'run_tests.sh' // fails build if script exits non-zero -> Option C
Quick Check:
Normal shell command fails build on error [OK]
Hint: Avoid '|| true' to let Jenkins catch test failures [OK]
Common Mistakes:
Adding '|| true' to shell commands
Running tests in background without waiting
Appending commands that always succeed after tests
3. Given this Jenkins pipeline snippet, what will be the build result if pytest finds failing tests?
pipeline {
agent any
stages {
stage('Test') {
steps {
sh 'pytest'
}
}
}
}
medium
A. Build will succeed regardless of test results.
B. Build will fail if pytest returns a failure exit code.
C. Build will be unstable but not fail.
D. Build will skip the test stage.
Solution
Step 1: Understand Jenkins behavior on shell step failure
The sh step fails the build if the command exits with a non-zero code.
Step 2: Recognize pytest exit codes
pytest returns non-zero exit code if any test fails, causing Jenkins to fail the build.
Final Answer:
Build will fail if pytest returns a failure exit code. -> Option B
Quick Check:
Failing tests cause non-zero exit, fail build [OK]
Hint: Test commands returning non-zero fail build [OK]
Common Mistakes:
Assuming build passes despite test failures
Confusing unstable with failed build
Thinking Jenkins skips failing test stages
4. You have a Jenkins pipeline where tests fail but the build still shows as SUCCESS. What is the most likely cause?
medium
A. The test command is run with '|| true' which ignores failures.
B. The pipeline is missing the 'agent any' declaration.
C. The Jenkins server is offline during the test stage.
D. The post section is configured to always mark build as success.
Solution
Step 1: Identify why build ignores test failures
Using '|| true' after test commands forces success regardless of test results.
Step 2: Exclude other causes
Missing 'agent any' causes pipeline failure, server offline stops build, post section can't override success if test fails.
Final Answer:
The test command is run with '|| true' which ignores failures. -> Option A
Quick Check:
'|| true' masks test failures causing success [OK]
Hint: Check for '|| true' masking failures in shell steps [OK]
Common Mistakes:
Blaming missing agent for test failure ignoring
Assuming Jenkins server offline lets build succeed
Misconfiguring post section to override failure
5. How can you configure a Jenkins declarative pipeline to always run tests but mark the build as UNSTABLE instead of FAILED when tests fail?
hard
A. Use post { always { junit '**/test-results.xml' } } and catchError(buildResult: 'UNSTABLE') around test step.
B. Add sh 'run_tests.sh || true' to ignore failures.
C. Set options { skipStagesAfterUnstable() } in pipeline.
D. Use post { failure { echo 'Tests failed' } } without changing build status.
Solution
Step 1: Use catchError to catch test failures and mark build unstable
Wrapping test commands with catchError(buildResult: 'UNSTABLE') prevents build failure but marks unstable.
Step 2: Use post section to publish test results
Publishing test results with junit reports test failures and sets build status accordingly.
Final Answer:
Use post { always { junit '**/test-results.xml' } } and catchError(buildResult: 'UNSTABLE') around test step. -> Option A
Quick Check:
catchError + junit marks unstable, not failed [OK]
Hint: Use catchError(buildResult: 'UNSTABLE') to mark unstable [OK]
Common Mistakes:
Ignoring test failures with '|| true' instead of marking unstable
Misusing post failure block without changing status
Skipping test stages after unstable status
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.