Composer 2 was released this week. It brings massive composer install/update performance improvement of 150-200 %.
That means faster feedback from CI and faster monorepo testing.
Today, we'll look on how to use Composer in Github Actions with monorepo split testing and what to avoid.
Monorepo split testing is made easier by symplify/monorepo-builder package. This is how it "works" for Composer 1. Why "works"? There are 2 problems, that we fix during upgrade to Composer 2.
Let's say we have a symplify/symplify monorepo, where we develop all symplify package. We need to test all packages together with their local version, even in pull-request.
We want to test symplify/coding-standard package:
symplify/coding-standard package needs symplify/autowire-array-parameter package
symplify/autowire-array-parameter needs the symplify/package-builder packageIn short:
This the result of localized package composer install on GitHub Action with Composer 1:
What happens with changes of symplify/package-builder in this pull-request? They're ignored, and last stable version is used instead. ❌
This is the same process, with Composer 2:
dev-masterSo we upgrade to Composer 2 with Symplify 9 and that's it? No.
Local and GitHub Action development are different. Locally, Composer can see them as dev-master branch, which works with using branch-alias. But on GitHub Actoin (or your any favorite CI, the pull-request branch is dev-<commit-hash>).
The composer install will lead to a conflict with these 2 version:
What now?
I asked on Composer repository and after less than hour of work got a working solution with proper explanation. Thank you Jordi!
Trick is using COMPOSER_ROOT_VERSION=dev-master env, that will explicitly make version dev-master for all environments.
This is the final working GitHub Action (here you can see it the action):
name: Split Tests
on:
pull_request: null
jobs:
split_testing:
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
package_name:
- coding-standard
# and all the other packages...
name: Split Tests of ${{ matrix.package_name }}
steps:
- uses: actions/checkout@v2
- uses: shivammathur/setup-php@v1
with:
php-version: 7.4
coverage: none
tools: composer:v2
- run: composer install --no-progress --ansi
# tell composer to use local package version
- run: vendor/bin/monorepo-builder localize-composer-paths packages/${{ matrix.package_name }}/composer.json --ansi
-
working-directory: packages/${{ matrix.package_name }}
run: composer update --no-progress --ansi
env:
# see https://github.com/composer/composer/issues/9368#issuecomment-718112361
COMPOSER_ROOT_VERSION: "dev-master"
-
working-directory: packages/${{ matrix.package_name }}
run: vendor/bin/phpunit
Do you want to know more about this topic?
Happy coding!