如何 运行 一个 github-actions 步骤,即使上一步失败,同时仍然使作业失败

How to run a github-actions step, even if the previous step fails, while still failing the job

我正在尝试按照 Github 的示例使用 github 操作测试我的构建,然后压缩测试结果并将它们作为工件上传。 https://help.github.com/en/actions/automating-your-workflow-with-github-actions/persisting-workflow-data-using-artifacts#uploading-build-and-test-artifacts

不过,当我的测试失败时,我不知道该怎么办。这是我的行动。当我的测试通过时一切正常,我的结果被压缩并作为工件导出,但如果我的测试失败,它会停止工作中的其余步骤,因此我的结果永远不会发布。

我尝试添加 continue-on-error: true https://help.github.com/en/actions/automating-your-workflow-with-github-actions/workflow-syntax-for-github-actions#jobsjob_idstepscontinue-on-error
这使得它在失败后继续并上传我的测试结果。但是随后作业被标记为通过,即使我的测试步骤失败了。有没有什么方法可以让它在步骤失败的情况下上传我的工件,同时仍然将整个作业标记为失败?

name: CI
on:
  pull_request:
    branches:
    - master
  push:
    branches:
      - master

jobs:
  build-and-test:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v1    
    - name: Test App
      run: ./gradlew test

    - name: Archive Rest Results
      uses: actions/upload-artifact@v1
      with:
        name: test-results
        path: app/build/reports/tests

您可以添加

if: always()

到你的步骤运行即使上一步失败 https://help.github.com/en/actions/automating-your-workflow-with-github-actions/contexts-and-expression-syntax-for-github-actions#job-status-check-functions

所以对于单个步骤,它看起来像这样:

steps:
- name: Build App
  run: ./build.sh

- name: Archive Test Results
  if: always()
  uses: actions/upload-artifact@v1
  with:
    name: test-results
    path: app/build

或者您可以将其添加到工作中:

jobs:
  job1:
  job2:
    needs: job1
  job3:
    if: always()
    needs: [job1, job2]

Addon: 如果您有以下情况。 2 个步骤,即 build > deploy,在某些情况下,即带有输入参数的 workflow_dispatch,您可能希望跳过 build 并继续 deploy。同时,当 build 失败时,您可能希望跳过 deploy
从逻辑上讲,这类似于 skipped or not failed 作为 deploy 条件。
if: always() 将不起作用,因为它总是会触发 deploy,即使 build 失败。
解决方案非常简单:
if: ${{ !failure() }}
请注意,在 if: 中否定时不能跳过括号,因为它会报告语法错误。

其他方式,您可以添加 continue-on-error: true。 长得像

- name: Job fail
  continue-on-error: true
  run |
    exit 1
- name: Next job
  run |
    echo Hello

here 阅读更多内容。

您可以添加||忠于你的命令。 示例:

 jobs:
  build-and-test:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v1    
    - name: Test App
      run: ./gradlew test || true