Question

Running a GitHub Actions step only if previous step has run

I've set up a workflow in GitHub actions to run my tests and create an artifact of the test coverage. The stripped down version of my YAML file looks like this:

name: Build

on: [pull_request]

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
      # Other steps here

      - name: Build app
      - name: Run tests
      - name: Create artifact of test coverage

      # Other steps here

The problem is that the artifact does not get created when the tests fail.

I figured out about if: always() condition the from the docs, but this will also cause this step to run when my Build app step fails. I don't want that to happen because there is nothing to archive in that case.

How can I only run this step if the previous step has run (either succeeded or failed)?

 48  47393  48
1 Jan 1970

Solution

 65

A possible better alternative is <step>.outcome or <step>.conclusion

https://docs.github.com/en/actions/learn-github-actions/contexts#steps-context

steps.<step id>.conclusion. The result of a completed step after continue-on-error is applied. Possible values are success, failure, cancelled, or skipped. When a continue-on-error step fails, the outcome is failure, but the final conclusion is success.

steps.<step id>.outcome The result of a completed step before continue-on-error is applied. Possible values are success, failure, cancelled, or skipped. When a continue-on-error step fails, the outcome is failure, but the final conclusion is success.

  - name: Build app
    id: build
    run: |
      <build command>

  - name: Run tests

  - name: Create artifact of test coverage
    if: steps.build.outcome == 'success'
2022-01-01

Solution

 43

Try checking success() OR failure().

name: Build

on: [pull_request]

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
      # Other steps here

      - name: Build app
      - name: Run tests
      - name: Create artifact of test coverage
        if: success() || failure()

      # Other steps here

Alternatively, create a step output of the exit code that you can check in later steps. For example:

      - name: Build app
        id: build
        run: |
          <build command>
          echo ::set-output name=exit_code::$?

      - name: Run tests

      - name: Create artifact of test coverage
        if: steps.build.outputs.exit_code == 0
2020-02-29