使用Cloud Build部署含私有依赖的Cloud Function时遇权限错误
解决Cloud Build部署Cloud Function拉取GitHub私有仓库权限问题
核心原因
gcloud functions deploy 默认会将源码上传至GCS,随后Cloud Functions的独立构建服务会重新拉取源码并执行npm install——这个过程不会继承Cloud Build步骤中配置的SSH密钥环境,导致拉取私有仓库时权限失败。而你单独执行的npm install/git clone是在Cloud Build的容器环境中完成的,密钥配置生效,因此能成功。
可行解决思路
1. 跳过deploy阶段的重新构建,直接部署已安装好依赖的代码
在Cloud Build中先完成SSH配置、npm install(确保私有依赖安装完成),然后执行deploy时添加--no-build参数,让命令直接使用当前目录下已构建好的代码(包括node_modules):
# cloudbuild.yaml 示例步骤 steps: # 1. 从Secret Manager获取SSH密钥并配置 - name: 'gcr.io/cloud-builders/gcloud' entrypoint: 'bash' args: - '-c' - | gcloud secrets versions access latest --secret=github-ssh-key > /root/.ssh/id_rsa chmod 600 /root/.ssh/id_rsa ssh-keyscan github.com >> /root/.ssh/known_hosts # 2. 安装所有依赖(包括私有仓库) - name: 'node:18' args: ['npm', 'install'] # 3. 部署函数,跳过重新构建 - name: 'gcr.io/cloud-builders/gcloud' args: - 'functions' - 'deploy' - 'YOUR_FUNCTION_NAME' - '--runtime' - 'nodejs18' - '--trigger-http' - '--source' - '.' - '--no-build'
2. 改用HTTPS+GitHub个人访问令牌(PAT)认证私有依赖
避免SSH环境继承问题,将package.json中的私有依赖URL替换为HTTPS格式,用GitHub PAT做认证:
- 先在GitHub生成具有
repo权限的PAT,存入Secret Manager(命名为github-pat) - 在Cloud Build步骤中替换package.json的依赖地址:
steps: - name: 'gcr.io/cloud-builders/gcloud' entrypoint: 'bash' args: - '-c' - | PAT=$(gcloud secrets versions access latest --secret=github-pat) sed -i "s/git+ssh:\/\/git@github.com\/foo\/my_private_repo.git/git+https:\/\/$PAT@github.com\/foo\/my_private_repo.git/g" package.json - name: 'node:18' args: ['npm', 'install'] - name: 'gcr.io/cloud-builders/gcloud' args: - 'functions' - 'deploy' - 'YOUR_FUNCTION_NAME' - '--runtime' - 'nodejs18' - '--trigger-http' - '--source' - '.'
3. 验证排查步骤
- 在Cloud Build的deploy步骤前,添加
ls -la node_modules/@foo命令,确认私有依赖已成功安装 - 检查Cloud Build服务账号是否具有Secret Manager的访问权限
- 确认
--source参数指向的目录包含完整的node_modules和源码文件
内容的提问来源于stack exchange,提问作者ta539tg70
相关产品推荐
相关产品推荐

