动态JSON矩阵中如何排除指定值以跳过build-dot作业?
解决GitHub Actions动态矩阵排除nodejs项目不生效的问题
当动态生成的JSON矩阵用exclude字段无法跳过nodejs类型项目时,可通过以下几种可靠方式实现需求:
1. 生成动态矩阵时直接过滤nodejs项
在生成矩阵的步骤中,用工具(如jq)提前过滤掉project=nodejs的条目,从根源避免这类项进入矩阵。示例Workflow代码:
jobs: generate-matrix: runs-on: ubuntu-latest outputs: matrix: ${{ steps.filter-matrix.outputs.matrix }} steps: - id: filter-matrix run: | # 替换为你的原始矩阵JSON获取逻辑,示例用硬编码JSON raw_matrix='[{"project": "dotnet", "path": "src/dotnet-api"}, {"project": "nodejs", "path": "src/node-app"}, {"project": "dotnet", "path": "src/dotnet-service"}]' # 用jq过滤掉project为nodejs的项 filtered_matrix=$(echo "$raw_matrix" | jq '[.[] | select(.project != "nodejs")]') echo "matrix=$filtered_matrix" >> "$GITHUB_OUTPUT" build-dot: needs: generate-matrix runs-on: ubuntu-latest strategy: matrix: ${{ fromJson(needs.generate-matrix.outputs.matrix) }} steps: - name: Build .NET project run: dotnet build ${{ matrix.path }}
2. 在作业级别添加执行条件
如果需要保留完整矩阵结构但跳过nodejs任务的执行,可在build-dot作业中添加if条件判断,直接跳过不符合要求的项:
jobs: build-dot: runs-on: ubuntu-latest strategy: matrix: ${{ fromJson(your_dynamic_matrix_source) }} # 仅当project不是nodejs时执行作业 if: ${{ matrix.project != 'nodejs' }} steps: - name: Build .NET project run: dotnet build ${{ matrix.path }}
3. 修正exclude字段的使用方式
若坚持使用exclude,需确保字段匹配完全正确——矩阵中的键和exclude中的键必须一致,且include和exclude需配合使用(动态矩阵通常用include引入):
jobs: build-dot: runs-on: ubuntu-latest strategy: matrix: include: ${{ fromJson(your_dynamic_matrix_source) }} exclude: - project: nodejs steps: - name: Build .NET project run: dotnet build ${{ matrix.path }}
注:这种方式在部分动态矩阵场景下可能因生成顺序问题失效,前两种方法更稳定。
内容的提问来源于stack exchange,提问作者Andrei Mironenko
相关产品推荐
相关产品推荐

