Workflows With GitHub Actions
La idea es construir nuestro workflow con GitHub Actions desde lo más simple hasta agregarle un poco de complejidad.
- One Job
- Secrets
- Deploy
- Multiple Jobs with artifacts
- Conditioned Jobs And Environments
Para hacer esto un poco más realista, todo el flujo se basará sobre una app con React, pero se puede aplicar a cualquier tipo de código.
One Job
.github/workflows/main.yml
name: workflow with github actions
'on':
push:
branches:
- one-job
jobs:
main:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- uses: actions/setup-node@v2
with:
node-version: '14'
- name: install
run: npm install
- name: test
run: npm run test
- name: build
run: npm run build
Una de las cosas importantes aquí es definir una versión de Node sobre la cual trabajar, por eso usamos actions/setup-node@v2 definiendo nuestra versión como 14. Luego instalamos las dependencias, ejecutamos pruebas y construimos la aplicación.
Actions Secrets
Antes de entrar en temas de deploy debemos saber definir y llamar a nuestras secrets. Para definirlas, vamos a Settings > Secrets y damos click en New repository secret.
- Name:
TOKEN - Value: tu token de Firebase, por ejemplo.
Para acceder a esta secret usamos:
${{ secrets.TOKEN }}
Deploy
Para hacer el deploy basta con agregar otro step a nuestro job que instale el CLI de Firebase y haga el deploy:
- name: deploy
run: |
npm install -g firebase-tools
firebase deploy --token ${{ secrets.TOKEN }}
Multiple Jobs
La idea es separar todo el flujo en diferentes jobs:
jobs:
install_and_test:
runs-on: ubuntu-latest
steps:
- name: install and test
run: echo "install and test"
build:
needs:
- install_and_test
runs-on: ubuntu-latest
steps:
- name: build
run: echo "build"
deploy:
needs:
- build
runs-on: ubuntu-latest
steps:
- name: deploy
run: echo "deploy"
Usamos needs para definir los jobs requeridos antes de ejecutar otro, rompiendo así el flujo paralelo natural.
Artifacts
Son datos que se comparten entre jobs. Un job los sube y otros los descargan.
install_and_test
jobs:
install_and_test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- uses: actions/setup-node@v2
with:
node-version: '14'
cache: npm
- run: npm install
- run: npm test
build
build:
needs:
- install_and_test
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- uses: actions/setup-node@v2
with:
node-version: '14'
cache: npm
- run: npm install
- run: npm run build
- run: rm -r node_modules
- name: artifact
uses: actions/upload-artifact@v2
with:
name: app
path: .
deploy
deploy:
needs:
- build
runs-on: ubuntu-latest
steps:
- uses: actions/setup-node@v2
with:
node-version: '14'
- uses: actions/download-artifact@v2
with:
name: app
- name: install firebase cli
run: npm install -g firebase-tools
- name: deploy
run: firebase deploy --token ${{ secrets.TOKEN }}
Conditioned Jobs And Environments
La idea es cambiar el valor de nuestras secrets dependiendo del entorno. Para esto configuramos los Environments en GitHub:
- Crea dos entornos:
DEVyPROD - Agrega la secret
TOKENen cada uno - Asocia cada entorno a una rama (
devymainrespectivamente)
deploy_dev
deploy_dev:
if: ${{ github.ref == 'refs/heads/dev' }}
environment: DEV
needs: [build]
runs-on: ubuntu-latest
steps:
- uses: actions/setup-node@v2
with:
node-version: '14'
- uses: actions/download-artifact@v2
with:
name: app
- name: install firebase cli
run: npm install -g firebase-tools
- name: deploy
run: echo "deploy to dev"
deploy_prod
deploy_prod:
if: ${{ github.ref == 'refs/heads/main' }}
environment: PROD
needs: [build]
runs-on: ubuntu-latest
steps:
- uses: actions/setup-node@v2
with:
node-version: '14'
- uses: actions/download-artifact@v2
with:
name: app
- name: install firebase cli
run: npm install -g firebase-tools
- name: deploy
run: firebase deploy --token ${{ secrets.TOKEN }}
Recomendación
🧩 Si usas VSCode, instala la extensión: GitHub Actions
Esta extensión te permite ver los workflows, secrets y environments desde el editor.