如何在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-matrixJob通过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
相关产品推荐
相关产品推荐

