You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于前置条件步骤的GitHub Actions工作流结果判定问题

GitHub Actions 工作流修正方案

针对你提出的两个问题,以下是修正后的完整工作流配置及说明:

完整配置代码

jobs:
  test-result:
    name: Run initial tests
    runs-on: ${{inputs.runner-tag}}
    steps:
      - name: Run tests
        run: |
          # 替换为你的实际测试命令
          echo "执行首次测试..."
          # 测试失败模拟:exit 1
          # 测试成功模拟:exit 0

  rerun-1-test-result:
    name: 重跑失败用例(第1次)
    needs: test-result
    if: needs.test-result.result == 'failure'
    runs-on: ${{inputs.runner-tag}}
    steps:
      - name: 重跑失败用例
        run: |
          # 替换为仅重跑失败用例的命令
          echo "第1次重跑失败用例..."
          # 重跑成功/失败模拟:exit 0 或 exit 1

  rerun-2-test-result:
    name: 重跑失败用例(第2次)
    needs: test-result
    if: needs.test-result.result == 'failure'
    runs-on: ${{inputs.runner-tag}}
    steps:
      - name: 重跑失败用例
        run: |
          # 替换为仅重跑失败用例的命令
          echo "第2次重跑失败用例..."
          # 重跑成功/失败模拟:exit 0 或 exit 1

  analyze-results:
    name: ${{inputs.test-description}} 最终判定
    needs: [test-result, rerun-1-test-result, rerun-2-test-result]
    if: always()
    runs-on: ${{inputs.runner-tag}}
    steps:
      - name: 判定最终结果
        run: |
          # 首次测试直接成功,直接判定通过
          if [ "${{needs.test-result.result}}" = "success" ]; then
            echo "首次测试通过,最终结果:成功"
            exit 0
          fi

          # 首次测试失败,检查重跑结果
          RERUN1_STATUS="${{needs.rerun-1-test-result.result}}"
          RERUN2_STATUS="${{needs.rerun-2-test-result.result}}"

          # 只要任意一次重跑成功,就判定通过
          if [ "$RERUN1_STATUS" = "success" ] || [ "$RERUN2_STATUS" = "success" ]; then
            echo "至少一次重跑通过,最终结果:成功"
            exit 0
          else
            echo "首次测试失败且所有重跑都失败,最终结果:失败"
            exit 1
          fi

问题修正说明

1. 重跑任务按需触发

给两个重跑任务添加if条件,仅当首次测试test-result失败时才执行:

if: needs.test-result.result == 'failure'

这样首次测试成功时,重跑任务会被标记为skipped,不会额外消耗资源。

2. 最终阶段的正确判定逻辑

修改analyze-results的执行逻辑,通过脚本的退出码直接控制任务状态(exit 0代表成功,exit 1代表失败):

  • 优先判断首次测试结果:如果首次测试成功,直接输出成功并结束任务。
  • 若首次测试失败,检查两次重跑的状态:只要有一次重跑成功,就判定最终结果为成功;若两次重跑都失败(或因首次成功被跳过),则判定为失败。

同时保留if: always()确保无论前置任务状态如何,最终判定阶段都会执行。

内容的提问来源于stack exchange,提问作者Sven van den Boogaart

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 05:02:26