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

如何在Monorepo中高效管理大量GitHub Actions工作流?

Monorepo部署工作流优化方案

核心思路:复用工作流模板 + 动态参数判断

通过拆分通用部署逻辑为可复用模板,分别处理PR自动触发和手动触发场景,既解决文件冗余问题,又满足两种触发需求。

1. 编写通用核心部署工作流

创建可被调用的核心工作流文件(如.github/workflows/_deploy-core.yml),封装所有项目通用的部署步骤,接收project和environment作为参数:

name: Deploy Core
on:
  workflow_call:
    inputs:
      project:
        required: true
        type: string
      environment:
        required: true
        type: string
        default: test

jobs:
  deploy:
    runs-on: ubuntu-latest
    environment: ${{ inputs.environment }}
    steps:
      - uses: actions/checkout@v4
      - name: Set up Node.js
        uses: actions/setup-node@v4
        with:
          node-version: 20
      - name: Cache dependencies
        uses: actions/cache@v3
        with:
          path: ./${{ inputs.project }}/node_modules
          key: ${{ runner.os }}-npm-${{ hashFiles('./${{ inputs.project }}/package-lock.json') }}
      - name: Install dependencies
        working-directory: ./${{ inputs.project }}
        run: npm install
      - name: Build project
        working-directory: ./${{ inputs.project }}
        run: npm run build
      - name: Deploy to target environment
        working-directory: ./${{ inputs.project }}
        run: ./deploy.sh ${{ inputs.environment }}

2. 实现PR合并自动触发工作流

创建自动触发工作流(如.github/workflows/deploy-auto.yml),监听PR合并事件,通过目标分支判断环境、文件变更路径判断项目,自动调用核心工作流:

name: Auto Deploy on PR Merge
on:
  pull_request:
    types: [closed]
    branches: [develop, main]
    paths:
      - 'api/**'
      - 'frontend/**'

jobs:
  determine-targets:
    runs-on: ubuntu-latest
    outputs:
      projects: ${{ steps.set-projects.outputs.projects }}
      environment: ${{ steps.set-env.outputs.environment }}
    steps:
      - uses: actions/checkout@v4
        with:
          fetch-depth: 2

      - name: Set environment from target branch
        id: set-env
        run: |
          if [ "${{ github.base_ref }}" = "develop" ]; then
            echo "environment=test" >> $GITHUB_OUTPUT
          elif [ "${{ github.base_ref }}" = "main" ]; then
            echo "environment=prod" >> $GITHUB_OUTPUT
          fi

      - name: Detect modified projects
        id: set-projects
        run: |
          modified_files=$(git diff --name-only HEAD^ HEAD)
          projects=()
          
          # 扫描API项目目录
          for dir in api/*; do
            project_name=$(basename $dir)
            if echo "$modified_files" | grep -q "^api/$project_name/"; then
              projects+=("$project_name")
            fi
          done
          
          # 扫描前端项目目录
          for dir in frontend/*; do
            project_name=$(basename $dir)
            if echo "$modified_files" | grep -q "^frontend/$project_name/"; then
              projects+=("$project_name")
            fi
          done
          
          # 输出为JSON数组供矩阵使用
          echo "projects=$(printf '%s\n' "${projects[@]}" | jq -R . | jq -s .)" >> $GITHUB_OUTPUT

  deploy:
    needs: determine-targets
    if: ${{ needs.determine-targets.outputs.projects != '[]' }}
    strategy:
      matrix:
        project: ${{ fromJson(needs.determine-targets.outputs.projects) }}
    uses: ./.github/workflows/_deploy-core.yml
    with:
      project: ${{ matrix.project }}
      environment: ${{ needs.determine-targets.outputs.environment }}
    secrets: inherit

3. 配置手动触发工作流

创建手动触发工作流(如.github/workflows/deploy-manual.yml),通过workflow_dispatch提供项目和环境选择项,调用核心工作流:

name: Manual Deploy
on:
  workflow_dispatch:
    inputs:
      project:
        description: '选择要部署的项目'
        required: true
        type: choice
        options:
          - api-project-1
          - api-project-2
          - frontend-project-1
          - frontend-project-2
          # 补充所有API和前端项目名称
      environment:
        description: '选择部署环境'
        required: true
        type: choice
        options:
          - test
          - prod

jobs:
  deploy:
    uses: ./.github/workflows/_deploy-core.yml
    with:
      project: ${{ inputs.project }}
      environment: ${{ inputs.environment }}
    secrets: inherit

额外优化建议

  • 统一环境配置:将test/prod环境的部署地址、密钥等配置存到GitHub仓库的「环境变量」中,避免工作流硬编码。
  • 错误告警:在核心工作流末尾添加失败通知步骤(如Slack消息),统一处理部署失败的告警逻辑。
  • 版本控制:核心工作流的变更通过PR审核,确保部署逻辑的一致性和安全性。

内容的提问来源于stack exchange,提问作者lpetrucci

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 19:01:29