DEV Community

Cover image for CI/CD y Testing Automatizado: Comparativa Real de 8 Herramientas con Código
IKER ALBERTO SIERRA RUIZ
IKER ALBERTO SIERRA RUIZ

Posted on

CI/CD y Testing Automatizado: Comparativa Real de 8 Herramientas con Código

Elegir una herramienta de CI/CD para automatizar tus pipelines de testing no debería ser una decisión basada solo en marketing. En este post comparamos 8 herramientas ampliamente usadas en la industria — GitLab Pipelines, GitHub Actions, Jenkins, CircleCI, TeamCity, Travis CI, Bitbucket Pipelines, Tekton y Harness — mostrando configuraciones reales que ejecutan un pipeline típico de testing: instalar dependencias, correr linter, ejecutar tests unitarios y publicar un reporte de cobertura.

Al final encontrarás un repositorio público de referencia para que puedas clonar, adaptar y experimentar.

Qué vamos a comparar

Para que la comparación sea justa, cada ejemplo resuelve el mismo escenario:

  1. Checkout del código
  2. Instalación de dependencias (Node.js como ejemplo)
  3. Linter (eslint)
  4. Tests unitarios (jest) con reporte de cobertura

5. Publicación del reporte/artefacto

1. GitHub Actions

Modelo: SaaS nativo de GitHub, YAML declarativo, runners hospedados o self-hosted.

# .github/workflows/ci.yml
name: CI

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

jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4

      - uses: actions/setup-node@v4
        with:
          node-version: '20'
          cache: 'npm'

      - run: npm ci
      - run: npm run lint
      - run: npm test -- --coverage

      - uses: actions/upload-artifact@v4
        with:
          name: coverage-report
          path: coverage/
Enter fullscreen mode Exit fullscreen mode

Fortalezas: integración nativa con PRs, marketplace enorme de actions reutilizables, muy buena curva de entrada.
Limitaciones: minutos gratuitos limitados en repos privados; el ecosistema de actions de terceros exige revisar la cadena de confianza (supply chain).

Repo público de referencia oficial: actions/starter-workflows


2. GitLab CI/CD (Pipelines)

Modelo: integrado en GitLab, self-hosted o SaaS, basado en stages y jobs.

# .gitlab-ci.yml
stages:
  - install
  - lint
  - test

variables:
  NODE_ENV: "test"

install_deps:
  stage: install
  image: node:20
  script:
    - npm ci
  cache:
    paths:
      - node_modules/

lint:
  stage: lint
  image: node:20
  script:
    - npm run lint

unit_tests:
  stage: test
  image: node:20
  script:
    - npm test -- --coverage
  coverage: '/All files[^|]*\|[^|]*\s+([\d\.]+)/'
  artifacts:
    paths:
      - coverage/
Enter fullscreen mode Exit fullscreen mode

Fortalezas: pipelines multi-proyecto (include), regex de cobertura nativo visible en el MR, muy potente si ya usas GitLab como plataforma completa (issues, registry, etc.).
Limitaciones: el rendimiento de runners compartidos SaaS puede ser inferior al de GitHub Actions en picos de uso.


3. Jenkins

Modelo: self-hosted, extensible vía plugins, Pipeline as Code con Jenkinsfile (Groovy DSL).

// Jenkinsfile
pipeline {
    agent { docker { image 'node:20' } }

    stages {
        stage('Install') {
            steps {
                sh 'npm ci'
            }
        }
        stage('Lint') {
            steps {
                sh 'npm run lint'
            }
        }
        stage('Test') {
            steps {
                sh 'npm test -- --coverage'
            }
        }
    }

    post {
        always {
            archiveArtifacts artifacts: 'coverage/**', fingerprint: true
            junit 'reports/junit/*.xml'
        }
    }
}
Enter fullscreen mode Exit fullscreen mode

Fortalezas: control total del entorno, miles de plugins, ideal para infraestructura on-premise o requisitos de compliance estrictos.
Limitaciones: mantenimiento propio (parches, escalado de agentes), curva de aprendizaje mayor, la sintaxis Groovy puede ser menos intuitiva.


4. CircleCI

Modelo: SaaS o self-hosted (server), configuración YAML con orbs reutilizables.

# .circleci/config.yml
version: 2.1

orbs:
  node: circleci/node@5.2.0

jobs:
  test:
    docker:
      - image: cimg/node:20.11
    steps:
      - checkout
      - node/install-packages:
          pkg-manager: npm
      - run: npm run lint
      - run: npm test -- --coverage
      - store_artifacts:
          path: coverage

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

Fortalezas: los orbs reducen boilerplate drásticamente, buen soporte de paralelización de tests y caching inteligente.
Limitaciones: el pricing basado en "créditos" puede ser confuso al estimar costos a escala.


5. TeamCity

Modelo: JetBrains, self-hosted con opción cloud, configuración vía UI o Kotlin DSL versionado.

// .teamcity/settings.kts (fragmento)
import jetbrains.buildServer.configs.kotlin.*
import jetbrains.buildServer.configs.kotlin.buildSteps.script

project {
    buildType(CiPipeline)
}

object CiPipeline : BuildType({
    name = "CI Pipeline"

    steps {
        script {
            name = "Install"
            scriptContent = "npm ci"
        }
        script {
            name = "Lint"
            scriptContent = "npm run lint"
        }
        script {
            name = "Test"
            scriptContent = "npm test -- --coverage"
        }
    }

    artifactRules = "coverage => coverage.zip"
})
Enter fullscreen mode Exit fullscreen mode

Fortalezas: excelente para entornos .NET/Java corporativos, testing de builds compuestas ("build chains"), buena trazabilidad histórica.
Limitaciones: licenciamiento por agentes puede encarecerse en equipos grandes; menor tracción en la comunidad open source comparado con GitHub Actions o GitLab CI.


