Skip to content

8. Integración continua

Temas del programa: 3.5

MR grande

40 archivos que nadie revisa a fondo y conflictos con todos

MR pequeño

5 archivos que se revisan en una sentada

Integración continua — integrar con frecuencia y verificar automáticamente cada integración

Humble y Farley Continuous Delivery 2010

Terminal window
composer install
cp .env.example .env && php artisan key:generate
vendor/bin/pint --test
php artisan migrate && php artisan migrate:rollback && php artisan migrate
php artisan test
A mano

Alguien lo olvida · funciona en mi máquina

Automático

Se ejecuta en cada push en una máquina limpia

TérminoQué es
PipelineTodo lo que se ejecuta por un push
Etapa (stage)Un grupo de trabajos · empieza si la anterior pasó
Trabajo (job)Una tarea con sus comandos
RunnerLa máquina que ejecuta los trabajos
.gitlab-ci.ymlEl archivo en la raíz que lo describe
.gitlab-ci.yml
hola:
image: php:8.3-cli
script:
- php -v
- echo "El pipeline funciona"

Un trabajo · una imagen · dos comandos · si alguno termina con error el trabajo queda en rojo

En GitLab Build · Pipelines muestra cada ejecución y su registro

stages:
- calidad
- pruebas
estilo:
stage: calidad
script:
- vendor/bin/pint --test
pruebas:
stage: pruebas
script:
- php artisan test

Si estilo falla pruebas ni siquiera empieza · el error más barato se detecta primero

.php:
image: php:8.3-cli
before_script:
- composer install --prefer-dist --no-progress --no-interaction
- cp .env.example .env
- php artisan key:generate
estilo:
extends: .php
stage: calidad
script:
- vendor/bin/pint --test

Un trabajo que empieza con punto es una plantilla · extends la hereda · el equivalente de compilar en PHP

Paso 4 — una base de datos para las pruebas

Section titled “Paso 4 — una base de datos para las pruebas”
variables:
POSTGRES_DB: reservafic_testing
POSTGRES_USER: reservafic
# POSTGRES_PASSWORD vive en Settings · CI/CD · Variables
DB_CONNECTION: pgsql
DB_HOST: postgres
DB_PASSWORD: $POSTGRES_PASSWORD
pruebas:
extends: .php
stage: pruebas
services:
- postgres:16
script:
- php artisan migrate --force
- php artisan test

El servicio es un PostgreSQL desechable · se crea para el trabajo y desaparece al terminar

En el YAML

DB_PASSWORD: clave123 · queda en el repositorio y en cada copia

En variables de CI/CD

Masked se oculta en el log · Protected solo en ramas protegidas

calidad ── estilo → vendor/bin/pint --test
└─ secretos → detección de secretos sobre todo el historial
pruebas ── pruebas → migrate · rollback · migrate · php artisan test
contra un PostgreSQL efímero

El runner usa imágenes de contenedor — construirlas es tema del Bloque IV

$ php artisan test
FAIL Tests\Feature\Repositories\EloquentPrestamoRepositoryTest
x detecta traslape de horarios with data set "contenido dentro del existente"
Failed asserting that false is identical to true.
Tests: 1 failed, 7 passed
ERROR: Job failed: exit code 1
Qué trabajo

pruebas

Qué caso

El nombre del data set

Qué esperaba

true y obtuvo false

Salida simplificada · lee de abajo hacia arriba hasta encontrar la primera falla

Rama main protegida

Nadie hace push directo

Pipelines must succeed

Un MR en rojo no se integra

En GitLab Free las aprobaciones no bloquean · nadie integra su propio MR sin aprobación por acuerdo del equipo

1

Cambien < por <= en la consulta de traslape

2

Abran un MR

3

El pipeline queda en rojo y el botón Merge se deshabilita

El pipeline sí

Estilo · pruebas · migraciones · secretos

La revisión humana sí

Si la lógica está en la capa correcta · si el nombre refleja el dominio · si falta un caso

Ninguna sustituye a la otra · STD-CI §8

ElementoQué muestra
HistorialConventional Commits legibles
IssuesCada historia o defecto con su issue
Merge requestsCloses #N · revisión con severidad · pipeline verde
DocumentaciónREADME · docs/api · docs/adr · CHANGELOG

Continúa con 9. Cierre y resumen.