单仓库多项目场景下GitHub Actions的配置问题咨询
问题1解答:可配置仅指定文件变更时触发工作流
GitHub Actions的push、pull_request触发规则原生支持paths和paths-ignore过滤规则,你可以按语言目录配置触发规则,实现只有对应目录下的文件发生变更时,才启动对应语言的构建任务,也可以排除不需要触发构建的非代码文件(如README、LICENSE等)。
参考配置片段如下:
name: Rust 项目构建 on: push: paths: # 仅rust目录下文件变更时触发 - 'rust/**' paths-ignore: # 排除所有markdown、LICENSE文件的变更 - '**/*.md' - '**/LICENSE-*' pull_request: paths: - 'rust/**' paths-ignore: - '**/*.md' - '**/LICENSE-*'
Go、Node语言的工作流修改对应路径匹配规则即可。
问题2解答:同语言所有项目可共用同一套工作流,无需单独配置
你可以通过「变更目录检测+矩阵构建」的方式实现同语言所有项目复用一套工作流,同时还能做到仅构建本次变更涉及的子项目,不会同语言全量构建。
完整的Rust通用工作流参考如下:
name: Rust 项目通用构建 on: push: paths: - 'rust/**' paths-ignore: - '**/*.md' - '**/LICENSE-*' jobs: # 第一步:提取本次变更涉及的Rust子项目路径 get-changed-rust-projects: runs-on: ubuntu-latest outputs: projects: ${{ steps.get-projects.outputs.projects }} steps: - uses: actions/checkout@v4 with: fetch-depth: 2 - id: get-projects run: | # 提取rust目录下有变更的一级子项目路径 changed_dirs=$(git diff --name-only HEAD~1 HEAD | grep '^rust/' | awk -F/ '{print $1"/"$2}' | sort | uniq) # 转换为矩阵可识别的JSON数组 echo "projects=$(echo "$changed_dirs" | jq -R -s -c 'split("\n")[:-1]')" >> $GITHUB_OUTPUT # 第二步:按项目矩阵并行执行构建测试 build-rust-projects: needs: get-changed-rust-projects runs-on: ubuntu-latest strategy: matrix: project: ${{ fromJson(needs.get-changed-rust-projects.outputs.projects) }} steps: - uses: actions/checkout@v4 - name: 安装 Rust 稳定版工具链 uses: dtolnay/rust-toolchain@stable - name: 执行测试与构建 # 自动切换到对应子项目目录执行命令 working-directory: ${{ matrix.project }} run: | cargo test cargo build
Go、Node的通用工作流只需修改路径匹配规则、工具链安装步骤和对应的执行命令即可,整套方案只需为每种语言维护1个工作流文件,不需要为每个子项目单独配置。
内容的提问来源于stack exchange,提问作者Naftuli Kay
相关产品推荐
相关产品推荐

