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
-
Crear un archivo de configuración: En el directorio raíz de tu proyecto, crea un archivo
.github/workflows/ci.yml
. -
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.
- Checkout code: Usa la acción
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
- Configura un pipeline de CI para tu proyecto GraphQL utilizando GitHub Actions.
- Asegúrate de que el pipeline ejecute las pruebas automatizadas cada vez que se haga un push a la rama
main
. - Agrega un paso para desplegar tu servidor GraphQL a Heroku.
Solución
- Crea el archivo
.github/workflows/ci.yml
con el contenido proporcionado anteriormente. - Asegúrate de tener pruebas automatizadas en tu proyecto.
- 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.
Curso de GraphQL
Módulo 1: Introducción a GraphQL
- ¿Qué es GraphQL?
- GraphQL vs REST
- Configuración de un Servidor GraphQL
- Conceptos Básicos del Esquema de GraphQL
Módulo 2: Conceptos Fundamentales
Módulo 3: Diseño Avanzado de Esquemas
Módulo 4: Trabajando con Datos
Módulo 5: Rendimiento y Seguridad
Módulo 6: Herramientas y Ecosistema
Módulo 7: Pruebas y Despliegue
- Pruebas Unitarias de Resolvers
- Pruebas de Integración
- Integración Continua
- Despliegue de Servidores GraphQL