Tester un bundle avec plusieurs versions de Symfony

Lorsque l’on travaille et maintient un bundle Symfony, il n’est pas rare de devoir gérer la compatibilité de ce dernier avec plusieurs versions du framework. Par exemple, au moment où je publie ces lignes, les versions 5.4, 6.4 et 7.1 sont officiellement maintenues. Exécuter sa batterie de tests automatisés sur plusieurs versions peut alors être fastidieux.

Le minimum que l’on puisse faire serait de tester le bundle en installant les dépendances Composer avec les options --prefer-stable et --prefer-lowest (pour récupérer les versions minimales des dépendances autorisées). Cela fonctionne, mais si une version du bundle supporte les trois versions courantes, ce dernier serait alors testé avec les versions 5.4 et 7.1.

Pour remédier à ce problème, on pourrait alors à l’installation des dépendances utiliser la commande composer require pour installer spécifiquement les versions désirées. Par exemple, si l’on souhaite installer une version 6.4, on pourrait utiliser la commande composer require symfony/framework-bundle:6.4.*. Cela fonctionne bien, mais peut rapidement être fastidieux si le nombre de dépendances Symfony est important.

Pour résoudre cette problématique, les équipes de Symfony ont intégré une fonctionnalité dans Symfony Flex permettant d’installer une version spécifique pour toutes les dépendances Symfony en une seule opération. Flex est une extension Composer bien connue des développeurs Symfony. Ainsi, pour mettre à jour vos dépendances sur une version spécifique, il vous suffira d’utiliser la variable d’environnement SYMFONY_REQUIRE.

Par exemple, la commande ci-dessous mettre toutes vos dépendances symfony/* en version 6.4:

$ SYMFONY_REQUIRE=6.4 composer update

A noter que symfony/flex peut-être installé en tant que dépendance de votre projet, mais peut également être installé sur l’OS et donc en dehors de votre projet via la commande: composer global require --no-progress --no-scripts --no-plugins symfony/flex.

Cela vous permettra de grandement simplifier vos workflows d’intégration continue. Et pour conclure cet article, voici par exemple, une configuration Github Actions que vous pouvez utiliser sur vos projets:

name: Run tests
on: [ push ]
jobs:
    phpunit:
        runs-on: ubuntu-latest
        strategy:
            matrix:
                composer-prefs: [ '--prefer-stable', '--prefer-lowest' ]
                php-version: [ '8.2', '8.3' ]
                symfony-version: [ '5.4.*', '6.4.*', '7.1.*' ]
        name: 'PHPUnit - PHP/${{ matrix.php-version }} - SF/${{ matrix.symfony-version }} ${{ matrix.composer-prefs }}'
        steps:
            -   name: Checkout
                uses: actions/checkout@v2
            -   name: Setup PHP
                uses: shivammathur/setup-php@v2
                with:
                    php-version: ${{ matrix.php-version }}
                    coverage: xdebug
            -   run: composer global config --no-plugins allow-plugins.symfony/flex true
            -   run: composer global require --no-progress --no-scripts --no-plugins symfony/flex
            -   run: composer update --prefer-dist --no-interaction ${{ matrix.composer-prefs }}
                env:
                    SYMFONY_REQUIRE: ${{ matrix.symfony-version }}
            -   name: PHPUnit
                run: vendor/bin/phpunit