馃帹 Sysprovider Code
Sysprovider LogoWiki
馃嚜馃嚫Hosting espa帽ol para ecommerce

Automatizaci贸n de CI/CD para WordPress con GitHub Actions y WP-CLI

Actualizado el 30 de noviembre de 2025

El desarrollo moderno de sitios web exige velocidad, consistencia y fiabilidad. Para los administradores y desarrolladores de WordPress, gestionar el flujo de trabajo entre el entorno local, el de staging y el de producci贸n puede convertirse en una tarea tediosa y propensa a errores. Aqu铆 es donde entra en juego la automatizaci贸n de CI/CD (Integraci贸n Continua y Despliegue Continuo).

En este art铆culo, exploraremos c贸mo construir un pipeline de CI/CD para WordPress utilizando GitHub Actions como orquestador y WP-CLI como herramienta de gesti贸n del CMS. Aprender谩s a sincronizar bases de datos, mover archivos, gestionar plugins y garantizar que cada commit en tu repositorio de GitHub se traduzca en un despliegue predecible y seguro.

驴Por qu茅 necesitas CI/CD para WordPress?

Tradicionalmente, los cambios en un sitio WordPress se realizan directamente en producci贸n o mediante plugins de migraci贸n manual. Este enfoque tiene varios problemas: sobrescritura accidental de contenido, conflictos de bases de datos, rotura de personalizaciones y falta de control de versiones. Un pipeline de CI/CD WordPress resuelve estos problemas al:

  • Estandarizar el proceso: Cada despliegue sigue los mismos pasos, eliminando la variabilidad humana.
  • Reducir el downtime: El despliegue se realiza en segundos o minutos, no en horas.
  • Mejorar la seguridad: Los secretos (como claves de API o contrase帽as de BD) se gestionan mediante variables de entorno, no en el c贸digo.
  • Facilitar la colaboraci贸n: M煤ltiples desarrolladores pueden trabajar en ramas sin temor a romper el sitio principal.

[INFO] La automatizaci贸n con WP-CLI es especialmente potente porque permite interactuar con WordPress desde la l铆nea de comandos sin necesidad de interfaz web, lo que es ideal para scripts de CI/CD.

Arquitectura del Pipeline

Antes de escribir c贸digo, es crucial entender el flujo. Nuestro pipeline se dividir谩 en tres fases principales:

  1. Integraci贸n (CI): Al hacer push a una rama (por ejemplo, develop), se ejecutan tests, se comprueba la sintaxis de PHP y se construye el artefacto.
  2. Despliegue (CD): Al hacer push a la rama main (o crear un release), se despliega el c贸digo y se ejecutan comandos de WP-CLI para sincronizar la base de datos y los assets.
  3. Post-despliegue: Se invalidan cach茅s, se env铆an notificaciones y se verifica el estado del sitio.

Requisitos Previos

Para seguir esta gu铆a, necesitar谩s:

  • Un repositorio en GitHub con tu tema y plugins de WordPress (sin el core, que se instalar谩 mediante WP-CLI).
  • Un servidor de producci贸n (VPS o hosting con acceso SSH).
  • Claves SSH configuradas entre GitHub Actions y tu servidor.
  • Conocimientos b谩sicos de YAML y l铆nea de comandos.

Configuraci贸n del Entorno: Secretos y Variables

En GitHub, dir铆gete a Settings > Secrets and variables > Actions. Aqu铆 almacenar谩s toda la informaci贸n sensible. Crea los siguientes secretos:

