Skip to content

[CI] Parallelize Windows Unit tests #717

[CI] Parallelize Windows Unit tests

[CI] Parallelize Windows Unit tests #717

Workflow file for this run

name: Unit Tests
defaults:
run:
shell: bash
on:
push:
paths-ignore:
- 'src/*/doc/**'
- 'src/**/*.md'
- 'ux.symfony.com/**'
- '.github/workflows/app-tests.yaml'
pull_request:
paths-ignore:
- 'src/*/doc/**'
- 'src/**/*.md'
- 'ux.symfony.com/**'
- '.github/workflows/app-tests.yaml'
concurrency:
group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }}
cancel-in-progress: true
jobs:
php:
runs-on: ${{ matrix.os || 'ubuntu-latest' }}
strategy:
fail-fast: false
matrix:
php-version: ['8.1', '8.2', '8.3', '8.4']
dependency-version: ['']
symfony-version: ['']
minimum-stability: ['stable']
os: ['']
include:
# dev packages (probably not needed to have multiple such jobs)
- minimum-stability: 'dev'
php-version: '8.4'
# lowest deps
- php-version: '8.1'
dependency-version: 'lowest'
# LTS version of Symfony
- php-version: '8.1'
symfony-version: '6.4.*'
- php-version: '8.1'
symfony-version: '6.4.*'
os: 'windows-latest'
# Explicit Symfony versions
- php-version: '8.1'
symfony-version: '6.4.*'
- php-version: '8.2'
symfony-version: '7.3.*' # TODO: change to '7.4' when Symfony 7.4 is released
- php-version: '8.4'
symfony-version: '8.0.x-dev' # TODO: change to '8.0' when Symfony 8.0 is released
minimum-stability: 'dev' # TODO: remove when Symfony 8.0 is released
env:
SYMFONY_REQUIRE: ${{ matrix.symfony-version || '>=5.4' }} # TODO: To change to '>=6.4' in 3.x
steps:
- uses: actions/checkout@v4
- name: Configure environment
run: |
echo COLUMNS=120 >> $GITHUB_ENV
echo COMPOSER_MIN_STAB='composer config minimum-stability ${{ matrix.minimum-stability || 'stable' }} --ansi' >> $GITHUB_ENV
echo COMPOSER_UP='composer update ${{ matrix.dependency-version == 'lowest' && '--prefer-lowest' || '' }} --no-progress --no-interaction --ansi' >> $GITHUB_ENV
echo PHPUNIT='vendor/bin/simple-phpunit' >> $GITHUB_ENV
[ 'lowest' = '${{ matrix.dependency-version }}' ] && export SYMFONY_DEPRECATIONS_HELPER=weak
# Swup and Typed have no tests, Turbo has its own workflow file
EXCLUDED_PACKAGES="Typed|Swup|Turbo"
# Exclude deprecated packages when testing against lowest dependencies
if [ "${{ matrix.dependency-version }}" = "lowest" ]; then
EXCLUDED_PACKAGES="$EXCLUDED_PACKAGES|LazyImage|TogglePassword"
fi
PACKAGES=$(find src/ -mindepth 2 -type f -name composer.json -not -path "*/vendor/*" -printf '%h\n' | sed 's/^src\///' | grep -Ev "$EXCLUDED_PACKAGES" | sort | tr '\n' ' ')
echo "Packages: $PACKAGES"
echo "PACKAGES=$PACKAGES" >> $GITHUB_ENV
- name: Install rust-parallel
run: |
mkdir -p "$HOME/.local/bin"
if [[ "${{ matrix.os }}" == "windows-latest" ]]; then
# Windows installation
curl -L https://github.com/aaronriekenberg/rust-parallel/releases/download/v1.18.1/rust-parallel-x86_64-pc-windows-msvc.zip -o rust-parallel.zip
unzip rust-parallel.zip -d "$HOME/.local/bin"
else
# Linux installation
curl -L https://github.com/aaronriekenberg/rust-parallel/releases/download/v1.18.1/rust-parallel-x86_64-unknown-linux-gnu.tar.gz -o rust-parallel.tar.gz
tar -xzf rust-parallel.tar.gz -C "$HOME/.local/bin"
chmod +x "$HOME/.local/bin/rust-parallel"
fi
echo "$HOME/.local/bin" >> $GITHUB_PATH
- name: Setup PHP
uses: shivammathur/setup-php@v2
with:
php-version: ${{ matrix.php-version }}
extensions: ${{ matrix.os == 'windows-latest' && 'pdo_sqlite,sqlite3,fileinfo,gd' || '' }}
tools: flex
- name: Get composer cache directory
id: composer-cache
run: |
echo "dir=$(composer config cache-files-dir)" >> $GITHUB_OUTPUT
- name: Cache packages dependencies
uses: actions/cache@v4
with:
path: ${{ steps.composer-cache.outputs.dir }}
key: ${{ runner.os }}-composer-packages-${{ matrix.php-version }}-${{ matrix.dependency-version }}-${{ matrix.symfony-version }}-${{ matrix.minimum-stability }}-${{ hashFiles('src/**/composer.json') }}
restore-keys: |
${{ runner.os }}-composer-packages-${{ matrix.php-version }}-${{ matrix.dependency-version }}-${{ matrix.symfony-version }}-${{ matrix.minimum-stability }}
- name: Install root dependencies
uses: ramsey/composer-install@v3
with:
working-directory: ${{ github.workspace }}
- name: Build root packages
run: php .github/build-packages.php
- name: Run packages tests
run: |
source .github/workflows/.utils.sh
echo "$PACKAGES" | xargs -n1 | rust-parallel -j 3 --shell --shell-path 'bash' --shell-argument '-c' --exit-on-error --regex '(.+)' "source .github/workflows/.utils.sh; _run_task {1} \
'(cd src/{1} \
&& $COMPOSER_MIN_STAB \
&& $COMPOSER_UP \
&& _before_test {1} ${{ matrix.php-version }} ${{ matrix.minimum-stability }} \
&& $PHPUNIT)'"
js:
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
node-version: [ '18.x', '20.x', '22.x', '24.x' ]
steps:
- uses: actions/checkout@v4
- run: npm i -g corepack && corepack enable
- uses: actions/setup-node@v4
with:
node-version: ${{ matrix.node-version }}
cache: 'pnpm'
cache-dependency-path: |
pnpm-lock.yaml
package.json
src/**/package.json
- run: pnpm install --frozen-lockfile
- run: pnpm exec playwright install chromium
- run: pnpm run test