Application for Managing Firebase Applications. Includes support for multiple environments and data migrations
coming soon
Interested in adding a feature or contributing? Please open an issue!
Since this is source code, a great place to start is checking the hosted version of Fireadmin available at fireadmin.io.
While developing, you will probably rely mostly on npm start
; however, there are additional scripts at your disposal:
yarn <script> |
Description |
---|---|
start |
Serves your app at localhost:3000 |
start:dist |
Builds the application to ./dist and Serves it at localhost:3000 using firebase serve |
functions:start |
Runs Functions REPL locally (uses firebase functions:shell |
functions:build |
Builds Cloud Functions to ./functions/dist |
functions:test |
Runs Functions Unit Tests with Mocha |
build |
Builds the application to ./dist |
test |
Runs E2E Tests with Cypress. See testing |
lint |
Lints the project for potential errors |
lint:fix |
Lints the project and fixes all correctable errors |
Husky is used to enable prepush
hook capability. The prepush
script currently runs eslint
, which will keep you from pushing if there is any lint within your code. If you would like to disable this, remove the prepush
script from the package.json
.
├── .github # Github Settings + Github Actions Workflows
│ ├── deploy.yml # Deploy workflow (called on merges to "master" and "production" branches)
│ └── verify.yml # Verify workflow (run when PR is created)
├── cypress # UI Integration Tests
├── docs # Docs application (built with Gatsby)
│ ├── content # Content of docs (written in markdown)
│ ├── components # React components used in docs app
│ ├── gatsby-config.js # Gatsby plugin settings
│ └── gatsby-node.js # Gatsby node definitions (how templates are combined with content)
│ └── package.json # Docs package file (docs specific dependencies)
├── functions # Cloud Functions (uses Cloud Functions for Firebase)
│ ├── src # Cloud Functions Source code (each folder represents a function)
│ └── index.js # Functions entry point
├── public # Public assets
│ ├── favicon.ico # Favicon
│ ├── firebase-messaging.sw.js # Messaging Service worker (loaded by Firebase SDK)
│ └── index.html # Main HTML page container for app
├── src # Application source code
│ ├── components # Global Reusable Presentational Components
│ ├── containers # Global Reusable Container Components
│ ├── layouts # Components that dictate major page structure
│ │ └── CoreLayout # Global application layout in which to render routes
│ ├── routes # Main route definitions and async split points
│ │ ├── index.js # Bootstrap main application routes with store
│ │ └── Home # Fractal route
│ │ ├── index.js # Route definitions and async split points
│ │ ├── assets # Assets required to render components
│ │ ├── components # Presentational React Components
│ │ ├── modules # Collections of reducers/constants/actions
│ │ └── routes ** # Fractal sub-routes (** optional)
│ ├── static # Static assets
│ └── utils # Application-wide utils (form validation etc)
├── .firebaserc # Firebase project settings (including settings for CI deployment)
├── cypress.json # Cypress Integration Test settings
├── database.rules.json # Firebase Real Time Database Rules
├── firebase.json # Firebase resource settings (including which folders are deployed)
├── firestore.indexes.json # Firestore Indexes
├── firestore.rules # Firestore Database Rules
└── storage.rules # Cloud Storage Rules
^10.18.0
(node 10 suggested in order to match newest Cloud Functions Runtime)npm i -g firebase-tools
Install dependencies: yarn install
Create a Web app within the Firebase Console of your project (config will be used in next step)
Create a .env.local
that has the following format (with your values filled from previous step):
REACT_APP_FIREBASE_apiKey=<- api key ->
REACT_APP_FIREBASE_authDomain=<- auth domain ->
REACT_APP_FIREBASE_databaseURL=<- database URL ->
REACT_APP_FIREBASE_projectId=<- project ID ->
REACT_APP_FIREBASE_storageBucket=<- storageBucket ->
REACT_APP_FIREBASE_messagingSenderId=<- message sender ID ->
REACT_APP_FIREBASE_appId=<- project app id ->
REACT_APP_FIREBASE_PUBLIC_VAPID_KEY=<- project app id ->
REACT_APP_ALGOLIA_APP_ID=<- ->
REACT_APP_ALGOLIA_API_KEY=<- ->
Create functions/.runtimeconfig.json
file that looks like so:
{
"algolia": {
"api_key": "<- your API KEY ->",
"app_id": "<- your Algolia APP ID ->"
},
"gmail": {
"email": "<- gmail account for sending invite emails ->",
"password": "<- password for ^ email ->"
},
"encryption": {
"password": "<- your own made up encryption password for service accounts -> "
}
}
Set Functions config variables to match the file you just made (for the deployed version of your functions):
firebase functions:config:set $(jq -r 'to_entries[] | [.key, (.value | tojson)] | join("=")' < functions/.runtimeconfig.json)
Build Project: yarn build
Deploy to Firebase: firebase deploy
(deploys, Cloud Functions, Rules, and Hosting)
Start Development server: npm start
NOTE: You can also use yarn start:dist
to test how your application will work when deployed to Firebase
View the deployed version of the site by running firebase open hosting:site
Note: Config for this is located within .github/workflows/app-deploy.yml
. firebase-ci
has been added to simplify the CI deployment process by getting settings from the .firebaserc
. All that is required is providing authentication with Firebase:
Have at least two Firebase projects to ready to use, one for each environment (staging and production)
Replace info within .firebaserc
under both the projects
, ci
, and targets
sections
Login: firebase login:ci
to generate an authentication token. This token will be used to give the CI provider rights to deploy on your behalf. Settings are provided for Gitlab, but any CI provider can be used.
Set FIREBASE_TOKEN
environment variable within Github Actions secrets
Add the following environment variables to Github Actions's variables (within /settings/ci_cd
):
FIREBASE_TOKEN; // Used to deploy to Firebase (token generated in last step)
CYPRESS_RECORD_KEY; // Record key for Cypress Dashboard
SERVICE_ACCOUNT; // Used to authenticate with database to run hosted tests
Run a build on Github Actions by pushing code to your Git remote (most likely Github)
For more options on CI settings checkout the firebase-ci docs.
yarn build
firebase deploy
NOTE: You can use firebase serve
to test how your application will work when deployed to Firebase, but make sure you run yarn build
first.Documentation is available at fireadmin.io/docs
All source code and content for docs is located within the docs
folder. Docs are generated from markdown into static files using Gatsby based on settings in gatsby-config.js
.
Visit the docs README for more info.
NOTE: If you have setup CI deployment, E2E tests and Unit Tests can automatically run against your staging environment before running the production build.
Cloud Functions Unit tests are written in Mocha with code coverage generated by Istanbul. These tests cover "backend functionality" handled by Cloud Functions by stubbing the functions environment (including dependencies).
cd functions
npm i
npm test
yarn test:cov
End to End tests are done using Cypress and they live within the cypress
folder. These tests cover UI functionality and are run directly on the hosted environment of Fireadmin. Application end to end tests are run automatically in Github Actions the after deploying to the staging environment before deploying to production.
Create a service account within the Firebase console
Save the service account as serviceAccount.json
within the root of the project
Get the UID of the user that you want to use while testing from the Authentication tab of the Firebase console to
Create cypress.env.json
with the following format:
{
"TEST_UID": "<- user account's UID ->"
}
Run yarn emulators
. This will bootup the emulators (pointed to during testing)
In a different terminal yun yarn start:emulate
. This will bootup the application pointed to the emulators
In a different terminal tab, run yarn test:emulate:run
. This will run Cypress integration tests pointed at emulators (for seeding and verifing)
To Open Cypress's local test runner UI where you can run single tests or all tests use yarn test:emulate
.
12
instead of a newer version?
Cloud Functions runtime supports up to 12
, which is why that is what is used for the CI build version. This will be switched when the functions runtime is updated