skip to Main Content

Say I have the following four functions in my Firebase projects:

openDoor(europe-west1)
closeDoor(europe-west1)
openWindow(europe-west1)
closeWindow(europe-west1)

Now, these functions live in two separate Node packages, i.e. one that contains openDoor and closeDoor and another one that contains openWindow and closeWindow.

Error

If I try to run firebase deploy from the package with the door functions, the following error will be thrown (in non-interactive mode):

Error: The following functions are found in your project but do not exist in your local source code:
    openWindow(europe-west1)
    closeWindow(europe-west1)

This is a problem because it will cancel any CD workflow that tries to deploy these functions.

Force delete

There is an option to force-delete any existing functions:

  -f, --force              delete Cloud Functions missing from the current 
                           working directory without confirmation

However, I want the opposite. I want to keep all existing functions.

Theoretical workaround

There is one workaround that I found would work in theory, which is:

yes N | firebase deploy --interactive

Piping N into the interactive deploy command, which will answer N to the deletion prompt:

The following functions are found in your project but do not exist in your local source code:
    openWindow(europe-west1)
    closeWindow(europe-west1)

If you are renaming a function or changing its region, it is recommended that you create the new function first before deleting the old one to prevent event loss. For more info, visit https://firebase.google.com/docs/functions/manage-functions#modify

? Would you like to proceed with deletion? Selecting no will continue the rest of the deployments. (y/N)

The problem now is that I am using https://github.com/w9jds/firebase-action to deploy the functions, which means that I need to have a built-in Firebase solution.

2

Answers


  1. Chosen as BEST ANSWER

    You can make use of the new codebases feature in Firebase.

    By specifying a codebase in your firebase.json functions configuration, this problem is solved. The Firebase CLI will no longer prompt you to delete other functions as it only considers the functions of the same codebase.

    If your firebase.json previously looked like this:

    {
      "functions": {
        "source": "cloud_functions",
        "ignore": [...],
        "predeploy": [...],
        "postdeploy": [...]
      }
    }
    

    You only need to add "codebase": "<name>" to the config:

    {
      "functions": {
        "source": "cloud_functions",
        "codebase": "window",
        "ignore": [...],
        "predeploy": [...],
        "postdeploy": [...]
      }
    }
    

    The deploy will now look like this:

    i  functions: updating Node.js 16 function window:openWindow(europe-west1)...
    i  functions: updating Node.js 16 function window:closeWindow(europe-west1)...
    

    Note that the actual function name does not change, i.e. the function will still only be called openWindow (without the prefix) in the Firebase / Google Cloud Console. So this is basically the perfect solution to the problem.


  2. Alternatively, you can also specify the function names when performing deployment.

    firebase deploy --only functions:openDoor,functions:closeDoor
    
    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search