Innusual Logo
CI/CD con GH Actions

Alejandro Falcon Carrion

CI/CD con GH Actions

GitHub es una de las principales, si no la principal, plataforma para almacenar código en la nube. Adquirida por Microsoft en 2018, a día de hoy almacena más de 420 millones de repositorios. Si la ponemos en comparación, sería el equivalente a más que la población de Estados Unidos y Canada juntos.

Una de las funcionalidades más utilizadas es GitHub Actions, que con el tiempo se ha vuelto crucial para gestionar y configurar la integración continua en nuestros proyectos, ofreciendo además muchas otras opciones.

Pero, ¿qué es GitHub Actions?

GitHub Actions se centra en automatizar los flujos de trabajo o "workflows". Esto puede ir desde la simple creación y gestión de pequeñas tareas programadas, conocidas como "cron jobs", hasta la ejecución de software y el desarrollo completo de la integración y despliegue continuos (CI/CD) de nuestra aplicación.

Para crear una GitHub Action, debemos definir archivos con extensión YAML que especifican las instrucciones o "jobs". A su vez, definimos conjuntos de pasos o "steps" que se ejecutan en un entorno totalmente limpio cada vez que se activan. Esto nos permite crear nuestra CI/CD, cuyo objetivo es agilizar y mejorar el ciclo de vida del software.

name: CI/CD Ejemplo

on:
  push:
    branches: [ main ]
  pull_request:
    branches: [ main ]

jobs:
  build-and-test:
    runs-on: ubuntu-latest

    steps:
    - uses: actions/checkout@v3

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

    - name: Install dependencies
      run: npm ci

    - name: Run linter
      run: npm run lint

    - name: Run tests
      run: npm test

    - name: Build project
      run: npm run build

    - name: Upload artifact
      uses: actions/upload-artifact@v3
      with:
        name: dist
        path: dist

  deploy:
    needs: build-and-test
    runs-on: ubuntu-latest
    if: github.ref == 'refs/heads/main' && github.event_name == 'push'

    steps:
    - name: Download artifact
      uses: actions/download-artifact@v3
      with:
        name: dist

    - name: Deploy to production
      run: |
        # Aquí irían los comandos para desplegar la aplicación
        # Por ejemplo, usando SSH para conectar a un servidor:
        # ssh [email protected] 'cd /path/to/app && git pull origin main && npm install && pm2 restart app'

Podemos elegir cuando ejecutar diferentes tareas: si al crear una “Pull Request”, al mergearla en una de las ramas principales, al hacer push.... hay multitud de opciones, pero la finalidad es siempre la misma: ejecutar y automatizar una seria de pasos para conseguir un fin, asegurando que el resultado tenga un mínimo de calidad y que cumpla su cometido.

Gestión de nuestra CI/CD

Los workflows en GitHub Actions permiten automatizar diversas tareas críticas en el ciclo de desarrollo de software. Entre las actividades más útiles que podemos configurar se encuentran:

  1. Comprobación de cobertura de tests: Podemos ejecutar automáticamente nuestras suites de pruebas y generar informes de cobertura. Esto nos ayuda a mantener un alto estándar de calidad y detectar rápidamente cualquier regresión.
  2. Verificación de convenciones de código: Utilizando herramientas como ESLint, Prettier o similares, podemos asegurar que todo el código nuevo cumpla con las normas de estilo y mejores prácticas establecidas para el proyecto.
  3. Análisis de accesibilidad: Podemos integrar herramientas que evalúen el cumplimiento de las pautas de accesibilidad web (WCAG), garantizando que nuestra aplicación sea inclusiva y utilizable por todos.
  4. Análisis de seguridad: Implementar escaneos de seguridad para detectar vulnerabilidades en el código o en las dependencias utilizadas.
  5. Optimización de rendimiento: Ejecutar pruebas de rendimiento y generar informes para identificar posibles cuellos de botella.
  6. Generación de documentación: Automatizar la creación y actualización de documentación técnica basada en los cambios en el código.

