如何让GitHub Actions中的子任务分别依赖矩阵中的每个独立任务?
如何让GitHub Actions中的子任务分别依赖矩阵中的每个独立任务?
这个需求我之前配置Workflow的时候也碰到过,一开始用第二个矩阵确实会等第一个矩阵所有任务跑完才启动,后来发现其实不用把逻辑塞进原矩阵的步骤里,有两种比较优雅的方法来实现每个子任务单独依赖对应矩阵实例的效果:
方法一:动态依赖的子矩阵(推荐灵活场景)
如果你的版本数量可能变化或者比较多,推荐用这种方法,通过动态生成依赖的任务ID来让每个子矩阵实例只等待对应的原矩阵实例完成:
name: Matrix with Per-Instance Dependencies jobs: example_matrix: runs-on: ubuntu-latest strategy: matrix: version: [10, 12, 14] steps: - uses: actions/setup-node@v3 with: node-version: ${{ matrix.version }} - name: 验证Node版本 run: node --version sub_job: runs-on: ubuntu-latest # 核心:动态指定依赖的原矩阵实例ID needs: ["example_matrix-${{ matrix.version }}"] strategy: matrix: version: [10, 12, 14] steps: - name: 执行Node ${{ matrix.version }}的子任务 run: echo "正在处理Node版本${{ matrix.version }}的后续任务"
这里的关键是needs: ["example_matrix-${{ matrix.version }}"],它会根据当前子矩阵的版本,自动拼接出对应的原矩阵实例ID(比如example_matrix-10),GitHub Actions会识别这个动态ID,确保只有对应的原矩阵任务完成后,才会启动这个子任务,完全不用等其他原矩阵实例结束。
方法二:逐个定义子任务(适合固定少量版本)
如果你的版本数量固定且不多,也可以直接逐个定义子任务,每个子任务明确指定依赖对应的原矩阵实例:
name: Matrix with Named Per-Instance Dependencies jobs: example_matrix: runs-on: ubuntu-latest strategy: matrix: version: [10, 12, 14] steps: - uses: actions/setup-node@v3 with: node-version: ${{ matrix.version }} - name: 验证Node版本 run: node --version # 每个子任务对应一个原矩阵实例 sub10: runs-on: ubuntu-latest needs: example_matrix-version-10 steps: - name: 执行Node 10的子任务 run: echo "正在处理Node版本10的后续任务" sub12: runs-on: ubuntu-latest needs: example_matrix-version-12 steps: - name: 执行Node 12的子任务 run: echo "正在处理Node版本12的后续任务" sub14: runs-on: ubuntu-latest needs: example_matrix-version-14 steps: - name: 执行Node 14的子任务 run: echo "正在处理Node版本14的后续任务"
这种方法的好处是子任务名字更直观(比如sub10),但缺点是如果后续要新增版本,需要手动添加对应的子任务,灵活性不如第一种方法。
备注:内容来源于stack exchange,提问作者Joey Yi Zhao
相关产品推荐
相关产品推荐

