How cook a Cron job with the Firebase Functions

Marco Cattaneo
5 min readApr 25, 2020

--

How to create a scheduled job (like a Unix Cron job) and execute it with the Google Firebase Functions.

On this blog, you are used to reading articles about Android, Kotlin, JUnit, etc, but today I want to talk about: Cloud Functions and Cloud Scheduler, two services that you can find inside the Google Cloud Services suite.

Cloud Functions for Firebase is a serverless framework that lets you automatically run backend code in response to events triggered by Firebase features and HTTPS requests. It’s server-less so you don’t need a remote server to host them and you pay only the requests done, it means that they are cheap because you don’t need to pay a server hosting day by day. About pricing I invite you to see the website because under a limit they are free.

source: https://giphy.com/gifs/mic-jimmy-fallon-the-roots-star-wars-force-awakens-dRXSJTNTfr9AI

To speak about Cloud Scheduler we have to take a leap into the past…

A long time ago in a dirty laboratory was invented the Cron, a job scheduler that allows UNIX users to schedule the execution of a job/script in a specific time with a programmed repeat. It’s something easy but in many cases very useful, for example, if you want to ping a service, or use an API for fetching specific information (for example if your online supermarket has a slot for shipping your groceries), or make a backup from a database to another.

Google has implemented the modern version of this service but with the same principles.

The recipe: what we need

Fortunately, the implementation is quite simple if we use Firebase, because it wraps many parts of setup and configuration, we need only to think about the functions and whats we want to do.

To do that we need our Terminal and the latest version of NodeJs downloadable from http://www.nodejs.org.

Start a new Project

We can start by opening our terminal and install the latest version of firebase-tools with the following command:

% npm i -g firebase-tools

Firebase-tools is a script that allows you to create/deploy the firebase functions, and also has an emulator and other stuff to test your projects.

After the installation, we need to create a folder for our project

% cd test-cron-on-firebase

and runs the init method inside the project folder

% firebase init

during the setup we need also to choose what firebase feature we want to add and the firebase destination project:

? Which Firebase CLI features do you want to set up for this folder? Press Space to select features, then Enter to confirm your choices.◯ Database: Deploy Firebase Realtime Database Rules
◯ Firestore: Deploy rules and create indexes for Firestore
❯◉ Functions: Configure and deploy Cloud Functions
◯ Hosting: Configure and deploy Firebase Hosting sites
◯ Storage: Deploy Cloud Storage security rules
◯ Emulators: Set up local emulators for Firebase features

in my sample I will use only the firebase functions, but if you want to use a database or something else you should remember to flag it.

First, let's associate this project directory with a Firebase project.You can create multiple project aliases by running firebase use --add,but for now we'll just set up a default project? Please select an option: (Use arrow keys)❯ Use an existing project
Create a new project
Add Firebase to an existing Google Cloud Platform project
Don't set up a default project

In the second step we need to choose the destination project (if exists) or we can create a new one. In the next steps we will only define programming language (Javascript or Typescript) and other optional properties.

At the end of the procedure we should have a file tree like below:

├── firebase.json
└── functions
├── index.js
├── package-lock.json
└── package.json

Create my first firebase functions

We need to modify the functions/index.js to write our first firebase function, the first example is only to understand how works an HTTP function, the next step will be how to define it inside a job.

In this example, I want to create a function that calculates how many days are left to the Bitcoin Halving 2020, you can see the implementation below:

The calculateHalving is the function name and it will be the path inside the firebase functions HTTP URL, indeed if we run:

% firebase deploy

we can see to URL to reach our firebase function

https://<project_name>.cloudfunctions.net/calculateHalving

If we want to test it locally, we need only to run firebase serve.

source https://giphy.com/gifs/cbs-young-and-restless-the-tyatr219-j05OpWhQmoNXDsNC0T

How schedule a Firebase Function

Now, if we want to know how many days are left to the Halving we need only to contact that URL, but…if we want to receive an email with this information every day at 10.00 AM? We can schedule it.

We have changed only the function definition by replacing thefunctions.https.onRequest() with functions.pubsub.schedule() ,the function argument is the cronjob configuration based on the Cron Job standard that you can find here.

I have not implemented the sending of email because there are many other articles about it and many other npm libraries.

The real Magic is that after firebase deploy the firebase-tools will publish the function and also it will configure the Job Scheduler automatically. In fact, after the deploy, if we open the Google Cloud Scheduler console we may found the list of all schedulers we have defined.

Conclusion

I think this is a cheap way to create a set of recursive small functions, the limit is only the imagination. At the end of the article you can find the source code.

Thank you for the time you have spent reading this article and also I hope to have helped you. As usual, if you like this article, please clap 👏it. Thanks!

--

--