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

如何在GitHub Action中解析JSON文件并循环执行任务?

从JSON文件动态生成GitHub Action Matrix并复用数据

问题背景

作为GitHub Action和YAML新手,当前工作流使用静态Matrix值,随着数据增多维护成本上升,希望通过解析repos.json文件,在多个jobs/steps中循环执行任务。

示例JSON:repos.json

{
    "github_repos": [
        {
            "repo_name": "repo1",
            "clone_repo": "template1"
        },
        {
            "repo_name": "repo2",
            "clone_repo": "template2"
        }
    ]
}

解决方案

可以通过添加一个预处理Job来读取并解析JSON文件,将其转换为GitHub Action可识别的Matrix格式,然后在后续Job中复用这份动态生成的Matrix数据,具体实现如下:

完整工作流示例

name: "GitHub Repo Create"
on:
  pull_request:
    types: [opened]
  workflow_dispatch:
permissions: write-all

jobs:
  # 预处理Job:解析JSON并生成动态Matrix
  generate-matrix:
    runs-on: ubuntu-latest
    outputs:
      repos: ${{ steps.set-matrix.outputs.repos }}
    steps:
      - name: Checkout code
        uses: actions/checkout@v3

      - name: Parse JSON to Matrix format
        id: set-matrix
        run: |
          # 使用jq将JSON数组转换为GitHub Action Matrix兼容的JSON格式
          MATRIX=$(jq -c '.github_repos' repos.json)
          # 将结果输出到GITHUB_OUTPUT供后续Job使用
          echo "repos=$MATRIX" >> $GITHUB_OUTPUT

  # 创建仓库的Job,复用动态Matrix
  create-repo:
    name: "create repo"
    runs-on: ubuntu-latest
    needs: generate-matrix
    strategy:
      fail-fast: false
      matrix:
        repo: ${{ fromJson(needs.generate-matrix.outputs.repos) }}

    steps:
      - name: Checkout code
        uses: actions/checkout@v3
          
      - name: Create Repos
        run: |
          # 访问矩阵对象中的repo_name字段
          gh repo create ${{ matrix.repo.repo_name }} --private

  # 修改仓库默认分支的Job,复用同一动态Matrix
  list-repo:
    name: "list repo"
    runs-on: ubuntu-latest
    needs: generate-matrix
    strategy:
      fail-fast: false
      matrix:
        repo: ${{ fromJson(needs.generate-matrix.outputs.repos) }}

    steps:
      - name: Checkout code
        uses: actions/checkout@v3
          
      - name: Set Default Branch
        run: |
          # 访问矩阵对象中的repo_name字段
          gh repo edit ${{ matrix.repo.repo_name }} --default-branch master

关键说明

  • 预处理Job作用:generate-matrix Job通过jq工具解析repos.json,将github_repos数组转换为JSON字符串,通过GITHUB_OUTPUT传递给后续Job。
  • Matrix复用:后续Job通过needs: generate-matrix依赖预处理Job,使用fromJson()将输出的JSON字符串转换为Matrix可用的数组。
  • 访问对象字段:因为Matrix的每个元素是JSON对象,所以需要通过${{ matrix.repo.repo_name }}来访问具体字段,替代原来的静态字符串值。
  • jq命令解释:jq -c '.github_repos' repos.json会紧凑输出github_repos数组的JSON内容,确保符合GitHub Action的Matrix格式要求。

内容的提问来源于stack exchange,提问作者Rio

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 17:07:47