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.ymlpara 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 testExplicació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/checkoutpara clonar el repositorio. - Set up Node.js: Usa la acción
actions/setup-nodepara configurar Node.js. - Install dependencies: Ejecuta
npm installpara instalar las dependencias. - Run tests: Ejecuta
npm testpara 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 mainEjercicio 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.ymlcon 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