6. Travis CI

Modelo: uno de los pioneros de CI en la nube, configuración simple basada en .travis.yml.

# .travis.yml
language: node_js
node_js:
  - "20"

cache: npm

install:
  - npm ci

script:
  - npm run lint
  - npm test -- --coverage

after_success:
  - bash <(curl -s https://codecov.io/bash)
Enter fullscreen mode Exit fullscreen mode

Fortalezas: configuración muy legible, ideal para proyectos open source pequeños/medianos.
Limitaciones: tras el cambio de modelo de negocio (2020-2021) perdió terreno frente a GitHub Actions; el plan gratuito para open source es más limitado que antes.


7. Bitbucket Pipelines

Modelo: integrado en Bitbucket Cloud, YAML con pipes reutilizables.

# bitbucket-pipelines.yml
image: node:20

pipelines:
  default:
    - step:
        name: Install & Test
        caches:
          - node
        script:
          - npm ci
          - npm run lint
          - npm test -- --coverage
        artifacts:
          - coverage/**
Enter fullscreen mode Exit fullscreen mode

Fortalezas: configuración mínima para equipos ya en el ecosistema Atlassian (Jira, Bitbucket), buen soporte de "deployments" por ambiente.
Limitaciones: el marketplace de pipes es más pequeño que el de GitHub Actions.


8. Tekton

Modelo: CI/CD cloud-native sobre Kubernetes, basado en CRDs (Task, Pipeline, PipelineRun). No es SaaS: corre dentro de tu clúster.

# tekton/task-test.yaml
apiVersion: tekton.dev/v1
kind: Task
metadata:
  name: run-tests
spec:
  workspaces:
    - name: source
  steps:
    - name: install
      image: node:20
      workingDir: $(workspaces.source.path)
      script: npm ci

    - name: lint
      image: node:20
      workingDir: $(workspaces.source.path)
      script: npm run lint

    - name: test
      image: node:20
      workingDir: $(workspaces.source.path)
      script: npm test -- --coverage
Enter fullscreen mode Exit fullscreen mode

Fortalezas: máxima portabilidad (corre igual en cualquier Kubernetes), extensible con CRDs propios, buena opción si ya tienes una plataforma interna de developer platform (IDP).
Limitaciones: requiere operar y mantener Kubernetes; la curva de entrada es la más alta de esta lista.


9. Harness

Modelo: plataforma comercial de CI/CD con enfoque en pipelines visuales + YAML, fuerte en CD y feature flags.

# harness/ci-pipeline.yaml (fragmento)
pipeline:
  name: ci-pipeline
  stages:
    - stage:
        name: Build and Test
        type: CI
        spec:
          execution:
            steps:
              - step:
                  type: Run
                  name: Install
                  spec:
                    command: npm ci
              - step:
                  type: Run
                  name: Lint
                  spec:
                    command: npm run lint
              - step:
                  type: Run
                  name: Test
                  spec:
                    command: npm test -- --coverage
Enter fullscreen mode Exit fullscreen mode

Fortalezas: buena UX visual para equipos que prefieren no escribir YAML desde cero, capacidades avanzadas de CD (canary, blue/green) integradas de fábrica.
Limitaciones: producto comercial, la capa gratuita es más limitada que la de las alternativas puramente open source.


Tabla comparativa rápida

Herramienta Hosting Configuración Curva de entrada Ideal para
GitHub Actions SaaS / self-hosted YAML Baja Proyectos ya en GitHub
GitLab CI SaaS / self-hosted YAML Baja-Media Equipos en GitLab, monorepos
Jenkins Self-hosted Groovy DSL Alta Compliance, control total
CircleCI SaaS / self-hosted YAML + Orbs Baja Paralelización rápida
TeamCity Self-hosted / cloud UI o Kotlin DSL Media-Alta Entornos .NET/Java corporativos
Travis CI SaaS YAML Baja Proyectos OSS pequeños
Bitbucket Pipelines SaaS YAML Baja Ecosistema Atlassian
Tekton Kubernetes (self-hosted) CRDs YAML Alta Plataformas cloud-native
Harness SaaS comercial YAML/UI visual Media CD avanzado, feature flags

Repositorio de ejemplo público

Para ver estos pipelines funcionando de verdad (no solo en un post), puedes explorar y clonar el repositorio oficial de plantillas de GitHub Actions:

🔗 https://github.com/actions/starter-workflows

Si quieres comparar varias herramientas sobre el mismo código fuente, la recomendación práctica es:

  1. Forkear cualquier repo pequeño de Node.js (por ejemplo, una API REST de ejemplo).
  2. Añadir en paralelo los archivos de configuración mostrados arriba (.github/workflows/ci.yml, .gitlab-ci.yml, Jenkinsfile, .circleci/config.yml, etc.).
  3. Conectar el repo a cada plataforma (todas ofrecen un tier gratuito para pruebas) y comparar tiempos de build, legibilidad de logs y facilidad de debugging. Ese ejercicio de "un repo, múltiples pipelines" es la forma más honesta de decidir cuál se ajusta mejor a tu equipo, ya que verás las diferencias reales de UX, velocidad y reporting — no solo la sintaxis.

Conclusión

No existe una herramienta "mejor" en abstracto:

  • Si ya vives en GitHub, GitHub Actions es el camino de menor fricción.
  • Si necesitas control total o cumples requisitos de compliance estrictos, Jenkins sigue siendo muy relevante.
  • Si operas sobre Kubernetes y quieres algo verdaderamente cloud-native, Tekton es la opción más alineada.
  • Si tu prioridad es CD avanzado (canary, feature flags) con una capa visual, Harness aporta valor rápido.

Top comments (0)