使用google-devtools-cloudbuild触发构建时遇实体未找到错误求助
问题描述
我从google-cloud-node的示例库中直接获取代码,已配置好ADC(应用默认凭据),账号拥有Owner权限及所有Cloud Build权限,同一账号能通过gcloud submit build创建构建。我从Cloud Build触发器页面的URL中获取了触发器UUID,且手动在GCP控制台运行构建时确认发送的payload完全一致,但运行以下代码时遇到NOT_FOUND错误:
export default async function cloudBuild( projectId = "myprojectId", // 你的Google Cloud项目ID triggerId = "75aaeefc-0b11-4ce8-b285-cc066ceffc77", // 构建触发器的UUID commitSha = "c13a9a2d500bec8680d3bb5a064c7dc72db31a90" // 要运行构建对应的提交SHA ) { // 导入Google Cloud客户端库 // 创建客户端 const cb = new CloudBuildClient(); // 针对指定提交启动构建 const [resp] = await cb.runBuildTrigger({ projectId, triggerId, source: { commitSha, }, }); console.info(`triggered build for ${triggerId}`); const [build] = await resp.promise(); }
错误信息
Error: 5 NOT_FOUND: Requested entity was not found. at callErrorFromStatus (/Users/jambrose/Apps/deploy_server/node_modules/@grpc/grpc-js/src/call.ts:81:17) at Object.onReceiveStatus (/Users/jambrose/Apps/deploy_server/node_modules/@grpc/grpc-js/src/client.ts:356:55) at Object.onReceiveStatus (/Users/jambrose/Apps/deploy_server/node_modules/@grpc/grpc-js/src/client-interceptors.ts:455:34) at Object.onReceiveStatus (/Users/jambrose/Apps/deploy_server/node_modules/@grpc/grpc-js/src/client-interceptors.ts:417:48) at /Users/jambrose/Apps/deploy_server/node_modules/@grpc/grpc-js/src/resolving-call.ts:111:24 at processTicksAndRejections (node:internal/process/task_queues:78:11) for call at { code: 5, details: 'Requested entity was not found.', metadata: Metadata { internalRepr: Map(2) { 'endpoint-load-metrics-bin' => [Array], 'grpc-server-stats-bin' => [Array] }, options: {} } }
更新记录
- 更新1:怀疑是认证问题,测试
Storage.listBuckets({ keyFilename: "key-file.json" })并成功返回结果,说明密钥文件有效,服务账号已激活。 - 更新2:查看runBuildTrigger示例代码时,注释提到触发器名称格式为
projects/{project}/locations/{location}/triggers/{trigger},但示例请求未包含name字段。
解决方案
这个NOT_FOUND错误核心原因是触发器的区域信息缺失。Cloud Build触发器属于区域资源(默认如us-central1),如果请求中未指定区域,API无法定位到目标触发器。
你可以通过以下两种方式修改代码:
方式1:添加区域字段
先在GCP控制台的触发器详情页确认触发器所在区域(如us-central1),然后在请求中补充location参数:
const [resp] = await cb.runBuildTrigger({ projectId, triggerId, location: "us-central1", // 替换为你的触发器实际区域 source: { commitSha, }, });
方式2:使用完整触发器名称
直接传入符合格式的完整触发器名称,替代projectId+triggerId的组合:
const [resp] = await cb.runBuildTrigger({ name: `projects/${projectId}/locations/us-central1/triggers/${triggerId}`, // 替换区域 source: { commitSha, }, });
额外验证点:
- 确认触发器所属项目与代码中
projectId一致 - 确认
commitSha对应的代码仓库与触发器配置的仓库匹配
内容的提问来源于stack exchange,提问作者jambrose
相关产品推荐
相关产品推荐

