September 2017 update: CircleCI 2.0’s config file format is different than what I describe here which is CircleCI’s 1.0 config format. The idea of getting a token from Firebase and using with CircleCI’s environment variables and config file still applies.
The command line page of the Firebase documentation doesn’t list all the commands available to you from the firebase-tools npm package. To see them all, install the tools with
npm install -g firebase-tools and execute the command
firebase in your terminal.
Usage: firebase [options] [command] Commands: data:get [options] <path> fetch and print JSON data at the specified path data:push [options] <path> [infile] add a new JSON object to a list of data in your Firebase data:set [options] <path> [infile] store JSON data at the specified path via STDIN, arg, or file data:remove [options] <path> remove data from your Firebase at the specified path data:update [options] <path> [infile] update some of the keys for the defined path in your Firebase deploy [options] deploy hosting assets and rules for the current app deploy:hosting [options] deploy hosting assets for the current app deploy:rules [options] deploy security rules for the current app disable:hosting [options] stop serving web traffic to your Firebase Hosting site help [command] display help information init [options] set up a Firebase app in the current directory list list the Firebases to which you have access login log the CLI into Firebase login:ci generate an access token for use in non-interactive environments logout log the CLI out of Firebase open [options] [panel] open Firebase Hosting URL in browser or jump to a dashboard panel prefs:token print the currently logged in user's access token serve [options] start a local server for your static assets Options: -h, --help output usage information -V, --version output the version number -j, --json output JSON instead of text, also triggers non-interactive mode --token <token> supply an auth token for this command --non-interactive error out of the command instead of waiting for prompts --interactive force interactive shell treatment even when not detected --debug print verbose debug output and keep a debug log file
The interesting command here is:
login:ci generate an access token for use in non-interactive environments
firebase login:ci and follow the instructions to receive an access token like
awelkfjw8efwpafh8phaua9 that you can use within circleci to deploy your app.
Save the access token in circleci’s project settings as an environment variable with a name like
FIREBASE_DEPLOY_TOKEN. Then configure circle.yml to use the environment variable inside the deploy step like this:
deployment: master: branch: master commands: - firebase deploy --token "$FIREBASE_DEPLOY_TOKEN" --non-interactive
When a build on the master branch succeeds, circleci will use that command to log into Firebase hosting on your behalf (via the access token) and upload the files configured in your firebase.json file.