SecretoDescripci贸n
SSH_PRIVATE_KEYClave privada SSH para conectar con el servidor.
SSH_HOSTIP o dominio del servidor de producci贸n.
SSH_USERUsuario SSH (ej. deploy).
PRODUCTION_DB_NAMENombre de la base de datos en producci贸n.
PRODUCTION_DB_USERUsuario de la BD.
PRODUCTION_DB_PASSWORDContrase帽a de la BD.
PRODUCTION_DB_HOSTHost de la BD (normalmente localhost).
WP_HOMEURL del sitio (ej. https://midominio.com).

[WARNING] Nunca incluyas contrase帽as o claves directamente en el archivo YAML. GitHub Actions las inyecta como variables de entorno de forma segura.

Creando el Workflow de GitHub Actions

Los workflows se definen en el directorio .github/workflows/ de tu repositorio. Crearemos un archivo llamado deploy.yml.

1. Integraci贸n Continua (CI)

El primer job se ejecuta en cada push a cualquier rama excepto main. Su objetivo es verificar que el c贸digo es v谩lido.

name: CI/CD WordPress Pipeline

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

jobs:
  ci:
    name: Integraci贸n Continua
    runs-on: ubuntu-latest
    steps:
      - name: Checkout del c贸digo
        uses: actions/checkout@v4

      - name: Verificar sintaxis PHP
        run: |
          find . -type f -name "*.php" -exec php -l {} \;
          
      - name: Verificar est谩ndares de WordPress (opcional)
        run: |
          # Si usas PHP_CodeSniffer con reglas de WordPress
          # composer install
          # vendor/bin/phpcs --standard=WordPress .

2. Despliegue Continuo (CD)

Este job se activa solo cuando hay un push a main. Aqu铆 es donde ocurre la magia de automatizaci贸n despliegue.

  cd:
    name: Despliegue Continuo
    if: github.ref == 'refs/heads/main'
    needs: ci  # Solo se ejecuta si CI pasa
    runs-on: ubuntu-latest
    steps:
      - name: Checkout del c贸digo
        uses: actions/checkout@v4

      - name: Configurar SSH
        run: |
          mkdir -p ~/.ssh/
          echo "${{ secrets.SSH_PRIVATE_KEY }}" > ~/.ssh/id_rsa
          chmod 600 ~/.ssh/id_rsa
          ssh-keyscan -H ${{ secrets.SSH_HOST }} >> ~/.ssh/known_hosts

      - name: Sincronizar archivos mediante rsync
        run: |
          rsync -avz --delete \
            --exclude '.git' \
            --exclude '.github' \
            --exclude 'wp-config.php' \
            --exclude 'node_modules' \
            ./ ${{ secrets.SSH_USER }}@${{ secrets.SSH_HOST }}:/ruta/a/tu/wordpress/wp-content/themes/mi-tema/
        # Ajusta la ruta de destino seg煤n tu estructura de directorios

[TIP] El comando rsync es tu mejor aliado. La opci贸n --delete asegura que los archivos eliminados localmente tambi茅n se eliminen en producci贸n, manteniendo una copia exacta.

3. Ejecutar WP-CLI en Producci贸n

Una vez que los archivos est谩n en el servidor, necesitamos actualizar la base de datos, limpiar cach茅s y posiblemente ejecutar migraciones. Aqu铆 es donde WP-CLI brilla.

A帽ade este paso despu茅s de la sincronizaci贸n de archivos:

      - name: Ejecutar WP-CLI en producci贸n
        run: |
          ssh ${{ secrets.SSH_USER }}@${{ secrets.SSH_HOST }} "
            cd /ruta/a/tu/wordpress &&
            
            # Actualizar la estructura de la base de datos si es necesario
            wp core update-db --allow-root &&
            
            # Actualizar plugins y temas (opcional, ten cuidado)
            # wp plugin update --all --allow-root --quiet
            
            # Limpiar cach茅s de WordPress
            wp cache flush --allow-root &&
            
            # Regenerar archivos de traducci贸n si es necesario
            wp language core update --allow-root
          "

4. Gesti贸n de la Base de Datos (Caso Avanzado)

Si tu sitio tiene contenido din谩mico que cambia en local (como posts de prueba), es posible que quieras sincronizar la base de datos de producci贸n a local, no al rev茅s. Sin embargo, para despliegues de c贸digo, normalmente no tocas la base de datos de producci贸n. Si necesitas aplicar cambios de esquema (por ejemplo, a帽adir una tabla personalizada), puedes hacerlo con:

      - name: Ejecutar migraciones de base de datos
        run: |
          ssh ${{ secrets.SSH_USER }}@${{ secrets.SSH_HOST }} "
            cd /ruta/a/tu/wordpress &&
            wp db query < /ruta/a/mi-migracion.sql --allow-root
          "

[WARNING] Manipular la base de datos de producci贸n desde CI/CD es peligroso. Siempre haz un backup antes de ejecutar migraciones autom谩ticas.

Gesti贸n de M煤ltiples Entornos (Staging y Producci贸n)

Una buena pr谩ctica es tener dos workflows separados o usar condicionales para desplegar en staging primero y, tras pruebas, en producci贸n. Puedes modificar el evento on para escuchar etiquetas:

on:
  push:
    tags:
      - 'v*'  # Ejecutar solo cuando se crea un tag como v1.0.0

Luego, dentro del job, extraes la versi贸n y despliegas en producci贸n.

Automatizaci贸n de Tareas Post-Despliegue

Despu茅s de que el c贸digo est谩 en vivo, es importante asegurarse de que todo funciona correctamente. A帽ade estos pasos:

      - name: Verificar estado del sitio
        run: |
          ssh ${{ secrets.SSH_USER }}@${{ secrets.SSH_HOST }} "
            wp core verify-checksums --allow-root &&
            wp plugin status --allow-root
          "

      - name: Invalidar cach茅 de CDN (opcional)
        run: |
          curl -X POST "https://api.cloudflare.com/client/v4/zones/TU_ZONE_ID/purge_cache" \
            -H "Authorization: Bearer ${{ secrets.CLOUDFLARE_TOKEN }}" \
            -H "Content-Type: application/json" \
            --data '{"purge_everything":true}'

Ejemplo Completo del Workflow

Aqu铆 tienes un workflow completo que une todas las piezas:

name: CI/CD WordPress

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

jobs:
  ci:
    name: CI
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - name: Validar PHP
        run: find . -name "*.php" -not -path "./vendor/*" -exec php -l {} \;

  cd:
    name: CD
    if: github.ref == 'refs/heads/main' && success()
    needs: ci
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - name: Configurar SSH
        run: |
          mkdir -p ~/.ssh
          echo "${{ secrets.SSH_PRIVATE_KEY }}" > ~/.ssh/id_rsa
          chmod 600 ~/.ssh/id_rsa
          ssh-keyscan -H ${{ secrets.SSH_HOST }} >> ~/.ssh/known_hosts
      - name: Sincronizar tema
        run: |
          rsync -avz --delete --exclude='.git' --exclude='node_modules' \
            ./ wp@${{ secrets.SSH_HOST }}:/var/www/html/wp-content/themes/mi-tema/
      - name: Ejecutar WP-CLI
        run: |
          ssh wp@${{ secrets.SSH_HOST }} "
            cd /var/www/html &&
            wp core update-db --allow-root &&
            wp cache flush --allow-root
          "
      - name: Healthcheck
        run: curl -I ${{ secrets.WP_HOME }}

Buenas Pr谩cticas y Consejos

  • Usa ramas protegidas: En GitHub, protege la rama main para que los merges requieran revisi贸n y los checks de CI pasen.
  • Prueba en staging: Crea un job que despliegue en un servidor de staging antes de tocar producci贸n. Puedes hacerlo con una rama staging.
  • No incluyas wp-config.php: Este archivo es espec铆fico del servidor. Genera uno por entorno usando variables de entorno.
  • Monitorea los logs: GitHub Actions proporciona logs detallados. Si un paso falla, revisa el output de rsync o wp.
  • Backups autom谩ticos: Antes de cualquier despliegue, programa un backup de la base de datos:
      - name: Backup de BD antes del despliegue
        run: |
          ssh wp@${{ secrets.SSH_HOST }} "
            wp db export /tmp/backup-$(date +%Y%m%d).sql --allow-root
          "

Conclusi贸n

Implementar un pipeline de CI/CD WordPress con GitHub Actions y WP-CLI transforma la forma en que gestionas tu sitio. Ya no es necesario entrar a FTP o al panel de administraci贸n para actualizar un archivo; todo se hace mediante commits y merges controlados. La combinaci贸n de rsync para archivos y wp-cli para la l贸gica de WordPress te da un control total y repetible sobre el proceso.

El resultado es un flujo de trabajo profesional, auditable y escalable. Ya sea que administres un solo blog o una red multisitio, esta automatizaci贸n te ahorrar谩 horas de trabajo y reducir谩 dr谩sticamente los errores humanos.

[INFO] Si quieres ir un paso m谩s all谩, puedes integrar herramientas como Composer para gestionar dependencias de PHP o npm para assets frontend. El l铆mite es tu imaginaci贸n y las necesidades de tu proyecto.

Ahora, ve a tu repositorio, configura los secretos y lanza tu primer commit. La automatizaci贸n te espera.

驴Necesitas ayuda?Son dos de nuestros t茅cnicos, Agust铆n y Mikel, y est谩n disponibles para resolver cualquier problema.

Hablar con ellos ahora
Agust铆n y Mikel