La integración continua (CI) es una práctica de desarrollo de software en la que los desarrolladores integran su código en un repositorio compartido varias veces al día. Cada integración es verificada por una construcción automatizada (incluyendo pruebas) para detectar errores lo antes posible. En este tema, aprenderemos cómo implementar CI en un proyecto GraphQL.

Objetivos de Aprendizaje

  • Comprender los conceptos básicos de la integración continua.
  • Configurar un pipeline de CI para un proyecto GraphQL.
  • Automatizar pruebas y despliegues con herramientas de CI/CD.

Conceptos Básicos de Integración Continua

¿Qué es la Integración Continua?

La integración continua es una práctica de desarrollo que implica:

  • Integraciones frecuentes: Los desarrolladores integran su trabajo en el repositorio varias veces al día.
  • Construcciones automatizadas: Cada integración dispara una construcción automatizada que incluye la compilación del código y la ejecución de pruebas.
  • Detección temprana de errores: Al integrar y probar frecuentemente, los errores se detectan y corrigen rápidamente.

Beneficios de la Integración Continua

  • Detección temprana de errores: Los errores se detectan y corrigen rápidamente, lo que reduce el costo de las correcciones.
  • Mejora de la calidad del código: Las pruebas automatizadas aseguran que el código cumple con los estándares de calidad.
  • Despliegue más rápido: La automatización de pruebas y despliegues permite liberar nuevas versiones del software más rápidamente.

Configuración de un Pipeline de CI para un Proyecto GraphQL

Herramientas de CI/CD

Existen varias herramientas populares para implementar CI/CD, entre ellas:

  • Jenkins
  • Travis CI
  • CircleCI
  • GitHub Actions

Para este ejemplo, utilizaremos GitHub Actions debido a su integración directa con GitHub y su facilidad de uso.

Configuración de GitHub Actions

  1. Crear un archivo de configuración: En el directorio raíz de tu proyecto, crea un archivo .github/workflows/ci.yml.

  2. Definir el workflow: Configura el archivo ci.yml para definir el pipeline de CI.

name: CI Pipeline

on:
  push:
    branches:
      - main
  pull_request:
    branches:
      - main

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
    - name: Checkout 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

  • name: Nombre del workflow.
  • on: Define los eventos que disparan el workflow (push y pull_request en la rama main).
  • jobs: Define los trabajos que se ejecutarán.
    • build: Nombre del trabajo.
    • runs-on: Define el sistema operativo en el que se ejecutará el trabajo (ubuntu-latest).
    • steps: Define los pasos del trabajo.
      • Checkout code: Usa la acción actions/checkout para clonar el repositorio.
      • Set up Node.js: Usa la acción actions/setup-node para configurar Node.js.
      • Install dependencies: Ejecuta npm install para instalar las dependencias.
      • Run tests: Ejecuta npm test para correr las pruebas.

Automatización de Pruebas y Despliegues

Pruebas Automatizadas

Las pruebas automatizadas son esenciales para asegurar la calidad del código. En un proyecto GraphQL, es importante incluir pruebas unitarias para los resolvers y pruebas de integración para las consultas y mutaciones.

Ejemplo de Prueba Unitaria

const { gql } = require('apollo-server');
const { createTestClient } = require('apollo-server-testing');
const { server } = require('../src/server');

const { query } = createTestClient(server);

const GET_USER = gql`
  query getUser($id: ID!) {
    user(id: $id) {
      id
      name
      email
    }
  }
`;

test('fetches a user by ID', async () => {
  const res = await query({ query: GET_USER, variables: { id: '1' } });
  expect(res.data.user).toEqual({
    id: '1',
    name: 'John Doe',
    email: '[email protected]',
  });
});

Despliegue Automatizado

El despliegue automatizado puede configurarse en el mismo pipeline de CI/CD. Por ejemplo, puedes agregar un paso para desplegar tu servidor GraphQL a un servicio como Heroku o AWS.

Ejemplo de Despliegue a Heroku

- name: Deploy to Heroku
  env:
    HEROKU_API_KEY: ${{ secrets.HEROKU_API_KEY }}
  run: |
    git remote add heroku https://git.heroku.com/<your-app-name>.git
    git push heroku main

Ejercicio Práctico

Ejercicio

  1. Configura un pipeline de CI para tu proyecto GraphQL utilizando GitHub Actions.
  2. Asegúrate de que el pipeline ejecute las pruebas automatizadas cada vez que se haga un push a la rama main.
  3. Agrega un paso para desplegar tu servidor GraphQL a Heroku.

Solución

  1. Crea el archivo .github/workflows/ci.yml con el contenido proporcionado anteriormente.
  2. Asegúrate de tener pruebas automatizadas en tu proyecto.
  3. Agrega el paso de despliegue a Heroku en el archivo ci.yml.

Conclusión

La integración continua es una práctica esencial para cualquier proyecto de software moderno. Al configurar un pipeline de CI para tu proyecto GraphQL, puedes asegurar la calidad del código, detectar errores rápidamente y desplegar nuevas versiones de manera eficiente. En el siguiente módulo, exploraremos cómo construir aplicaciones full-stack utilizando GraphQL.

© Copyright 2024. Todos los derechos reservados