GitLab CI运行google-cloud-sdk的Datastore模拟器报错如何解决
修复GitLab CI中Datastore Emulator运行错误的方案
问题根因
- 端口不匹配:服务启动时监听8080端口,但全局环境变量中配置的Datastore访问端口为8081,两端端口不一致
- 域名解析异常:未给service指定别名,GitLab Runner生成的默认hostname与配置中使用的
google-cloud-sdk不匹配 - 项目ID配置未生效:模拟器初始化日志显示使用的是GitLab Runner自动生成的项目ID,而非指定的
project-007,和业务代码使用的项目ID不一致 - 健康检查失败:
google/cloud-sdk镜像默认未声明暴露8080端口,GitLab Runner的健康检查逻辑无法找到待检测的端口,直接报错
方案1:调整现有Service配置
修改现有配置中的错误项即可修复,调整后的核心配置如下:
# 修改全局环境变量,统一端口为8080 variables: DATASTORE_DATASET: project-007 DATASTORE_EMULATOR_HOST: google-cloud-sdk:8080 DATASTORE_EMULATOR_HOST_PATH: google-cloud-sdk:8080/datastore DATASTORE_HOST: http://google-cloud-sdk:8080 DATASTORE_PROJECT_ID: project-007 test: services: - name: google/cloud-sdk:latest alias: google-cloud-sdk # 显式指定服务hostname,和环境变量保持一致 command: ["gcloud", "beta", "emulators", "datastore", "start", "--host-port", "0.0.0.0:8080", "--project", "project-007", "--no-store-on-disk", "--consistency", "1.0"] variables: CLOUDSDK_CORE_PROJECT: project-007 script: # 新增端口等待步骤,避免模拟器未完全启动就运行测试 - apt-get update && apt-get install -y netcat - while ! nc -z google-cloud-sdk 8080; do sleep 1; done - make test
方案2:更稳妥的Job内直接运行模拟器
无需依赖GitLab Service机制,直接在测试Job内部安装启动模拟器,可控性更高,不会出现健康检查相关问题,配置参考如下:
test: before_script: # 安装基础依赖与Google Cloud SDK - apt-get update && apt-get install -y ffmpeg make apt-transport-https ca-certificates gnupg curl netcat - echo "deb [signed-by=/usr/share/keyrings/cloud.google.gpg] https://packages.cloud.google.com/apt cloud-sdk main" | tee -a /etc/apt/sources.list.d/google-cloud-sdk.list - curl https://packages.cloud.google.com/apt/doc/apt-key.gpg | gpg --dearmor -o /usr/share/keyrings/cloud.google.gpg - apt-get update && apt-get install -y google-cloud-cli google-cloud-cli-datastore-emulator # 原有Python环境配置步骤 - python --version - cd backend - python -m pip install -r dev-requirements.txt # 后台启动Datastore模拟器,日志写入文件方便排查问题 - gcloud beta emulators datastore start --host-port 0.0.0.0:8080 --project project-007 --no-store-on-disk --consistency 1.0 > emulator.log 2>&1 & # 等待模拟器启动完成 - while ! nc -z localhost 8080; do sleep 1; done # 加载模拟器环境变量,自动配置业务代码需要的Datastore连接参数 - $(gcloud beta emulators datastore env-init) script: - make test
内容的提问来源于stack exchange,提问作者Miki Tebeka
相关产品推荐
相关产品推荐

