CI / No Debug Code (pull_request) Successful in 26s
CI / Tests (PHP 8.1) (pull_request) Successful in 2m35s
CI / Tests (PHP 8.2) (pull_request) Successful in 2m35s
CI / Coding Standards & Static Analysis (pull_request) Successful in 4m1s
CI / Tests (PHP 8.3) (pull_request) Failing after 7m17s
CI / Build Plugin Zip (pull_request) Skipped
Run 536 proved the cache works -- ACTIONS_CACHE_URL is now populated, no GHES warning, "Cache saved with key: apt-php-builder-deps-ARM64-v1" -- and in doing so showed the key was wrong. The jobs that saved it were 8.1 and 8.2. They take the ondrej PPA path, a handful of runtime packages, while 8.3 takes php-builder and its ~70 -dev packages. One shared key therefore lets whichever job finishes first decide what every other job restores, and 8.1 is always first, at ~30s against 8.3's several minutes. 8.3 would have restored a few runtime .debs it has no use for and then downloaded all 70 anyway. My "the dep list is the same for every PHP version" comment was true only among the builder versions. Keyed per version now, so each path caches what it actually installs. That also picks up a small win on 8.1 and 8.2 rather than only avoiding harm. Both temporary steps are gone. Report restored .debs was there to show the cache URL arriving and the restore landing; both are established, so it goes. Keep downloaded .debs stays -- it is not instrumentation, it disables Ubuntu's docker-clean, without which there are no .debs left to cache. Refs #178. Co-Authored-By: Claude Opus 5 <[email protected]> Claude-Session: https://claude.ai/code/session_01Uw545F1vveNJKjzLxdi2ks
208 lines
7.7 KiB
YAML
208 lines
7.7 KiB
YAML
name: CI
|
|
|
|
on:
|
|
push:
|
|
branches:
|
|
- main
|
|
- develop
|
|
pull_request:
|
|
|
|
jobs:
|
|
# PHPCS and PHPStan share a job so the two of them draw once on Setup PHP
|
|
# rather than twice. That step is slow and intermittently fails on 8.3
|
|
# (see #178), so every job that can be folded into another is one less
|
|
# chance for a run to fall over. They run as separate steps, and PHPCS
|
|
# failing stops the job before PHPStan reports.
|
|
quality:
|
|
name: Coding Standards & Static Analysis
|
|
runs-on: ubuntu-latest
|
|
steps:
|
|
- uses: actions/checkout@v4
|
|
|
|
# setup-php installs PHP 8.3+ through php-builder, which apt-installs ~70
|
|
# -dev packages before unpacking the build (#178). Ubuntu's image deletes
|
|
# the .debs after install, so every job re-downloads them. Keeping them
|
|
# and restoring them from the cache server, which lives in the cluster,
|
|
# turns a WAN download into a local one.
|
|
#
|
|
# Keyed per PHP version because the install path differs by version and
|
|
# the package sets are not interchangeable: 8.3+ pulls the ~70 -dev
|
|
# packages through php-builder, while 8.1 and 8.2 come from the ondrej
|
|
# PPA as a handful of runtime packages. Sharing one key across both lets
|
|
# whichever job finishes first decide what the others restore, and 8.1 is
|
|
# always first.
|
|
#
|
|
# Only the .debs are cached, never /var/lib/apt/lists — a stale index is
|
|
# how you get 404s mid-install.
|
|
- name: Keep downloaded .debs
|
|
run: |
|
|
sudo rm -f /etc/apt/apt.conf.d/docker-clean
|
|
echo 'Binary::apt::APT::Keep-Downloaded-Packages "true";' \
|
|
| sudo tee /etc/apt/apt.conf.d/99keep-downloaded-packages >/dev/null
|
|
|
|
- name: Cache apt packages
|
|
uses: actions/cache@v4
|
|
with:
|
|
path: /var/cache/apt/archives/*.deb
|
|
key: apt-php8.3-${{ runner.arch }}-v1
|
|
|
|
- name: Setup PHP
|
|
uses: shivammathur/setup-php@v2
|
|
with:
|
|
php-version: '8.3'
|
|
tools: composer:v2
|
|
|
|
- name: Cache Composer packages
|
|
uses: actions/cache@v4
|
|
with:
|
|
path: ~/.composer/cache
|
|
key: composer-${{ hashFiles('composer.json') }}
|
|
|
|
- name: Install dependencies
|
|
run: composer install --prefer-dist --no-progress --no-interaction
|
|
|
|
- name: Run PHPCS
|
|
run: composer cs
|
|
|
|
- name: Run PHPStan
|
|
run: composer lint
|
|
|
|
test:
|
|
name: Tests (PHP ${{ matrix.php }})
|
|
runs-on: ubuntu-latest
|
|
strategy:
|
|
fail-fast: false
|
|
matrix:
|
|
php:
|
|
- '8.1'
|
|
- '8.2'
|
|
- '8.3'
|
|
steps:
|
|
- uses: actions/checkout@v4
|
|
|
|
# setup-php installs PHP 8.3+ through php-builder, which apt-installs ~70
|
|
# -dev packages before unpacking the build (#178). Ubuntu's image deletes
|
|
# the .debs after install, so every job re-downloads them. Keeping them
|
|
# and restoring them from the cache server, which lives in the cluster,
|
|
# turns a WAN download into a local one.
|
|
#
|
|
# Keyed per PHP version because the install path differs by version and
|
|
# the package sets are not interchangeable: 8.3+ pulls the ~70 -dev
|
|
# packages through php-builder, while 8.1 and 8.2 come from the ondrej
|
|
# PPA as a handful of runtime packages. Sharing one key across both lets
|
|
# whichever job finishes first decide what the others restore, and 8.1 is
|
|
# always first.
|
|
#
|
|
# Only the .debs are cached, never /var/lib/apt/lists — a stale index is
|
|
# how you get 404s mid-install.
|
|
- name: Keep downloaded .debs
|
|
run: |
|
|
sudo rm -f /etc/apt/apt.conf.d/docker-clean
|
|
echo 'Binary::apt::APT::Keep-Downloaded-Packages "true";' \
|
|
| sudo tee /etc/apt/apt.conf.d/99keep-downloaded-packages >/dev/null
|
|
|
|
- name: Cache apt packages
|
|
uses: actions/cache@v4
|
|
with:
|
|
path: /var/cache/apt/archives/*.deb
|
|
key: apt-php${{ matrix.php }}-${{ runner.arch }}-v1
|
|
|
|
- name: Setup PHP
|
|
uses: shivammathur/setup-php@v2
|
|
with:
|
|
php-version: ${{ matrix.php }}
|
|
extensions: mbstring, intl
|
|
coverage: none
|
|
tools: composer:v2
|
|
|
|
- name: Cache Composer packages
|
|
uses: actions/cache@v4
|
|
with:
|
|
path: ~/.composer/cache
|
|
key: ${{ matrix.php }}-composer-${{ hashFiles('composer.json') }}
|
|
|
|
- name: Install dependencies
|
|
run: composer install --prefer-dist --no-progress --no-interaction
|
|
|
|
- name: Run PHPUnit
|
|
run: composer test
|
|
|
|
no-debug:
|
|
name: No Debug Code
|
|
runs-on: ubuntu-latest
|
|
steps:
|
|
- uses: actions/checkout@v4
|
|
- name: Check for debug statements
|
|
run: |
|
|
# \b keeps method calls like DateTimeImmutable::add() from matching dd(.
|
|
if grep -rn --include="*.php" -E "\b(var_dump|var_export|print_r|error_log|dd|dump)\s*\(" src/; then
|
|
echo "Debug code found in src/ — please remove before merging."
|
|
exit 1
|
|
fi
|
|
|
|
build:
|
|
name: Build Plugin Zip
|
|
runs-on: ubuntu-latest
|
|
# Only build a shippable artifact once changes land on main, and only
|
|
# after the quality gates pass.
|
|
needs: [quality, test, no-debug]
|
|
if: github.event_name == 'push' && github.ref == 'refs/heads/main'
|
|
steps:
|
|
- uses: actions/checkout@v4
|
|
|
|
# setup-php installs PHP 8.3+ through php-builder, which apt-installs ~70
|
|
# -dev packages before unpacking the build (#178). Ubuntu's image deletes
|
|
# the .debs after install, so every job re-downloads them. Keeping them
|
|
# and restoring them from the cache server, which lives in the cluster,
|
|
# turns a WAN download into a local one.
|
|
#
|
|
# Keyed per PHP version because the install path differs by version and
|
|
# the package sets are not interchangeable: 8.3+ pulls the ~70 -dev
|
|
# packages through php-builder, while 8.1 and 8.2 come from the ondrej
|
|
# PPA as a handful of runtime packages. Sharing one key across both lets
|
|
# whichever job finishes first decide what the others restore, and 8.1 is
|
|
# always first.
|
|
#
|
|
# Only the .debs are cached, never /var/lib/apt/lists — a stale index is
|
|
# how you get 404s mid-install.
|
|
- name: Keep downloaded .debs
|
|
run: |
|
|
sudo rm -f /etc/apt/apt.conf.d/docker-clean
|
|
echo 'Binary::apt::APT::Keep-Downloaded-Packages "true";' \
|
|
| sudo tee /etc/apt/apt.conf.d/99keep-downloaded-packages >/dev/null
|
|
|
|
- name: Cache apt packages
|
|
uses: actions/cache@v4
|
|
with:
|
|
path: /var/cache/apt/archives/*.deb
|
|
key: apt-php8.3-${{ runner.arch }}-v1
|
|
|
|
- name: Setup PHP
|
|
uses: shivammathur/setup-php@v2
|
|
with:
|
|
php-version: '8.3'
|
|
tools: composer:v2
|
|
|
|
- name: Build plugin zip
|
|
run: composer build
|
|
|
|
- name: Read plugin version
|
|
id: meta
|
|
run: |
|
|
version="$(sed -nE 's/^[[:space:]]*\*?[[:space:]]*Version:[[:space:]]*([^[:space:]]+).*/\1/p' unsupervised-schedular.php | head -1)"
|
|
echo "version=${version}" >> "$GITHUB_OUTPUT"
|
|
|
|
# Gitea/Actions re-zips artifacts on download. Upload the unpacked plugin
|
|
# folder (not the built zip) so the downloaded archive's top level is
|
|
# unsupervised-schedular/ and installs directly in WordPress. Uploading
|
|
# the zip instead double-wraps it ("No valid plugins were found").
|
|
- name: Unpack plugin for artifact
|
|
run: unzip -q "dist/unsupervised-schedular-${{ steps.meta.outputs.version }}.zip" -d artifact
|
|
|
|
- name: Upload artifact
|
|
uses: actions/upload-artifact@v3
|
|
with:
|
|
name: unsupervised-schedular-${{ steps.meta.outputs.version }}
|
|
path: artifact/
|
|
if-no-files-found: error
|