Los tests que solo corren en tu computadora no bloquean nada. Un desarrollador puede mergear código que rompe tu suite de tests y no te vas a enterar hasta que los ejecutes manualmente. Este artículo cubre cómo conectar los tests de Playwright a GitHub Actions, GitLab CI y Jenkins para que corran automáticamente en cada pull request, con un workflow de GitHub Actions listo para copiar y pegar y las diferencias de configuración entre las tres plataformas.

Qué significa CI/CD para QA

CI significa Integración Continua. La idea: cada vez que un desarrollador sube código, un proceso automatizado corre, compila el código, ejecuta los tests y reporta los resultados. Los problemas se detectan minutos después de introducirse, no días después durante el QA manual.

CD significa Entrega Continua (o Despliegue Continuo). Después de que CI pasa, el código se despliega automáticamente a un entorno de staging, o incluso a producción.

Para un ingeniero QA, la parte relevante es CI. Tus tests corren en el pipeline. Cada pull request los activa. Si los tests fallan, el PR no puede mergearse. Ese es el contrato.

Los tests que solo corren en tu computadora no hacen cumplir nada. Los tests en CI hacen cumplir el estándar de calidad en cada cambio, automáticamente.

GitHub Actions: empezá por acá

GitHub Actions es la herramienta de CI más fácil de aprender y la más usada en proyectos nuevos. Es gratuita para repositorios públicos y tiene un nivel gratuito generoso para los privados.

El concepto: defines un workflow en un archivo YAML dentro de tu repositorio. GitHub ejecuta ese workflow cuando ocurre un evento desencadenante: un push, un pull request, un horario programado.

Crea .github/workflows/playwright.yml en la raíz de tu proyecto:

mkdir -p .github/workflows

# .github/workflows/playwright.yml
name: Playwright Tests

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

jobs:
  test:
    runs-on: ubuntu-latest

    steps:
      - name: Checkout del código
        uses: actions/checkout@v4

      - name: Configurar Node.js
        uses: actions/setup-node@v4
        with:
          node-version: 20
          cache: 'npm'

      - name: Instalar dependencias
        run: npm ci

      - name: Instalar navegadores de Playwright
        run: npx playwright install --with-deps

      - name: Ejecutar tests de Playwright
        run: npx playwright test

      - name: Subir reporte de tests
        uses: actions/upload-artifact@v4
        if: always()
        with:
          name: playwright-report
          path: playwright-report/
          retention-days: 14

Commitea este archivo, súbelo a GitHub y abre la pestaña Actions. Vas a ver el workflow corriendo. Instala Node, instala los navegadores de Playwright, ejecuta tus tests y sube el reporte HTML como un artefacto descargable.

El if: always() en el paso de subida significa que el reporte se sube incluso cuando los tests fallan, que es exactamente cuando más lo necesitas.

Entender el archivo de workflow

on: define qué activa el workflow. La configuración de arriba corre en los pushes a main y en los pull requests que apuntan a main. Agrega workflow_dispatch: si quieres un botón de activación manual en la UI de GitHub. runs-on: ubuntu-latest es el tipo de máquina. Ubuntu es el estándar para Playwright. Es en lo que se basa la imagen Docker de Playwright, y las dependencias del navegador funcionan sin configuración extra. npm ci en lugar de npm install. ci instala exactamente lo que está en package-lock.json sin modificarlo, lo que importa para la reproducibilidad en CI. npx playwright install --with-deps instala los navegadores Y sus dependencias del sistema. En un runner de Ubuntu nuevo, los navegadores necesitan bibliotecas del sistema que no vienen preinstaladas. --with-deps lo maneja automáticamente.

Variables de entorno en GitHub Actions

Nunca hardcodees credenciales en el archivo de workflow. Guárdalas como Secrets de GitHub y referencialas como variables de entorno.

Anda a tu repositorio → Settings → Secrets and variables → Actions → New repository secret. Agrega TEST_USER y TEST_PASS.

