DEV Community

🚀 CI/CD Testing Tools Comparison: GitHub Actions vs GitLab CI vs Jenkins (With Real Examples!)

📋 Introducción

Las herramientas de testing automatizado son fundamentales en el desarrollo moderno. Este artículo compara las principales plataformas CI/CD con ejemplos prácticos y código real.


🔧 Herramientas Analizadas

1️⃣ GitHub Actions

¿Qué es? Plataforma CI/CD nativa de GitHub

✨ Características Principales:

  • Integración nativa con repositorios GitHub
  • Marketplace con miles de actions predefinidas
  • Matrix builds para múltiples entornos
  • 2,000 minutos gratis/mes

💻 Ejemplo Real:

# .github/workflows/test.yml
name: Run Tests

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

jobs:
  test:
    runs-on: ubuntu-latest

    strategy:
      matrix:
        node-version: [16.x, 18.x, 20.x]

    steps:
    - uses: actions/checkout@v3

    - name: Setup Node.js ${{ matrix.node-version }}
      uses: actions/setup-node@v3
      with:
        node-version: ${{ matrix.node-version }}
        cache: 'npm'

    - name: Install dependencies
      run: npm ci

    - name: Run tests
      run: npm test -- --coverage

    - name: Upload coverage
      uses: codecov/codecov-action@v3
Enter fullscreen mode Exit fullscreen mode

🎯 Mejor Para: Proyectos en GitHub que necesitan integración simple y rápida


2️⃣ GitLab CI/CD

¿Qué es? Plataforma DevOps completa con CI/CD integrado

✨ Características Principales:

  • Plataforma todo-en-uno
  • Auto DevOps para configuración automática
  • Container registry incluido
  • Visualización potente de pipelines

💻 Ejemplo Real:

# .gitlab-ci.yml
stages:
  - build
  - test
  - deploy

variables:
  POSTGRES_DB: test_db

build:
  stage: build
  image: node:18
  script:
    - npm install
  artifacts:
    paths:
      - node_modules/
    expire_in: 1 hour

unit_tests:
  stage: test
  image: node:18
  dependencies:
    - build
  script:
    - npm run test:unit
  coverage: '/Lines\s*:\s*(\d+\.\d+)%/'
  artifacts:
    reports:
      junit: junit.xml
      coverage_report:
        coverage_format: cobertura
        path: coverage/cobertura-coverage.xml

integration_tests:
  stage: test
  image: node:18
  services:
    - postgres:14
  script:
    - npm run test:integration
  only:
    - merge_requests
    - main
Enter fullscreen mode Exit fullscreen mode

🎯 Mejor Para: Equipos que usan GitLab y necesitan una solución DevOps completa


3️⃣ Jenkins

¿Qué es? Servidor de automatización open-source con máxima customización

✨ Características Principales:

  • 1800+ plugins disponibles
  • Auto-hospedado con control total
  • Builds distribuidos
  • Comunidad masiva

💻 Ejemplo Real:

// Jenkinsfile
pipeline {
    agent any

    tools {
        nodejs 'NodeJS-18'
    }

    environment {
        CI = 'true'
    }

    stages {
        stage('Checkout') {
            steps {
                checkout scm
            }
        }

        stage('Install') {
            steps {
                sh 'npm ci'
            }
        }

        stage('Test') {
            steps {
                sh 'npm test -- --ci'
            }
            post {
                always {
                    junit 'test-results/junit.xml'
                }
            }
        }

        stage('Coverage') {
            steps {
                sh 'npm run test:coverage'
            }
            post {
                always {
                    publishCoverage adapters: [
                        coberturaAdapter('coverage/cobertura-coverage.xml')
                    ]
                }
            }
        }
    }

    post {
        failure {
            emailext (
                subject: "Build Failed: ${env.JOB_NAME}",
                body: "Check: ${env.BUILD_URL}",
                to: "${env.CHANGE_AUTHOR_EMAIL}"
            )
        }
    }
}
Enter fullscreen mode Exit fullscreen mode

🎯 Mejor Para: Empresas que necesitan customización extrema e infraestructura propia


4️⃣ CircleCI

¿Qué es? Plataforma cloud reconocida por su velocidad

✨ Características Principales:

  • Builds súper rápidos
  • Caching inteligente
  • Soporte Docker nativo
  • Analytics poderosos

💻 Ejemplo Real:

