CI/CD
Pipeline CI/CD avec GitLab CI pour Symfony : Guide Complet 2024
15/01/2024
# Pipeline CI/CD avec GitLab CI pour Symfony : Guide Complet 2024
## Introduction
L'intégration continue et le déploiement continu (CI/CD) sont devenus des pratiques essentielles dans le développement moderne. Dans cet article, nous allons construire un pipeline CI/CD complet pour une application Symfony en utilisant GitLab CI/CD.
## Prérequis
- Une application Symfony (6.x ou supérieur)
- Un compte GitLab avec accès aux runners
- Docker installé (pour les tests locaux)
- Connaissance basique de YAML
## Architecture du Pipeline
Notre pipeline comprendra 4 étapes principales :
1. **Build** : Installation des dépendances
2. **Test** : Exécution des tests unitaires et fonctionnels
3. **Quality** : Analyse statique du code
4. **Deploy** : Déploiement automatique
## Configuration de base : .gitlab-ci.yml
```yaml
image: php:8.2-fpm
variables:
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: test_db
MYSQL_USER: symfony
MYSQL_PASSWORD: symfony
DATABASE_URL: "mysql://symfony:symfony@mysql:3306/test_db?serverVersion=8.0"
stages:
- build
- test
- quality
- deploy
cache:
key: ${CI_COMMIT_REF_SLUG}
paths:
- vendor/
- node_modules/
before_script:
- apt-get update -yqq
- apt-get install -yqq git libzip-dev libpq-dev libcurl4-gnutls-dev
- docker-php-ext-install zip pdo pdo_mysql
- curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer
- composer install --prefer-dist --no-ansi --no-interaction --no-progress
```
## Stage 1 : Build
```yaml
build:dependencies:
stage: build
script:
- composer validate
- composer check-platform-reqs
- composer install --optimize-autoloader --no-dev
- php bin/console cache:clear --env=prod
artifacts:
paths:
- vendor/
- var/cache/
expire_in: 1 hour
only:
- main
- develop
- merge_requests
```
## Stage 2 : Tests
### Tests Unitaires et Fonctionnels
```yaml
test:phpunit:
stage: test
services:
- mysql:8.0
dependencies:
- build:dependencies
script:
- cp .env.test .env.local
- php bin/console doctrine:database:create --env=test
- php bin/console doctrine:schema:create --env=test
- php bin/console doctrine:fixtures:load --env=test -n
- php bin/phpunit --coverage-text --colors=never --testdox
coverage: '/^\s*Lines:\s*(\d+\.\d+%)'
artifacts:
when: always
reports:
junit: var/log/junit.xml
coverage_report:
coverage_format: cobertura
path: var/log/cobertura.xml
```
### Tests de Sécurité
```yaml
test:security:
stage: test
script:
- composer require --dev symfony/security-checker
- symfony security:check
allow_failure: true
```
## Stage 3 : Qualité du Code
### PHPStan - Analyse Statique
```yaml
quality:phpstan:
stage: quality
script:
- composer require --dev phpstan/phpstan
- vendor/bin/phpstan analyse src --level=8 --memory-limit=1G
allow_failure: false
```
### PHP CS Fixer - Standards de Code
```yaml
quality:php-cs-fixer:
stage: quality
script:
- composer require --dev friendsofphp/php-cs-fixer
- vendor/bin/php-cs-fixer fix --dry-run --diff --verbose
allow_failure: true
```
### PHPMetrics - Métriques de Code
```yaml
quality:metrics:
stage: quality
script:
- composer require --dev phpmetrics/phpmetrics
- vendor/bin/phpmetrics --report-html=phpmetrics src/
artifacts:
paths:
- phpmetrics/
expire_in: 7 days
```
## Stage 4 : Déploiement
### Déploiement en Staging
```yaml
deploy:staging:
stage: deploy
script:
- apt-get install -yqq openssh-client rsync
- eval $(ssh-agent -s)
- echo "$SSH_PRIVATE_KEY" | tr -d '\r' | ssh-add -
- mkdir -p ~/.ssh
- chmod 700 ~/.ssh
- ssh-keyscan $STAGING_SERVER >> ~/.ssh/known_hosts
- chmod 644 ~/.ssh/known_hosts
- |
ssh $STAGING_USER@$STAGING_SERVER > ~/.ssh/known_hosts
- |
ssh $PRODUCTION_USER@$PRODUCTION_SERVER 95%
3. **Couverture de code** : Objectif > 80%
4. **Fréquence de déploiement** : Mesurer les déploiements par jour
### Script de Monitoring
```yaml
metrics:collect:
stage: .post
script:
- |
echo "Pipeline Duration: $CI_PIPELINE_DURATION seconds"
echo "Pipeline Status: $CI_PIPELINE_STATUS"
echo "Commit: $CI_COMMIT_SHORT_SHA"
# Envoyer les métriques à votre système de monitoring
curl -X POST $METRICS_ENDPOINT \
-d "pipeline_duration=$CI_PIPELINE_DURATION" \
-d "pipeline_status=$CI_PIPELINE_STATUS" \
-d "project=$CI_PROJECT_NAME"
when: always
```
## Dépannage Courant
### Problème 1 : Cache Corrompu
```yaml
clear:cache:
stage: build
script:
- rm -rf vendor/ var/cache/*
- composer install
when: manual
```
### Problème 2 : Migrations Échouées
```yaml
rollback:migrations:
stage: deploy
script:
- php bin/console doctrine:migrations:migrate prev --no-interaction
when: manual
only:
- main
```
## Sécurité du Pipeline
### 1. Scan de Vulnérabilités
```yaml
security:dependencies:
stage: quality
script:
- composer audit
allow_failure: false
```
### 2. Scan de Secrets
```yaml
security:secrets:
stage: quality
image: trufflesecurity/trufflehog:latest
script:
- trufflehog filesystem . --json --no-update
allow_failure: false
```
## Configuration Docker-Compose pour Tests
```yaml
# docker-compose.test.yml
version: '3.8'
services:
php:
build:
context: .
dockerfile: Dockerfile.test
volumes:
- .:/var/www/symfony
environment:
DATABASE_URL: mysql://test:test@mysql:3306/test_db
APP_ENV: test
depends_on:
- mysql
mysql:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: test_db
MYSQL_USER: test
MYSQL_PASSWORD: test
tmpfs:
- /var/lib/mysql
```
## Conclusion
Ce pipeline CI/CD complet pour Symfony offre :
✅ **Automatisation totale** : Du commit au déploiement
✅ **Qualité garantie** : Tests, analyse statique, métriques
✅ **Sécurité renforcée** : Scans de vulnérabilités et secrets
✅ **Déploiements fiables** : Stratégies blue-green et rollback
✅ **Monitoring continu** : Métriques et notifications
## Ressources Complémentaires
- Documentation GitLab CI/CD : https://docs.gitlab.com/ee/ci/
- Symfony Best Practices : https://symfony.com/doc/current/best_practices.html
- PHPUnit Documentation : https://phpunit.de/documentation.html
- Docker pour PHP : https://www.docker.com/blog/tag/php/
## Pour Aller Plus Loin
1. Intégrer SonarQube pour l'analyse de qualité
2. Mettre en place Kubernetes pour l'orchestration
3. Utiliser Vault pour la gestion des secrets
4. Implémenter des tests de performance avec Gatling
5. Ajouter des tests end-to-end avec Panther
Avec ce pipeline, vous disposez d'une base solide pour développer et déployer vos applications Symfony en toute confiance. N'hésitez pas à l'adapter selon vos besoins spécifiques !