我想运行一个通知作业,让我知道我的工作流失败了,有什么方法可以做到这一点,而不必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我想简单地检查一下工作流是否在结束时失败了,也就是说,如果有任何作业失败了,这有可能吗?
我看到这些文档来检查触发工作流是否失败(https://docs.github.com/en/actions/using-workflows/events-that-trigger-workflows#running-a-workflow-based-on-the-conclusion-of-another-workflow)。
是否有方法在finally当前工作流的末尾运行或ensure状态检查?
发布于 2022-03-10 21:31:06
默认情况下,一旦运行作业中的步骤失败,该作业中的所有后续步骤都将被跳过,此作业将被标记为失败。如果希望后续步骤仍然执行,可以在每个后续步骤中添加If条件( if : add ())。 在job1和job2的末尾添加两个额外的步骤,并设置始终执行的两个步骤(if: and ())。第一个用于创建文本文件并将作业状态写入其中,第二个用于将此文本文件作为工件上载。在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
. . .在您的示例中,您最终可以使用这些status job输出来根据它们的值执行作业,如果条件与您在问题中所建议的情况相同(在将它们设置为job3输出后,很可能处于第四个作业中)。
这不是一个很好的解决方案(因为它非常冗长),但它有效。
发布于 2022-11-24 14:09:06
我发现这个语法不那么冗长:
if: ${{ always() && contains(needs.*.result, 'failure') }}https://stackoverflow.com/questions/71430668
复制相似问题