如何在Cloud Build中启动Firebase模拟器后执行npm test测试
问题根因
- 单独步骤启动模拟器无效:Cloud Build 的每个步骤都运行在独立的隔离容器中,你单独配置一个步骤启动 Firebase 模拟器,该服务会在当前步骤结束后随容器一同销毁,后续的测试步骤根本无法访问到这个模拟器服务。
- 后台运行符不生效:你将
&直接放在了 firebase 命令的 args 参数中,这个符号会被识别为 firebase 命令的输入参数,而不是 shell 的后台运行指令,无法实现后台启动的效果,会导致当前步骤一直阻塞直到超时退出,所以你只能看到镜像拉取日志,看不到后续报错。
调整后的完整配置
steps: - name: 'gcr.io/cloud-builders/gcloud' id: MOVE-DOTENV-APP-YAML entrypoint: bash args: - '-e' - '-c' - | cp functions/util/config_dev.js functions/util/config.js cp functions/.env_dev functions/.env - name: node dir: 'functions' entrypoint: npm args: ['install'] - name: 'gcr.io/xxxx/firebase' dir: 'functions' entrypoint: bash args: - '-e' - '-c' - | # 后台启动模拟器 firebase emulators:start --only functions,firestore & echo "Waiting for emulator to load..." # 等待模拟器就绪,注意替换为你自己的健康检查地址 while [ $(curl http://localhost:5001/xxx/us-central1/api --silent | grep "Unauthorized" | wc -l) -eq 0 ]; do sleep 2; done # 导入测试数据 node import-db.js # 执行测试 npm test
注意事项
- 确认你构建的
gcr.io/xxxx/firebase自定义镜像中预装了curl工具,否则等待就绪的逻辑会执行失败 - 请将脚本中的健康检查地址
http://localhost:5001/xxx/us-central1/api替换为你自己实际的 Cloud Functions 模拟器可访问地址 - 如果
import-db.js依赖额外的 npm 包,确保在上一步的npm install中已经完成安装
内容的提问来源于stack exchange,提问作者Michael
相关产品推荐
相关产品推荐

