如何运行 github-actions 步骤,即使前一步失败,同时仍然失败

我试图遵循 Github 的一个示例,用 Github 操作测试我的构建,然后压缩测试结果并将它们作为工件上传。 Https://help.github.com/en/actions/automating-your-workflow-with-github-actions/persisting-workflow-data-using-artifacts#uploading-build-and-test-artifacts

不过,如果我的测试失败了,我就不知道该怎么办了。这是我的行动。当我的测试通过所有的工作时,我的结果被压缩为一个工件,但是如果我的测试失败了,它将停止工作中的其余步骤,所以我的结果永远不会被发布。
github-ci-result
我试着添加了 Continu- on-error: true < a href = “ https://help. github.com/en/actions/Automating-your-works-with-github-actions/working-sem- for-github-actions # jobjob _ idstep/Contin- on-error”rel = “ norefrer”> 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
79675 次浏览

你可以加

if: always()

让它运行,即使前一步失败 Https://docs.github.com/en/actions/learn-github-actions/expressions#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]

另外,正如下面所指出的,即使构建被取消,添加 always ()也会导致函数运行。
如果在手动取消作业时不希望函数运行,可以将:

if: success() || failure()

附录: 如果你有以下情况。2个步骤,即 build > deploy,在某些情况下,即 workflow_dispatch与输入参数,你可能想跳过 build,继续与 deploy。同时,当 build失败时,您可能希望跳过 deploy
逻辑上,它应该是类似于 skipped or not faileddeploy条件。
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

阅读更多 给你

可以将 | | true 添加到命令中。 例如:

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

运行 github-actions 步骤,即使前一步骤失败

如果 只有需要执行 成功了失败步骤,则:

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


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

为什么使用 success() || failure()而不是 always()

阅读 Github 上的 状态检查功能文档:

一直都是

使该步骤始终执行,并返回 true,即 即使取消了。当严重故障阻止任务运行时,作业或步骤将不会运行。例如,如果获取源失败。

这意味着当作业被取消时,它将运行 甚至,如果这是您想要的,那么请继续。否则,success() || failure()会更合适。

注意 - 这份文件清楚地表达了对 Vladimir Panteleev的感谢,他在其中提交了以下 PR: Github Docs PR # 8411