繁体   English   中英

如何在工作流失败时运行 github 操作作业?

[英]How to run a github actions job on workflow failure?

我想运行一个通知作业,让我知道我的工作流失败了,有没有一种方法可以做到这一点,而不必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-另一个工作流程的结论)。

有没有办法在当前工作流程结束时运行finallyensure状态检查?

我发现这个语法不那么冗长:

if: ${{ always() && contains(needs.*.result, 'failure') }}

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
      . . .

在您的情况下,您最终可以使用这些status job输出根据它们在 if 条件下的值执行或不执行作业,就像您在问题中建议的那样(在将它们设置为 job3 输出后,它可能是第 4 个作业)。

这不是一个很好的解决方案(因为它非常冗长),但它确实有效。

您可以使用${{ failure() }}

steps:
  ...
  - name: The job has failed
    if: ${{ failure() }}

来自Github 文档

当作业的任何先前步骤失败时返回 true。 如果您有一个依赖作业链,如果任何祖先作业失败,则 failure() 返回 true。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM