如何在GitHub Actions中通过GitHub Secret配置Firebase Functions服务账号?
方案一:继续使用 applicationDefault()(推荐)
GitHub Actions 环境中没有默认的应用凭据,我们可以通过将 GitHub Secret 中的服务账号 JSON 写入临时文件,再指定 GOOGLE_APPLICATION_CREDENTIALS 环境变量来适配 applicationDefault() 的读取逻辑:
在 GitHub 仓库配置 Secret
进入仓库的「Settings」→「Secrets and variables」→「Actions」,新建一个名为FIREBASE_SERVICE_ACCOUNT的 Secret,将完整的服务账号 JSON 内容粘贴进去。修改 GitHub Actions 工作流文件
在部署步骤前添加以下操作,生成临时服务账号文件并设置环境变量:- name: Create temporary service account file run: | # 创建存放服务账号的目录(和本地路径保持一致) mkdir -p .service-accounts # 将 Secret 内容写入临时 JSON 文件 echo "${{ secrets.FIREBASE_SERVICE_ACCOUNT }}" > .service-accounts/development.json # 设置环境变量指向该文件 echo "GOOGLE_APPLICATION_CREDENTIALS=.service-accounts/development.json" >> $GITHUB_ENV这样你的原有初始化代码无需修改,
applicationDefault()会自动读取临时文件中的凭据。
方案二:直接用服务账号对象初始化 cert()
如果不想生成临时文件,可以直接将 Secret 中的 JSON 字符串解析为对象,传入 admin.credential.cert():
配置 GitHub Secret
和方案一相同,将服务账号 JSON 存入FIREBASE_SERVICE_ACCOUNTSecret。修改 Firebase Admin 初始化代码
import * as admin from 'firebase-admin'; // 避免重复初始化 if (!admin.apps.length) { // 从环境变量读取服务账号 JSON 并解析 const serviceAccount = JSON.parse(process.env.FIREBASE_SERVICE_ACCOUNT || '{}'); admin.initializeApp({ credential: admin.credential.cert(serviceAccount) }); } export default admin;在工作流中注入环境变量
在部署步骤前添加:- name: Inject service account env var run: echo "FIREBASE_SERVICE_ACCOUNT=${{ secrets.FIREBASE_SERVICE_ACCOUNT }}" >> $GITHUB_ENV
本地开发时,你可以继续使用 .env 文件,通过 dotenv 加载 GOOGLE_APPLICATION_CREDENTIALS 或直接设置 FIREBASE_SERVICE_ACCOUNT 环境变量,不影响原有开发流程。
内容的提问来源于stack exchange,提问作者Yulian

