From 58b52e6f604a893245c7d8603a460e82d1232557 Mon Sep 17 00:00:00 2001 From: James Brooks Date: Wed, 17 Jun 2026 13:46:44 +0100 Subject: [PATCH 1/2] ci: drop unused coverage and build front-end assets once MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Speed up the test workflow: 1. Remove Xdebug coverage. `composer test` ran `pest --coverage` under Xdebug in every matrix job, but nothing consumed the report (no upload, no `--min` threshold). Drop `--coverage` from the test:unit script and set `coverage: none` in setup-php so Xdebug isn't loaded at all — it's the single largest slowdown in the suite. 2. Build front-end assets once. The compiled assets are identical across every test job, so build them in a dedicated `build-assets` job and share them via an artifact, instead of running `npm ci && npm run build` in all of them. Also cache the Composer download directory per php/stability so `composer update` doesn't re-download packages. Co-Authored-By: Claude Opus 4.8 (1M context) --- .github/workflows/run-tests.yml | 168 ++++++++++++++++++++++++++------ composer.json | 2 +- 2 files changed, 138 insertions(+), 32 deletions(-) diff --git a/.github/workflows/run-tests.yml b/.github/workflows/run-tests.yml index d17a1610..c3a118da 100644 --- a/.github/workflows/run-tests.yml +++ b/.github/workflows/run-tests.yml @@ -10,6 +10,34 @@ on: - cron: '0 0 * * *' jobs: + build-assets: + runs-on: ubuntu-latest + + name: Build Assets + + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Setup Node + uses: actions/setup-node@v4 + with: + node-version: 22 + cache: npm + + - name: Install frontend dependencies + run: npm ci + + - name: Build assets + run: npm run build + + - name: Upload compiled assets + uses: actions/upload-artifact@v4 + with: + name: build-assets + path: public/build + retention-days: 1 + static-analysis: runs-on: ubuntu-latest strategy: @@ -30,7 +58,19 @@ jobs: with: php-version: ${{ matrix.php }} extensions: dom, curl, libxml, mbstring, zip, pcntl, pdo, sqlite, pdo_sqlite, bcmath, soap, intl, gd, exif, iconv, imagick, fileinfo - coverage: xdebug + coverage: none + + - name: Get Composer cache directory + id: composer-cache + run: echo "dir=$(composer config cache-files-dir)" >> "$GITHUB_OUTPUT" + + - name: Cache Composer dependencies + uses: actions/cache@v4 + with: + path: ${{ steps.composer-cache.outputs.dir }} + key: composer-${{ matrix.php }}-${{ matrix.stability }}-${{ hashFiles('composer.json') }} + restore-keys: | + composer-${{ matrix.php }}-${{ matrix.stability }}- - name: Install dependencies run: | @@ -42,6 +82,7 @@ jobs: mysql: runs-on: ubuntu-latest + needs: build-assets services: mysql: @@ -73,18 +114,30 @@ jobs: with: php-version: ${{ matrix.php }} extensions: dom, curl, libxml, mbstring, zip, pcntl, pdo, sqlite, pdo_sqlite, bcmath, soap, intl, gd, exif, iconv, imagick, fileinfo - coverage: xdebug + coverage: none + + - name: Get Composer cache directory + id: composer-cache + run: echo "dir=$(composer config cache-files-dir)" >> "$GITHUB_OUTPUT" + + - name: Cache Composer dependencies + uses: actions/cache@v4 + with: + path: ${{ steps.composer-cache.outputs.dir }} + key: composer-${{ matrix.php }}-${{ matrix.stability }}-${{ hashFiles('composer.json') }} + restore-keys: | + composer-${{ matrix.php }}-${{ matrix.stability }}- - name: Install dependencies run: | composer require "laravel/framework:${{ matrix.laravel }}" --no-interaction --no-update composer update --${{ matrix.stability }} --prefer-dist --no-interaction - - name: Install frontend dependencies - run: npm ci - - - name: Build assets - run: npm run build + - name: Download compiled assets + uses: actions/download-artifact@v4 + with: + name: build-assets + path: public/build - name: Build tests environment run: composer build @@ -100,6 +153,7 @@ jobs: postgres13: runs-on: ubuntu-latest + needs: build-assets services: postgres: @@ -130,18 +184,30 @@ jobs: with: php-version: ${{ matrix.php }} extensions: dom, curl, libxml, mbstring, zip, pcntl, pdo, sqlite, pdo_sqlite, bcmath, soap, intl, gd, exif, iconv, imagick, fileinfo - coverage: xdebug + coverage: none + + - name: Get Composer cache directory + id: composer-cache + run: echo "dir=$(composer config cache-files-dir)" >> "$GITHUB_OUTPUT" + + - name: Cache Composer dependencies + uses: actions/cache@v4 + with: + path: ${{ steps.composer-cache.outputs.dir }} + key: composer-${{ matrix.php }}-${{ matrix.stability }}-${{ hashFiles('composer.json') }} + restore-keys: | + composer-${{ matrix.php }}-${{ matrix.stability }}- - name: Install dependencies run: | composer require "laravel/framework:${{ matrix.laravel }}" --no-interaction --no-update composer update --${{ matrix.stability }} --prefer-dist --no-interaction - - name: Install frontend dependencies - run: npm ci - - - name: Build assets - run: npm run build + - name: Download compiled assets + uses: actions/download-artifact@v4 + with: + name: build-assets + path: public/build - name: Build tests environment run: composer build @@ -157,6 +223,7 @@ jobs: postgres14: runs-on: ubuntu-latest + needs: build-assets services: postgres: @@ -187,18 +254,30 @@ jobs: with: php-version: ${{ matrix.php }} extensions: dom, curl, libxml, mbstring, zip, pcntl, pdo, sqlite, pdo_sqlite, bcmath, soap, intl, gd, exif, iconv, imagick, fileinfo - coverage: xdebug + coverage: none + + - name: Get Composer cache directory + id: composer-cache + run: echo "dir=$(composer config cache-files-dir)" >> "$GITHUB_OUTPUT" + + - name: Cache Composer dependencies + uses: actions/cache@v4 + with: + path: ${{ steps.composer-cache.outputs.dir }} + key: composer-${{ matrix.php }}-${{ matrix.stability }}-${{ hashFiles('composer.json') }} + restore-keys: | + composer-${{ matrix.php }}-${{ matrix.stability }}- - name: Install dependencies run: | composer require "laravel/framework:${{ matrix.laravel }}" --no-interaction --no-update composer update --${{ matrix.stability }} --prefer-dist --no-interaction - - name: Install frontend dependencies - run: npm ci - - - name: Build assets - run: npm run build + - name: Download compiled assets + uses: actions/download-artifact@v4 + with: + name: build-assets + path: public/build - name: Build tests environment run: composer build @@ -214,6 +293,7 @@ jobs: postgres15: runs-on: ubuntu-latest + needs: build-assets services: postgres: @@ -244,18 +324,30 @@ jobs: with: php-version: ${{ matrix.php }} extensions: dom, curl, libxml, mbstring, zip, pcntl, pdo, sqlite, pdo_sqlite, bcmath, soap, intl, gd, exif, iconv, imagick, fileinfo - coverage: xdebug + coverage: none + + - name: Get Composer cache directory + id: composer-cache + run: echo "dir=$(composer config cache-files-dir)" >> "$GITHUB_OUTPUT" + + - name: Cache Composer dependencies + uses: actions/cache@v4 + with: + path: ${{ steps.composer-cache.outputs.dir }} + key: composer-${{ matrix.php }}-${{ matrix.stability }}-${{ hashFiles('composer.json') }} + restore-keys: | + composer-${{ matrix.php }}-${{ matrix.stability }}- - name: Install dependencies run: | composer require "laravel/framework:${{ matrix.laravel }}" --no-interaction --no-update composer update --${{ matrix.stability }} --prefer-dist --no-interaction - - name: Install frontend dependencies - run: npm ci - - - name: Build assets - run: npm run build + - name: Download compiled assets + uses: actions/download-artifact@v4 + with: + name: build-assets + path: public/build - name: Build tests environment run: composer build @@ -271,6 +363,7 @@ jobs: sqlite: runs-on: ubuntu-latest + needs: build-assets strategy: fail-fast: false matrix: @@ -289,18 +382,30 @@ jobs: with: php-version: ${{ matrix.php }} extensions: dom, curl, libxml, mbstring, zip, pcntl, pdo, sqlite, pdo_sqlite, bcmath, soap, intl, gd, exif, iconv, imagick, fileinfo - coverage: xdebug + coverage: none + + - name: Get Composer cache directory + id: composer-cache + run: echo "dir=$(composer config cache-files-dir)" >> "$GITHUB_OUTPUT" + + - name: Cache Composer dependencies + uses: actions/cache@v4 + with: + path: ${{ steps.composer-cache.outputs.dir }} + key: composer-${{ matrix.php }}-${{ matrix.stability }}-${{ hashFiles('composer.json') }} + restore-keys: | + composer-${{ matrix.php }}-${{ matrix.stability }}- - name: Install dependencies run: | composer require "laravel/framework:${{ matrix.laravel }}" --no-interaction --no-update composer update --${{ matrix.stability }} --prefer-dist --no-interaction - - name: Install frontend dependencies - run: npm ci - - - name: Build assets - run: npm run build + - name: Download compiled assets + uses: actions/download-artifact@v4 + with: + name: build-assets + path: public/build - name: Build tests environment run: composer build @@ -311,6 +416,7 @@ jobs: check: if: always() needs: + - build-assets - static-analysis - mysql - postgres13 diff --git a/composer.json b/composer.json index 347c842b..d25d1338 100644 --- a/composer.json +++ b/composer.json @@ -109,7 +109,7 @@ "test:lint": [ "pint --test" ], - "test:unit": "pest --parallel --processes=10 --ci --coverage --compact", + "test:unit": "pest --parallel --processes=10 --ci --compact", "test": [ "@test:unit" ] From 53aff4906a3e1d246386460e691f08e5846e77d5 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 17 Jun 2026 17:10:15 +0000 Subject: [PATCH 2/2] Fix Build Assets CI job by adding PHP/Composer setup before npm build --- .github/workflows/run-tests.yml | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/.github/workflows/run-tests.yml b/.github/workflows/run-tests.yml index c3a118da..da93cf6b 100644 --- a/.github/workflows/run-tests.yml +++ b/.github/workflows/run-tests.yml @@ -19,6 +19,18 @@ jobs: - name: Checkout code uses: actions/checkout@v4 + - name: Setup PHP + uses: shivammathur/setup-php@v2 + with: + php-version: 8.3 + extensions: dom, curl, libxml, mbstring, zip, pcntl, pdo, sqlite, pdo_sqlite, bcmath, soap, intl, gd, exif, iconv, imagick, fileinfo + coverage: none + + - name: Install PHP dependencies + run: | + composer require "laravel/framework:11.x" --no-interaction --no-update + composer update --prefer-dist --no-interaction + - name: Setup Node uses: actions/setup-node@v4 with: