🎨 Sysprovider Code
Sysprovider LogoWiki
🇪🇸Hosting español para ecommerce

Automatización de deploys con GitHub Actions para WordPress

Actualizado el 20 de abril de 2026

Imagina que cada cambio en tu repositorio de WordPress se despliega automáticamente en producción sin intervención manual, sin riesgos de error humano y con un registro impecable de cada versión. Eso es exactamente lo que consigues con GitHub Actions. En este artículo, vamos a construir un pipeline de CI/CD WordPress completo, desde el commit hasta el servidor, usando exclusivamente GitHub Actions.

Si eres desarrollador o sysadmin, sabes que mantener un WordPress actualizado y estable es un reto. Entre plugins, temas y el núcleo, cualquier cambio mal sincronizado puede romper el sitio. La automatización de deploys con GitHub Actions WordPress no solo acelera el proceso, sino que lo vuelve predecible y auditable.

A continuación, desglosamos cómo implementar un flujo DevOps real para WordPress, con ejemplos prácticos, configuraciones YAML y buenas prácticas para que tu WordPress pipeline sea robusto y eficiente.


¿Por qué necesitas un pipeline CI/CD para WordPress?

El desarrollo tradicional de WordPress suele ser caótico: editas archivos directamente en producción, usas FTP o plugins de sincronización que a menudo fallan. Con un enfoque DevOps, introduces control de versiones, pruebas automatizadas y despliegues repetibles.

Beneficios clave de la automatización de deploys:

  • Consistencia: Cada deploy sigue exactamente los mismos pasos, eliminando desviaciones.
  • Velocidad: Pasar de un commit a producción en minutos, no horas.
  • Seguridad: Nunca tocas el servidor directamente; todo pasa por el pipeline.
  • Rollback inmediato: Si algo falla, puedes revertir a una versión anterior con un solo clic.
  • Auditoría: Cada cambio queda registrado en los logs de GitHub Actions.

[INFO] No confundas CI/CD con simple sincronización de archivos. CI/CD incluye pruebas, compilación y validación antes del deploy. Es un proceso completo, no solo copiar archivos.


Componentes esenciales de un WordPress pipeline

Antes de escribir código, necesitas entender los actores de este flujo:

  1. Repositorio Git (GitHub): Almacena todo el código: temas, plugins, archivos de configuración (wp-config.php, .htaccess, etc.).
  2. GitHub Actions: Orquesta el pipeline. Se ejecuta en máquinas virtuales (runners) que GitHub proporciona.
  3. Servidor de destino: Puede ser un VPS, un hosting compartido con SSH, o un servicio como AWS, DigitalOcean, etc.
  4. Secrets de GitHub: Almacena credenciales como claves SSH, tokens de API o contraseñas de base de datos.

Flujo típico de un pipeline CI/CD WordPress

  • Commit en la rama main o production.
  • Trigger de GitHub Actions.
  • Checkout del código.
  • Instalación de dependencias (composer, npm si usas preprocesadores).
  • Pruebas (PHP lint, comprobación de plugins, validación de assets).
  • Build (compilar CSS/JS, minificar, optimizar imágenes).
  • Deploy (subir archivos vía rsync/SSH, ejecutar migraciones de BD si aplica).
  • Notificación (Slack, email, o comentario en el PR).

Configuración paso a paso del pipeline con GitHub Actions

1. Preparar tu repositorio

Estructura recomendada para el repositorio de WordPress:

/
├── .github/
│   └── workflows/
│       └── deploy.yml
├── wp-content/
│   ├── themes/
│   │   └── tu-tema/
│   └── plugins/
├── wp-config.php
├── composer.json (opcional)
└── package.json (opcional)

[TIP] No incluyas el núcleo de WordPress (wp-admin, wp-includes) en el repositorio. Es mejor gestionarlo aparte o usando Composer. Tu repositorio debe contener solo tu código personalizado.

2. Crear el workflow YAML

Crea el archivo .github/workflows/deploy.yml con el siguiente contenido base:

name: Deploy WordPress

on:
  push:
    branches:
      - main
      - production

jobs:
  deploy:
    runs-on: ubuntu-latest

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

      - name: Configurar PHP
        uses: shivammathur/setup-php@v2
        with:
          php-version: '8.2'

      - name: Instalar dependencias (Composer)
        run: composer install --no-dev --optimize-autoloader
        if: hashFiles('composer.json') != ''

      - name: Compilar assets (si usas npm)
        run: |
          npm ci
          npm run build
        if: hashFiles('package.json') != ''

      - name: Lint PHP
        run: find wp-content -name "*.php" -exec php -l {} \;

      - name: Sincronizar archivos al servidor (rsync)
        env:
          SSH_PRIVATE_KEY: ${{ secrets.SSH_PRIVATE_KEY }}
          REMOTE_HOST: ${{ secrets.REMOTE_HOST }}
          REMOTE_USER: ${{ secrets.REMOTE_USER }}
          TARGET_DIR: ${{ secrets.TARGET_DIR }}
        run: |
          mkdir -p ~/.ssh
          echo "$SSH_PRIVATE_KEY" > ~/.ssh/id_rsa
          chmod 600 ~/.ssh/id_rsa
          ssh-keyscan -H $REMOTE_HOST >> ~/.ssh/known_hosts
          rsync -avz --delete --exclude='.git' --exclude='.github' \
            --exclude='node_modules' --exclude='vendor' \
            ./ $REMOTE_USER@$REMOTE_HOST:$TARGET_DIR/

