如何 运行 一个 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()
所以对于单个步骤,它看起来像这样:
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
我正在尝试按照 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()
所以对于单个步骤,它看起来像这样:
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