首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在工作流失败时运行github操作作业?

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

Stack Overflow用户
提问于 2022-03-10 20:53:07
回答 2查看 2.6K关注 0票数 2

我想运行一个通知作业,让我知道我的工作流失败了,有什么方法可以做到这一点,而不必needs每个作业和检查每个作业的状态?

这就是我现在必须做的事情,但如果我有大量的工作,就会变得很麻烦:

代码语言:javascript
复制
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状态检查?

EN

回答 2

Stack Overflow用户

发布于 2022-03-10 21:31:06

Github合作伙伴光亮剂这个职位中声明

默认情况下,一旦运行作业中的步骤失败,该作业中的所有后续步骤都将被跳过,此作业将被标记为失败。如果希望后续步骤仍然执行,可以在每个后续步骤中添加If条件( if : add ())。 在job1和job2的末尾添加两个额外的步骤,并设置始终执行的两个步骤(if: and ())。第一个用于创建文本文件并将作业状态写入其中,第二个用于将此文本文件作为工件上载。在job3中,还需要添加下载工件的步骤,并读取jo1和jo2的状态。

使用此工作流作为演示:

代码语言:javascript
复制
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输出后,很可能处于第四个作业中)。

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

票数 1
EN

Stack Overflow用户

发布于 2022-11-24 14:09:06

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

代码语言:javascript
复制
if: ${{ always() && contains(needs.*.result, 'failure') }}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71430668

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档