Volver a la página principal
martes 6 agosto 2024
22

🛠️ Cómo funcionan los workflows de GitHub 🛠️

Conceptos Básicos de GitHub Actions

Antes de profundizar en los detalles de los workflows, es importante entender algunos conceptos básicos:

  • Workflows: Son procesos automatizados que se definen mediante archivos YAML en el repositorio. Cada workflow puede tener uno o más jobs que se ejecutan en paralelo o secuencialmente.
  • Jobs: Son conjuntos de pasos que se ejecutan en un runner. Cada job se ejecuta en un entorno virtual limpio.
  • Steps: Son comandos individuales que se ejecutan dentro de un job. Pueden ser acciones específicas de GitHub o comandos de shell.
  • Runners: Son los servidores que ejecutan los jobs. GitHub proporciona runners hospedados, pero también puedes usar tus propios runners autoservidos.

☑️ Creación de un Workflow Básico

Para crear un workflow en GitHub, debes agregar un archivo YAML dentro del directorio .github/workflows de tu repositorio. A continuación, se presenta un ejemplo básico de un workflow que se ejecuta cada vez que se realiza un push al repositorio.

name: CI Workflow

on: [push]

jobs:
  build:
    runs-on: ubuntu-latest
    
    steps:
    - name: Check out repository code
      uses: actions/checkout@v2

    - name: Set up Node.js
      uses: actions/setup-node@v2
      with:
        node-version: '14'

    - name: Install dependencies
      run: npm install

    - name: Run tests
      run: npm test

Explicación del Workflow

1. name: Asigna un nombre al workflow (en este caso, "CI Workflow").

2. on: Define los eventos que activarán el workflow. Aquí, se ejecuta en cada push.

3. jobs: Contiene uno o más jobs que se ejecutarán como parte del workflow.

4. runs-on: Especifica el tipo de runner que se utilizará (por ejemplo, ubuntu-latest).

5. steps: Define los pasos que se ejecutarán en el job.

☑️ Eventos que Pueden Desencadenar Workflows

GitHub Actions permite que los workflows se activen en respuesta a una variedad de eventos, tales como:

  • push: Cuando se hace push a cualquier rama.
  • pull_request: Cuando se abre, se sincroniza o se cierra un pull request.
  • schedule: Permite ejecutar workflows en un horario específico usando cron syntax.
  • workflow_dispatch: Permite ejecutar workflows manualmente desde la interfaz de GitHub.

☑️ Ejemplo Avanzado: Despliegue a Producción

A continuación, un ejemplo más complejo que incluye un despliegue a producción si los tests pasan exitosamente en la rama main.

name: CI/CD Workflow

on:
  push:
    branches:
      - main

jobs:
  build:
    runs-on: ubuntu-latest
    
    steps:
    - name: Check out repository code
      uses: actions/checkout@v2

    - name: Set up Node.js
      uses: actions/setup-node@v2
      with:
        node-version: '14'

    - name: Install dependencies
      run: npm install

    - name: Run tests
      run: npm test

  deploy:
    runs-on: ubuntu-latest
    needs: build
    if: github.ref == 'refs/heads/main'
    
    steps:
    - name: Check out repository code
      uses: actions/checkout@v2

    - name: Deploy to Production
      run: |
        echo "Deploying to production server..."
        ssh user@server 'cd /path/to/app && git pull && npm install && pm2 restart all'

Explicación del Workflow Avanzado

1. on: El workflow se ejecuta en cada push a la rama main.

2. jobs:

  • build: Job que instala dependencias y ejecuta tests.
  • deploy: Job que se ejecuta solo si el job build ha pasado y si la referencia (ref) es la rama main.

3. needs: Define que el job deploy depende del job build y solo se ejecutará si build finaliza correctamente.

4. if: Condición adicional para asegurarse de que el despliegue solo se realice en la rama main.

☑️ Uso de Acciones Personalizadas

Además de las acciones oficiales proporcionadas por GitHub, puedes crear y utilizar tus propias acciones personalizadas. Estas acciones pueden ser reutilizadas en múltiples workflows y repositorios. Aquí hay un ejemplo de una acción personalizada:

name: Custom Action
description: A custom action that prints a greeting message

runs:
  using: 'node12'
  main: 'index.js'

inputs:
  name:
    description: 'Name to greet'
    required: true
    default: 'World'

Y el archivo index.js asociado:

const core = require('@actions/core');

try {
  const nameToGreet = core.getInput('name');
  console.log(`Hello ${nameToGreet}!`);
} catch (error) {
  core.setFailed(error.message);
}

Conclusión

GitHub Actions y sus workflows ofrecen una forma flexible y potente de automatizar una amplia gama de tareas dentro de un proyecto de desarrollo. Desde la ejecución de pruebas automatizadas hasta el despliegue continuo, los workflows permiten mantener un ciclo de desarrollo eficiente y de alta calidad. Con los ejemplos proporcionados, se puede comenzar a implementar automatizaciones personalizadas que se adapten a las necesidades específicas de cualquier proyecto.

Compartir:
Creado por:
Author photo

Jorge García

Fullstack developer