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

如何配置Cloud Build仅部署仓库中更新的GCP Cloud Functions

仅部署变更的GCP Cloud Functions(单仓库架构)

下面给你几个可行的方案,都能在保持单仓库结构的前提下,避免每次全量部署所有函数:

方案1:优化Cloud Build配置实现增量部署

核心思路是通过git diff检测本次提交中变更的函数目录,只部署这些目录对应的Cloud Functions。

示例cloudbuild.yaml配置

steps:
  # 1. 安装依赖并编译TypeScript(全量编译避免依赖遗漏,若有增量编译工具可替换)
  - name: 'node:18'
    args: ['npm', 'install']
    dir: '.'
  - name: 'node:18'
    args: ['npm', 'run', 'build']
    dir: '.'

  # 2. 检测变更的函数目录
  - name: 'gcr.io/cloud-builders/git'
    entrypoint: 'bash'
    args:
      - '-c'
      - |
        # 提取本次提交变更的src下目录,去重得到函数名
        CHANGED_FUNCTIONS=$(git diff --name-only HEAD~1 HEAD | grep 'src/' | cut -d'/' -f2 | sort | uniq)
        # 处理共享代码变更:如果src/common目录有改动,部署所有函数
        if echo "$CHANGED_FUNCTIONS" | grep -q 'common'; then
          CHANGED_FUNCTIONS=$(ls -d src/*/ | cut -d'/' -f2 | grep -v 'common')
        fi
        # 将结果写入文件供后续步骤使用
        echo "$CHANGED_FUNCTIONS" > /workspace/changed_functions.txt
        echo "要部署的函数:$CHANGED_FUNCTIONS"

  # 3. 循环部署变更的函数
  - name: 'gcr.io/google.com/cloudsdktool/cloud-sdk'
    entrypoint: 'bash'
    args:
      - '-c'
      - |
        while read -r FUNC_NAME; do
          echo "开始部署函数:$FUNC_NAME"
          # 根据你的实际配置调整参数(入口点、触发器、运行时等)
          gcloud functions deploy $FUNC_NAME \
            --source=gs://[你的Cloud Source Repo存储桶]/[仓库名]/out/$FUNC_NAME \
            --entry-point=func${FUNC_NAME#func-} # 假设func-1对应入口点func1,可按需修改
            --runtime=nodejs18 \
            --trigger-http \
            --project=[你的GCP项目ID]
        done < /workspace/changed_functions.txt

注意事项

  • 确保每个函数的src/[函数名]、out/[函数名]和Cloud Functions名称一一对应
  • 如果有其他共享目录(比如src/utils),需要在检测步骤里添加类似common的判断逻辑
  • 若你的函数触发器不是HTTP,要修改--trigger-http为对应类型(比如--trigger-topic)

方案2:用GitHub Actions替代Cloud Build实现增量部署

直接在GitHub环境中完成编译和部署,无需依赖Cloud Source Repository同步,流程更简洁。

示例GitHub Actions配置(.github/workflows/deploy-functions.yml)

name: 部署变更的Cloud Functions
on:
  push:
    branches: [master]

jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
        with:
          fetch-depth: 2 # 拉取最近两次提交用于对比变更

      - name: 配置Node.js环境
        uses: actions/setup-node@v4
        with:
          node-version: '18'

      - name: 安装依赖并编译
        run: |
          npm install
          npm run build

      - name: 检测变更的函数
        id: detect-changes
        run: |
          # 提取变更的函数目录
          CHANGED_DIRS=$(git diff --name-only HEAD~1 HEAD | grep 'src/' | cut -d'/' -f2 | sort | uniq)
          # 处理共享代码变更
          if echo "$CHANGED_DIRS" | grep -q 'common'; then
            CHANGED_FUNCTIONS=$(ls -d src/*/ | cut -d'/' -f2 | grep -v 'common')
          else
            CHANGED_FUNCTIONS="$CHANGED_DIRS"
          fi
          echo "changed_functions=$CHANGED_FUNCTIONS" >> $GITHUB_OUTPUT

      - name: 认证GCP
        uses: google-github-actions/auth@v2
        with:
          credentials_json: ${{ secrets.GCP_SERVICE_ACCOUNT_KEY }}

      - name: 配置Cloud SDK
        uses: google-github-actions/setup-gcloud@v2

      - name: 部署变更的函数
        run: |
          for FUNC_NAME in ${{ steps.detect-changes.outputs.changed_functions }}; do
            echo "部署函数:$FUNC_NAME"
            gcloud functions deploy $FUNC_NAME \
              --source=./out/$FUNC_NAME \
              --entry-point=func${FUNC_NAME#func-} \
              --runtime=nodejs18 \
              --trigger-http \
              --project=[你的GCP项目ID]
          done

注意事项

  • 在GitHub仓库的「Settings > Secrets and variables > Actions」中添加GCP_SERVICE_ACCOUNT_KEY,值为GCP服务账号的JSON密钥(该账号需拥有Cloud Functions部署权限)
  • 如果仍需同步到Cloud Source Repository,可添加一个步骤执行gcloud source repos push [仓库名] --branch=master

方案3:用Monorepo工具强化增量管理

如果你的函数数量较多、依赖关系复杂,可以用Nx、Turbo等Monorepo工具:

  • 这些工具能精准追踪每个函数的依赖,仅编译变更的函数及其依赖项
  • 结合Cloud Build或GitHub Actions,直接调用工具的命令获取需要部署的函数列表,进一步优化构建和部署效率

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 23:55:23