name: CI - Intégration continue # Intégration continue : à chaque push et chaque pull request, on vérifie # automatiquement la qualité du code (Laravel Pint, analyse statique Larastan) # puis on exécute les tests automatisés (PHPUnit) avec couverture. Un # déploiement (voir deploy.yml) ne doit se faire que si cette étape est au vert. # # NB : l'application Laravel vit dans le sous-dossier WEB/ (monorepo). on: push: branches: [main] paths: - 'WEB/**' - '.gitea/workflows/ci.yml' pull_request: branches: [main] paths: - 'WEB/**' jobs: quality-and-tests: runs-on: ubuntu-latest # Toutes les commandes s'exécutent dans le dossier de l'app Laravel. defaults: run: working-directory: WEB # Jetons SonarQube, définis dans les secrets du dépôt Gitea. # Exposés au niveau du job pour pouvoir conditionner l'étape d'analyse # (elle ne s'exécute que si un jeton est configuré). env: SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} SONAR_HOST_URL: ${{ secrets.SONAR_HOST_URL }} steps: - name: Récupération du code uses: actions/checkout@v4 with: # Historique complet : SonarQube en a besoin pour dater le code # et calculer correctement le "nouveau code". fetch-depth: 0 - name: Installation de PHP 8.2 uses: shivammathur/setup-php@v2 with: php-version: '8.2' extensions: pdo_mysql, pdo_sqlite, sqlite3, mbstring, exif, pcntl, bcmath, gd, intl, zip # pcov : moteur de couverture rapide, requis pour le rapport SonarQube. coverage: pcov - name: Cache des dépendances Composer uses: actions/cache@v4 with: path: WEB/vendor key: composer-${{ hashFiles('WEB/composer.lock') }} - name: Installation des dépendances run: composer install --no-interaction --prefer-dist --optimize-autoloader - name: Préparation de l'environnement de test run: | cp .env.example .env php artisan key:generate - name: Vérification du style de code (Laravel Pint) run: vendor/bin/pint --test - name: Analyse statique (Larastan / PHPStan) run: vendor/bin/phpstan analyse --configuration=phpstan.neon --memory-limit=512M --no-progress - name: Exécution des tests + couverture (PHPUnit) # phpunit.xml définit déjà l'environnement de test (sqlite en mémoire). # On génère le rapport de couverture (clover) et le rapport de tests # (junit) consommés ensuite par SonarQube. run: | mkdir -p coverage vendor/bin/phpunit \ --coverage-clover=coverage/clover.xml \ --log-junit=coverage/junit.xml - name: Analyse SonarQube # Ne s'exécute que si le secret SONAR_TOKEN est configuré dans Gitea, # sinon l'étape est ignorée (la CI reste verte tant que le serveur # SonarQube n'est pas branché). if: ${{ env.SONAR_TOKEN != '' }} uses: sonarsource/sonarqube-scan-action@v5 with: # L'app (et sonar-project.properties) se trouve dans WEB/. projectBaseDir: WEB # Le scanner lit sonar-project.properties et utilise SONAR_HOST_URL / # SONAR_TOKEN exposés au niveau du job.