Wordpress/.github/workflows/phpunit-tests.yml
Jonathan Desrosiers 643754dc67 Build/Test Tools: Cancel previous active workflow runs for pull requests.
Because workflow results are reported for each commit, it’s important to let all runs against main and version branches to complete so that the checks are reported accurately.

When considering and reviewing pull requests, the only workflow run that matters is the most recent.

Props ocean90, helen.
See #50401.

git-svn-id: https://develop.svn.wordpress.org/trunk@49244 602fd350-edb4-49c9-b593-d223f7449a82
2020-10-20 17:44:27 +00:00

281 lines
10 KiB
YAML

name: PHPUnit Tests
on:
push:
branches:
- master
- '*.*'
pull_request:
# Once weekly On Sundays at 00:00 UTC.
schedule:
- cron: '0 0 * * 0'
env:
LOCAL_DIR: build
PUPPETEER_SKIP_CHROMIUM_DOWNLOAD: ${{ true }}
COMPOSER_INSTALL: ${{ false }}
# Controls which NPM script to use for running PHPUnit tests. Options ar `php` and `php-composer`.
PHPUNIT_SCRIPT: php
LOCAL_PHP_MEMCACHED: ${{ false }}
jobs:
# Sets up WordPress for testing or development use.
#
# Performs the following steps:
# - Cancels all previous workflow runs for pull requests that have not completed.
# - Checks out the repository.
# - Checks out the WordPress Importer plugin (needed for the Core PHPUnit tests).
# - Logs debug information about the runner container.
# - Installs NodeJS 12 (todo: install the version of NPM specified in the `.nvmrc` file to support older branches)
# - Sets up caching for NPM.
# _ Installs NPM dependencies.
# - Builds WordPress to run from the `build` directory.
# - Creates a ZIP file of compiled WordPress
# - Uploads ZIP file as an artifact.
setup-wordpress:
name: Setup WordPress
runs-on: ubuntu-latest
steps:
- name: Cancel previous runs of this workflow (pull requests only)
if: ${{ github.event_name == 'pull_request' }}
uses: styfle/cancel-workflow-action@0.5.0
with:
access_token: ${{ github.token }}
- name: Checkout repository
uses: actions/checkout@v2
- name: Checkout the WordPress Importer plugin
run: svn checkout -r 2387243 https://plugins.svn.wordpress.org/wordpress-importer/trunk/ tests/phpunit/data/plugins/wordpress-importer
- name: Log debug information
run: |
npm --version
node --version
curl --version
git --version
svn --version
php --version
php -i
locale -a
- name: Install NodeJS
uses: actions/setup-node@v1
with:
node-version: 12
- name: Cache NodeJS modules
uses: actions/cache@v2
env:
cache-name: cache-node-modules
with:
# npm cache files are stored in `~/.npm` on Linux/macOS
path: ~/.npm
key: ${{ runner.os }}-npm-${{ hashFiles('**/package-lock.json') }}
restore-keys: |
${{ runner.os }}-npm-
- name: Install Dependencies
run: npm ci
- name: Build WordPress
run: npm run build
- name: Create ZIP artifact
uses: thedoctor0/zip-release@0.4.1
with:
filename: built-wp-${{ github.sha }}.zip
exclusions: '/*node_modules/*'
- name: Upload build artifact
uses: actions/upload-artifact@v2
with:
name: built-wp-${{ github.sha }}
path: built-wp-${{ github.sha }}.zip
if-no-files-found: error
# Runs the PHPUnit tests for WordPress.
#
# Performs the following steps:
# - Set environment variables.
# - Sets up the environment variables needed for testing with memcached (if desired).
# - Downloads the built WordPress artifact from the previous job.
# - Unzips the artifact.
# - Installs NodeJS 12 (todo: install the version of NPM specified in the `nvmrc` file to support older branches)
# - Sets up caching for NPM.
# _ Installs NPM dependencies.
# - Configures caching for Composer.
# _ Installs Composer dependencies (if desired)
# - Logs Docker debug information (about both the Docker installation within the runner)
# - Starts the WordPress Docker container.
# - Starts the memcached server after the Docker network has been created (if desired).
# - Logs WordPress Docker container debug information.
# - Logs debug general information.
# - Logs the running Docker containers.
# - Logs Docker debug information (about both the Docker installation within the runner and the WordPress container)
# - Install WordPress within the Docker container.
# - Run the PHPUnit tests.
# - Reports test results to the Distributed Hosting Tests.
# - todo: Configure Slack notifications for failing tests.
test-php:
name: ${{ matrix.php }}${{ matrix.memcached && ' with memcached' || '' }} on ${{ matrix.os }}
needs: setup-wordpress
runs-on: ${{ matrix.os }}
strategy:
matrix:
php: [ '8.0', '7.4', '7.3', '7.2', '7.1', '7.0', '5.6.20' ]
os: [ ubuntu-latest ]
memcached: [ false ]
include:
# Include job for PHP 7.4 with memcached.
- php: '7.4'
os: ubuntu-latest
memcached: true
# Report the results of the PHP 7.4 without memcached job.
- php: '7.4'
os: ubuntu-latest
memcached: false
report: true
env:
LOCAL_PHP: ${{ matrix.php }}-fpm
LOCAL_PHP_MEMCACHED: ${{ matrix.memcached }}
steps:
- name: Configure environment variables
run: |
echo "PHP_FPM_UID=$(id -u)" >> $GITHUB_ENV
echo "PHP_FPM_GID=$(id -g)" >> $GITHUB_ENV
- name: Download the built WordPress artifact
uses: actions/download-artifact@v2
with:
name: built-wp-${{ github.sha }}
- name: Unzip built artifact
run: unzip built-wp-${{ github.sha }}.zip
- name: Install NodeJS
uses: actions/setup-node@v1
with:
node-version: 12
- name: Use cached Node modules
uses: actions/cache@v2
env:
cache-name: cache-node-modules
with:
# npm cache files are stored in `~/.npm` on Linux/macOS
path: ~/.npm
key: ${{ runner.os }}-npm-${{ hashFiles('**/package-lock.json') }}
restore-keys: |
${{ runner.os }}-npm-
- name: Install Dependencies
run: npm ci
- name: Get composer cache directory
id: composer-cache
if: ${{ env.COMPOSER_INSTALL == true || env.LOCAL_PHP == '8.0-fpm' }}
run: echo "::set-output name=dir::$(composer config cache-files-dir)"
- name: Cache Composer dependencies
if: ${{ env.COMPOSER_INSTALL == true || env.LOCAL_PHP == '8.0-fpm' }}
uses: actions/cache@v2
env:
cache-name: cache-composer-dependencies
with:
path: ${{ steps.composer-cache.outputs.dir }}
key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }}
restore-keys: |
${{ runner.os }}-composer-
- name: Install Composer dependencies
if: ${{ env.COMPOSER_INSTALL == true || env.LOCAL_PHP == '8.0-fpm' }}
run: |
docker-compose run --rm php composer --version
# The PHPUnit 7.x phar is not compatible with PHP 8 and won't be updated,
# as PHPUnit 7 is no longer supported. The Composer-installed PHPUnit should be
# used for PHP 8 testing instead.
if [ ${{ env.LOCAL_PHP }} == '8.0-fpm' ]; then
docker-compose run --rm php composer install --ignore-platform-reqs
echo "PHPUNIT_SCRIPT=php-composer" >> $GITHUB_ENV
else
docker-compose run --rm php composer install
fi
- name: Docker debug information
run: |
docker -v
docker-compose -v
- name: Start Docker environment
run: |
npm run env:start
# The memcached server needs to start after the Docker network has been set up with `npm run env:start`.
- name: Start the Memcached server.
if: ${{ matrix.memcached }}
run: |
cp tests/phpunit/includes/object-cache.php build/wp-content/object-cache.php
docker run --name memcached --net $(basename "$PWD")_wpdevnet -d memcached
- name: General debug information
run: |
npm --version
node --version
curl --version
git --version
svn --version
- name: Log running Docker containers
run: docker ps -a
- name: WordPress Docker container debug information
run: |
docker -v
docker-compose -v
docker-compose run --rm mysql mysql --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
- name: Install WordPress
run: npm run env:install
- name: Run PHPUnit tests
run: npm run test:${{ env.PHPUNIT_SCRIPT }} -- --verbose -c phpunit.xml.dist
- name: Run AJAX tests
run: npm run test:${{ env.PHPUNIT_SCRIPT }} -- --verbose -c phpunit.xml.dist --group ajax
- name: Run tests as a multisite install
run: npm run test:${{ env.PHPUNIT_SCRIPT }} -- --verbose -c tests/phpunit/multisite.xml
- name: Run ms-files tests as a multisite install
run: npm run test:${{ env.PHPUNIT_SCRIPT }} -- --verbose -c tests/phpunit/multisite.xml --group ms-files
- name: Run external HTTP tests
run: npm run test:${{ env.PHPUNIT_SCRIPT }} -- --verbose -c phpunit.xml.dist --group external-http
- name: Run REST API tests
run: npm run test:${{ env.PHPUNIT_SCRIPT }} -- --verbose -c phpunit.xml.dist --group restapi-jsclient
# Xdebug supports PHP 8 only from version 3.0, which is not released yet.
# Once Xdebug 3.0 is released and included in the Docker image, the IF condition should be removed.
# __fakegroup__ is excluded to force PHPUnit to ignore the <exclude> settings in phpunit.xml.dist.
- name: Run (xDebug) tests
if: ${{ env.LOCAL_PHP != '8.0-fpm' }}
run: LOCAL_PHP_XDEBUG=true npm run test:php -- -v --group xdebug --exclude-group __fakegroup__
- name: WordPress Test Reporter
if: ${{ matrix.report }}
uses: actions/checkout@v2
with:
repository: 'WordPress/phpunit-test-runner'
path: 'test-runner'
# TODO: Configure hidden keys to successfully report test results.
# run: docker-compose run --rm -e WPT_REPORT_API_KEY -e WPT_PREPARE_DIR=/var/www -e WPT_TEST_DIR=/var/www php php test-runner/report.php