Pipeline CI/CD avec GitLab CI pour Symfony : Guide Complet 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 pr

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 !