Developing Geonotes — Automated build system with GitHub Actions — Ep. 6
Implementing an automated build system for Geonotes using GitHub actions to update the Hasura and Firebase instances.
An automated testing system is essential for ensuring that the code is always up to quality standards and consistently builds successfully.
I have implemented this system for Geonotes using GitHub actions.
🤖 Automated build system
To create an automated build system, I decided to use GitHub Actions. There are quite a few reasons why it is a good choice for my use case:
- It is directly integrated into the Version Control System, without needing additional platforms
- It is completely free for public repositories
- It has a nice YAML syntax to define the various jobs
My Continuous Integration pipeline is composed of two main stages: Hasura
and Firebase
.
The first job essentially synchronizes the schema, metadata and migrations between my local environment and my remote Heroku environment. Source
steps:
- uses: actions/checkout@v2
- name: Download Hasura CLI
run: |
curl -L https://github.com/hasura/graphql-engine/raw/stable/cli/get.sh | bash
sudo hasura update-cli --version ${HASURA_CLI_VERSION}
- name: Apply migrations and metadata
working-directory: hasura
run: |
hasura metadata apply
hasura migrate apply --all-databases
hasura metadata reload
The second job runs only after the first one is complete, and is responsible of linting and building the code, and ultimately updating all cloud functions in the remote Firebase project. Source
steps:
# ...
- name: Download Firebase CLI
run: |
curl -sL https://firebase.tools | bash
- name: Update environment configuration
run: |
firebase use ${FIREBASE_PROJECT_ID}
firebase functions:config:get > .runtimeconfig.json
- name: Install dependencies
run: npm ci
- name: Lint
run: npm run lint
- name: Deploy
run: firebase deploy --only functions
The whole pipeline is invoked each time a push is made to the develop
branch, ensuring that the remote environments for both Hasura and Firebase always stay in sync.
🛑 A small roadblock
While writing the pipeline definition, I run into a weird problem in the interaction between the Firebase CLI and the GitHub action runner image.
Even though the deployment worked flawlessly from my machine using firebase deploy --only functions
, running the same command in the GitHub runner resulted in a syntax error on optional chaining (?.
).
Technically, optional chaining is available in ES2020 and should be fully supported by Node.js 14 (which both my system and the action are running). I have opened an issue on the Firebase tools repository, but for now the easiest workaround has been to target ES2019 during the TypeScript build.
⭐️ The final result
I am now much more confident that my backend is always in a working state and synchronized between my local environment and my deployment target. This should ensure more peace of mind when finally releasing to production.
🚧 Next steps
The first workflow is in progress but it still does not cover the frontend part. Ideally I'll want to also deploy the Expo artifacts on push.
I want to also focus on building more base functionalities into the app, like the ability to create a custom note in the current location, and a list of all the notes the user has created.
🎙 How to follow the project
I'll be posting updates throughout the development process and as I learn new thing regarding development, design, and marketing.
If you'd like to have even more real-time updates you can
- Follow me on Twitter @emilioschepis
- Checkout the public GitHub app repository and backend repository