Bird
Raised Fist0
Jenkinsdevops~5 mins

Failing builds on test failures in Jenkins - Commands & Configuration

Choose your learning style10 modes available
Introduction
When running automated tests in Jenkins, it is important to stop the build if any test fails. This helps catch problems early and prevents broken code from moving forward.
When you want to ensure only code that passes all tests is deployed.
When you want to save time by stopping builds early if tests fail.
When you want to get quick feedback on code quality after each commit.
When you want to prevent broken code from affecting other developers.
When you want to maintain a stable main branch by blocking failing changes.
Config File - Jenkinsfile
Jenkinsfile
pipeline {
    agent any
    stages {
        stage('Build') {
            steps {
                echo 'Building the project'
                // Add build commands here
            }
        }
        stage('Test') {
            steps {
                echo 'Running tests'
                // Run tests and record results
                sh 'pytest --junitxml=results.xml'
            }
            post {
                always {
                    junit 'results.xml'
                }
                failure {
                    error 'Tests failed, stopping the build.'
                }
            }
        }
    }
}

This Jenkinsfile defines a pipeline with two stages: Build and Test.

In the Test stage, it runs tests using pytest and saves results in results.xml.

The junit step publishes test results and marks the build unstable if tests fail.

The failure block stops the build immediately if any test fails.

Commands
This command triggers the Jenkins pipeline named 'example-pipeline' to start the build and test process.
Terminal
jenkins-jobs build example-pipeline
Expected OutputExpected
Started build #15 for example-pipeline Building in workspace /var/lib/jenkins/workspace/example-pipeline [Pipeline] stage [Pipeline] { (Build) [Pipeline] echo Building the project [Pipeline] // echo [Pipeline] stage [Pipeline] { (Test) [Pipeline] echo Running tests [Pipeline] sh + pytest --junitxml=results.xml ============================= test session starts ============================== collected 3 items test_sample.py ..F [100%] =================================== FAILURES =================================== ____________________________ test_example_failure _____________________________ def test_example_failure(): > assert 1 == 2 E assert 1 == 2 test_sample.py:10: AssertionError =========================== short test summary info =========================== FAILED test_sample.py::test_example_failure - assert 1 == 2 ========================= 1 failed, 2 passed in 0.12s ========================== [Pipeline] junit Recording test results [Pipeline] error ERROR: Tests failed, stopping the build. [Pipeline] // error [Pipeline] } [Pipeline] // stage [Pipeline] End of Pipeline Finished: FAILURE
This command fetches the console output of build number 15 to review test results and failure details.
Terminal
jenkins-jobs console example-pipeline 15
Expected OutputExpected
Started by user admin Building in workspace /var/lib/jenkins/workspace/example-pipeline [Pipeline] stage [Pipeline] { (Build) [Pipeline] echo Building the project [Pipeline] // echo [Pipeline] stage [Pipeline] { (Test) [Pipeline] echo Running tests [Pipeline] sh + pytest --junitxml=results.xml ============================= test session starts ============================== collected 3 items test_sample.py ..F [100%] =================================== FAILURES =================================== ____________________________ test_example_failure _____________________________ def test_example_failure(): > assert 1 == 2 E assert 1 == 2 test_sample.py:10: AssertionError =========================== short test summary info =========================== FAILED test_sample.py::test_example_failure - assert 1 == 2 ========================= 1 failed, 2 passed in 0.12s ========================== [Pipeline] junit Recording test results [Pipeline] error ERROR: Tests failed, stopping the build. [Pipeline] // error [Pipeline] } [Pipeline] // stage [Pipeline] End of Pipeline Finished: FAILURE
Key Concept

If any test fails during the Jenkins pipeline, the build should stop immediately to prevent broken code from progressing.

Common Mistakes
Not using the 'junit' step to publish test results.
Without publishing test results, Jenkins cannot detect test failures properly and may mark builds as successful even if tests fail.
Always use the 'junit' step with the test results file to let Jenkins track test outcomes.
Not adding a failure block to stop the build on test failure.
Without the failure block, the build may continue even if tests fail, allowing broken code to deploy.
Add a 'failure' post block that calls 'error' to stop the build when tests fail.
Summary
Define a Jenkins pipeline with stages for building and testing your code.
Run tests and save results in a file like 'results.xml'.
Use the 'junit' step to publish test results and detect failures.
Add a 'failure' post block to stop the build immediately if tests fail.
Check the build console output to see test failures and fix them before continuing.

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

  1. 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.
  2. 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.
  3. Final Answer:

    The build fails automatically to indicate test failure. -> Option D
  4. 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

  1. 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.
  2. 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.
  3. Final Answer:

    sh 'run_tests.sh' // fails build if script exits non-zero -> Option C
  4. 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

  1. Step 1: Understand Jenkins behavior on shell step failure

    The sh step fails the build if the command exits with a non-zero code.
  2. Step 2: Recognize pytest exit codes

    pytest returns non-zero exit code if any test fails, causing Jenkins to fail the build.
  3. Final Answer:

    Build will fail if pytest returns a failure exit code. -> Option B
  4. 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

  1. Step 1: Identify why build ignores test failures

    Using '|| true' after test commands forces success regardless of test results.
  2. Step 2: Exclude other causes

    Missing 'agent any' causes pipeline failure, server offline stops build, post section can't override success if test fails.
  3. Final Answer:

    The test command is run with '|| true' which ignores failures. -> Option A
  4. 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

  1. 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.
  2. Step 2: Use post section to publish test results

    Publishing test results with junit reports test failures and sets build status accordingly.
  3. Final Answer:

    Use post { always { junit '**/test-results.xml' } } and catchError(buildResult: 'UNSTABLE') around test step. -> Option A
  4. 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 unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard