You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Cloud Build CI管道数据库连接失败求助:测试阶段报错ENOENT

Cloud Build CI管道数据库连接失败排查求助

构建日志最后部分

...
Step #3 - "tests": webpack compiled successfully
Step #3 - "tests": [ info ]  running tests...
Step #3 - "tests": 
Step #3 - "tests":    connect ENOENT /cloudsql/w121-cms:europe-west1:w121/.s.PGSQL.5432
Step #3 - "tests":   
Step #3 - "tests": 
Finished Step #3 - "tests"
ERROR
ERROR: build step 3 "gcr.io/cloud-builders/npm" failed: step exited with non-zero status: 1

构建脚本(cloudbuild.yaml)

steps:
  - id: install
    name: 'gcr.io/cloud-builders/npm'
    args: ['install']

  - id: lint
    name: 'gcr.io/cloud-builders/npm'
    args: ['run', 'lint']

  - id: proxy-install
    name: 'gcr.io/cloud-builders/npm'
    entrypoint: sh
    args:
      - -c
      - 'wget -O /workspace/cloud_sql_proxy https://dl.google.com/cloudsql/cloud_sql_proxy.linux.386 &&  chmod +x /workspace/cloud_sql_proxy'

  - id: tests
    name: 'gcr.io/cloud-builders/npm'
    timeout: 100s
    entrypoint: sh
    args:
      - -c
      - '(/workspace/cloud_sql_proxy $PROJECT_ID:europe-west1:w121 & sleep 2) && npm run ci:test'
    env:
      - 'NODE_ENV=test'
      - 'DB_CONNECTION=pg'
      - 'PG_HOST=/cloudsql/$PROJECT_ID:europe-west1:w121'
      - 'PG_PORT=5432'
      - 'PG_USER=postgres'
      - 'PG_DB_NAME=testing'
      - others ...
    secretEnv: ['PG_PASSWORD', 'APP_KEY']

availableSecrets:
  secretManager:
    - env: 'PG_PASSWORD'
      versionName: projects/$PROJECT_ID/secrets/PG_PASSWORD/versions/1
    - env: 'APP_KEY'
      versionName: projects/$PROJECT_ID/secrets/APP_KEY/versions/1

已完成的检查项

连接参数

DB_CONNECTION、PG_HOST、PG_PORT和PG_USER与另一个正常运行的构建脚本完全一致,日志显示$PROJECT_ID已正确解析,且Postgres实例中确实存在testing数据库。

服务账号权限

执行命令:

gcloud projects get-iam-policy $PROJECTNUM

确认构建账号已具备以下权限:

bindings:
- members:
  - serviceAccount:610825299606@cloudbuild.gserviceaccount.com
  role: roles/cloudbuild.builds.builder
- members:
  - serviceAccount:service-610825299606@gcp-sa-cloudbuild.iam.gserviceaccount.com
  role: roles/cloudbuild.serviceAgent
- members:
  - serviceAccount:610825299606@cloudbuild.gserviceaccount.com
  role: roles/cloudsql.client
- members:
  - serviceAccount:610825299606-compute@developer.gserviceaccount.com
  - serviceAccount:610825299606@cloudbuild.gserviceaccount.com
  role: roles/secretmanager.secretAccessor

网络访问

CD脚本中使用gcr.io/google-appengine/exec-wrapper及相同连接变量可成功对同一数据库实例执行迁移。当前尝试通过Cloud SQL Proxy隧道连接,而非构建推送容器运行,避免为每个PR生成构建产物。

排查建议

  1. 验证Cloud SQL Proxy是否成功启动
    在测试步骤中增加日志输出,确认代理进程是否正常运行:

    (/workspace/cloud_sql_proxy $PROJECT_ID:europe-west1:w121 > proxy.log 2>&1 & sleep 5) && cat proxy.log && npm run ci:test
    

    查看proxy.log中的错误信息,比如权限问题或实例地址错误。

  2. 检查套接字目录权限
    Cloud SQL Proxy需要对/cloudsql目录有读写权限,在测试步骤前添加目录检查:

    mkdir -p /cloudsql && chmod 777 /cloudsql && (/workspace/cloud_sql_proxy $PROJECT_ID:europe-west1:w121 & sleep 5) && npm run ci:test
    

    确保代理能创建套接字文件。

  3. 延长代理启动等待时间
    当前sleep 2可能不足以让代理完成初始化,改为sleep 5或更长时间,避免测试进程在代理就绪前尝试连接。

  4. 使用TCP连接替代Unix套接字
    临时修改测试步骤,让代理监听TCP端口,验证是否是套接字问题:

    (/workspace/cloud_sql_proxy -instances=$PROJECT_ID:europe-west1:w121=tcp:5432 & sleep 5) && npm run ci:test
    

    同时修改PG_HOST=127.0.0.1,如果连接成功,说明Unix套接字配置存在问题。

  5. 确认Cloud SQL实例状态
    检查目标Postgres实例是否处于运行状态,是否有维护窗口导致不可访问,可通过GCP控制台或命令行确认:

    gcloud sql instances describe w121
    

内容的提问来源于stack exchange,提问作者Jannie Theunissen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 19:20:30