Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to prevent a step failing in Bitbucket Pipelines?

I am running all my test cases and some of them get fail sometimes, pipeline detects it and fail the step and build. this blocks the next step to be executed (zip the report folder). I want to send that zip file as an email attachment.

Here is my bitbucket-pipelines.yml file

custom: # Pipelines that can only be triggered manually
  QA2: # The name that is displayed in the list in the Bitbucket Cloud GUI
  - step:
      image: openjdk:8
      caches:
      - gradle
      size: 2x    # double resources available for this step to 8G
      script:
      - apt-get update
      - apt-get install zip
      - cd config/geb
      - ./gradlew -DBASE_URL=qa2 clean BSchrome_win **# This step fails** 
      - cd build/reports
      - zip -r testresult.zip BSchrome_winTest 

      after-script: # On test execution completion or build failure, send test report to e-mail lists
      - pipe: atlassian/email-notify:0.3.11
        variables:
          <<: *email-notify-config
          TO: '[email protected]'
          SUBJECT: "Test result for QA2 environment"
          BODY_PLAIN: |
            Please find the attached test result report to the email.
          ATTACHMENTS: config/geb/build/reports/testresult.zip

Screenshot of build failure

The steps:

- cd build/reports 
and
- zip -r testresult.zip BSchrome_winTest

do not get executed because - ./gradlew -DBASE_URL=qa2 clean BSchrome_win failed

I don't want bitbucket to fail the step and stop the Queue's step from executing.

like image 330
Shubhendu Pandey Avatar asked Aug 01 '20 10:08

Shubhendu Pandey


People also ask

How do you fail a pipeline in Bitbucket?

Bb Pipelines fail when a command exits with a non-zero exit code. So, if you want the pipeline to fail, you have to make sure the code is not 0.

How does Bitbucket check pipeline logs?

Log viewClicking on a step shows you its logs, in the log view on the right hand side. By default you'll be shown the build logs of the last step that ran, but depending on your configuration you might also have tabs for any services you've added, test reports, or artifacts.


2 Answers

The bitbucket-pipelines.yml file is just running bash/shell commands on Unix. The script runner looks for the return status codes of each command, to see if it succeeded (status = 0) or failed (status = non-zero). So you can use various techniques to control this status code:

Add " || true" to the end of your command

./gradlew -DBASE_URL=qa2 clean BSchrome_win || true

When you add "|| true" to the end of a shell command, it means "ignore any errors, and always return a success code 0". More info:

  • Bash ignoring error for a particular command
  • https://www.cyberciti.biz/faq/bash-get-exit-code-of-command/

Use "gradlew --continue" flag

./gradlew -DBASE_URL=qa2 clean BSchrome_win --continue

The "--continue" flag can be used to prevent a single test failure from stopping the whole task. So if one test or sub-step fails, gradle will try to continue running the other tests until all are run. However, it may still return an error, if an important step failed. More info: Ignore Gradle Build Failure and continue build script?

Move the 2 steps to the after-script section

after-script:
  - cd config/geb # You may need this, if the current working directory is reset. Check with 'pwd'
  - cd build/reports
  - zip -r testresult.zip BSchrome_winTest 

If you move the 2 steps for zip creation to the after-script section, then they will always run, regardless of the success/fail status of the previous step.

like image 141
Mr-IDE Avatar answered Nov 14 '22 13:11

Mr-IDE


A better solution

If you want all the commands in your script to execute regardless of errors then put set +e at the top of your script.

If you just want to ignore the error for one particular command then put set +e before that command and set -e after it.

Example:

- set +e 
- ./gradlew -DBASE_URL=qa2 clean BSchrome_win **# This step fails** 
- set -e 

Also valid for group of commands:

- set +e    
- cd config/geb 
- ./gradlew -DBASE_URL=qa2 clean BSchrome_win **# This step fails** 
- cd config/geb
- set -e 
like image 36
Salam El-Banna Avatar answered Nov 14 '22 14:11

Salam El-Banna