jsh*_*hah 11 github github-actions
我想运行一个通知作业,让我知道我的工作流程失败了,有没有办法做到这一点,而不必执行needs每项作业并检查每项作业的状态?
这就是我现在必须这样做的方式,但如果我有大量工作,它会变得很麻烦:
jobs:
first-job:
runs-on: ubuntu-20.04
steps:
- exit 0
second-job:
runs-on: ubuntu-20.04
steps:
- exit 1
notify-job:
runs-on: ubuntu-20.04
needs: [first-job, second-job]
if: ${{ always() && (needs.first-job.result == 'failure' || needs.second-job.result == 'failure') }}
steps:
- ./notify.sh
Run Code Online (Sandbox Code Playgroud)
我想简单地检查工作流程最后是否以任何身份失败,即如果任何作业失败,这可能吗?
我看到此文档来检查触发工作流程是否失败(https://docs.github.com/en/actions/using-workflows/events-that-trigger-workflows#running-a-workflow-based-on-the-另一个工作流程的结论)。
有没有办法在当前工作流程结束时运行finally或状态检查?ensure
小智 13
我发现这个不太冗长的语法:
if: ${{ always() && contains(needs.*.result, 'failure') }}
Run Code Online (Sandbox Code Playgroud)
意思是,如果返回“失败”中列出的任何作业needs,则运行此作业...
来源:https ://docs.github.com/en/actions/learn-github-actions/expressions#contains
Github 合作伙伴Brightran在这篇文章中表示:
默认情况下,一旦正在运行的作业中的某个步骤失败,将跳过该作业中的所有后续步骤,并将该作业标记为失败。如果您希望后续步骤仍然执行,可以在每个后续步骤中添加 if 条件(if:always())。
在job1和job2的末尾添加2个额外的步骤,并设置这2个步骤始终执行(if:always())。第一个用于创建文本文件并将作业状态写入其中,第二个用于将此文本文件作为工件上传。在 job3 中,您还需要添加下载工件并读取 jo1 和 jo2 状态的步骤。
使用此工作流程作为演示:
jobs:
JOB_01:
name: Job 01
. . .
steps:
- name: Some steps of job 01
. . .
- name: Create file status_job01.txt and write the job status into it
if: always()
run: |
echo ${{ job.status }} > status_job01.txt
- name: Upload file status_job01.txt as an artifact
if: always()
uses: actions/upload-artifact@v1
with:
name: pass_status_job01
path: status_job01.txt
JOB_02:
name: Job 02
. . .
steps:
- name: Some steps of job 02
. . .
- name: Create file status_job02.txt and write the job status into it
if: always()
run: |
echo ${{ job.status }} > status_job02.txt
- name: Upload file status_job02.txt as an artifact
if: always()
uses: actions/upload-artifact@v1
with:
name: pass_status_job02
path: status_job02.txt
JOB_03:
needs: [JOB_01, JOB_02]
if: always()
name: Job 03
. . .
steps:
- name: Download artifact pass_status_job01
uses: actions/download-artifact@v1
with:
name: pass_status_job01
- name: Download artifact pass_status_job02
uses: actions/download-artifact@v1
with:
name: pass_status_job02
- name: Set the statuses of Job 01 and Job 02 as output parameters
id: set_outputs
run: |
echo "::set-output name=status_job01::$(<pass_status_job01/status_job01.txt)"
echo "::set-output name=status_job02::$(<pass_status_job02/status_job02.txt)"
- name: Show the values of the outputs
run: |
# using the syntax steps.<step_id>.outputs.<output_name> to access the output parameters
echo "status_job01 = ${{ steps.set_outputs.outputs.status_job01 }}"
echo "status_job02 = ${{ steps.set_outputs.outputs.status_job02 }}"
- name: Some other steps of job 03
. . .
Run Code Online (Sandbox Code Playgroud)
在您的情况下,您最终可以使用这些status job输出根据它们在 if 条件下的值来执行或不执行作业,就像您在问题中建议的那样(在将它们设置为 job3 输出后,它可能会在第四个作业中)。
这不是一个很好的解决方案(因为它非常冗长),但它有效。
| 归档时间: |
|
| 查看次数: |
12451 次 |
| 最近记录: |