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:
- Checkout del código
- Instalación de dependencias (Node.js como ejemplo)
- Linter (
eslint) - 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/
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/
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'
}
}
}
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
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"
})
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)
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/**
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
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
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:
- Forkear cualquier repo pequeño de Node.js (por ejemplo, una API REST de ejemplo).
- Añadir en paralelo los archivos de configuración mostrados arriba (
.github/workflows/ci.yml,.gitlab-ci.yml,Jenkinsfile,.circleci/config.yml, etc.). - 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)