Una buena implementación puede ahorrarnos muchos problemas en nuestras aplicaciones, desde simples errores en la gestión de las builds hasta cuestiones más avanzadas como la revisión de código en un entorno externo que nos alerte sobre su calidad y mantenibilidad.

GitHub también nos ofrece un marketplace donde podemos mejorar nuestras Actions con extensiones creadas por la comunidad. Así, por ejemplo, podemos encontrar extensiones para integrarse con sistemas como SonarCloud, desplegar en diversos proveedores de cloud como Azure, AWS o Google, etc, etc.... Todas estas herramientas se pueden integrar para gestionar la calidad, mantenibilidad y funcionalidad de nuestro código en las pull requests (PR) o merges.

¿Y qué pasa con los despliegues?

Desde hace años, disponemos de gran variedad de alternativas en cuanto a despliegues. Si nos centramos en “cloud”, la oferta de servicios como AWS, Azure, Google Cloud, Oracle Cloud o Digital Ocean por nombrar unos pocos, nos ofrecen despliegues globales, con bajos costes operativos, alta agilidad y escalabilidad sin precedentes. Por otro lado, también contamos con despliegues en servidores "on-premise", donde los servidores están físicamente localizados en las instalaciones del cliente. Esta opción es común para software sensible, perteneciente a gobiernos, corporaciones no gubernamentales o entidades bancarias.

En ambos casos, GitHub Actions es una herramienta versátil que nos permite adaptarnos fácilmente sin complicaciones adicionales, proporcionando autonomía al desarrollador y cumpliendo con los requisitos necesarios.

Ventajas frente a otras soluciones

Jenkins es uno de los principales competidores ya que se trata de una solución Open Source que lleva en el mercado muchos años y ha sido adoptado tradicionalmente por muchas organizaciones para desempeñar estas tareas. Sin embargo, cada vez más, vemos clientes y colaboradores que migran su actual infraestructura a Github Actions, destacando principalmente su gestión y configuración de workflows creados mediante archivos YAML, permitiendo hacer cambios “en caliente”. En cambio, Jenkins requiere una instalación y configuración avanzada desde el inicio, lo cual puede dificultar el desarrollo tanto de un producto mínimo viable (MVP) como de un software con un ciclo de vida largo.

Otra gran ventaja de GitHub Actions es su amplia comunidad en el marketplace de plugins. Aunque Jenkins también tiene un marketplace similar, su entorno suele estar desactualizado o incluso abandonado, lo que puede llevar a situaciones donde un plugin esencial esté deprecado, presentando posibles problemas de seguridad y funcionamiento si actualizamos cualquier versión.

En conclusión, establecer y mantener buenos pipelines de CI/CD es esencial. Una de las plataformas que más empleamos para ello es GitHub, el cual, más allá de su trabajo como repositorio de código nos permite implementar workflows que extienden su uso a todo el ciclo de vida de nuestro software. Esto nos permitirá mejorar la calidad, mantenibilidad, seguridad y robustez de nuestra aplicación en cada una de sus fases, automatizando los procesos manuales de pruebas y despliegues, lo que se traduce en grandes mejoras de productividad para los equipos de desarrollo.

>>> Podría interesarte

    Programando con Copilot

    Blanca Lendoiro Valle

    La inteligencia artificial está transformando rápidamente diversos sectores, y el desarrollo de software no es una excepción. Entre las innovaciones más utilizadas se encuentra GitHub Copilot, un asistente de código creado por OpenAI y GitHub, que sugiere líneas de código o funciones completas en tiempo real, basándose en el contexto del código en el que se está trabajando.

    CI/CD con GH Actions

    Alejandro Falcon Carrion

    GitHub es una de las principales, si no la principal, plataforma para almacenar código en la nube. Adquirida por Microsoft en 2018, a día de hoy almacena más de 420 millones de repositorios. Si la ponemos en comparación, sería el equivalente a más que la población de Estados Unidos y Canada juntos.

    Microfrontends con Webpack Module Federation

    Carlos Perez Ruiz

    Adopta los microfrontends con Webpack Module Federation para escalar tu aplicación web de manera modular y eficiente.