Cloud Build无法拉取Git子模块的问题求助
解决Cloud Build拉取Git子模块失败的问题
问题背景
配置了指向GitHub仓库的Cloud Build触发器,选择「Cloud Build配置文件(yaml或json)」选项。仓库包含Git子模块,但Cloud Build默认不会拉取子模块,导致用构建出的Docker镜像创建Compute VM后出现以下报错:
DEFAULT 2023-05-22T01 [resource.labels.instanceId: XXX-build] ImportError: cannot import name 'mysubmodule' from 'mysubmodule' (unknown location)
尝试两种方案均失败:
- 将子模块路径改为SSH格式,问题未解决
- 在cloudbuild.yaml中添加git命令时因参数格式错误报错,错误配置如下:
执行时报错:- name: "gcr.io/cloud-builders/git" args: - submodule update --init --recursiveStep #0: git: 'submodule update --init --recursive' is not a git command. See 'git --help'.
相关问题已在Google问题工单(编号123060361)中记录。
解决方法
1. 修正git命令的参数格式
Cloud Build的gcr.io/cloud-builders/git镜像要求每个命令参数单独作为数组元素,不能将整个命令串写为单个参数。正确配置如下:
steps: # 拉取所有子模块(包括嵌套子模块) - name: 'gcr.io/cloud-builders/git' args: ['submodule', 'update', '--init', '--recursive'] # 后续构建步骤示例:Docker镜像构建 - name: 'gcr.io/cloud-builders/docker' args: ['build', '-t', 'gcr.io/[你的项目ID]/[目标镜像名]', '.']
2. 私有子模块的权限配置(若子模块为私有仓库)
如果子模块是私有GitHub仓库,需要配置SSH身份验证:
- 生成Cloud Build服务账号的SSH密钥对
- 将公钥添加到子模块仓库的「部署密钥」中,开启读取权限
- 在cloudbuild.yaml中添加SSH配置步骤(建议用Secret Manager存储私钥,避免硬编码):
steps: - name: 'gcr.io/cloud-builders/git' entrypoint: 'bash' args: - '-c' - | mkdir -p /root/.ssh # 从Secret Manager读取私钥 gcloud secrets versions access latest --secret=[你的私钥密钥名] > /root/.ssh/id_rsa chmod 600 /root/.ssh/id_rsa ssh-keyscan github.com >> /root/.ssh/known_hosts git submodule update --init --recursive # 后续构建步骤 - name: 'gcr.io/cloud-builders/docker' args: ['build', '-t', 'gcr.io/[你的项目ID]/[目标镜像名]', '.'] secrets: - kmsKeyName: projects/[你的项目ID]/locations/[区域]/keyRings/[密钥环名]/cryptoKeys/[密钥名] secretEnv: SSH_PRIVATE_KEY: [你的私钥密钥资源ID]
内容的提问来源于stack exchange,提问作者engineer-x
相关产品推荐
相关产品推荐

