如何通过GitHub Actions动态拼接目录下JSON文件生成数组合集
实现方案
核心逻辑是通过GitHub Actions监听JSON存放目录的文件变动,工作流触发时自动遍历目录下所有JSON文件,将合法内容拼接为标准JSON数组写入目标文件,存在内容变动时自动提交回仓库,完全适配目录下文件的新增、修改、删除操作。
工作流配置步骤
- 在仓库
.github/workflows/路径下新建工作流配置文件,例如命名为generate-merged-config.yml - 配置触发规则:仅当目标JSON目录下的文件发生变动时触发工作流,覆盖push、PR合入到默认分支的场景,避免无效运行
- 配置执行逻辑:拉取代码后通过原生Node脚本遍历读取JSON文件、做格式校验、拼接数组、写入目标文件,最后检查文件是否有实际变动,有变动则自动提交推送,无变动则直接结束流程
可直接使用的配置代码
name: 生成汇总JSON数组 on: push: paths: - 'configurations/**.json' # 替换为实际存放零散JSON文件的目录路径 pull_request: paths: - 'configurations/**.json' branches: [ main ] # 替换为仓库默认分支名 jobs: generate-configs: runs-on: ubuntu-latest permissions: contents: write # 给工作流开放仓库写权限,用于提交生成的文件 steps: - name: 拉取仓库代码 uses: actions/checkout@v4 with: fetch-depth: 0 - name: 配置Node运行环境 uses: actions/setup-node@v4 with: node-version: 20 - name: 遍历生成汇总JSON文件 shell: node {0} run: | const fs = require('fs'); const path = require('path'); // 配置项:可根据实际路径修改 const JSON_FILES_DIR = path.join(process.cwd(), 'configurations'); const OUTPUT_FILE_PATH = path.join(process.cwd(), 'configs.json'); // 读取目录下所有.json后缀文件,按文件名字典序排序,保证生成内容顺序稳定 const jsonFileList = fs.readdirSync(JSON_FILES_DIR) .filter(fileName => fileName.endsWith('.json')) .sort(); const mergedContentArray = []; for (const fileName of jsonFileList) { const filePath = path.join(JSON_FILES_DIR, fileName); const fileRawContent = fs.readFileSync(filePath, 'utf-8'); try { const parsedJson = JSON.parse(fileRawContent); mergedContentArray.push(parsedJson); } catch (parseErr) { throw new Error(`解析文件${fileName}失败,请检查JSON格式:${parseErr.message}`); } } // 写入格式化后的JSON内容,缩进2格便于阅读 fs.writeFileSync(OUTPUT_FILE_PATH, JSON.stringify(mergedContentArray, null, 2)); - name: 提交变动到仓库 run: | git config user.name "github-actions[bot]" git config user.email "github-actions[bot]@users.noreply.github.com" git add configs.json # 替换为实际生成的文件名 if git diff --cached --quiet; then echo "汇总文件无内容变更,跳过提交" else git commit -m "chore: 自动更新配置汇总文件" git push fi
配置说明
- 权限配置:工作流里已经显式声明了
contents: write权限,如果你的仓库默认限制了Actions权限,也可以手动到仓库设置页的Actions权限配置项中,开启工作流的读写权限,否则推送提交会失败 - 顺序稳定性:脚本对读取到的JSON文件名做了字典序排序,不会因为文件系统的随机读取顺序导致生成的汇总文件出现无意义的内容diff
- 错误校验:脚本自带JSON格式校验,只要目录下存在格式非法的JSON文件,工作流会直接报错终止,不会生成损坏的汇总文件
- 无额外依赖:整个逻辑用Node原生API实现,不需要安装第三方依赖包,运行速度快,兼容性强
- 按需修改:如果你的JSON存放目录、生成文件的路径/文件名和示例不一致,只需要修改代码里标注了配置项的对应值即可
内容的提问来源于stack exchange,提问作者bk_lounge
相关产品推荐
相关产品推荐

