CI部署Astro项目至Firebase Hosting失败:未找到OAuth令牌
解决Astro项目Firebase Hosting CI部署失败问题
问题分析
从CI日志看,两个关键异常:
- 多次出现
No OAuth tokens found提示,但实际权限检查(testIamPermissions)返回200,说明认证本身有效,这个提示属于firebase-tools的日志干扰项,不是核心错误。 - 真正导致部署失败的是
SyntaxError: Unexpected end of JSON input,错误发生在firebase-tools尝试检测Nuxt框架版本时——你用的是Astro项目,显然是框架自动检测逻辑出错,误将Astro识别为Nuxt,进而解析依赖时失败。
另外CI脚本中写入service account文件的方式存在问题,导致firebase-tools读取凭证时出现异常提示。
解决方案
1. 明确指定Astro框架,避免误检测
修改firebase.json的hosting配置,明确告知firebase-tools使用Astro框架,跳过自动检测:
{ "$schema": "https://raw.githubusercontent.com/firebase/firebase-tools/master/schema/firebase-config.json", "hosting": { "source": ".", "ignore": [ "firebase.json", "**/.*", "**/node_modules/**" ], "frameworksBackend": { "region": "asia-east1", "framework": "astro" // 新增该行,指定框架为Astro }, "public": "dist" // 可选:明确指定Astro的构建输出目录,确保firebase能正确找到产物 } }
2. 修正CI中Service Account凭证的写入方式
CI脚本中原来的cp "$GCP_SERVICE_ACCOUNT" credential.json是错误的——通常GCP_SERVICE_ACCOUNT环境变量存储的是JSON格式的凭证字符串,而非文件路径。需要用echo将字符串写入文件:
# 替换原来的touch和cp命令 - echo "$GCP_SERVICE_ACCOUNT" > credential.json
3. 优化CI认证流程(可选)
直接使用firebase的service account认证方式,无需通过gcloud激活:
script: - echo "$GCP_SERVICE_ACCOUNT" > credential.json - export GOOGLE_APPLICATION_CREDENTIALS=./credential.json - cp "$DOT_ENV_STAGING" .env - nvm use 20 && pnpm install --no-frozen-lockfile - pnpm exec firebase experiments:enable webframeworks - pnpm exec firebase deploy --only hosting --debug --project my-project # 明确指定项目,避免默认项目问题
4. 升级firebase-tools到最新稳定版
旧版本的firebase-tools可能存在框架检测bug,升级到最新版可避免这类问题:
# 在pnpm install前添加升级命令 - pnpm add firebase-tools@latest
验证步骤
- 推送修改后的配置到仓库,触发CI流水线
- 查看日志,确认
SyntaxError消失,部署流程正常完成 - 访问Firebase Hosting的 staging 站点,验证内容是否正确部署
内容的提问来源于stack exchange,提问作者newtocoding
相关产品推荐
相关产品推荐

