如何在GitHub Actions中实现全工作流级别的Matrix策略?
实现GitHub Actions全工作流级别的Matrix并行执行
要实现每个版本对应的job1+job2独立并行执行(某版本的job1完成后直接启动该版本的job2,不受其他版本影响),可以通过以下两种方式实现:
方式一:在同一工作流中优化Matrix依赖关系
如果希望在单个工作流内完成,核心是让job2的每个实例仅依赖对应版本的job1实例,而非等待所有job1实例完成。通过strategy.inherit特性可以实现这一点:
name: Single Workflow with Isolated Matrix Jobs on: push jobs: job1: runs-on: ubuntu-latest strategy: matrix: version: [10, 12, 14] steps: - name: Run job1 for version ${{ matrix.version }} run: | echo "Processing version ${{ matrix.version }} in job1" # 这里添加job1的实际业务逻辑 job2: runs-on: ubuntu-latest # 配置inherit,让job2的matrix继承job1的version,且每个实例仅依赖对应版本的job1 needs: job1 strategy: inherit: matrix: version: job1 steps: - name: Run job2 for version ${{ matrix.version }} run: | echo "Processing version ${{ matrix.version }} in job2" # 这里添加job2的实际业务逻辑
配置后,job1的三个实例会并行启动,当某版本的job1执行完成后,对应的job2实例会立即启动,无需等待其他版本的job1完成。
方式二:主工作流触发多个子工作流(真正的全工作流隔离)
如果需要完全隔离每个版本的工作流(每个版本的job1+job2作为独立的工作流运行),可以通过主工作流动态触发多个子工作流:
1. 创建子工作流文件(例如.github/workflows/sub-workflow.yml)
该文件负责单个版本的job1+job2执行:
name: Sub Workflow for Version ${{ inputs.version }} on: workflow_dispatch: inputs: version: description: 'Target version' required: true jobs: job1: runs-on: ubuntu-latest steps: - name: Run job1 for version ${{ inputs.version }} run: | echo "Processing version ${{ inputs.version }} in job1" # 这里添加job1的实际业务逻辑 job2: runs-on: ubuntu-latest needs: job1 steps: - name: Run job2 for version ${{ inputs.version }} run: | echo "Processing version ${{ inputs.version }} in job2" # 这里添加job2的实际业务逻辑
2. 创建主工作流文件(例如.github/workflows/main-workflow.yml)
主工作流在push事件触发时,遍历版本列表,逐个触发子工作流:
name: Main Workflow to Trigger Sub Workflows on: push jobs: trigger-sub-workflows: runs-on: ubuntu-latest strategy: matrix: version: [10, 12, 14] steps: - name: Trigger sub workflow for version ${{ matrix.version }} uses: actions/github-script@v6 with: script: | await github.rest.actions.createWorkflowDispatch({ owner: context.repo.owner, repo: context.repo.repo, workflow_id: 'sub-workflow.yml', ref: context.sha, inputs: { version: '${{ matrix.version }}' } })
这种方式下,每个版本的job1+job2会作为独立的工作流运行,彼此完全隔离。子工作流的job2仅依赖自身的job1,某个版本的工作流执行进度完全不受其他版本影响。
内容的提问来源于stack exchange,提问作者Alexander Kondratskiy
相关产品推荐
相关产品推荐

