Ce document explique l'architecture et l'organisation du projet PHPQA centralisé.
phpqa/
├── .castor/
│ └── phpqa.php # Tâches Castor centralisées
├── .github/
│ └── workflows/
│ └── reusable-ci.yml # Workflow GitHub Actions réutilisable
├── examples/
│ ├── README.md
│ ├── .phpqa-config-library.php
│ ├── .phpqa-config-application.php
│ ├── castor-library.php
│ ├── castor-application.php
│ ├── ci-library.yml
│ └── ci-application.yml
├── scripts/
│ └── migrate-project.sh # Script de migration automatique
├── Dockerfile # Image Docker personnalisée
├── README.md
├── INTEGRATION.md # Guide d'intégration
└── ARCHITECTURE.md # Ce fichier
Image Docker construite en deux étapes (php:X.Y-cli pour compiler, debian:slim à l'exécution) avec :
- Uniquement les outils QA appelés par les tâches Castor (PHPStan, ECS, Rector, Deptrac, PHPUnit, Infection, parallel-lint, Mago)
- Castor pré-installé (binaire statique)
- Les extensions PHP nécessaires aux projets Symfony/Doctrine
- Le layout
/tools/.composer/vendor-bin/...hérité dejakzal/phpqa, référencé par les projets
Publié sur: ghcr.io/spomky-labs/phpqa:X.Y
Fichier PHP contenant toutes les tâches Castor réutilisables dans le namespace phpqa.
Configuration :
get_config()- Charge.phpqa-config.phpou utilise des valeurs par défaut
Tâches QA :
phpunit()- Tests avec couverturephpstan()/phpstan_baseline()- Analyse statiqueecs()/ecs_fix()- Coding standardsrector()/rector_fix()- Refactoringdeptrac()- Architecturelint()- Syntaxeinfect()- Mutation testingvalidate()- Validation composer.jsoncheck_licenses()- Vérification des licencesjs()- Tests JavaScript
Utilitaires :
phpqa()- Exécute une commande via Docker PHPQAinstall()- Installe les dépendancesprepare_pr()- Prépare le code pour une PRall()- Lance toutes les vérifications
Applications :
console()- Exécute des commandes Symfony (namespaceapp)
<?php
// Dans votre projet
use function Castor\import;
import(__DIR__ . '/../phpqa/.castor/phpqa.php');
// Les tâches sont maintenant disponibles
// castor qa:phpunit
// castor qa:phpstan
// etc.Workflow réutilisable avec paramètres configurables.
- pre_checks - Vérifications préliminaires
- prepare_dependencies - Installation et cache des dépendances
- phpstan, ecs, rector, validate, lint - Analyses en parallèle
- check_licenses - Vérification licences (optionnel)
- deptrac - Architecture (optionnel)
- js_tests - Tests JS (optionnel)
- tests - Tests unitaires/fonctionnels (matrice PHP)
- tests_experimental - Tests PHP expérimental
- infection - Mutation testing (optionnel)
- exported_files - Vérification fichiers exportés (optionnel)
Tous configurables via inputs: dans le workflow appelant :
jobs:
ci:
uses: spomky-labs/phpqa/.github/workflows/reusable-ci.yml@main
with:
project_type: 'library'
php_versions: '["8.2", "8.3", "8.4"]'
enable_infection: true
# ... autres paramètresFichier PHP optionnel à la racine de chaque projet.
<?php
return [
'type' => 'library|bundle|application',
'php_version' => '8.4',
'source_dirs' => ['src', 'tests'],
'check_licenses' => true,
'infection_enabled' => true,
'deptrac_enabled' => true,
'js_enabled' => false,
'docker_enabled' => true,
'console_path' => 'bin/console',
];Si absent, des valeurs par défaut sont utilisées.
Script bash pour migrer automatiquement un projet existant :
./scripts/migrate-project.sh /path/to/project libraryEffectue :
- Backup de l'ancien
castor.php - Création de
.phpqa-config.php - Création du nouveau
castor.phpavec import - Création du workflow GitHub Actions
- Résumé des changements
Développeur
↓
castor qa:phpunit
↓
.castor/phpqa.php::phpunit()
↓
get_config() → .phpqa-config.php
↓
phpqa(command, options)
↓
Docker ghcr.io/spomky-labs/phpqa:X.Y
↓
Exécution dans le conteneur
GitHub Event (push/PR)
↓
.github/workflows/ci.yml
↓
uses: spomky-labs/phpqa/.github/workflows/reusable-ci.yml
↓
Jobs en parallèle (prepare, phpstan, ecs, etc.)
↓
Container: ghcr.io/spomky-labs/phpqa:X.Y
↓
castor qa:* (depuis le container)
↓
Résultats
- Un seul endroit pour maintenir les tâches QA
- Tous les projets bénéficient des améliorations
- Cohérence garantie
- Configuration optionnelle avec valeurs par défaut
- Support de différents types de projets
- Tâches spécifiques au projet possibles
- Cache Composer partagé dans CI
- Jobs GitHub Actions en parallèle
- Réutilisation d'image Docker
- Séparation claire des responsabilités
- Documentation centralisée
- Migration facilitée (script)
Dans .castor/phpqa.php :
#[AsTask(description: 'Ma nouvelle tâche', namespace: 'qa')]
function my_task(): void
{
$config = get_config();
phpqa(['mon-outil', '--option']);
}Immédiatement disponible dans tous les projets !
Dans .github/workflows/reusable-ci.yml :
my_job:
name: "Mon Job"
needs: [prepare_dependencies]
runs-on: ubuntu-latest
container:
image: ghcr.io/spomky-labs/phpqa:${{ inputs.default_php_version }}
steps:
- uses: actions/checkout@v5
- run: castor qa:my-task- Ajouter dans
get_config()defaults :
$defaults = [
// ...
'my_option' => true,
];- Utiliser dans les tâches :
$config = get_config();
if ($config['my_option']) {
// ...
}- Documenter dans
INTEGRATION.md
- Tâches QA : namespace
qa:, ex:qa:phpunit - Tâches Application : namespace
app:, ex:app:console - Fonctions internes : pas de namespace, ex:
phpqa(),get_config() - Jobs CI : snake_case, ex:
prepare_dependencies - Inputs CI : snake_case, ex:
enable_infection
- Toujours utiliser
get_config()pour la configuration - Gérer les cas où l'outil n'est pas disponible
- Fournir des messages clairs (
io()->success(), etc.) - Documenter avec
#[AsTask(description: '...')]
- Utiliser des jobs parallèles quand possible
- Réutiliser le cache des dépendances
- Permettre la désactivation via
inputs - Donner des noms explicites aux jobs
- Ne mettre que ce qui diffère des valeurs par défaut
- Commenter les options non évidentes
- Versionner le fichier
.phpqa-config.php
- Castor : >= 0.23.0
- Docker : pour l'exécution locale
- GitHub Actions : pour CI/CD
- PHP : >= 8.2
- Libraries PHP
- Bundles Symfony
- Applications Symfony
- Tout projet PHP avec Composer
- Nécessite que phpqa soit accessible (même dossier parent recommandé)
- Les workflows réutilisables GitHub Actions nécessitent un accès public ou token
- Package Composer pour distribution
- Support de monorepos
- Tâches conditionnelles plus fines
- Intégration avec d'autres CI (GitLab CI, etc.)
- Dashboard de métriques QA