3535 COMPOSER_VERSION : " 2.9.2"
3636 COMPOSER_PHAR_SHA256 : " 471f2d857abf0ec18af7b055e61472214d91adb24f9bdbbb864c1c64faad7dd6"
3737 # setup-php installs an 8.6 nightly, which has no matching Windows devel pack.
38- PHP86_WINDOWS_VERSION : " 8.6.0beta3 "
38+ PHP86_WINDOWS_VERSION : " 8.6.0RC2 "
3939
4040jobs :
4141 compiler-tests :
@@ -397,9 +397,9 @@ jobs:
397397 # of ORIGIN_RUN_ID repeated in both). The tests of every binary, reused
398398 # or compiled, run in the turbo-differential jobs, so the commit job,
399399 # which needs the binaries, does not wait for them.
400- runs-on : ${{ fromJSON(needs.turbo-origins.outputs.origins || '{}')[format('{0}-{1}-php{2}', matrix.target.artifact, matrix.target.name, matrix.php-version)] && 'ubuntu-latest' || ( matrix.php-version == '8.6' && matrix. target.family == 'gnu' && (matrix.target.name == 'linux-gnu-arm64' && 'ubuntu-22.04-arm' || 'ubuntu-22.04') || matrix.target. runs-on) }}
400+ runs-on : ${{ fromJSON(needs.turbo-origins.outputs.origins || '{}')[format('{0}-{1}-php{2}', matrix.target.artifact, matrix.target.name, matrix.php-version)] && 'ubuntu-latest' || matrix.target.runs-on }}
401401 # Container legs pin the built binaries' userland floor independently of
402- # the runner image. The 8.3–8.5 gnu legs run in a prebuilt ubuntu:22.04-based
402+ # the runner image. The gnu legs run in a prebuilt ubuntu:22.04-based
403403 # image (.github/turbo-build/Dockerfile, published to GHCR by
404404 # turbo-build-image.yml) with the PHP toolchain baked in: the glibc
405405 # symbol floor stays at 2.34 (RHEL 9, Ubuntu 22.04+, Debian 12+) and the
@@ -418,10 +418,9 @@ jobs:
418418 # not worth two binaries per PHP minor. Their binaries are deleted from
419419 # phpstan/phpstan by the commit job (TURBO_RETIRED_BINARIES). Windows
420420 # keeps its ZTS leg: XAMPP, WampServer and Scoop default to TS PHP.
421- # PHP 8.6 has no ondrej/php packages or prebuilt GNU image yet. Use
422- # setup-php on Jammy runners, preserving the shipped binary's glibc floor.
423- # Alpine's php86 packages are currently only in edge/testing.
424- container : ${{ !(fromJSON(needs.turbo-origins.outputs.origins || '{}')[format('{0}-{1}-php{2}', matrix.target.artifact, matrix.target.name, matrix.php-version)]) && (matrix.target.family == 'gnu' && matrix.php-version != '8.6' && format('ghcr.io/phpstan/turbo-build:gnu-php{0}', matrix.php-version) || matrix.target.family == 'musl' && matrix.php-version == '8.6' && 'alpine:edge' || matrix.target.container) || '' }}
421+ # The gnu-php8.6 image builds the official 8.6 prerelease tarball (see the
422+ # Dockerfile). Alpine's php86 packages are currently only in edge/testing.
423+ container : ${{ !(fromJSON(needs.turbo-origins.outputs.origins || '{}')[format('{0}-{1}-php{2}', matrix.target.artifact, matrix.target.name, matrix.php-version)]) && (matrix.target.family == 'gnu' && format('ghcr.io/phpstan/turbo-build:gnu-php{0}', matrix.php-version) || matrix.target.family == 'musl' && matrix.php-version == '8.6' && 'alpine:edge' || matrix.target.container) || '' }}
425424 needs : turbo-origins
426425 timeout-minutes : 30
427426
@@ -485,7 +484,7 @@ jobs:
485484 # The Alpine leg installs PHP and tooling before checkout:
486485 # actions/checkout needs git inside the container, and the build needs
487486 # php/php-config symlinks pointing at the matrix PHP version. The GNU
488- # container legs have the toolchain baked in; 8.6 uses setup-php below .
487+ # container legs have the toolchain baked in.
489488 - name : " Install PHP and build tools (Alpine container)"
490489 if : env.ORIGIN_RUN_ID == '' && matrix.target.family == 'musl'
491490 run : |
@@ -526,13 +525,6 @@ jobs:
526525 coverage : " none"
527526 php-version : " ${{ matrix.php-version }}"
528527
529- - name : " Install PHP (GNU runners)"
530- if : env.ORIGIN_RUN_ID == '' && matrix.target.family == 'gnu' && matrix.php-version == '8.6'
531- uses : " shivammathur/setup-php@f3e473d116dcccaddc5834248c87452386958240" # v2.37.2
532- with :
533- coverage : " none"
534- php-version : " ${{ matrix.php-version }}"
535-
536528 # The training run of `make pgo` (bin/pgo-train.sh) runs bin/phpstan on
537529 # the checkout, so the dependencies must be in place before the build.
538530 - uses : " ramsey/composer-install@65e4f84970763564f46a70b8a54b90d033b3bdda" # v4.0.0
@@ -544,15 +536,11 @@ jobs:
544536 if : env.ORIGIN_RUN_ID == '' && matrix.target.family != 'macos'
545537 # checksum-pinned composer, run under the matrix PHP so platform
546538 # requirements are validated against the interpreter the build
547- # trains on. COMPOSER_HOME is isolated: on the runner (PHP 8.6) legs,
548- # setup-php seeds ~/.composer/auth.json with the workflow's GitHub
549- # token, which this pinned composer rejects at startup ("github oauth
550- # token contains invalid characters") — everything here comes from
551- # packagist dists, no auth needed.
539+ # trains on
552540 run : |
553541 curl -fsSLo composer.phar "https://getcomposer.org/download/$COMPOSER_VERSION/composer.phar"
554542 echo "$COMPOSER_PHAR_SHA256 composer.phar" | sha256sum -c -
555- COMPOSER_HOME="$(mktemp -d)" php composer.phar install --no-interaction --no-progress
543+ php composer.phar install --no-interaction --no-progress
556544 rm composer.phar
557545
558546 - name : " Compile phpstan_turbo with strict warnings (profile-guided)"
@@ -1142,11 +1130,15 @@ jobs:
11421130 # reused, under the runtime setup-php installs on the platform the
11431131 # binary is built for. Kept out of the compile jobs so the commit job,
11441132 # which only needs the binaries, does not wait for them (see there).
1145- # The musl binaries are tested in turbo-differential-musl.
1133+ # The musl binaries are tested in turbo-differential-musl. The linux-gnu
1134+ # 8.6 legs run in the image the binary is compiled in instead: setup-php's
1135+ # Linux 8.6 is a nightly snapshot that can predate the release the binary
1136+ # targets, and a module API mismatch refuses to load it at all.
11461137 needs :
11471138 - turbo-compile
11481139 - turbo-compile-windows
11491140 runs-on : ${{ matrix.runs-on }}
1141+ container : ${{ matrix.container || '' }}
11501142 timeout-minutes : 30
11511143
11521144 defaults :
@@ -1180,9 +1172,16 @@ jobs:
11801172 # see turbo-run for why windows-latest loads the DLL
11811173 - target : " windows-x86_64"
11821174 runs-on : " windows-latest"
1175+ - target : " linux-gnu-x86_64"
1176+ php-version : " 8.6"
1177+ container : " ghcr.io/phpstan/turbo-build:gnu-php8.6"
1178+ - target : " linux-gnu-arm64"
1179+ php-version : " 8.6"
1180+ container : " ghcr.io/phpstan/turbo-build:gnu-php8.6"
11831181
11841182 steps :
11851183 - name : Harden the runner (Audit all outbound calls)
1184+ if : ${{ !matrix.container }}
11861185 uses : step-security/harden-runner@bf7454d06d71f1098171f2acdf0cd4708d7b5920 # v2.20.0
11871186 with :
11881187 egress-policy : audit
@@ -1193,6 +1192,7 @@ jobs:
11931192 persist-credentials : false
11941193
11951194 - name : " Install PHP"
1195+ if : ${{ !matrix.container }}
11961196 uses : " shivammathur/setup-php@f3e473d116dcccaddc5834248c87452386958240" # v2.37.2
11971197 env :
11981198 phpts : " ${{ matrix.ts == 'zts' && 'ts' || 'nts' }}"
@@ -1207,9 +1207,18 @@ jobs:
12071207 run : bash .github/scripts/install-php86-windows.sh
12081208
12091209 - uses : " ramsey/composer-install@65e4f84970763564f46a70b8a54b90d033b3bdda" # v4.0.0
1210+ if : ${{ !matrix.container }}
12101211 with :
12111212 ignore-cache : true
12121213
1214+ - name : " Install Composer dependencies (pinned composer)"
1215+ if : ${{ matrix.container }}
1216+ run : |
1217+ curl -fsSLo composer.phar "https://getcomposer.org/download/$COMPOSER_VERSION/composer.phar"
1218+ echo "$COMPOSER_PHAR_SHA256 composer.phar" | sha256sum -c -
1219+ php composer.phar install --no-interaction --no-progress
1220+ rm composer.phar
1221+
12131222 - name : " Download extension artifact"
12141223 uses : actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
12151224 with :
@@ -1407,6 +1416,13 @@ jobs:
14071416 exclude :
14081417 - operating-system : " ubuntu-latest"
14091418 ts : " zts"
1419+ # setup-php's Linux 8.6 is a nightly snapshot that can predate the
1420+ # release the binary is compiled against (on 2026-09-25 it still
1421+ # had the module API 8.6.0RC2 replaced), and a module API mismatch
1422+ # refuses to load the extension at all. turbo-docker-run runs the
1423+ # same checks with this binary in the official 8.6 prerelease image.
1424+ - operating-system : " ubuntu-latest"
1425+ php-version : " 8.6"
14101426 # macOS runs the shipped ad-hoc-signed arm64 binary; there is no
14111427 # macOS zts build, and 8.3/8.4 coverage comes from the other legs.
14121428 include :
0 commit comments