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

如何用单个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

请问是否可以通过单个工作流实现上述需求?

解决方案

完全可以通过单个工作流实现需求,以下是具体实现方案:

核心思路

  1. 设置工作流触发条件,监听master分支的PR合并事件,并匹配所有目标文件夹的路径变更
  2. 在工作流中自动检测本次PR合并涉及的所有变更文件夹
  3. 利用矩阵遍历每个变更的文件夹,调用复用的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 00:48:27