简化Cloud Build获取GitHub Git历史命令,适配分支合并与手动部署
优化Cloud Build中NX单体仓库的Git历史获取配置
问题背景
需要在Cloud Build中获取完整Git历史,用于检测NX单体仓库中哪些应用发生了变更。当前配置包含冗余的Git分支操作,希望简化命令,同时适配main分支合并触发构建和手动部署两种场景。
当前冗余配置如下:
steps: - id: 'create github ssh configurations' name: 'gcr.io/cloud-builders/git' secretEnv: ['SSH_KEY'] entrypoint: 'bash' args: - -c - | echo "$$SSH_KEY" >> /root/.ssh/id_rsa chmod 400 /root/.ssh/id_rsa cp known_hosts.github /root/.ssh/known_hosts git config --global user.email "a@b.com" volumes: - name: 'ssh' path: /root/.ssh - id: 'fetch more history' name: 'gcr.io/cloud-builders/git' script: | #!/usr/bin/env bash git remote set-url origin git@github.com:<user>/<repo>.git git fetch git checkout -b deploy-branch git add -A git commit -m "dep commit" git checkout main git pull git checkout deploy-branch git rebase main -X theirs volumes: - name: 'ssh' path: /root/.ssh - other steps availableSecrets: secretManager: - versionName: projects/<>/secrets/<>/versions/latest env: 'SSH_KEY'
优化方案
核心优化思路
- 移除所有冗余的分支创建、提交、变基操作:Cloud Build触发时已处于目标分支(main或手动指定分支),无需额外分支操作。
- 仅保留必要的Git历史拉取操作,确保NX能获取足够的提交来检测变更。
- 添加分支判断逻辑,兼容手动部署场景。
优化后的完整配置
steps: - id: '配置GitHub SSH访问' name: 'gcr.io/cloud-builders/git' secretEnv: ['SSH_KEY'] entrypoint: 'bash' args: - -c - | mkdir -p /root/.ssh echo "$SSH_KEY" > /root/.ssh/id_rsa chmod 400 /root/.ssh/id_rsa cp known_hosts.github /root/.ssh/known_hosts git config --global user.email "a@b.com" volumes: - name: 'ssh' path: /root/.ssh - id: '拉取完整Git历史' name: 'gcr.io/cloud-builders/git' script: | #!/usr/bin/env bash # 切换为SSH远程地址(替换为你的仓库地址) git remote set-url origin git@github.com:<user>/<repo>.git # 将浅克隆转为完整克隆,确保获取所有历史提交 git fetch --unshallow --tags # 手动部署时,若当前分支不是main,拉取main分支的远程引用用于变更对比 if [[ "$BRANCH_NAME" != "main" ]]; then git fetch origin main:refs/remotes/origin/main fi volumes: - name: 'ssh' path: /root/.ssh # 后续NX变更检测步骤示例 - id: '检测NX变更应用' name: 'node:18' script: | #!/usr/bin/env bash npm install -g nx # 根据场景选择对应的affected命令 if [[ "$BRANCH_NAME" == "main" ]]; then # main分支合并触发:对比当前提交与上一个提交的变更 nx affected:apps --base=HEAD~1 --head=HEAD else # 手动部署:对比当前分支与main分支的变更 nx affected:apps --base=origin/main --head=HEAD fi availableSecrets: secretManager: - versionName: projects/<>/secrets/<>/versions/latest env: 'SSH_KEY'
配置说明
- SSH配置步骤:简化了目录创建逻辑,确保
.ssh目录存在,避免潜在报错。 - Git历史拉取步骤:
git fetch --unshallow:解决Cloud Build默认浅克隆的问题,获取完整仓库历史,满足NX变更检测的需求。- 分支判断逻辑:手动部署时自动拉取main分支的远程引用,方便NX对比当前分支与main的差异。
- NX变更检测步骤:根据触发场景自动选择对比基准,确保变更检测的准确性:
- main分支合并触发时,对比当前提交与上一个提交的差异。
- 手动部署时,对比当前分支与main分支的差异。
内容的提问来源于stack exchange,提问作者sev
相关产品推荐
相关产品推荐