3. Explicación de cada paso

  • Checkout: Descarga el código del repositorio.
  • Setup PHP: Configura la versión de PHP que usará el runner para validaciones.
  • Composer: Instala dependencias de PHP (plugins, temas gestionados con Composer).
  • Build: Compila assets si usas preprocesadores (Sass, Webpack, etc.).
  • Lint: Verifica que no haya errores de sintaxis PHP.
  • Rsync: Sincroniza los archivos al servidor remoto vía SSH, eliminando archivos obsoletos (--delete).

[WARNING] El flag --delete en rsync es peligroso si no excluyes correctamente carpetas como wp-content/uploads. Asegúrate de que uploads/ esté en el servidor pero no en el repositorio, y exclúyelo explícitamente en el comando rsync.

4. Configurar los Secrets en GitHub

Ve a Settings > Secrets and variables > Actions de tu repositorio y añade:

  • SSH_PRIVATE_KEY: La clave privada SSH (sin passphrase) que tiene acceso al servidor.
  • REMOTE_HOST: IP o dominio del servidor.
  • REMOTE_USER: Usuario SSH (ej: deploy, root, www-data).
  • TARGET_DIR: Ruta absoluta en el servidor donde está WordPress (ej: /var/www/html).

[INFO] Nunca pongas credenciales en el código. GitHub Actions las inyecta como variables de entorno de forma segura.


Mejoras avanzadas para tu pipeline CI/CD WordPress

a) Despliegue condicional por ramas

Puedes tener diferentes entornos (dev, staging, production) usando la misma acción pero con distintos secretos:

on:
  push:
    branches:
      - develop
      - staging
      - main

jobs:
  deploy:
    runs-on: ubuntu-latest
    environment: ${{ github.ref_name == 'main' && 'production' || 'staging' }}

Luego defines entornos en GitHub con sus propios secrets (ej: REMOTE_HOST_STAGING, REMOTE_HOST_PRODUCTION).

b) Ejecutar migraciones de base de datos

Si usas un plugin como WP Migrate DB Pro o tienes scripts SQL, puedes ejecutarlos después del deploy:

- name: Ejecutar migraciones
  run: |
    ssh $REMOTE_USER@$REMOTE_HOST "cd $TARGET_DIR && wp db migrate"
  if: github.ref == 'refs/heads/main'

[TIP] La herramienta WP-CLI es tu mejor aliada. Instálala en el servidor y úsala desde el pipeline para tareas como actualizar plugins, limpiar caché o cambiar URLs.

c) Notificaciones y alertas

Integra notificaciones para saber si el deploy fue exitoso o falló:

- name: Notificar éxito
  if: success()
  uses: slackapi/slack-github-action@v1.24.0
  with:
    payload: |
      {
        "text": "✅ Deploy exitoso a producción desde ${{ github.sha }}"
      }
  env:
    SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK }}

- name: Notificar fallo
  if: failure()
  run: echo "Deploy falló. Revisa los logs."

d) Cache de dependencias para acelerar el pipeline

- name: Cache Composer
  uses: actions/cache@v3
  with:
    path: vendor
    key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }}
    restore-keys: |
      ${{ runner.os }}-composer-

- name: Cache npm
  uses: actions/cache@v3
  with:
    path: node_modules
    key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }}
    restore-keys: |
      ${{ runner.os }}-node-

Errores comunes y cómo evitarlos

❌ Subir archivos sensibles (wp-config.php con credenciales)

Solución: Usa variables de entorno en el servidor o un archivo .env que no esté versionado. En el pipeline, puedes generar el wp-config.php dinámicamente desde secrets.

❌ Olvidar excluir wp-content/uploads

Solución: Añade --exclude='wp-content/uploads' al comando rsync. Las imágenes subidas por usuarios no deben estar en el repositorio.

❌ Permisos incorrectos en el servidor

Solución: Después del rsync, ejecuta un comando SSH para ajustar permisos:

- name: Ajustar permisos
  run: |
    ssh $REMOTE_USER@$REMOTE_HOST "chown -R www-data:www-data $TARGET_DIR && find $TARGET_DIR -type d -exec chmod 755 {} \; && find $TARGET_DIR -type f -exec chmod 644 {} \;"

❌ No probar antes de desplegar

Solución: Añade un paso de pruebas unitarias o de integración. Por ejemplo, con PHPUnit si tu tema/plugin tiene tests.


Conclusión: De despliegues manuales a DevOps real

La automatización de deploys con GitHub Actions WordPress transforma la forma en que gestionas tu sitio. Dejas atrás el FTP, los errores por subir el archivo equivocado y las noches sin dormir por un deploy fallido.

Implementar un WordPress pipeline no solo es técnicamente factible, sino que es una inversión que paga dividendos en tiempo, seguridad y tranquilidad. Empieza con un pipeline simple como el que hemos visto, y ve añadiendo capas de complejidad según tu proyecto lo requiera: tests, múltiples entornos, notificaciones, etc.

[TIP] Si trabajas en equipo, define una rama develop para integración continua y main para producción. Cada merge a main dispara el deploy automático. Así, nunca despliegas código sin revisión.

Ahora tienes el conocimiento y el código listo para implementar tu propio CI/CD WordPress. ¿A qué esperas para automatizar?

¿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