Referencialas en el workflow:

      - name: Ejecutar tests de Playwright
        run: npx playwright test
        env:
          TEST_USER: ${{ secrets.TEST_USER }}
          TEST_PASS: ${{ secrets.TEST_PASS }}
          BASE_URL: https://lab.becomeqa.com

En tus tests, accedelas con process.env.TEST_USER. Los secrets están enmascarados en los logs. GitHub reemplaza sus valores con * si aparecen en el output.

Corré los tests más rápido con sharding

Por defecto Playwright usa múltiples workers en una sola máquina. Para suites grandes, puedes dividirlos entre múltiples máquinas usando sharding.

jobs:
  test:
    runs-on: ubuntu-latest
    strategy:
      matrix:
        shard: [1, 2, 3, 4]

    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-node@v4
        with:
          node-version: 20
          cache: 'npm'
      - run: npm ci
      - run: npx playwright install --with-deps
      - run: npx playwright test --shard=${{ matrix.shard }}/4

Esto ejecuta 4 jobs en paralelo, cada uno manejando el 25% de los tests. Un suite que tarda 20 minutos en una máquina tarda 5 minutos dividido entre cuatro.

Empezá sin sharding. Agrégalo cuando tu suite tarde más de 5 minutos en correr. El sharding agrega complejidad. No optimices antes de necesitarlo.

GitLab CI

GitLab CI usa los mismos conceptos que GitHub Actions pero con sintaxis diferente. El archivo de configuración es .gitlab-ci.yml en la raíz del proyecto.

# .gitlab-ci.yml
image: mcr.microsoft.com/playwright:v1.44.0-jammy

stages:
  - test

playwright:
  stage: test
  script:
    - npm ci
    - npx playwright test
  artifacts:
    when: always
    paths:
      - playwright-report/
    expire_in: 1 week
  variables:
    TEST_USER: $TEST_USER
    TEST_PASS: $TEST_PASS

Diferencias clave con GitHub Actions:

El campo image: especifica una imagen Docker para el job. Usar la imagen oficial de Playwright (mcr.microsoft.com/playwright) significa que los navegadores ya están instalados, así que no se necesita npx playwright install.

artifacts en GitLab es equivalente a upload-artifact en GitHub Actions. El when: always garantiza que se sube incluso en caso de fallo.

Las variables se configuran en GitLab → Project → Settings → CI/CD → Variables. Se referencian con $NOMBRE_VARIABLE en la config.

Si conoces GitHub Actions, puedes aprender GitLab CI en un día. El modelo mental es idéntico: activadores, jobs, pasos, artefactos. Solo diferente YAML.

Jenkins

Jenkins es más antiguo, más complejo y sigue siendo dominante en grandes entornos empresariales. Lo vas a encontrar en empresas con infraestructura legacy.

Jenkins usa un Jenkinsfile en la raíz del proyecto:

pipeline {
  agent {
    docker {
      image 'mcr.microsoft.com/playwright:v1.44.0-jammy'
    }
  }

  environment {
    TEST_USER = credentials('test-user')
    TEST_PASS = credentials('test-pass')
  }

  stages {
    stage('Instalar') {
      steps {
        sh 'npm ci'
      }
    }

    stage('Test') {
      steps {
        sh 'npx playwright test'
      }
      post {
        always {
          publishHTML(target: [
            reportDir: 'playwright-report',
            reportFiles: 'index.html',
            reportName: 'Playwright Report'
          ])
        }
      }
    }
  }
}

Jenkins requiere un servidor Jenkins funcionando. No es un servicio en la nube. Alguien necesita instalarlo, configurarlo y mantenerlo. Por eso GitHub Actions lo reemplazó en gran medida para los proyectos nuevos.

Para QA específicamente: si te unís a una empresa que usa Jenkins, no necesitás entender la administración de Jenkins. Necesitás entender la sintaxis del Jenkinsfile lo suficiente para agregar o modificar etapas de tests. El DSL del pipeline (la sintaxis de arriba) es con lo que los ingenieros QA trabajan día a día.

