仅在上一步骤运行后才运行GitHub Actions步骤

38

我已经在GitHub Actions中设置了一个工作流程来运行我的测试,并创建测试覆盖率的构件。 我的YAML文件的简化版本如下所示:

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

问题在于测试失败时不会创建工件。

我从文档中了解到关于if: always()条件,但这将导致即使Build app步骤失败时也运行此步骤。我不希望发生这种情况,因为在这种情况下没有任何东西可归档。

如何只在先前的步骤已运行(成功或失败)的情况下运行此步骤?

2个回答

48
一个可能更好的替代方案是 <step>.outcome 或者 <step>.conclusion
参考链接:https://docs.github.com/en/actions/learn-github-actions/contexts#steps-context steps.<step id>.conclusion: 应用了 continue-on-error 后,已完成步骤的结果。可能的值为 successfailurecancelledskipped。当 continue-on-error 步骤失败时,结果为 failure,但最终的结论是 success。 steps.<step id>.outcome:在应用 continue-on-error 之前,已完成步骤的结果。可能的值为 successfailurecancelledskipped。当 continue-on-error 步骤失败时,结果为 failure,但最终的结论是 success。
  - name: Build app
    id: build
    run: |
      <build command>

  - name: Run tests

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

42

尝试检查success()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

或者,创建一个步骤输出的退出码,以便您可以在后续步骤中检查。例如:

      - 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

8
针对未来的读者,尽管这个解决方案在2020年是唯一可选的,但现在使用Maks3w的解决方案更加高效。 - cmousset

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接