如何用单个GitHub Actions工作流实现多文件夹变更触发版本发布
问题描述
我有一个包含多个文件夹(/folder_a、/folder_b……/folder_z)的代码仓库。我希望创建一个GitHub Actions工作流,当合并了包含任一文件夹代码变更的Pull Request(PR)时触发,自动创建以变更文件夹名称为前缀、附加版本号的Release(例如:若folder_a内容变更,合并后创建名为folder_a_1.0.0的Release)。
我可以为每个文件夹单独创建工作流,但因文件夹数量众多,这种方式可维护性较差(示例为复用包含发布逻辑的release.yml工作流,传入prefix参数):
name: Release folder_a on: pull_request: branches: - master paths: - "folder_a/**" permissions: contents: write jobs: release: uses: ./.github/workflows/release.yml secrets: inherit with: prefix: folder_a
请问是否可以通过单个工作流实现上述需求?
解决方案
完全可以通过单个工作流实现需求,以下是具体实现方案:
核心思路
- 设置工作流触发条件,监听
master分支的PR合并事件,并匹配所有目标文件夹的路径变更 - 在工作流中自动检测本次PR合并涉及的所有变更文件夹
- 利用矩阵遍历每个变更的文件夹,调用复用的
release.yml工作流并传入对应前缀参数
完整工作流代码
name: Multi-Folder Auto Release on: pull_request: branches: - master types: [closed] paths: - "folder_*/**" permissions: contents: write pull-requests: read jobs: # 第一步:检测本次PR变更的文件夹 detect-changed-folders: runs-on: ubuntu-latest outputs: folders: ${{ steps.extract-folders.outputs.changed_folders }} steps: - name: 拉取代码仓库 uses: actions/checkout@v4 with: fetch-depth: 0 # 需要完整提交历史来对比变更 - name: 提取变更的文件夹 id: extract-folders run: | # 获取PR的基准提交和头部提交SHA BASE_SHA=${{ github.event.pull_request.base.sha }} HEAD_SHA=${{ github.event.pull_request.head.sha }} # 对比两次提交,筛选出变更的folder_开头的文件夹,去重后转为JSON数组 CHANGED_FOLDERS=$(git diff --name-only $BASE_SHA $HEAD_SHA | grep -E '^folder_[a-z]/' | cut -d'/' -f1 | sort | uniq | jq -R . | jq -s .) echo "changed_folders=$CHANGED_FOLDERS" >> $GITHUB_OUTPUT # 第二步:针对每个变更文件夹执行发布流程 trigger-release: needs: detect-changed-folders if: github.event.pull_request.merged == true # 仅当PR合并时才执行 strategy: matrix: folder: ${{ fromJSON(needs.detect-changed-folders.outputs.folders) }} uses: ./.github/workflows/release.yml secrets: inherit with: prefix: ${{ matrix.folder }}
关键细节说明
- 触发条件优化:添加
types: [closed]确保工作流仅在PR关闭时触发,配合if: github.event.pull_request.merged == true进一步限定为合并后的场景 - 路径匹配:
paths: - "folder_*/**"匹配所有以folder_开头的文件夹下的变更,若你的文件夹命名规则不同,可调整该正则匹配 - 变更检测:通过
git diff对比PR的基准提交和头部提交,筛选出变更的文件夹,并用jq转为JSON数组供矩阵遍历使用 - 矩阵遍历:利用GitHub Actions的矩阵策略,自动为每个变更的文件夹调用
release.yml工作流,实现批量处理
注意事项
- 确保运行环境中安装了
jq(ubuntu-latest镜像默认已包含),若使用其他基础镜像需手动添加安装步骤 release.yml需能够接收prefix参数,并根据该参数生成对应格式的Release名称(例如${{ inputs.prefix }}_1.0.0)
内容的提问来源于stack exchange,提问作者Weili Gao
相关产品推荐
相关产品推荐

