google-cloud-functionsenvironment-variablesgithub-actionscicdenv-file

Environment variables when deploying Firebase Cloud functions with Github Actions


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


Solution

  • 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 }}