在GitHub Actions CI/CD流水线配置GOOGLE_APPLICATION_CREDENTIALS部署Firebase函数失败求助
通过GitHub Actions工作流部署Firebase Functions,无法使用firebase login,已将Google服务账号凭据JSON内容存入GitHub Actions密钥SERVICE_ACCOUNT_STAGING,编写了如下工作流代码:
name: Deploy to Firebase Hosting project XXX when pushed on other branches than main (for example, staging) on: push: env: SERVICE_ACCOUNT_STAGING: ${{secrets.SERVICE_ACCOUNT_STAGING}} jobs: deploy_cloud_functions_staging: name: deploy cloud functions to staging runs-on: ubuntu-latest defaults: run: working-directory: ./functions if: github.ref != 'refs/heads/main' steps: - uses: actions/checkout@v4 - name: Setup Node.js uses: actions/setup-node@v4 with: node-version: 20 cache: 'npm' - run: npm ci --ignore-scripts - run: npm run build - name: Write secrets to JSON file run: | echo "${{ secrets.SERVICE_ACCOUNT_STAGING }}" > credentials.json - name: Install firebase run: npm i -g firebase-tools@latest - name: deploy function env: PROJECT_ID: "XXX" run: | echo "Current Directory Location: $(pwd)" echo "List of Files:" ls -1 cat credentials.json export GOOGLE_APPLICATION_CREDENTIALS="/home/runner/work/XXX/XXX/functions/credentials.json" echo "GOOGLE_APPLICATION_CREDENTIALS=$GOOGLE_APPLICATION_CREDENTIALS" firebase use xxx-station-staging firebase deploy --only functions --non-interactive --debug
但流水线执行失败,提示需运行firebase login,说明firebase-tools未识别到服务账号凭据。已尝试将凭据以字符串和Base64格式存储,期望firebase-tools自动读取GOOGLE_APPLICATION_CREDENTIALS变量,需排查问题原因。
检查凭据文件完整性
原命令echo "${{ secrets.SERVICE_ACCOUNT_STAGING }}" > credentials.json可能因JSON含特殊字符(如换行、嵌套引号)导致文件损坏。改用printf避免转义问题:printf "%s" "${{ secrets.SERVICE_ACCOUNT_STAGING }}" > credentials.json保留
cat credentials.json步骤,确认输出的JSON格式完整,无缺失括号、引号等语法错误。修正
GOOGLE_APPLICATION_CREDENTIALS路径
不要硬编码绝对路径,改用相对路径或动态获取当前目录,避免仓库路径变化导致错误:export GOOGLE_APPLICATION_CREDENTIALS="$(pwd)/credentials.json"新增
ls -l $GOOGLE_APPLICATION_CREDENTIALS命令,确认文件存在且拥有读取权限。显式执行服务账号认证
firebase-tools自动读取环境变量的逻辑可能存在兼容性问题,建议显式用服务账号完成认证:# 先安装gcloud工具(若工作流未包含) - name: Install gcloud SDK run: sudo apt-get install google-cloud-cli # 在deploy步骤中添加认证 firebase login:ci --non-interactive --key-file=$GOOGLE_APPLICATION_CREDENTIALS认证完成后再执行
firebase use和firebase deploy。验证服务账号权限
确保服务账号已关联目标Firebase项目,并拥有Cloud Functions Developer、Firebase Admin SDK Administrator Service Agent等必要权限。可在Google Cloud控制台IAM页面检查权限配置。简化项目指定逻辑
跳过firebase use步骤,直接在部署命令中指定项目ID,避免项目切换错误:firebase deploy --only functions --non-interactive --debug --project $PROJECT_ID尝试降级
firebase-tools版本
最新版工具可能存在兼容性问题,指定稳定版本安装:npm i -g firebase-tools@12.9.1
内容的提问来源于stack exchange,提问作者A B

