技術約4分で読めます

WordPress Coreが7.1に向けてPR時のPHPUnitテストをPHP3バージョンに絞った

いけさん目次

Make WordPress Coreは2026年7月30日、7.1へ向けたPHPUnit実行の削減を発表した。
PHPUnitはPHPやデータベースのバージョンを掛け合わせた組み合わせ(マトリクス)ごとにジョブを走らせる。全組み合わせを大量のPRやバックポートブランチで同時に走らせると、GitHub Actions側の容量を圧迫するためだ。

指標変化
1回の実行あたりのジョブ数約52%減
1回の実行あたりのジョブ分約54%減
成功状態にするため再実行が必要だった実行約68% → 約36%

GitHub Actions APIで変更前後の比較可能な実行を取り、ジョブ数、実行時間、再実行数を測ったとしている。

PRでテストするPHPを3バージョンに絞った

ブランチPRPR時にテストするPHP外した中間バージョンの検出方法
trunk#127197.48.08.5日曜cronの週次スケジュールで全バージョン
7.0#12720下限側と上限側(組み合わせ約168 → 約72)なし
6.8#127267.27.48.08.4(約198 → 約99ジョブ)記載なし

trunkでは、PR時に走るテストがPHPの下限側と上限側になり、外した中間バージョンの失敗は週1回の日曜cronで検出される。

flowchart TD
    PR[PRとプッシュ] --> BASE[基本の組み合わせだけ実行<br/>PHPは下限と上限]
    BASE --> MERGE[trunkへマージ]
    MERGE --> CRON[日曜cronで週1回<br/>全PHPバージョンを実行]
    CRON --> MID[中間バージョンの失敗は<br/>ここで検出]

trunk向けのPR #12719では、中間の 8.18.28.38.4 を基本の組み合わせから外した。
ただし、変更対象外の include ジョブでは、8.38.4 の一部がPR時にも残る。
7.0ブランチでは、スケジュールワークフローがデフォルトブランチからしか動かないため、trunkのような週次の全組み合わせ実行は設定されていない。

Make投稿は、PHPの対応範囲は維持し、重複するデータベース組み合わせを削ったと書いている。
一方で、#12719と#12720のPR本文は、少なくともその変更範囲をPHPバージョンのみと明記し、データベースバージョン、マルチサイト、memcached、include ジョブは変更していないとしている。

6.8ブランチはテストの組み合わせが多い

Make投稿の次の予定には、6.8ブランチのテスト組み合わせの削減が挙がっていた。
PR #12726側では、7.2 から 8.4 までの全PHPバージョンを3つのジョブグループで回していた構成を、表の4バージョンへ絞る内容になっている。

そもそもPHP 7系がテストに残るのは、WordPressの利用率基準による。
WordPressは、監視対象サイトでの利用率が約5%を下回ったPHPバージョンを廃止候補にしており、7.2と7.3は合計の利用率が4%を下回ったため、2026年1月に廃止が発表された。
WordPress 7.0で最低サポートはPHP 7.4になり、trunkのPR時テストの 7.4 始まりはこれと対応する。
推奨バージョンの8.3以上は、この最低サポートバージョンとは別に案内されている。

6.8は古いPHP下限を維持しているため、下限側と上限側として残すバージョンもtrunkや7.0とは違う。
複数ブランチを同時に回すセキュリティリリースやドライランでは、6.8のテスト組み合わせが多いぶん同時実行数も増える。

GutenbergとDockerイメージの取得では失敗の種類が違う

Gutenbergビルドも、ジョブごとの取得からワークフロー実行ごとに1回の取得へ変わった。
変更前は同じ成果物をジョブごとに取り直しており、ネットワーク依存で失敗する箇所もジョブの数だけあった。
発表では、これとDockerイメージ取得の上限付きリトライを合わせて、再実行が必要な割合が下がったとしている。

対策変更減らす失敗
Gutenbergビルドの取得ジョブごと → ワークフロー実行ごとに1回ジョブ数に比例するネットワーク依存の失敗
Dockerイメージの事前取得(#12703)env:start の前にComposeサービスを取得。最大3回、失敗後に10秒・20秒待ちで再試行Docker Hubやネットワークの一時的な失敗

Dockerイメージ取得のPR #12703は、再利用可能なPHPUnitワークフローで env:start の前に必要なComposeサービスを先に取得する変更だった。
対象は wordpress-developphpmysqlcli で、memcachedが有効な時だけ memcached も含める。

Dockerイメージ取得のリトライは、ジョブ数削減とは別の対策で、Docker Hubやネットワークの一時的な失敗を減らす。
PHPUnitのテストケース自体の実行時間は変わらない。
Make投稿も、今回の削減はジョブ数を削るもので、テストそのものはまだ調整できる、と書いている。

PRテストをさらに減らす案も出ていた

Make投稿のコメント欄では、PR上のテストをもっと減らし、trunkへマージした後にスケジュールテストで検出する案も出ていた。
この案ではCI使用量をさらに減らせるが、失敗検出がマージ後へずれる。

参考