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

Guía oficial sobre 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:

  1. Crea dos entornos: DEV y PROD
  2. Agrega la secret TOKEN en cada uno
  3. Asocia cada entorno a una rama (dev y main respectivamente)

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.