如何配置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
相关产品推荐
相关产品推荐

