基于前置条件步骤的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
相关产品推荐
相关产品推荐

