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生成构建产物。
排查建议
验证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中的错误信息,比如权限问题或实例地址错误。检查套接字目录权限
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确保代理能创建套接字文件。
延长代理启动等待时间
当前sleep 2可能不足以让代理完成初始化,改为sleep 5或更长时间,避免测试进程在代理就绪前尝试连接。使用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套接字配置存在问题。确认Cloud SQL实例状态
检查目标Postgres实例是否处于运行状态,是否有维护窗口导致不可访问,可通过GCP控制台或命令行确认:gcloud sql instances describe w121
内容的提问来源于stack exchange,提问作者Jannie Theunissen
相关产品推荐
相关产品推荐

