CI/CD automatiza la prueba y el despliegue de tu código. Con GitHub Actions, cada push puede disparar pruebas, construir una imagen Docker y deployar a producción — sin intervención manual. Esta guía te muestra cómo configurarlo desde cero.
¿Qué es CI/CD?
CI (Continuous Integration) — cada cambio de código se integra, compila y prueba automáticamente. Detecta errores antes de que lleguen a producción.
CD (Continuous Delivery/Deployment) — el código que pasa las pruebas se despliega automáticamente al ambiente de staging o producción.
GitHub Actions: conceptos
| Concepto | Descripción |
|---|---|
| Workflow | Proceso automatizado definido en un archivo YAML en .github/workflows/ |
| Trigger (on) | Evento que dispara el workflow: push, pull_request, schedule, manual |
| Job | Grupo de pasos que corren en la misma máquina virtual (runner) |
| Step | Un comando o Action individual dentro de un Job |
| Action | Paso reutilizable del marketplace. Ej: actions/checkout, docker/build-push-action |
Pipeline básico: pruebas PHP
# .github/workflows/ci.yml
name: CI Pipeline
on:
push:
branches: [main, develop]
pull_request:
branches: [main]
jobs:
test:
runs-on: ubuntu-latest
steps:
# 1. Descargar el código
- name: Checkout
uses: actions/checkout@v4
# 2. Configurar PHP
- name: Setup PHP
uses: shivammathur/setup-php@v2
with:
php-version: '8.3'
extensions: pdo, pdo_mysql, mbstring
# 3. Instalar dependencias
- name: Install dependencies
run: composer install --no-progress --no-interaction
# 4. Ejecutar pruebas
- name: Run tests
run: vendor/bin/phpunit --colors=always
Pipeline completo: CI + Deploy
# .github/workflows/deploy.yml
name: Build and Deploy
on:
push:
branches: [main]
jobs:
build-and-push:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Login to Docker Hub
uses: docker/login-action@v3
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
- name: Build and push Docker image
uses: docker/build-push-action@v5
with:
push: true
tags: miusuario/mi-app:${{ github.sha }},miusuario/mi-app:latest
deploy:
needs: build-and-push
runs-on: ubuntu-latest
steps:
- name: Deploy to server via SSH
uses: appleboy/ssh-action@v1
with:
host: ${{ secrets.SERVER_HOST }}
username: ${{ secrets.SERVER_USER }}
key: ${{ secrets.SSH_PRIVATE_KEY }}
script: |
docker pull miusuario/mi-app:latest
docker stop mi-app || true
docker rm mi-app || true
docker run -d --name mi-app \
-p 80:80 \
--restart always \
miusuario/mi-app:latest
Secretos y variables
# Configurar en GitHub:
# Settings → Secrets and variables → Actions → New repository secret
# En el workflow se acceden como:
${{ secrets.NOMBRE_DEL_SECRETO }}
# Variables de entorno normales (no secretos):
env:
APP_ENV: production
DB_HOST: db.ejemplo.com
💡 Free tier de GitHub Actions: 2,000 minutos/mes para repositorios privados. Ilimitado para repositorios públicos. Para proyectos educativos o de open source, es completamente gratuito.
✅ Buenas prácticas: Un workflow por propósito (ci.yml, deploy.yml, security.yml) · Usar Actions del marketplace verificadas · Siempre pinear versiones de Actions con SHA para seguridad · Secrets para credenciales, nunca en el código · Cache de dependencias para builds más rápidos
"CI/CD no es un lujo — es la diferencia entre deployar con miedo el viernes por la tarde o con confianza cualquier día."