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

GitHub Actions带needs/if条件的动态测试重跑任务实现咨询

解决方案

要实现带依赖/条件控制的动态次数重跑,同时避免代码重复,可通过复合步骤封装逻辑+动态矩阵生成作业的方式解决,具体实现如下:

1. 封装重复逻辑为复合步骤

创建一个复合步骤,把重跑测试和结果分析的重复逻辑整合到一起,避免在工作流中多次编写相同代码。在仓库的.github/actions/rerun-test-suite/action.yml中添加以下内容:

name: 'Rerun Test Suite'
description: '执行失败测试重跑并分析结果'
inputs:
  failed-test-id:
    description: '失败测试的ID'
    required: true
  runner-tag:
    description: '自定义基础设施的Runner标签'
    required: true
outputs:
  test-id:
    description: '重跑测试的ID'
    value: ${{ steps.test.outputs.test-id }}
  result-failed:
    description: '结果分析是否失败'
    value: ${{ steps.parse-test-result.outcome == 'failure' }}
runs:
  using: 'composite'
  steps:
    - name: 重跑失败测试
      id: test
      uses: somedir/test@v1.0.0
      with:
        failed_test_id: ${{ inputs.failed-test-id }}
      shell: bash

    - name: 解析并分析重跑结果
      id: parse-test-result
      uses: somedir/test-analyze-results@v1.0.0
      with:
        test-id: ${{ steps.test.outputs.test-id }}
      shell: bash

2. 动态生成重跑矩阵

通过一个辅助作业生成包含重跑轮次、依赖关系、参数来源的动态矩阵,支持任意重跑次数:

name: 测试重跑工作流
on:
  workflow_dispatch:
    inputs:
      runner-tag:
        description: '自定义基础设施Runner标签'
        required: true
      rerun-count:
        description: '最大重跑次数'
        required: true
        default: '3'

jobs:
  # 初始测试作业(保留你现有配置)
  first-tests:
    runs-on: ${{ inputs.runner-tag }}
    outputs:
      test-id: ${{ steps.test.outputs.test-id }}
    steps:
      # ... 你的初始测试步骤,需输出test-id

  # 初始测试结果分析(保留你现有配置)
  first-tests-results:
    needs: first-tests
    runs-on: ${{ inputs.runner-tag }}
    outputs:
      result-failed: ${{ steps.parse-test-result.outcome == 'failure' }}
    steps:
      - name: 解析初始测试结果
        id: parse-test-result
        uses: somedir/test-analyze-results@v1.0.0
        with:
          test-id: ${{ needs.first-tests.outputs.test-id }}

  # 生成动态重跑矩阵
  generate-rerun-matrix:
    runs-on: ubuntu-latest
    outputs:
      matrix: ${{ steps.generate.outputs.matrix }}
    steps:
      - id: generate
        run: |
          RERUN_COUNT=${{ inputs.rerun-count }}
          # 生成包含每个重跑轮次信息的矩阵
          MATRIX=$(jq -n --argjson count "$RERUN_COUNT" '
            {
              reruns: [
                range(1; $count + 1) | {
                  index: .,
                  depends_on: (
                    if . == 1 then "first-tests-results"
                    else "rerun-test-suite-\(. - 1)"
                    end
                  ),
                  test_id_source: (
                    if . == 1 then "first-tests"
                    else "rerun-test-suite-\(. - 1)"
                    end
                  )
                }
              ]
            }
          ')
          echo "matrix=$MATRIX" >> $GITHUB_OUTPUT

  # 动态生成的重跑作业
  rerun-test-suite:
    needs: [generate-rerun-matrix, first-tests, first-tests-results]
    strategy:
      matrix:
        include: ${{ fromJSON(needs.generate-rerun-matrix.outputs.matrix).reruns }}
    name: 重跑测试套件 ${{ matrix.index }}
    runs-on: ${{ inputs.runner-tag }}
    outputs:
      test-id: ${{ steps.rerun-suite.outputs.test-id }}
      result-failed: ${{ steps.rerun-suite.outputs.result-failed }}
    # 动态设置依赖:第一次重跑依赖初始结果分析,后续依赖上一次重跑作业
    needs:
      - ${{ matrix.depends_on }}
      - ${{ matrix.test_id_source }}
    # 动态设置执行条件:仅当依赖作业结果失败且测试源作业成功时执行
    if: |
      ${{
        needs[matrix.depends_on].outputs.result-failed == 'true' &&
        needs[matrix.test_id_source].result == 'success'
      }}
    steps:
      - name: 执行重跑测试套件
        id: rerun-suite
        uses: ./.github/actions/rerun-test-suite
        with:
          failed-test-id: ${{ needs[matrix.test_id_source].outputs.test-id }}
          runner-tag: ${{ inputs.runner-tag }}

  # 最终分析步骤(所有重跑完成后执行)
  final-analysis:
    needs: [first-tests-results, rerun-test-suite]
    if: always()
    runs-on: ${{ inputs.runner-tag }}
    steps:
      - name: 汇总所有测试结果分析
        run: |
          echo "所有测试及重跑完成,开始最终分析"
        shell: bash

核心优势

  • 无代码重复:通过复合步骤封装重跑和分析逻辑,工作流中仅需调用一次
  • 动态重跑次数:通过rerun-count输入参数控制重跑次数,支持1到99次任意配置
  • 依赖与条件自动控制:每个重跑作业自动继承上一次的依赖关系和执行条件,无需手动维护
  • 符合工作流深度限制:所有作业均为平级依赖,不会触发嵌套工作流的深度限制

内容的提问来源于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 07:09:57