仅当上一步已运行时才运行 GitHub 操作步骤

Dun*_*Luk 12 continuous-integration github continuous-deployment github-actions

我在 GitHub 操作中设置了一个工作流来运行我的测试并创建测试覆盖的工件。我的 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
Run Code Online (Sandbox Code Playgroud)

问题是当测试失败时不会创建工件。

if: always()docs 中找出了条件,但这也会导致当我的Build app步骤失败时运行此步骤。我不希望这种情况发生,因为在这种情况下没有什么可存档的。

如果上一步已运行(成功或失败),我如何仅运行此步骤?

Mak*_*s3w 56

一个可能更好的选择是<step>.outcome或者<step>.conclusion

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

steps.<step id>.conclusion。应用错误继续后已完成步骤的结果。可能的值为成功失败取消跳过。当错误继续步骤失败时,结果是失败,但最终结论是成功。

steps.<step id>.outcome应用错误继续之前已完成步骤的结果。可能的值为成功失败取消跳过。当错误继续步骤失败时,结果是失败,但最终结论是成功。

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

  - name: Run tests

  - name: Create artifact of test coverage
    if: steps.build.outcome == 'success'
Run Code Online (Sandbox Code Playgroud)


pet*_*ans 14

尝试检查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
Run Code Online (Sandbox Code Playgroud)

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

      - 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
Run Code Online (Sandbox Code Playgroud)

  • 对于未来的读者来说,尽管这是被接受的解决方案,因为 2020 年没有其他选择,但现在使用 Maks3w 的解决方案更有效:) (11认同)