pipelinebitbucket-pipelines

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@email.com'
          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.


Solution

  • 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:

    Use the "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 steps for zip creation to the after-script section

    pipelines:
      default:
        - step:
            name: Build and test the app
            script:
              - apt-get update
              - apt-get install zip
              - cd config/geb
              - ./gradlew -DBASE_URL=qa2 clean BSchrome_win  # This can fail
              # Add other build steps
            after-script:
              - echo "After the build and test 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 steps that create the report zip file to the after-script section, then they will always run, regardless of the success/fail status of the previous step. More info: https://support.atlassian.com/bitbucket-cloud/docs/step-options/#After-script