From 5a936f02c6a34cf51c201cd027de039373e02ee7 Mon Sep 17 00:00:00 2001 From: Peter Wilson Date: Thu, 30 Jul 2026 09:49:43 +1000 Subject: [PATCH 01/16] Add DB as a service to the top level of the workflow. --- .github/workflows/reusable-phpunit-tests-v3.yml | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/.github/workflows/reusable-phpunit-tests-v3.yml b/.github/workflows/reusable-phpunit-tests-v3.yml index 4ce4e65b0ba12..2ea447e844a9c 100644 --- a/.github/workflows/reusable-phpunit-tests-v3.yml +++ b/.github/workflows/reusable-phpunit-tests-v3.yml @@ -134,6 +134,21 @@ jobs: permissions: contents: read + services: + mysql: + image: ${{ inputs.db-type }}:${{ inputs.db-version }} + env: + MYSQL_ROOT_PASSWORD: password + MARIADB_ROOT_PASSWORD: password + ports: + - 3306:3306 + options: >- + --health-cmd="${{ inputs.db-type == 'mariadb' && contains(fromJSON('["5.5", "10.0", "10.1", "10.2", "10.3"]'), inputs.db-version) && 'mysqladmin ping -h localhost' || inputs.db-type == 'mariadb' && 'mariadb-admin ping -h localhost' || 'mysqladmin ping -h localhost' }}" + --health-interval=5s + --health-timeout=5s + --health-retries=10 + --health-start-period=60s + steps: - name: Configure environment variables run: | From 5871cdc4b09704189c5a75f0f61b7fc440034122 Mon Sep 17 00:00:00 2001 From: Peter Wilson Date: Thu, 30 Jul 2026 09:55:04 +1000 Subject: [PATCH 02/16] Add memcached service when required, otherwise a noop container. --- .github/workflows/reusable-phpunit-tests-v3.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.github/workflows/reusable-phpunit-tests-v3.yml b/.github/workflows/reusable-phpunit-tests-v3.yml index 2ea447e844a9c..ebbf08656e18c 100644 --- a/.github/workflows/reusable-phpunit-tests-v3.yml +++ b/.github/workflows/reusable-phpunit-tests-v3.yml @@ -148,6 +148,10 @@ jobs: --health-timeout=5s --health-retries=10 --health-start-period=60s + memcached: + image: ${{ inputs.memcached && 'memcached' || 'alpine' }} + ports: + - 11211:11211 steps: - name: Configure environment variables From 12d858af13d054af0802feb33bc69c2d5ce54fed Mon Sep 17 00:00:00 2001 From: Peter Wilson Date: Thu, 30 Jul 2026 10:00:38 +1000 Subject: [PATCH 03/16] Install required extensions with PHP. --- .github/workflows/reusable-phpunit-tests-v3.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/reusable-phpunit-tests-v3.yml b/.github/workflows/reusable-phpunit-tests-v3.yml index ebbf08656e18c..664a05971e607 100644 --- a/.github/workflows/reusable-phpunit-tests-v3.yml +++ b/.github/workflows/reusable-phpunit-tests-v3.yml @@ -193,6 +193,7 @@ jobs: uses: shivammathur/setup-php@f3e473d116dcccaddc5834248c87452386958240 # 2.37.2 with: php-version: '${{ inputs.php }}' + extensions: "gd, opcache, mysqli, zip, exif, intl, mbstring, xml, xsl, imagick, xdebug${{ inputs.memcached && ', memcached' || '' }}" coverage: none # Since Composer dependencies are installed using `composer update` and no lock file is in version control, From 5dde189ab920d3baebd8aec14445ae6e140a7302 Mon Sep 17 00:00:00 2001 From: Peter Wilson Date: Thu, 30 Jul 2026 10:05:20 +1000 Subject: [PATCH 04/16] Install PCOV on GHA container. --- .../workflows/reusable-phpunit-tests-v3.yml | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/.github/workflows/reusable-phpunit-tests-v3.yml b/.github/workflows/reusable-phpunit-tests-v3.yml index 664a05971e607..5e8da5d993445 100644 --- a/.github/workflows/reusable-phpunit-tests-v3.yml +++ b/.github/workflows/reusable-phpunit-tests-v3.yml @@ -275,16 +275,15 @@ jobs: - name: Install PCOV coverage driver if: ${{ inputs.coverage-report }} run: | - docker compose exec -T -u 0 php sh -c ' - pecl install --force pcov-1.0.12 && - docker-php-ext-enable pcov && - { - echo "pcov.enabled=1" - echo "pcov.directory=/var/www/src" - echo "pcov.initial.files=10000" - } >> /usr/local/etc/php/conf.d/docker-php-ext-pcov.ini && - php -m | grep -i pcov - ' + pecl install --force pcov-1.0.12 + PHP_INI_SCAN_DIR=$(php -r 'echo PHP_CONFIG_FILE_SCAN_DIR;') + { + echo "extension=pcov" + echo "pcov.enabled=1" + echo "pcov.directory=${GITHUB_WORKSPACE}/src" + echo "pcov.initial.files=10000" + } > "$PHP_INI_SCAN_DIR/pcov.ini" + php -m | grep -i pcov - name: Run external HTTP tests if: ${{ ! inputs.multisite && ! inputs.phpunit-test-groups && ! inputs.coverage-report }} From a6b7468baaff464a23d01c6a67ab69ed6eb83d8d Mon Sep 17 00:00:00 2001 From: Peter Wilson Date: Thu, 30 Jul 2026 10:11:19 +1000 Subject: [PATCH 05/16] Configure tests on GHA container. --- .github/workflows/reusable-phpunit-tests-v3.yml | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/.github/workflows/reusable-phpunit-tests-v3.yml b/.github/workflows/reusable-phpunit-tests-v3.yml index 5e8da5d993445..6083122ee953d 100644 --- a/.github/workflows/reusable-phpunit-tests-v3.yml +++ b/.github/workflows/reusable-phpunit-tests-v3.yml @@ -258,8 +258,16 @@ jobs: env: LOCAL_DB_CMD: ${{ env.LOCAL_DB_TYPE == 'mariadb' && contains( fromJSON('["5.5", "10.0", "10.1", "10.2", "10.3"]'), env.LOCAL_DB_VERSION ) && 'mysql' || env.LOCAL_DB_TYPE }} - - name: Install WordPress - run: npm run env:install + - name: Set up test configuration + run: | + sed \ + -e 's/youremptytestdbnamehere/wordpress_develop_tests/' \ + -e 's/yourusernamehere/root/' \ + -e 's/yourpasswordhere/password/' \ + -e 's/localhost/127.0.0.1/' \ + -e "s/'WP_TESTS_DOMAIN', 'example.org'/'WP_TESTS_DOMAIN', '${LOCAL_WP_TESTS_DOMAIN}'/" \ + wp-tests-config-sample.php > wp-tests-config.php + echo "define( 'FS_METHOD', 'direct' );" >> wp-tests-config.php # Installs PCOV as the code coverage driver for the PHPUnit run below. # From 9a354de889d04bf50ec0cb153c65d45ac890c322 Mon Sep 17 00:00:00 2001 From: Peter Wilson Date: Thu, 30 Jul 2026 10:13:43 +1000 Subject: [PATCH 06/16] Run PHPUnit outside of docker containers. --- .github/workflows/reusable-phpunit-tests-v3.yml | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/.github/workflows/reusable-phpunit-tests-v3.yml b/.github/workflows/reusable-phpunit-tests-v3.yml index 6083122ee953d..7e23c15a1787d 100644 --- a/.github/workflows/reusable-phpunit-tests-v3.yml +++ b/.github/workflows/reusable-phpunit-tests-v3.yml @@ -296,13 +296,12 @@ jobs: - name: Run external HTTP tests if: ${{ ! inputs.multisite && ! inputs.phpunit-test-groups && ! inputs.coverage-report }} continue-on-error: ${{ inputs.allow-errors }} - run: node ./tools/local-env/scripts/docker.js run php ./vendor/bin/phpunit --verbose -c "${PHPUNIT_CONFIG}" --group external-http + run: ./vendor/bin/phpunit --verbose -c "${PHPUNIT_CONFIG}" --group external-http - name: Run PHPUnit tests${{ inputs.phpunit-test-groups && format( ' ({0} groups)', inputs.phpunit-test-groups ) || '' }}${{ inputs.coverage-report && ' with coverage report' || '' }} continue-on-error: ${{ inputs.allow-errors }} run: | - node ./tools/local-env/scripts/docker.js ${{ inputs.coverage-report && 'exec' || 'run' }} \ - php ./vendor/bin/phpunit \ + ./vendor/bin/phpunit \ --verbose \ -c "${PHPUNIT_CONFIG}" \ ${{ inputs.phpunit-test-groups && '--group "${TEST_GROUPS}"' || '' }} \ @@ -314,18 +313,18 @@ jobs: - name: Run AJAX tests if: ${{ ! inputs.phpunit-test-groups && ! inputs.coverage-report }} continue-on-error: ${{ inputs.allow-errors }} - run: node ./tools/local-env/scripts/docker.js run php ./vendor/bin/phpunit --verbose -c "${PHPUNIT_CONFIG}" --group ajax + run: ./vendor/bin/phpunit --verbose -c "${PHPUNIT_CONFIG}" --group ajax - name: Run ms-files tests as a multisite install if: ${{ inputs.multisite && ! inputs.phpunit-test-groups && ! inputs.coverage-report }} continue-on-error: ${{ inputs.allow-errors }} - run: node ./tools/local-env/scripts/docker.js run php ./vendor/bin/phpunit --verbose -c "${PHPUNIT_CONFIG}" --group ms-files + run: ./vendor/bin/phpunit --verbose -c "${PHPUNIT_CONFIG}" --group ms-files # __fakegroup__ is excluded to force PHPUnit to ignore the settings in phpunit.xml.dist. - name: Run (Xdebug) tests if: ${{ ! inputs.phpunit-test-groups && ! inputs.coverage-report }} continue-on-error: ${{ inputs.allow-errors }} - run: LOCAL_PHP_XDEBUG=true node ./tools/local-env/scripts/docker.js run php ./vendor/bin/phpunit -v --group xdebug --exclude-group __fakegroup__ + run: XDEBUG_MODE=develop,debug ./vendor/bin/phpunit -v --group xdebug --exclude-group __fakegroup__ - name: Upload test coverage report to Codecov if: ${{ inputs.coverage-report }} From e255fb43b7bead974dafdb3e27ad639f264f9b97 Mon Sep 17 00:00:00 2001 From: Peter Wilson Date: Thu, 30 Jul 2026 10:18:59 +1000 Subject: [PATCH 07/16] Remove docker pull, etc. --- .../workflows/reusable-phpunit-tests-v3.yml | 37 ------------------- 1 file changed, 37 deletions(-) diff --git a/.github/workflows/reusable-phpunit-tests-v3.yml b/.github/workflows/reusable-phpunit-tests-v3.yml index 7e23c15a1787d..5299d17e9985d 100644 --- a/.github/workflows/reusable-phpunit-tests-v3.yml +++ b/.github/workflows/reusable-phpunit-tests-v3.yml @@ -221,43 +221,6 @@ jobs: composer --version locale -a - - name: Docker debug information - run: | - docker -v - - - name: Pull Docker images (with retry) - run: | - for attempt in 1 2 3; do - if npm run env:pull; then - break - fi - - if [ "$attempt" -eq 3 ]; then - echo "npm run env:pull failed after $attempt attempts." - exit 1 - fi - - echo "npm run env:pull failed (attempt $attempt); retrying..." - sleep $(( attempt * 10 )) - done - - - name: Start Docker environment - run: | - npm run env:start - - - name: Log running Docker containers - run: docker ps -a - - - name: WordPress Docker container debug information - run: | - docker compose run --rm mysql "${LOCAL_DB_CMD}" --version - docker compose run --rm php php --version - docker compose run --rm php php -m - docker compose run --rm php php -i - docker compose run --rm php locale -a - env: - LOCAL_DB_CMD: ${{ env.LOCAL_DB_TYPE == 'mariadb' && contains( fromJSON('["5.5", "10.0", "10.1", "10.2", "10.3"]'), env.LOCAL_DB_VERSION ) && 'mysql' || env.LOCAL_DB_TYPE }} - - name: Set up test configuration run: | sed \ From 7b30e94ec07fab4b02dff40d0a76b0c7ed73319e Mon Sep 17 00:00:00 2001 From: Peter Wilson Date: Thu, 30 Jul 2026 10:30:36 +1000 Subject: [PATCH 08/16] Configure db and tests correctly, so the DB names match. --- .github/workflows/reusable-phpunit-tests-v3.yml | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/.github/workflows/reusable-phpunit-tests-v3.yml b/.github/workflows/reusable-phpunit-tests-v3.yml index 5299d17e9985d..1e660179183c5 100644 --- a/.github/workflows/reusable-phpunit-tests-v3.yml +++ b/.github/workflows/reusable-phpunit-tests-v3.yml @@ -134,12 +134,18 @@ jobs: permissions: contents: read + env: + WP_DB_PASSWORD: password + WP_DB_DATABASE: wordpress_develop_tests + services: mysql: image: ${{ inputs.db-type }}:${{ inputs.db-version }} env: - MYSQL_ROOT_PASSWORD: password - MARIADB_ROOT_PASSWORD: password + MYSQL_ROOT_PASSWORD: ${{ env.WP_DB_PASSWORD }} + MYSQL_DATABASE: ${{ env.WP_DB_DATABASE }} + MARIADB_ROOT_PASSWORD: ${{ env.WP_DB_PASSWORD }} + MARIADB_DATABASE: ${{ env.WP_DB_DATABASE }} ports: - 3306:3306 options: >- @@ -224,9 +230,9 @@ jobs: - name: Set up test configuration run: | sed \ - -e 's/youremptytestdbnamehere/wordpress_develop_tests/' \ + -e "s/youremptytestdbnamehere/${WP_DB_DATABASE}/" \ -e 's/yourusernamehere/root/' \ - -e 's/yourpasswordhere/password/' \ + -e "s/yourpasswordhere/${WP_DB_PASSWORD}/" \ -e 's/localhost/127.0.0.1/' \ -e "s/'WP_TESTS_DOMAIN', 'example.org'/'WP_TESTS_DOMAIN', '${LOCAL_WP_TESTS_DOMAIN}'/" \ wp-tests-config-sample.php > wp-tests-config.php From 7bf7febe19e2bd2af7eb7b211b808988bb2cc746 Mon Sep 17 00:00:00 2001 From: Peter Wilson Date: Thu, 30 Jul 2026 10:58:21 +1000 Subject: [PATCH 09/16] Configure imagick. --- .github/workflows/reusable-phpunit-tests-v3.yml | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/.github/workflows/reusable-phpunit-tests-v3.yml b/.github/workflows/reusable-phpunit-tests-v3.yml index 1e660179183c5..89bd67d5564e8 100644 --- a/.github/workflows/reusable-phpunit-tests-v3.yml +++ b/.github/workflows/reusable-phpunit-tests-v3.yml @@ -202,6 +202,13 @@ jobs: extensions: "gd, opcache, mysqli, zip, exif, intl, mbstring, xml, xsl, imagick, xdebug${{ inputs.memcached && ', memcached' || '' }}" coverage: none + - name: Configure ImageMagick + run: | + sudo apt-get install -y --no-install-recommends ghostscript libheif1 + # Allow PDF processing; Ubuntu disables this in the default ImageMagick policy for security. + sudo find /etc/ImageMagick* -name policy.xml \ + -exec sed -i 's@rights="none" pattern="PDF"@rights="read|write" pattern="PDF"@' {} + + # Since Composer dependencies are installed using `composer update` and no lock file is in version control, # passing a custom cache suffix ensures that the cache is flushed at least once per week. - name: Install Composer dependencies From d65570579e12c4a45cf44e34e80c06bc0eaa772b Mon Sep 17 00:00:00 2001 From: Peter Wilson Date: Thu, 30 Jul 2026 11:10:06 +1000 Subject: [PATCH 10/16] Further system deps. --- .github/workflows/reusable-phpunit-tests-v3.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/reusable-phpunit-tests-v3.yml b/.github/workflows/reusable-phpunit-tests-v3.yml index 89bd67d5564e8..1df12a6c7e7ee 100644 --- a/.github/workflows/reusable-phpunit-tests-v3.yml +++ b/.github/workflows/reusable-phpunit-tests-v3.yml @@ -204,7 +204,7 @@ jobs: - name: Configure ImageMagick run: | - sudo apt-get install -y --no-install-recommends ghostscript libheif1 + sudo apt-get install -y --no-install-recommends ghostscript libheif1 libheif-plugin-aomenc libheif-plugin-aomdec # Allow PDF processing; Ubuntu disables this in the default ImageMagick policy for security. sudo find /etc/ImageMagick* -name policy.xml \ -exec sed -i 's@rights="none" pattern="PDF"@rights="read|write" pattern="PDF"@' {} + From 4156ba9ceedbbabe74a343a2eef9660af185e704 Mon Sep 17 00:00:00 2001 From: Peter Wilson Date: Thu, 30 Jul 2026 11:13:22 +1000 Subject: [PATCH 11/16] Further system dependencies. --- .github/workflows/reusable-phpunit-tests-v3.yml | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/.github/workflows/reusable-phpunit-tests-v3.yml b/.github/workflows/reusable-phpunit-tests-v3.yml index 1df12a6c7e7ee..5a758a3208549 100644 --- a/.github/workflows/reusable-phpunit-tests-v3.yml +++ b/.github/workflows/reusable-phpunit-tests-v3.yml @@ -202,9 +202,11 @@ jobs: extensions: "gd, opcache, mysqli, zip, exif, intl, mbstring, xml, xsl, imagick, xdebug${{ inputs.memcached && ', memcached' || '' }}" coverage: none - - name: Configure ImageMagick + - name: Install system dependencies run: | - sudo apt-get install -y --no-install-recommends ghostscript libheif1 libheif-plugin-aomenc libheif-plugin-aomdec + sudo apt-get install -y --no-install-recommends ghostscript libheif1 libheif-plugin-aomenc libheif-plugin-aomdec libavif16 locales + # Generate the locales used by WordPress tests. + sudo locale-gen ru_RU.UTF-8 fr_FR.UTF-8 de_DE.UTF-8 es_ES.UTF-8 ja_JP.UTF-8 # Allow PDF processing; Ubuntu disables this in the default ImageMagick policy for security. sudo find /etc/ImageMagick* -name policy.xml \ -exec sed -i 's@rights="none" pattern="PDF"@rights="read|write" pattern="PDF"@' {} + From 935ae78989299fd0e1a015eed8309205d92d1137 Mon Sep 17 00:00:00 2001 From: Peter Wilson Date: Thu, 30 Jul 2026 12:20:02 +1000 Subject: [PATCH 12/16] Try building WordPress once. --- .github/workflows/phpunit-tests.yml | 5 ++++ .../workflows/reusable-phpunit-tests-v3.yml | 22 +++++++++++++++- .../workflows/reusable-prepare-gutenberg.yml | 25 +++++++++++++++++++ 3 files changed, 51 insertions(+), 1 deletion(-) diff --git a/.github/workflows/phpunit-tests.yml b/.github/workflows/phpunit-tests.yml index a9be5d8565fe3..8dfe9cb66309d 100644 --- a/.github/workflows/phpunit-tests.yml +++ b/.github/workflows/phpunit-tests.yml @@ -146,6 +146,7 @@ jobs: report: ${{ matrix.report || false }} gutenberg-artifact: gutenberg-build gutenberg-sha: ${{ needs.prepare-gutenberg.outputs.gutenberg-sha }} + wordpress-build-artifact: wordpress-build # # Creates a PHPUnit test job for each PHP/MariaDB combination. @@ -202,6 +203,7 @@ jobs: report: false gutenberg-artifact: gutenberg-build gutenberg-sha: ${{ needs.prepare-gutenberg.outputs.gutenberg-sha }} + wordpress-build-artifact: wordpress-build # # Creates PHPUnit test jobs to test MariaDB and MySQL innovation releases. @@ -252,6 +254,7 @@ jobs: report: false gutenberg-artifact: gutenberg-build gutenberg-sha: ${{ needs.prepare-gutenberg.outputs.gutenberg-sha }} + wordpress-build-artifact: wordpress-build # # Runs the HTML API test group. @@ -287,6 +290,7 @@ jobs: phpunit-test-groups: ${{ matrix.phpunit-test-groups }} gutenberg-artifact: gutenberg-build gutenberg-sha: ${{ needs.prepare-gutenberg.outputs.gutenberg-sha }} + wordpress-build-artifact: wordpress-build # # Runs unit tests for forks. @@ -350,6 +354,7 @@ jobs: phpunit-test-groups: ${{ matrix.phpunit-test-groups || '' }} gutenberg-artifact: gutenberg-build gutenberg-sha: ${{ needs.prepare-gutenberg.outputs.gutenberg-sha }} + wordpress-build-artifact: wordpress-build slack-notifications: name: Slack Notifications diff --git a/.github/workflows/reusable-phpunit-tests-v3.yml b/.github/workflows/reusable-phpunit-tests-v3.yml index 5a758a3208549..bc96b4e4cab4e 100644 --- a/.github/workflows/reusable-phpunit-tests-v3.yml +++ b/.github/workflows/reusable-phpunit-tests-v3.yml @@ -82,6 +82,11 @@ on: required: false type: string default: '' + wordpress-build-artifact: + description: 'The name of a same-workflow artifact containing the pre-built WordPress assets. Optional: callers that omit it build per job.' + required: false + type: string + default: '' secrets: CODECOV_TOKEN: description: 'The Codecov token required for uploading reports.' @@ -174,7 +179,7 @@ jobs: # Branches >= 5.9 call this workflow at @trunk without the producer job, so they # pass no artifact. They skip this step and fall back to a per-job download. - name: Download prepared Gutenberg build - if: inputs.gutenberg-artifact != '' + if: inputs.gutenberg-artifact != '' && inputs.wordpress-build-artifact == '' uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1 with: # Without a run ID, this action reads only from the caller's current workflow run. @@ -183,11 +188,24 @@ jobs: digest-mismatch: error - name: Set up Node.js + if: inputs.wordpress-build-artifact == '' uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0 with: node-version-file: '.nvmrc' cache: npm + - name: Download WordPress build + if: inputs.wordpress-build-artifact != '' + uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1 + with: + name: ${{ inputs.wordpress-build-artifact }} + path: /tmp/wordpress-build + digest-mismatch: error + + - name: Apply WordPress build + if: inputs.wordpress-build-artifact != '' + run: tar -xzf /tmp/wordpress-build/wordpress-build.tar.gz + ## # This allows Composer dependencies to be installed using a single step. # @@ -219,9 +237,11 @@ jobs: custom-cache-suffix: $(/bin/date -u --date='last Mon' "+%F") - name: Install npm dependencies + if: inputs.wordpress-build-artifact == '' run: npm ci - name: Build WordPress + if: inputs.wordpress-build-artifact == '' run: npm run build:dev env: # The producer resolved this once. Matrix jobs must not re-resolve mutable GHCR tags. diff --git a/.github/workflows/reusable-prepare-gutenberg.yml b/.github/workflows/reusable-prepare-gutenberg.yml index c5e1f904a9680..5f4af5420dbc8 100644 --- a/.github/workflows/reusable-prepare-gutenberg.yml +++ b/.github/workflows/reusable-prepare-gutenberg.yml @@ -38,6 +38,7 @@ jobs: uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0 with: node-version-file: '.nvmrc' + cache: npm - name: Download and verify Gutenberg build id: download @@ -58,3 +59,27 @@ jobs: if-no-files-found: error include-hidden-files: true retention-days: 1 + + - name: Install npm dependencies + run: npm ci + env: + PUPPETEER_SKIP_DOWNLOAD: true + + - name: Build WordPress + run: npm run build:dev + env: + GUTENBERG_EXPECTED_SHA: ${{ steps.download.outputs.gutenberg-sha }} + + - name: Package WordPress build + run: | + { git diff --name-only HEAD; git ls-files --others --exclude-standard; } \ + > /tmp/build-manifest.txt + tar -czf /tmp/wordpress-build.tar.gz --files-from=/tmp/build-manifest.txt + + - name: Upload WordPress build + uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 + with: + name: wordpress-build + path: /tmp/wordpress-build.tar.gz + if-no-files-found: error + retention-days: 1 From 1131aad926af897bc8f460673de6107db97dc9ab Mon Sep 17 00:00:00 2001 From: Peter Wilson Date: Thu, 30 Jul 2026 12:27:23 +1000 Subject: [PATCH 13/16] Display list of files to be included in the tar file. --- .github/workflows/reusable-prepare-gutenberg.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/reusable-prepare-gutenberg.yml b/.github/workflows/reusable-prepare-gutenberg.yml index 5f4af5420dbc8..9bd5c31d98ad9 100644 --- a/.github/workflows/reusable-prepare-gutenberg.yml +++ b/.github/workflows/reusable-prepare-gutenberg.yml @@ -74,6 +74,8 @@ jobs: run: | { git diff --name-only HEAD; git ls-files --others --exclude-standard; } \ > /tmp/build-manifest.txt + echo "Files included in build artifact:" + cat /tmp/build-manifest.txt tar -czf /tmp/wordpress-build.tar.gz --files-from=/tmp/build-manifest.txt - name: Upload WordPress build From c322e1a6cfdfc13355b9bac4fcaa88065a839308 Mon Sep 17 00:00:00 2001 From: Peter Wilson Date: Thu, 30 Jul 2026 12:39:21 +1000 Subject: [PATCH 14/16] The WP artifact should actually contain files. --- .github/workflows/reusable-phpunit-tests-v3.yml | 5 ++++- .github/workflows/reusable-prepare-gutenberg.yml | 4 ++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/.github/workflows/reusable-phpunit-tests-v3.yml b/.github/workflows/reusable-phpunit-tests-v3.yml index bc96b4e4cab4e..38d280d21b7d5 100644 --- a/.github/workflows/reusable-phpunit-tests-v3.yml +++ b/.github/workflows/reusable-phpunit-tests-v3.yml @@ -204,7 +204,10 @@ jobs: - name: Apply WordPress build if: inputs.wordpress-build-artifact != '' - run: tar -xzf /tmp/wordpress-build/wordpress-build.tar.gz + run: | + echo "Files included in build artifact:" + tar -tzf /tmp/wordpress-build/wordpress-build.tar.gz + tar -xzf /tmp/wordpress-build/wordpress-build.tar.gz ## # This allows Composer dependencies to be installed using a single step. diff --git a/.github/workflows/reusable-prepare-gutenberg.yml b/.github/workflows/reusable-prepare-gutenberg.yml index 9bd5c31d98ad9..ace2806c6aeef 100644 --- a/.github/workflows/reusable-prepare-gutenberg.yml +++ b/.github/workflows/reusable-prepare-gutenberg.yml @@ -76,12 +76,12 @@ jobs: > /tmp/build-manifest.txt echo "Files included in build artifact:" cat /tmp/build-manifest.txt - tar -czf /tmp/wordpress-build.tar.gz --files-from=/tmp/build-manifest.txt + tar -czf wordpress-build.tar.gz --files-from=/tmp/build-manifest.txt - name: Upload WordPress build uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 with: name: wordpress-build - path: /tmp/wordpress-build.tar.gz + path: wordpress-build.tar.gz if-no-files-found: error retention-days: 1 From c18e564e4c79135888242974b3c2b9c069fb4e0b Mon Sep 17 00:00:00 2001 From: Peter Wilson Date: Thu, 30 Jul 2026 12:56:16 +1000 Subject: [PATCH 15/16] I reckon this will be better. --- .github/workflows/reusable-prepare-gutenberg.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/reusable-prepare-gutenberg.yml b/.github/workflows/reusable-prepare-gutenberg.yml index ace2806c6aeef..8e979ce788b76 100644 --- a/.github/workflows/reusable-prepare-gutenberg.yml +++ b/.github/workflows/reusable-prepare-gutenberg.yml @@ -72,7 +72,7 @@ jobs: - name: Package WordPress build run: | - { git diff --name-only HEAD; git ls-files --others --exclude-standard; } \ + { git diff --name-only HEAD; git ls-files --others --exclude="/vendor/*" --exclude="/node_modules/*"; } \ > /tmp/build-manifest.txt echo "Files included in build artifact:" cat /tmp/build-manifest.txt From bd7f9da3df946171c44e4eb8f3d3cdc51f30f111 Mon Sep 17 00:00:00 2001 From: Peter Wilson Date: Thu, 30 Jul 2026 12:58:27 +1000 Subject: [PATCH 16/16] Exclude gb directory too. --- .github/workflows/reusable-prepare-gutenberg.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/reusable-prepare-gutenberg.yml b/.github/workflows/reusable-prepare-gutenberg.yml index 8e979ce788b76..4a05e6a77a824 100644 --- a/.github/workflows/reusable-prepare-gutenberg.yml +++ b/.github/workflows/reusable-prepare-gutenberg.yml @@ -72,7 +72,7 @@ jobs: - name: Package WordPress build run: | - { git diff --name-only HEAD; git ls-files --others --exclude="/vendor/*" --exclude="/node_modules/*"; } \ + { git diff --name-only HEAD; git ls-files --others --exclude="/gutenberg/*" --exclude="/vendor/*" --exclude="/node_modules/*"; } \ > /tmp/build-manifest.txt echo "Files included in build artifact:" cat /tmp/build-manifest.txt