CI/CD para proyectos PHP: GitHub Actions
El desarrollo web moderno es impensable sin automatización. Ejecutar pruebas manualmente, verificar el estilo del código y hacer despliegues al servidor consume tiempo y es propenso a errores. La solución es CI/CD (Integración Continua / Despliegue Continuo). En este artículo, analizaremos cómo configurar un pipeline completo para proyectos PHP usando GitHub Actions. Aprenderás cómo probar automáticamente el código, verificar su calidad y desplegarlo en un servidor de producción con cada push al repositorio.
¿Qué es CI/CD y por qué lo necesita un desarrollador PHP?
Integración Continua (CI) es la práctica en la que cada commit se verifica automáticamente: se ejecutan pruebas unitarias, linters, verificaciones de seguridad. Despliegue Continuo (CD) es el siguiente paso, donde el código que pasa exitosamente la CI se despliega automáticamente en un servidor (staging o producción).
Para PHP esto es especialmente relevante: el lenguaje es dinámico, los errores de tipificación y sintaxis a menudo se detectan solo en tiempo de ejecución. GitHub Actions permite configurar un pipeline que:
- Ejecuta pruebas PHPUnit en diferentes versiones de PHP (7.4, 8.0, 8.1, 8.2).
- Verifica el código con PHP_CodeSniffer o PHPStan.
- Realiza el despliegue en el servidor a través de SSH o Docker.
Creación de un workflow en GitHub Actions
Para empezar, crea en la raíz de tu proyecto PHP el directorio .github/workflows. Dentro, crea un archivo, por ejemplo ci.yml. Este será tu pipeline.
Veamos un ejemplo básico para CI. Se ejecutará con cada push a la rama main o al crear un Pull Request.
name: PHP CI
on: push: branches: [ "main" ] pull_request: branches: [ "main" ]
jobs: build: runs-on: ubuntu-latest
strategy: matrix: php-versions: ['7.4', '8.0', '8.1', '8.2']
steps: - uses: actions/checkout@v3
- name: Setup PHP uses: shivammathur/setup-php@v2 with: php-version: ${{ matrix.php-versions }} tools: composer, phpunit
- name: Validate composer.json and composer.lock run: composer validate --strict
- name: Cache Composer packages id: composer-cache uses: actions/cache@v3 with: path: vendor key: ${{ runner.os }}-php-${{ hashFiles('**/composer.lock') }} restore-keys: | ${{ runner.os }}-php-
- name: Install dependencies run: composer install --prefer-dist --no-progress
- name: Run PHPUnit tests run: phpunit --configuration phpunit.xmlAnálisis de los puntos clave:
- Matrix strategy — permite ejecutar pruebas en varias versiones de PHP simultáneamente. Esto garantiza la compatibilidad del código.
- shivammathur/setup-php — un action popular para configurar el entorno PHP. Instala la versión necesaria, Composer y PHPUnit.
- Cache de vendor — acelera ejecuciones posteriores al no descargar las dependencias nuevamente.
- composer validate — verifica la corrección de composer.json.
Añadiendo análisis estático y linting
Las pruebas están bien, pero no se puede prescindir del control de calidad del código. Añadamos al mismo workflow (o creemos un job separado) la verificación con PHPStan y PHP_CodeSniffer.
- name: Run PHPStan run: vendor/bin/phpstan analyse src tests --level=max
- name: Run PHP_CodeSniffer run: vendor/bin/phpcs --standard=PSR2 src testsEstos pasos se pueden agregar después de la instalación de dependencias. PHPStan con nivel max encontrará posibles errores de tipos, y PHP_CodeSniffer con el estándar PSR-2 (o PSR-12) asegurará un estilo de código uniforme. Si al menos un paso falla,