En este tutorial vas a aprender la configuración básica para que despliegues tu sitio de React en Firebase Console usando Github Actions como CI/CD.
¿ Qué necesitas ?
- Cuenta de Github configurada localmente que usarás para subir y configurar el proyecto de React
- Una cuenta de Google (como la que usas para Gmail)
- El proyecto de React que vas a configurar
1 – Creación del proyecto en Firebase Console
Lo primero que haremos es crear un proyecto de Firebase Console con tu cuenta de Google en https://console.firebase.google.com
En la siguiente página le puedes poner nombre a tu proyecto, si quieres también puedes cambiar el ID, ten esto en cuenta ya que lo necesitarás más adelante.
En el segundo y tercer paso depende de ti si quieres o no agregar Google Analytics, dependiendo de eso debes usar la cuenta por defecto o crear una cuenta de tu preferencia.
Después de que termines de crear el proyecto vas a ver un dashboard como este
Si vas a la pestaña de Hosting vas a ver el mensaje indicando que puedes hacer deploy de sitios y aplicaciones web, esto significa que no tienes ningún proyecto corriendo todavía. pero ya has creado el proyecto de Firebase Console.
2 – Configuración de Github
Como ya tienes tu proyecto de React en github (o debes hacerlo para seguir) puedes utilizar CRA.
Se utilizará un proyecto de ejemplo (puedes ver el repositorio aquí) de React
Ahora vas a tu repositorio en Github y entramos en la tab de Actions.
En este apartado hay muchos workflows que Github ya tiene definido para hacer deploys con ciertas herramientas, nosotros vamos a seleccionar “set up a workflow yourself” para crear nuestro workflow personalizado.
Ahora en Edit new file vamos a agregar el siguiente código
name: production-deployment
on:
push:
branches:
- master
jobs:
deploy:
runs-on: ubuntu-latest
strategy:
matrix:
node-version: [12.x]
steps:
- uses: actions/checkout@v2
- name: Use Node.js ${{ matrix.node-version }}
uses: actions/setup-node@v1
with:
node-version: ${{ matrix.node-version }}
- name: Install Packages
run: npm install
- name: Build page
run: npm run build
- name: Deploy to firebase
uses: w9jds/firebase-action@master
with:
args: deploy --only hosting
env:
FIREBASE_TOKEN: ${{ secrets.FIREBASE_TOKEN }}
Con name le pones el nombre con el que se identificará el workflow
On sirve para especificar cuándo se debe correr, en este caso tenemos que sera cuando se haga un push sobre master (podrías utilizar también pull-request y otras ramas)
Dentro de jobs podemos agrupar varios pasos dentro de una categoría, por ejemplo, test, build, deploy; para este tutorial solo definimos el job de deploy que nos permitirá hacer deploy de nuestro proyecto.
Runs-on define el entorno en el cual ejecutaremos este job.
Strategy es un item interesante porque nos permite definir una matriz de diferentes configuraciones de trabajo que puedes reemplazar fácilmente en un workflow, en este caso usaremos la versión 12 de Node.
Con steps podemos definir los pasos que tendrá este job.
Actions/checkout@v2 nos permite verificar y acceder al repositorio desde un workflow, tienes más información disponible en el repo de actions.
El nombre del primer paso utiliza la variable que definimos en la matriz Use Node.js ${{ matrix.node-version }}
Setup-node nos sirve para configurar Node en este job, más info en el repo de setup-node
Con with le especificamos la versión de Node que vamos a usar.
En los dos siguientes pasos simplemente instalamos las dependencias del proyecto y hacemos un build para tener una versión de producción disponible de nuestro proyecto de React.
El paso de Deploy to firebase utiliza el repositorio que nos permite hacer deploy en firebase y con args: deploy –only hosting se especifica que solo nos interesa desplegar en el hoisting de firebase.
Después de esto creas el commit con el workflow con start commit y agregamos el commit a master.
Ahora si revisas el repositorio podrás ver que en la carpeta .github/workflows se encuentra el workflow que acabas de crear.
Y si vas al tab de actions del repositorio veras que se ya se lanzó el workflow y si esperas un momento verás que falla, esto sucede porque el workflow no tiene definido el FIREBASE_TOKEN que necesita para poder hacer deploy del repo.
3 – Configuración de Firebase en React
Ahora debemos agregar a la configuración la variable de entorno FIREBASE_TOKEN que le da permisos a nuestro workflow para hacer deploy en el proyecto de firebase.
Para hacer esto primero debes instalar firebase-tools globalmente
npm install -g firebase-tools
luego debes hacer login con tu cuenta de Google
firebase login:ci
Cuando lo hagas en la consola deberá mostrarte el token que necesitas
Ahora debes agregar ese token en los secrets de nuestro repo para que el workflow pueda utilizarlo, vamos a nuestro repo en github, después a secrets y creas la variable FIREBASE_TOKEN con el token que te dio el login de firebase.
Lo último que debemos hacer es agregar las configuraciones de firebase a nuestro proyecto de React, para esto debes ejecutar el siguiente comando en la raíz de tu proyecto.
firebase init
Te saldrán una serie de opciones de todos los servicios de firebase, tu debes escoger Hoisting presionando espacio y luego enter.
luego debes seleccionar la opción para usar un proyecto existente de firebase
luego seleccionas tu proyecto de firebase
y confirmas las siguientes opciones de usar el directorio public y sobrescribir el index.html
Ahora el archivo firebase.json que genero firebase debe quedar así para que funcione con React
{
"hosting": {
"public": "build",
"ignore": ["firebase.json", "**/.*", "**/node_modules/**"],
"rewrites": [
{
"source": "**",
"destination": "/index.html"
}
]
}
}
Ahora debes hacer un commit de los cambios y subirlo al repositorio, recuerda que debes hacer un pull de los cambios que hiciste en el repositorio y no están en tu local, es decir, el yml del workflow.
En este punto verás que se vuelve a lanzar el workflow de deploy en github actions
también puedes seleccionar un workflow para ver el detallado de los steps
4 – Deployment
Si seguiste correctamente los pasos el workflow debería concluir exitosamente.
Ahora vas al proyecto en la consola de firebase y en la tab de Hoisting verás una pantalla como la siguiente
Esto quiere decir que Github Actions ha hecho deploy de tu proyecto de React !
Firebase te asigna dominios por defecto dependiendo del nombre de tu proyecto, igualmente puedes agregar tus dominios personalizados muy fácilmente agregando los registros a los DNS que te muestra en la opción de agregar dominio personalizado.
También es genial que Firebase te agrega un certificado SSL emitido a nombre de Google lo que hará que tu sitio sea mucho más seguro.
Ya tienes tu sitio corriendo en firebase y siempre que hagas un push a master se van a desplegar los nuevos cambios !!
Para terminar
- En este tutorial sencillo no tenemos en cuenta otros steps que pueden ser por ejemplo, correr las pruebas de tu proyecto y dependiendo del resultado hacer deploy o no a firebase
- El flujo normal debería ser que el workflow de deploy solo debe correrse cuando se hace merge de un pull request y no siempre que se hace un push a cierto branch.
- El paquete Spark de firebase es gratuito y te permite probar tu aplicación en sandbox e incluso en producción si tu proyecto no tiene tanta concurrencia o no es muy grande.
- El uso de GitHub Actions es gratuito para los repositorios públicos. Para los repositorios privados, cada cuenta de GitHub recibe una cantidad determinada de minutos y almacenamiento gratuitos dependiendo del producto que se utilice con la cuenta.
- A Pesar de esto que es una buena opción para que tu mismo implementes tu CI y no dependas de terceros, además de aprovechar la buena integración de github con todos sus servicios y realmente pienso que para la mayoría de los casos la capa gratuita de Github Actions es suficiente o muy económica.
Referencias
- Costos de Github Actions https://help.github.com/es/github/setting-up-and-managing-billing-and-payments-on-github/about-billing-for-github-actions
- Costos de firebase https://firebase.google.com/pricing?authuser=1
- Repo https://github.com/diegocastillogz/React-Firebase-GithubActions/actions
- Documentación de la consola de Firebase https://firebase.google.com/docs
- Documentación de Github Actions https://help.github.com/es/actions/reference/workflow-syntax-for-github-actions
Síguenos