1

I have been trying to automate the deployment of firebase cloud functions using the Github actions CI/CD workflows. The functions are developed using NodeJs, Express, and Typescript. And all environment variables are saved in a .env file that is not tracked on github (for obvious reasons)

The main.yaml file (in .github/workflows/)

name: CI/CD

on:
  push:
    branches: [ deploy ]
  pull_request:
    branches: [ deploy ]

  workflow_dispatch:

jobs:
  deploy:
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v2

      - name: create env file
        run: |
          cd functions
          touch .env
          echo "${{ secrets.ENV_VARS }}" >> .env
    

      - name: Install npm packages
        run: |
          cd functions
          npm install
    
      - name: Deploy to Firebase
        uses: w9jds/firebase-action@master
        with:
          args: deploy
        env:
          FIREBASE_TOKEN: ${{ secrets.FIREBASE_TOKEN }}

The workflow first creates a .env file where it writes the env variables (saved in github secrets) then installs the dependencies, and finally deploy the cloud functions

The steps are executed without any issues, up to the deployment part where I got this error

Error: Service account object must contain a string "project_id" property.
    at FirebaseAppError.FirebaseError [as constructor] (/github/workspace/functions/node_modules/firebase-admin/lib/utils/error.js:44:28)
    at FirebaseAppError.PrefixedFirebaseError [as constructor] (/github/workspace/functions/node_modules/firebase-admin/lib/utils/error.js:90:28)
    at new FirebaseAppError (/github/workspace/functions/node_modules/firebase-admin/lib/utils/error.js:125:28)
    at new ServiceAccount (/github/workspace/functions/node_modules/firebase-admin/lib/credential/credential-internal.js:134:19)
    at new ServiceAccountCredential (/github/workspace/functions/node_modules/firebase-admin/lib/credential/credential-internal.js:68:15)
    at Object.exports.cert (/github/workspace/functions/node_modules/firebase-admin/lib/credential/credential.js:34:54)
    at Object.<anonymous> (/github/workspace/functions/lib/config/firebase.js:10:34)
    at Module._compile (internal/modules/cjs/loader.js:1085:14)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:1114:10)
    at Module.load (internal/modules/cjs/loader.js:950:32)

Thank you in advance

  • Hi! Did you check this [reference](https://github.com/firebase/firebase-admin-node/issues/855)? It looks like your project_id is missing inside the firebase credentials. Make sure your `FIREBASE_PROJECT_ID` variable actually contains a non-empty value. – GuiFalourd Jul 05 '21 at 18:25

1 Answers1

4

I solved this problem. The answer was very simple: instead of following the different tutorials that use "w9jds/firebase-action@master" for the deployment, I simply used firebase deploy :)

The new main.yaml

name: CI/CD

on:
  push:
    branches: [ deploy]
  pull_request:
    branches: [ deploy]

  workflow_dispatch:

jobs:
  main:
    runs-on: ubuntu-latest

    steps:
      
      - uses: actions/checkout@v2

      # Environment variables
      - name: create env file
        run: |
          cd functions
          touch .env
          echo "${{ secrets.ENV_VARS }}" >> .env

      # Install npm packages and firebase
      - name: Install npm packages
        run: |
          cd functions
          npm install
          npm audit fix
          npm install firebase-tools
          
      # Run tests
      - name: Run tests
        run: |
          cd functions
          npm run test
          
      # Deploying the functions to firebase
      - name: Deploy to Firebase
        run: |
          cd functions
          npm run deploy
        env:
          FIREBASE_TOKEN: ${{ secrets.FIREBASE_TOKEN }}