CI/CD para proyectos PHP: GitHub Actions de la A a la Z

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

Introducción: Por qué CI/CD es el nuevo estándar del desarrollo PHP

\n

El desarrollo PHP moderno es impensable sin automatización. El despliegue manual, ejecutar pruebas "a ojo" y revisar el código en el último momento es un camino directo a errores en producción. CI/CD (Integración Continua / Despliegue Continuo) resuelve estos problemas integrando verificaciones y despliegue de código directamente en tu flujo de trabajo.

\n

GitHub Actions es una herramienta potente y gratuita para integrar CI/CD directamente en el repositorio. En este artículo, analizaremos cómo configurar un pipeline completo para un proyecto PHP en Laravel o Symfony: desde la instalación de dependencias hasta el despliegue en el servidor. Obtendrás configuraciones listas y comprensión de cada etapa.

\n\n

1. Fundamentos de GitHub Actions: estructura de Workflow para PHP

\n

Un Workflow en GitHub Actions es un proceso automatizado definido en un archivo YAML dentro de la carpeta .github/workflows/. Para un proyecto PHP, un workflow típico incluye:

\n
    \n
  • Disparadores: push a la rama main, pull request.
  • \n
  • Runner: Ubuntu latest (soporte para PHP).
  • \n
  • Pasos: Checkout, instalación de PHP, Composer, pruebas, linters.
  • \n
\n

Veamos el archivo mínimo ci.yml:

\n
name: PHP CI\n\non:\n  push:\n    branches: [ main ]\n  pull_request:\n    branches: [ main ]\n\njobs:\n  build:\n    runs-on: ubuntu-latest\n\n    steps:\n    - uses: actions/checkout@v3\n\n    - name: Setup PHP\n      uses: shivammathur/setup-php@v2\n      with:\n        php-version: '8.2'\n        extensions: mbstring, pdo_mysql, xml\n        coverage: xdebug\n\n    - name: Install Composer dependencies\n      run: composer install --no-progress --prefer-dist\n\n    - name: Run PHPUnit\n      run: vendor/bin/phpunit --testdox
\n

Este workflow se ejecuta en cada push. Verifica que el código se compile y las pruebas pasen. Observa la acción shivammathur/setup-php — es el estándar de facto para PHP.

\n\n

2. Configuración avanzada: análisis estático, linters y almacenamiento en caché

\n

CI no se limita solo a pruebas. Para mantener la calidad del código, añade análisis estático (PHPStan, Psalm) y verificación de estilo (PHP CS Fixer).

\n

2.1. Añadiendo PHPStan y PHP CS Fixer

\n

Instálalos como dependencias de desarrollo:

\n
composer require --dev phpstan/phpstan friendsofphp/php-cs-fixer
\n

Complementa los pasos en el workflow:

\n
    - name: Run PHPStan\n      run: vendor/bin/phpstan analyse --memory-limit=1G\n\n    - name: Check code style\n      run: vendor/bin/php-cs-fixer fix --dry-run --diff
\n

Consejo: usa --dry-run para no modificar archivos, solo verificar. Si el estilo se viola, el CI fallará y el desarrollador lo corregirá.

\n

2.2. Almacenamiento en caché de dependencias de Composer

\n

Cada ejecución de CI descarga los paquetes nuevamente, lo cual es lento. Habilitamos el almacenamiento en caché:

\n
    - name: Cache Composer packages\n      id: composer-cache\n      uses: actions/cache@v3\n      with:\n        path: vendor\n        key: ${{ runner.os }}-php-${{ hashFiles('**/composer.lock') }}\n        restore-keys: |\n          ${{ runner.os }}-php-\n\n    - name: Install dependencies\n      if: steps.composer-cache.outputs.cache-hit != 'true'\n      run: composer install --no-progress --prefer-dist
\n

Ahora las ejecuciones repetidas serán 2-3 veces más rápidas.

\n\n

3. Pruebas con base de datos y servicios Docker

\n

Muchas aplicaciones PHP requieren MySQL, PostgreSQL o Redis para las pruebas. GitHub Actions permite ejecutar contenedores de servicio (Service Containers).

\n

3.1. Ejemplo con MySQL y Laravel

\n

Supongamos que tu proyecto usa Laravel con MySQL. Añadimos el servicio y configuramos .env:

\n
jobs:\n  test:\n    runs-on: ubuntu-latest\n    services:\n      mysql:\n        image: mysql:8.0\n        env:\n          MYSQL_ROOT_PASSWORD: root\n          MYSQ                

Blogs

Book Recommendations