# .circleci/config.yml
version: 2.1

orbs:
  node: circleci/node@5.1.0

executors:
  node-executor:
    docker:
      - image: cimg/node:18.17

jobs:
  test:
    executor: node-executor
    parallelism: 4
    steps:
      - checkout
      - restore_cache:
          keys:
            - v1-deps-{{ checksum "package-lock.json" }}
      - run:
          name: Install
          command: npm ci
      - save_cache:
          paths:
            - node_modules
          key: v1-deps-{{ checksum "package-lock.json" }}
      - run:
          name: Run tests
          command: |
            FILES=$(circleci tests glob "src/**/*.test.js" | \
                    circleci tests split --split-by=timings)
            npm test -- $FILES --coverage
      - store_test_results:
          path: test-results

workflows:
  test-workflow:
    jobs:
      - test
Enter fullscreen mode Exit fullscreen mode

🎯 Mejor Para: Teams que priorizan velocidad y ejecución paralela


5️⃣ Travis CI

¿Qué es? CI/CD clásico, popular en open-source

✨ Características Principales:

  • Configuración YAML simple
  • Gratis para proyectos open-source
  • Multi-lenguaje
  • Build matrix

💻 Ejemplo Real:

# .travis.yml
language: node_js

node_js:
  - '16'
  - '18'
  - '20'

services:
  - postgresql

env:
  global:
    - DATABASE_URL=postgresql://postgres@localhost/test_db
  matrix:
    - TEST_SUITE=unit
    - TEST_SUITE=integration

cache:
  directories:
    - node_modules

before_script:
  - psql -c 'create database test_db;' -U postgres

script:
  - npm run lint
  - |
    if [ "$TEST_SUITE" = "unit" ]; then
      npm run test:unit -- --coverage
    else
      npm run test:integration
    fi

after_success:
  - npm run coverage:upload

notifications:
  email:
    on_success: change
    on_failure: always
Enter fullscreen mode Exit fullscreen mode

🎯 Mejor Para: Proyectos open-source y equipos que buscan simplicidad

💡 Best Practices

1. 🔺 Pirámide de Testing

  • Más tests unitarios
  • Menos tests de integración
  • Mínimos tests E2E

2. ⚡ Optimización

  • Cachear dependencias
  • Ejecutar en paralelo
  • Fail fast cuando sea posible

3. 📈 Cobertura

  • Monitorear tendencias
  • Apuntar a 80%+ en crítico
  • No sacrificar calidad por %

4. 🔒 Seguridad

  • Usar secrets para credenciales
  • Escanear dependencias
  • Actualizar regularmente

🎬 Repositorio de Ejemplo

He creado un repositorio completo con ejemplos funcionales:

📦 Repo: github.com/your-user/ci-cd-testing-comparison

Incluye:

  • ✅ API Node.js con Express
  • ✅ Tests unitarios (Jest)
  • ✅ Tests de integración (Supertest)
  • ✅ Tests E2E (Playwright)
  • ✅ Configuraciones para todas las plataformas
  • ✅ Docker setup
  • ✅ Documentación completa

🎯 ¿Cuál Elegir?

Elige GitHub Actions si:

  • Ya usas GitHub
  • Quieres setup rápido
  • Necesitas gran ecosistema

Elige GitLab CI/CD si:

  • Quieres plataforma todo-en-uno
  • Necesitas self-hosting
  • Buscas DevOps completo

Elige Jenkins si:

  • Necesitas control total
  • Tienes infraestructura propia
  • Requieres customización extrema

Elige CircleCI si:

  • Velocidad es prioridad
  • Necesitas paralelismo avanzado
  • Quieres analytics detallados

Elige Travis CI si:

  • Proyecto open-source
  • Buscas simplicidad máxima
  • Configuración mínima

🚀 Conclusión

No existe una solución única para todos. La elección depende de tu stack, equipo, presupuesto y necesidades específicas. Todas estas herramientas son excelentes cuando se usan correctamente.

Pro tip: Empieza simple, itera y optimiza según tus necesidades reales.


📚 Recursos Adicionales


🏷️ Tags: #DevOps #CICD #Testing #Automation #GitHubActions #GitLab #Jenkins #CircleCI #TravisCI #QualityAssurance

👤 Autor: [Diego Fernando Castillo Mamani] | 📅 Fecha: Noviembre 2024

Top comments (0)