name: CI — Lint & Test # Runs on every PR and every push to main. # Three jobs in parallel: # 1. PHP Lint — syntax check across supported PHP versions # 2. PHPCS — WordPress coding standards (non-blocking during theme rollout) # 3. PHPUnit — runs the theme's test suite against the WordPress test framework on: push: branches: [main] pull_request: branches: [main] permissions: contents: read jobs: php-lint: name: PHP Lint (${{ matrix.php }}) runs-on: ubuntu-latest strategy: fail-fast: false matrix: php: ['7.4', '8.1', '8.3'] steps: - uses: actions/checkout@v4 - name: Setup PHP ${{ matrix.php }} uses: shivammathur/setup-php@v2 with: php-version: ${{ matrix.php }} coverage: none - name: Syntax check all PHP files run: | set -e find . -name '*.php' \ -not -path './vendor/*' \ -not -path './node_modules/*' \ -not -path './.git/*' \ -print0 | xargs -0 -n1 -P4 php -l > /dev/null phpcs: name: PHPCS (WordPress standards) runs-on: ubuntu-latest continue-on-error: true steps: - uses: actions/checkout@v4 - name: Setup PHP uses: shivammathur/setup-php@v2 with: php-version: '8.1' coverage: none tools: composer:v2 - name: Install dependencies run: composer install --no-progress --no-interaction --prefer-dist - name: Run PHPCS run: vendor/bin/phpcs --standard=.phpcs.xml.dist phpunit: name: PHPUnit (PHP ${{ matrix.php }}, WP ${{ matrix.wp }}) runs-on: ubuntu-latest strategy: fail-fast: false matrix: php: ['8.1'] wp: ['latest'] services: mysql: image: mysql:8.0 env: MYSQL_ROOT_PASSWORD: root MYSQL_DATABASE: wp_tests ports: - 3306:3306 options: --health-cmd="mysqladmin ping" --health-interval=10s --health-timeout=5s --health-retries=5 steps: - uses: actions/checkout@v4 - name: Install subversion # ubuntu-latest no longer ships svn preinstalled. The WP test suite # bootstrap script checks out develop.svn.wordpress.org via svn. run: sudo apt-get update -qq && sudo apt-get install -y --no-install-recommends subversion - name: Setup PHP ${{ matrix.php }} uses: shivammathur/setup-php@v2 with: php-version: ${{ matrix.php }} coverage: none tools: composer:v2 extensions: mysqli - name: Install composer dependencies run: composer install --no-progress --no-interaction --prefer-dist - name: Wait for MySQL run: | for i in {1..30}; do if mysqladmin ping -h 127.0.0.1 -P 3306 -u root -proot --silent; then echo "MySQL is up"; break fi echo "Waiting for MySQL..."; sleep 2 done - name: Install WordPress test suite env: WP_TESTS_DIR: /tmp/wordpress-tests-lib WP_CORE_DIR: /tmp/wordpress run: | chmod +x bin/install-wp-tests.sh bin/install-wp-tests.sh wp_tests root root 127.0.0.1:3306 ${{ matrix.wp }} - name: Run PHPUnit env: WP_TESTS_DIR: /tmp/wordpress-tests-lib run: vendor/bin/phpunit --colors=always