Qué herramienta aprender primero

La decisión es directa:

Aprende GitHub Actions primero. Es gratuito, no requiere configuración de servidor, tiene la comunidad más grande y se usa en la mayoría de los proyectos nuevos. Podés tener tests corriendo en CI en una hora desde un repo nuevo. GitLab CI en segundo lugar si apuntas a empresas que usan GitLab (común en empresas europeas, servicios financieros, gobierno). Los conceptos se transfieren directamente desde GitHub Actions. Jenkins en tercer lugar. No porque esté muriendo, sino porque entender GitHub Actions primero hace que Jenkins sea más fácil de aprender, y el conocimiento de Jenkins es más útil en entornos donde un equipo de CI ya gestiona el servidor. No vas a estar configurando Jenkins desde cero como ingeniero QA.

Cómo se ve un pipeline de CI real

Un pipeline maduro de Playwright en un proyecto real típicamente tiene más que solo "correr tests":

# Pipeline realista de producción
jobs:
  lint:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - run: npm ci
      - run: npx tsc --noEmit        # verificación de tipos TypeScript
      - run: npx eslint tests/       # lint de los archivos de tests

  test:
    needs: lint
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-node@v4
        with: { node-version: 20, cache: 'npm' }
      - run: npm ci
      - run: npx playwright install --with-deps
      - run: npx playwright test --project=chromium  # feedback rápido en un navegador
        env:
          BASE_URL: ${{ vars.BASE_URL }}
          TEST_USER: ${{ secrets.TEST_USER }}
          TEST_PASS: ${{ secrets.TEST_PASS }}
      - uses: actions/upload-artifact@v4
        if: always()
        with:
          name: playwright-report
          path: playwright-report/

  test-cross-browser:
    needs: test
    if: github.ref == 'refs/heads/main'  # solo en la rama main
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-node@v4
        with: { node-version: 20, cache: 'npm' }
      - run: npm ci
      - run: npx playwright install --with-deps
      - run: npx playwright test  # todos los navegadores

El patrón: feedback rápido primero (lint + Chromium), luego cross-browser completo en la rama main. Los pull requests reciben resultados rápidos; los merges reciben cobertura exhaustiva.

No corras tests cross-browser en cada PR desde el principio. Triplica el tiempo de CI y la mayoría de los bugs no son específicos del navegador. Corré cross-browser solo en los merges a main hasta que tu suite sea maduro.

FAQ

Mis tests pasan localmente pero fallan en GitHub Actions. ¿Qué está mal?

Verifica tres cosas: variables de entorno (secrets no configurados en Actions), base URL (localhost hardcodeado que no existe en CI), y timing (los runners de CI son más lentos, así que agregá retries: 1 en playwright.config.ts para CI).

¿Cómo veo el reporte de Playwright de una ejecución de CI fallida?

En GitHub Actions: anda a la ejecución fallida → Summary → Artifacts → descarga playwright-report. Extrae el zip y abre index.html en un navegador.

¿Puedo correr solo los tests modificados en CI?

No de forma nativa en Playwright. Algunos equipos usan filtrado por ruta: correr solo los tests en tests/auth/ cuando cambiaron archivos en src/auth/. Es complejo de configurar de forma confiable. Empieza corriendo el suite completo y optimiza después si se vuelve muy lento.

¿Cómo ejecuto tests con un horario programado (por ejemplo, cada noche)?

Agregá un activador de horario:

on:
  schedule:
    - cron: '0 2 * * *'   # 2am UTC todas las noches
  push:
    branches: [main]

Las ejecuciones nocturnas son útiles para detectar fallos intermitentes que no aparecen en cada ejecución de PR.

→ See also: GitHub Actions para Tests de Playwright: La Configuración Completa (2026) | GitLab CI + Playwright: Guía Completa de Configuración | Jenkins + Playwright: Construyendo un Pipeline CI desde Cero | Ejecución Paralela en Playwright: Workers, Fragmentos y Fragmentación para Mayor Velocidad