Nightly #48
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
name: Nightly | |
on: | |
schedule: | |
- cron: "0 1 * * *" | |
workflow_dispatch: ~ | |
permissions: | |
contents: read | |
jobs: | |
GENERATE_MATRIX: | |
name: Generate Matrix | |
if: github.repository == 'php/php-src' || github.event_name == 'workflow_dispatch' | |
runs-on: ubuntu-latest | |
outputs: | |
branches: ${{ steps.set-matrix.outputs.branches }} | |
matrix-include: ${{ steps.set-matrix.outputs.matrix-include }} | |
windows-matrix-include: ${{ steps.set-matrix.outputs.windows-matrix-include }} | |
macos-matrix-include: ${{ steps.set-matrix.outputs.macos-matrix-include }} | |
alpine-matrix-include: ${{ steps.set-matrix.outputs.alpine-matrix-include }} | |
steps: | |
- uses: actions/checkout@v4 | |
with: | |
# Set fetch-depth to 0 to clone the full repository | |
# including all branches. This is required to find | |
# the correct commit hashes. | |
fetch-depth: 0 | |
- name: Grab the commit mapping | |
uses: actions/cache@v4 | |
with: | |
path: branch-commit-cache.json | |
# The cache key needs to change every time for the | |
# cache to be updated after this job finishes. | |
key: nightly-${{ github.run_id }}-${{ github.run_attempt }} | |
restore-keys: | | |
nightly- | |
- name: Generate Matrix | |
id: set-matrix | |
run: php .github/nightly_matrix.php "${{ github.event_name }}" "${{ github.run_attempt }}" "${{ github.head_ref || github.ref_name }}" | |
- name: Notify Slack | |
if: failure() | |
uses: ./.github/actions/notify-slack | |
with: | |
token: ${{ secrets.ACTION_MONITORING_SLACK }} | |
ALPINE: | |
needs: GENERATE_MATRIX | |
if: ${{ needs.GENERATE_MATRIX.outputs.branches != '[]' }} | |
strategy: | |
fail-fast: false | |
matrix: | |
include: ${{ fromJson(needs.GENERATE_MATRIX.outputs.alpine-matrix-include) }} | |
name: "${{ matrix.branch.name }}_ALPINE_X64${{ matrix.name }}_${{ matrix.debug && 'DEBUG' || 'RELEASE' }}_${{ matrix.zts && 'ZTS' || 'NTS' }}" | |
runs-on: ubuntu-22.04 | |
container: | |
image: 'alpine:3.20.1' | |
steps: | |
- name: git checkout | |
uses: actions/checkout@v4 | |
with: | |
ref: ${{ matrix.branch.ref }} | |
- name: apk | |
uses: ./.github/actions/apk | |
- name: LLVM 17 (ASAN-only) | |
if: ${{ matrix.asan }} | |
# libclang_rt.asan-x86_64.a is provided by compiler-rt, and only for clang17: | |
# https://pkgs.alpinelinux.org/contents?file=libclang_rt.asan-x86_64.a&path=&name=&branch=v3.20 | |
run: | | |
apk add clang17 compiler-rt | |
- name: System info | |
run: | | |
echo "::group::Show host CPU info" | |
lscpu | |
echo "::endgroup::" | |
echo "::group::Show installed package versions" | |
apk list | |
echo "::endgroup::" | |
- name: ./configure | |
uses: ./.github/actions/configure-alpine | |
with: | |
configurationParameters: >- | |
${{ matrix.configuration_parameters }} | |
--${{ matrix.debug && 'enable' || 'disable' }}-debug | |
--${{ matrix.zts && 'enable' || 'disable' }}-zts | |
skipSlow: ${{ matrix.asan }} | |
- name: make | |
run: make -j$(/usr/bin/nproc) >/dev/null | |
- name: make install | |
uses: ./.github/actions/install-alpine | |
- name: Test Tracing JIT | |
if: matrix.test_jit | |
uses: ./.github/actions/test-alpine | |
with: | |
jitType: tracing | |
runTestsParameters: >- | |
${{ matrix.run_tests_parameters }} | |
-d zend_extension=opcache.so | |
-d opcache.enable_cli=1 | |
- name: Notify Slack | |
if: failure() | |
uses: ./.github/actions/notify-slack | |
with: | |
token: ${{ secrets.ACTION_MONITORING_SLACK }} | |
LINUX_X64: | |
needs: GENERATE_MATRIX | |
if: ${{ needs.GENERATE_MATRIX.outputs.branches != '[]' }} | |
services: | |
mysql: | |
image: mysql:8.3 | |
ports: | |
- 3306:3306 | |
env: | |
MYSQL_DATABASE: test | |
MYSQL_ROOT_PASSWORD: root | |
postgres: | |
image: postgres | |
env: | |
POSTGRES_USER: postgres | |
POSTGRES_PASSWORD: postgres | |
POSTGRES_DB: test | |
firebird: | |
image: jacobalberty/firebird | |
ports: | |
- 3050:3050 | |
env: | |
ISC_PASSWORD: test | |
FIREBIRD_DATABASE: test.fdb | |
FIREBIRD_USER: test | |
FIREBIRD_PASSWORD: test | |
strategy: | |
fail-fast: false | |
matrix: | |
branch: ${{ fromJson(needs.GENERATE_MATRIX.outputs.branches) }} | |
configuration_parameters: [''] | |
debug: [true, false] | |
name: [''] | |
run_tests_parameters: [''] | |
test_function_jit: [true] | |
zts: [true, false] | |
include: ${{ fromJson(needs.GENERATE_MATRIX.outputs.matrix-include) }} | |
name: "${{ matrix.branch.name }}_LINUX_X64${{ matrix.name }}_${{ matrix.debug && 'DEBUG' || 'RELEASE' }}_${{ matrix.zts && 'ZTS' || 'NTS' }}" | |
runs-on: ubuntu-${{ (matrix.branch.version.minor >= 3 && !matrix.asan) && '22.04' || '20.04' }} | |
steps: | |
- name: git checkout | |
uses: actions/checkout@v4 | |
with: | |
ref: ${{ matrix.branch.ref }} | |
- name: Create MSSQL container | |
uses: ./.github/actions/setup-mssql | |
- name: apt | |
uses: ./.github/actions/apt-x64 | |
with: | |
asan: ${{ matrix.asan && 'true' || 'false' }} | |
- name: System info | |
run: | | |
echo "::group::Show host CPU info" | |
lscpu | |
echo "::endgroup::" | |
echo "::group::Show installed package versions" | |
dpkg -l | |
echo "::endgroup::" | |
- name: ./configure | |
uses: ./.github/actions/configure-x64 | |
with: | |
configurationParameters: >- | |
${{ matrix.configuration_parameters }} | |
--${{ matrix.debug && 'enable' || 'disable' }}-debug | |
--${{ matrix.zts && 'enable' || 'disable' }}-zts | |
asan: ${{ matrix.asan && 'true' || 'false' }} | |
- name: make | |
run: make -j$(/usr/bin/nproc) >/dev/null | |
- name: make install | |
uses: ./.github/actions/install-linux | |
- name: Setup | |
uses: ./.github/actions/setup-x64 | |
- name: Test | |
uses: ./.github/actions/test-linux | |
with: | |
runTestsParameters: >- | |
${{ matrix.run_tests_parameters }} | |
idleCpu: ${{ matrix.asan && 'true' || 'false' }} | |
- name: Test Tracing JIT | |
uses: ./.github/actions/test-linux | |
with: | |
jitType: tracing | |
runTestsParameters: >- | |
${{ matrix.run_tests_parameters }} | |
-d zend_extension=opcache.so | |
-d opcache.enable_cli=1 | |
- name: Test OpCache | |
uses: ./.github/actions/test-linux | |
with: | |
runTestsParameters: >- | |
${{ matrix.run_tests_parameters }} | |
-d zend_extension=opcache.so | |
-d opcache.enable_cli=1 | |
- name: Test Function JIT | |
# ASAN frequently timeouts. Each test run takes ~90 minutes, we can | |
# avoid running into the 6 hour timeout by skipping the function JIT. | |
if: matrix.test_function_jit | |
uses: ./.github/actions/test-linux | |
with: | |
jitType: function | |
runTestsParameters: >- | |
${{ matrix.run_tests_parameters }} | |
-d zend_extension=opcache.so | |
-d opcache.enable_cli=1 | |
- name: Verify generated files are up to date | |
uses: ./.github/actions/verify-generated-files | |
- name: Notify Slack | |
if: failure() | |
uses: ./.github/actions/notify-slack | |
with: | |
token: ${{ secrets.ACTION_MONITORING_SLACK }} | |
LINUX_X32: | |
needs: GENERATE_MATRIX | |
if: ${{ needs.GENERATE_MATRIX.outputs.branches != '[]' }} | |
strategy: | |
fail-fast: false | |
matrix: | |
branch: ${{ fromJson(needs.GENERATE_MATRIX.outputs.branches) }} | |
debug: [true, false] | |
zts: [true, false] | |
name: "${{ matrix.branch.name }}_LINUX_X32_${{ matrix.debug && 'DEBUG' || 'RELEASE' }}_${{ matrix.zts && 'ZTS' || 'NTS' }}" | |
runs-on: ubuntu-latest | |
container: | |
image: ubuntu:${{ matrix.branch.version.minor >= 3 && '22.04' || '20.04' }} | |
services: | |
mysql: | |
image: mysql:8.3 | |
ports: | |
- 3306:3306 | |
env: | |
MYSQL_DATABASE: test | |
MYSQL_ROOT_PASSWORD: root | |
steps: | |
- name: git checkout | |
uses: actions/checkout@v4 | |
with: | |
ref: ${{ matrix.branch.ref }} | |
- name: apt | |
uses: ./.github/actions/apt-x32 | |
- name: System info | |
run: | | |
echo "::group::Show host CPU info" | |
lscpu | |
echo "::endgroup::" | |
echo "::group::Show installed package versions" | |
dpkg -l | |
echo "::endgroup::" | |
- name: ./configure | |
uses: ./.github/actions/configure-x32 | |
with: | |
configurationParameters: >- | |
--${{ matrix.debug && 'enable' || 'disable' }}-debug | |
--${{ matrix.zts && 'enable' || 'disable' }}-zts | |
- name: make | |
run: make -j$(/usr/bin/nproc) >/dev/null | |
- name: make install | |
uses: ./.github/actions/install-linux-x32 | |
- name: Test | |
uses: ./.github/actions/test-linux | |
with: | |
runTestsParameters: >- | |
${{ matrix.run_tests_parameters }} | |
- name: Test Tracing JIT | |
uses: ./.github/actions/test-linux | |
with: | |
jitType: tracing | |
runTestsParameters: >- | |
${{ matrix.run_tests_parameters }} | |
-d zend_extension=opcache.so | |
-d opcache.enable_cli=1 | |
- name: Test OpCache | |
uses: ./.github/actions/test-linux | |
with: | |
runTestsParameters: >- | |
${{ matrix.run_tests_parameters }} | |
-d zend_extension=opcache.so | |
-d opcache.enable_cli=1 | |
- name: Test Function JIT | |
uses: ./.github/actions/test-linux | |
with: | |
jitType: function | |
runTestsParameters: >- | |
${{ matrix.run_tests_parameters }} | |
-d zend_extension=opcache.so | |
-d opcache.enable_cli=1 | |
- name: Notify Slack | |
if: failure() | |
uses: ./.github/actions/notify-slack | |
with: | |
token: ${{ secrets.ACTION_MONITORING_SLACK }} | |
MACOS: | |
needs: GENERATE_MATRIX | |
if: ${{ needs.GENERATE_MATRIX.outputs.branches != '[]' }} | |
strategy: | |
fail-fast: false | |
matrix: | |
include: ${{ fromJson(needs.GENERATE_MATRIX.outputs.macos-matrix-include) }} | |
name: "${{ matrix.branch.name }}_MACOS_${{ matrix.arch }}_${{ matrix.debug && 'DEBUG' || 'RELEASE' }}_${{ matrix.zts && 'ZTS' || 'NTS' }}" | |
runs-on: macos-${{ matrix.os }} | |
steps: | |
- name: git checkout | |
uses: actions/checkout@v4 | |
with: | |
ref: ${{ matrix.branch.ref }} | |
- name: brew | |
uses: ./.github/actions/brew | |
- name: ./configure | |
uses: ./.github/actions/configure-macos | |
with: | |
configurationParameters: >- | |
--${{ matrix.debug && 'enable' || 'disable' }}-debug | |
--${{ matrix.zts && 'enable' || 'disable' }}-zts | |
- name: make | |
run: |- | |
export PATH="$(brew --prefix)/opt/bison/bin:$PATH" | |
make -j$(sysctl -n hw.logicalcpu) >/dev/null | |
- name: make install | |
run: sudo make install | |
- name: Test | |
uses: ./.github/actions/test-macos | |
- name: Test Tracing JIT | |
if: matrix.test_jit | |
uses: ./.github/actions/test-macos | |
with: | |
jitType: tracing | |
runTestsParameters: >- | |
-d zend_extension=opcache.so | |
-d opcache.enable_cli=1 | |
- name: Test OpCache | |
uses: ./.github/actions/test-macos | |
with: | |
runTestsParameters: >- | |
-d zend_extension=opcache.so | |
-d opcache.enable_cli=1 | |
- name: Test Function JIT | |
if: matrix.test_jit | |
uses: ./.github/actions/test-macos | |
with: | |
jitType: function | |
runTestsParameters: >- | |
-d zend_extension=opcache.so | |
-d opcache.enable_cli=1 | |
- name: Verify generated files are up to date | |
uses: ./.github/actions/verify-generated-files | |
- name: Notify Slack | |
if: failure() | |
uses: ./.github/actions/notify-slack | |
with: | |
token: ${{ secrets.ACTION_MONITORING_SLACK }} | |
COVERAGE_DEBUG_NTS: | |
if: github.repository == 'php/php-src' || github.event_name == 'workflow_dispatch' | |
services: | |
mysql: | |
image: mysql:8.3 | |
ports: | |
- 3306:3306 | |
env: | |
MYSQL_DATABASE: test | |
MYSQL_ROOT_PASSWORD: root | |
postgres: | |
image: postgres | |
env: | |
POSTGRES_USER: postgres | |
POSTGRES_PASSWORD: postgres | |
POSTGRES_DB: test | |
firebird: | |
image: jacobalberty/firebird | |
ports: | |
- 3050:3050 | |
env: | |
ISC_PASSWORD: test | |
FIREBIRD_DATABASE: test.fdb | |
FIREBIRD_USER: test | |
FIREBIRD_PASSWORD: test | |
runs-on: ubuntu-22.04 | |
steps: | |
- name: git checkout | |
uses: actions/checkout@v4 | |
- name: Create MSSQL container | |
uses: ./.github/actions/setup-mssql | |
- name: apt | |
uses: ./.github/actions/apt-x64 | |
- name: Install gcovr | |
run: sudo -H pip install gcovr | |
- name: ./configure | |
uses: ./.github/actions/configure-x64 | |
with: | |
configurationParameters: --enable-debug --disable-zts --enable-gcov | |
- name: make | |
run: make -j$(/usr/bin/nproc) >/dev/null | |
- name: make install | |
uses: ./.github/actions/install-linux | |
- name: Setup | |
uses: ./.github/actions/setup-x64 | |
# We only test with OpCache, the difference in coverage is negligible | |
- name: Test OpCache | |
uses: ./.github/actions/test-linux | |
with: | |
jitType: tracing | |
runTestsParameters: >- | |
-d zend_extension=opcache.so | |
-d opcache.enable_cli=1 | |
- uses: codecov/codecov-action@v4 | |
if: always() | |
with: | |
fail_ci_if_error: true | |
token: ${{ secrets.CODECOV_TOKEN }} | |
verbose: true | |
- name: Notify Slack | |
if: failure() | |
uses: ./.github/actions/notify-slack | |
with: | |
token: ${{ secrets.ACTION_MONITORING_SLACK }} | |
COMMUNITY: | |
needs: GENERATE_MATRIX | |
if: ${{ needs.GENERATE_MATRIX.outputs.branches != '[]' }} | |
strategy: | |
fail-fast: false | |
matrix: | |
branch: ${{ fromJson(needs.GENERATE_MATRIX.outputs.branches) }} | |
type: ['asan', 'verify_type_inference'] | |
# These branches don't include type verification | |
exclude: | |
- { branch: { name: 'PHP-8.1', ref: 'PHP-8.1', major: 8, minor: 1 }, type: 'verify_type_inference' } | |
- { branch: { name: 'PHP-8.2', ref: 'PHP-8.2', major: 8, minor: 2 }, type: 'verify_type_inference' } | |
- { branch: { name: 'PHP-8.3', ref: 'PHP-8.3', major: 8, minor: 3 }, type: 'verify_type_inference' } | |
name: "${{ matrix.branch.name }}_COMMUNITY_${{ matrix.type }}" | |
runs-on: ubuntu-${{ matrix.branch.version.minor >= 3 && '22.04' || '20.04' }} | |
env: | |
ASAN_OPTIONS: exitcode=139 | |
UBSAN_OPTIONS: print_stacktrace=1 | |
USE_ZEND_ALLOC: 0 | |
USE_TRACKED_ALLOC: 1 | |
steps: | |
- name: git checkout | |
uses: actions/checkout@v4 | |
with: | |
ref: ${{ matrix.branch.ref }} | |
- name: apt | |
uses: ./.github/actions/apt-x64 | |
- name: ./configure | |
uses: ./.github/actions/configure-x64 | |
with: | |
# CFLAGS removes O2, so we have to add it again... | |
configurationParameters: >- | |
--enable-zts | |
${{ matrix.type == 'asan' && '--enable-debug CFLAGS="-fsanitize=undefined,address -fno-sanitize-recover -DZEND_TRACK_ARENA_ALLOC" LDFLAGS="-fsanitize=undefined,address"' || '' }} | |
${{ matrix.type == 'verify_type_inference' && 'CFLAGS="-DZEND_VERIFY_TYPE_INFERENCE -O2"' || '' }} | |
- name: make | |
run: make -j$(/usr/bin/nproc) >/dev/null | |
- name: make install | |
uses: ./.github/actions/install-linux | |
- name: Setup | |
run: | | |
sudo service mysql start | |
mysql -uroot -proot -e "CREATE DATABASE IF NOT EXISTS test" | |
mysql -uroot -proot -e "SET GLOBAL local_infile = true" | |
- name: Enable Opcache | |
run: | | |
echo memory_limit=-1 >> /etc/php.d/opcache.ini | |
echo zend_extension=opcache.so > /etc/php.d/opcache.ini | |
echo opcache.enable_cli=1 >> /etc/php.d/opcache.ini | |
echo opcache.enable=1 >> /etc/php.d/opcache.ini | |
echo opcache.protect_memory=1 >> /etc/php.d/opcache.ini | |
echo opcache.memory_consumption=256M >> /etc/php.d/opcache.ini | |
echo opcache.file_update_protection=0 >> /etc/php.d/opcache.ini | |
echo opcache.interned_strings_buffer=64 >> /etc/php.d/opcache.ini | |
echo opcache.max_accelerated_files=100000 >> /etc/php.d/opcache.ini | |
- name: Enable JIT | |
if: matrix.type != 'verify_type_inference' | |
run: | | |
echo opcache.jit=tracing >> /etc/php.d/opcache.ini | |
echo opcache.jit_buffer_size=1G >> /etc/php.d/opcache.ini | |
echo opcache.jit_max_root_traces=100000 >> /etc/php.d/opcache.ini | |
echo opcache.jit_max_side_traces=100000 >> /etc/php.d/opcache.ini | |
echo opcache.jit_max_exit_counters=100000 >> /etc/php.d/opcache.ini | |
echo opcache.jit_hot_loop=1 >> /etc/php.d/opcache.ini | |
echo opcache.jit_hot_func=1 >> /etc/php.d/opcache.ini | |
echo opcache.jit_hot_return=1 >> /etc/php.d/opcache.ini | |
echo opcache.jit_hot_side_exit=1 >> /etc/php.d/opcache.ini | |
php -v | |
- name: Test AMPHP | |
if: always() | |
run: | | |
repositories="amp cache dns file http parallel parser pipeline process serialization socket sync websocket-client websocket-server" | |
X=0 | |
for repository in $repositories; do | |
printf "Testing amp/%s\n" "$repository" | |
git clone "https://github.com/amphp/$repository.git" "amphp-$repository" --depth 1 | |
cd "amphp-$repository" | |
git rev-parse HEAD | |
php /usr/bin/composer install --no-progress --ignore-platform-reqs | |
vendor/bin/phpunit || EXIT_CODE=$? | |
if [ ${EXIT_CODE:-0} -gt 128 ]; then | |
X=1; | |
fi | |
cd .. | |
done | |
exit $X | |
- name: Test Laravel | |
if: always() | |
run: | | |
git clone https://github.com/laravel/framework.git --branch=master --depth=1 | |
cd framework | |
git rev-parse HEAD | |
php /usr/bin/composer install --no-progress --ignore-platform-reqs | |
# Hack to disable a test that hangs | |
php -r '$c = file_get_contents("tests/Filesystem/FilesystemTest.php"); $c = str_replace("public function testSharedGet()", "#[\\PHPUnit\\Framework\\Attributes\\Group('"'"'skip'"'"')]\n public function testSharedGet()", $c); file_put_contents("tests/Filesystem/FilesystemTest.php", $c);' | |
php vendor/bin/phpunit --exclude-group skip || EXIT_CODE=$? | |
if [ ${EXIT_CODE:-0} -gt 128 ]; then | |
exit 1 | |
fi | |
- name: Test ReactPHP | |
if: always() | |
run: | | |
repositories="async cache child-process datagram dns event-loop promise promise-stream promise-timer stream" | |
X=0 | |
for repository in $repositories; do | |
printf "Testing reactphp/%s\n" "$repository" | |
git clone "https://github.com/reactphp/$repository.git" "reactphp-$repository" --depth 1 | |
cd "reactphp-$repository" | |
git rev-parse HEAD | |
php /usr/bin/composer install --no-progress --ignore-platform-reqs | |
vendor/bin/phpunit || EXIT_CODE=$? | |
if [ $[EXIT_CODE:-0} -gt 128 ]; then | |
X=1; | |
fi | |
cd .. | |
done | |
exit $X | |
- name: Test Revolt PHP | |
if: always() | |
run: | | |
git clone https://github.com/revoltphp/event-loop.git --depth=1 | |
cd event-loop | |
git rev-parse HEAD | |
php /usr/bin/composer install --no-progress --ignore-platform-reqs | |
vendor/bin/phpunit || EXIT_CODE=$? | |
if [ ${EXIT_CODE:-0} -gt 128 ]; then | |
exit 1 | |
fi | |
- name: Test Symfony | |
if: always() | |
run: | | |
git clone https://github.com/symfony/symfony.git --depth=1 | |
cd symfony | |
git rev-parse HEAD | |
php /usr/bin/composer install --no-progress --ignore-platform-reqs | |
php ./phpunit install | |
# Test causes a heap-buffer-overflow but I cannot reproduce it locally... | |
php -r '$c = file_get_contents("src/Symfony/Component/HtmlSanitizer/Tests/HtmlSanitizerCustomTest.php"); $c = str_replace("public function testSanitizeDeepNestedString()", "/** @group skip */\n public function testSanitizeDeepNestedString()", $c); file_put_contents("src/Symfony/Component/HtmlSanitizer/Tests/HtmlSanitizerCustomTest.php", $c);' | |
# Buggy FFI test in Symfony, see https://github.com/symfony/symfony/issues/47668 | |
php -r '$c = file_get_contents("src/Symfony/Component/VarDumper/Tests/Caster/FFICasterTest.php"); $c = str_replace("public function testCastNonTrailingCharPointer()", "/** @group skip */\n public function testCastNonTrailingCharPointer()", $c); file_put_contents("src/Symfony/Component/VarDumper/Tests/Caster/FFICasterTest.php", $c);' | |
export SYMFONY_DEPRECATIONS_HELPER=max[total]=999 | |
X=0 | |
for component in $(find src/Symfony -mindepth 2 -type f -name phpunit.xml.dist -printf '%h\n'); do | |
php ./phpunit $component --exclude-group tty,benchmark,intl-data,transient --exclude-group skip || EXIT_CODE=$? | |
if [ ${EXIT_CODE:-0} -gt 128 ]; then | |
X=1; | |
fi | |
done | |
exit $X | |
- name: Test PHPUnit | |
if: always() | |
run: | | |
git clone https://github.com/sebastianbergmann/phpunit.git --branch=main --depth=1 | |
cd phpunit | |
git rev-parse HEAD | |
php /usr/bin/composer install --no-progress --ignore-platform-reqs | |
php ./phpunit || EXIT_CODE=$? | |
if [ ${EXIT_CODE:-0} -gt 128 ]; then | |
exit 1 | |
fi | |
- name: 'Symfony Preloading' | |
if: always() | |
run: | | |
php /usr/bin/composer create-project symfony/symfony-demo symfony_demo --no-progress --ignore-platform-reqs | |
cd symfony_demo | |
git rev-parse HEAD | |
sed -i 's/PHP_SAPI/"cli-server"/g' var/cache/dev/App_KernelDevDebugContainer.preload.php | |
php -d opcache.preload=var/cache/dev/App_KernelDevDebugContainer.preload.php public/index.php | |
- name: Test Wordpress | |
if: always() | |
run: | | |
git clone https://github.com/WordPress/wordpress-develop.git wordpress --depth=1 | |
cd wordpress | |
git rev-parse HEAD | |
php /usr/bin/composer install --no-progress --ignore-platform-reqs | |
cp wp-tests-config-sample.php wp-tests-config.php | |
sed -i 's/youremptytestdbnamehere/test/g' wp-tests-config.php | |
sed -i 's/yourusernamehere/root/g' wp-tests-config.php | |
sed -i 's/yourpasswordhere/root/g' wp-tests-config.php | |
php vendor/bin/phpunit || EXIT_CODE=$? | |
if [ $EXIT_CODE -gt 128 ]; then | |
exit 1 | |
fi | |
- name: Notify Slack | |
if: failure() | |
uses: ./.github/actions/notify-slack | |
with: | |
token: ${{ secrets.ACTION_MONITORING_SLACK }} | |
OPCACHE_VARIATION: | |
needs: GENERATE_MATRIX | |
if: ${{ needs.GENERATE_MATRIX.outputs.branches != '[]' }} | |
services: | |
mysql: | |
image: mysql:8.3 | |
ports: | |
- 3306:3306 | |
env: | |
MYSQL_DATABASE: test | |
MYSQL_ROOT_PASSWORD: root | |
postgres: | |
image: postgres | |
env: | |
POSTGRES_USER: postgres | |
POSTGRES_PASSWORD: postgres | |
POSTGRES_DB: test | |
firebird: | |
image: jacobalberty/firebird | |
ports: | |
- 3050:3050 | |
env: | |
ISC_PASSWORD: test | |
FIREBIRD_DATABASE: test.fdb | |
FIREBIRD_USER: test | |
FIREBIRD_PASSWORD: test | |
strategy: | |
fail-fast: false | |
matrix: | |
branch: ${{ fromJson(needs.GENERATE_MATRIX.outputs.branches) }} | |
name: "${{ matrix.branch.name }}_OPCACHE_VARIATION" | |
runs-on: ubuntu-${{ matrix.branch.version.minor >= 3 && '22.04' || '20.04' }} | |
steps: | |
- name: git checkout | |
uses: actions/checkout@v4 | |
with: | |
ref: ${{ matrix.branch.ref }} | |
- name: Create MSSQL container | |
uses: ./.github/actions/setup-mssql | |
- name: apt | |
uses: ./.github/actions/apt-x64 | |
- name: ./configure | |
uses: ./.github/actions/configure-x64 | |
with: | |
configurationParameters: >- | |
--enable-debug --disable-zts | |
- name: make | |
run: make -j$(/usr/bin/nproc) >/dev/null | |
- name: make install | |
uses: ./.github/actions/install-linux | |
- name: Setup | |
uses: ./.github/actions/setup-x64 | |
- name: Test File Cache (prime shm) | |
uses: ./.github/actions/test-linux | |
with: | |
runTestsParameters: >- | |
-d zend_extension=opcache.so | |
-d opcache.enable_cli=1 | |
--file-cache-prime | |
- name: Test File Cache (prime shm, use shm) | |
uses: ./.github/actions/test-linux | |
with: | |
runTestsParameters: >- | |
-d zend_extension=opcache.so | |
-d opcache.enable_cli=1 | |
--file-cache-use | |
- name: Test File Cache (prime shm, use file) | |
uses: ./.github/actions/test-linux | |
with: | |
runTestsParameters: >- | |
-d zend_extension=opcache.so | |
-d opcache.enable_cli=1 | |
--file-cache-use | |
-d opcache.file_cache_only=1 | |
- name: Test File Cache Only (prime) | |
uses: ./.github/actions/test-linux | |
with: | |
runTestsParameters: >- | |
-d zend_extension=opcache.so | |
-d opcache.enable_cli=1 | |
--file-cache-prime | |
-d opcache.file_cache_only=1 | |
- name: Test File Cache Only (use) | |
uses: ./.github/actions/test-linux | |
with: | |
runTestsParameters: >- | |
-d zend_extension=opcache.so | |
-d opcache.enable_cli=1 | |
--file-cache-use | |
-d opcache.file_cache_only=1 | |
- name: Verify generated files are up to date | |
uses: ./.github/actions/verify-generated-files | |
- name: Notify Slack | |
if: failure() | |
uses: ./.github/actions/notify-slack | |
with: | |
token: ${{ secrets.ACTION_MONITORING_SLACK }} | |
MSAN: | |
needs: GENERATE_MATRIX | |
if: ${{ needs.GENERATE_MATRIX.outputs.branches != '[]' }} | |
strategy: | |
fail-fast: false | |
matrix: | |
branch: ${{ fromJson(needs.GENERATE_MATRIX.outputs.branches) }} | |
name: "${{ matrix.branch.name }}_MSAN" | |
runs-on: ubuntu-${{ matrix.branch.version.minor >= 3 && '22.04' || '20.04' }} | |
steps: | |
- name: git checkout | |
uses: actions/checkout@v4 | |
with: | |
ref: ${{ matrix.branch.ref }} | |
- name: apt | |
uses: ./.github/actions/apt-x64 | |
- name: ./configure | |
run: | | |
export CC=clang | |
export CXX=clang++ | |
export CFLAGS="-DZEND_TRACK_ARENA_ALLOC" | |
./buildconf --force | |
# msan requires all used libraries to be instrumented, | |
# so we should avoiding linking against anything but libc here | |
./configure \ | |
--enable-debug \ | |
--enable-zts \ | |
--enable-option-checking=fatal \ | |
--prefix=/usr \ | |
--without-sqlite3 \ | |
--without-pdo-sqlite \ | |
--without-libxml \ | |
--disable-dom \ | |
--disable-simplexml \ | |
--disable-xml \ | |
--disable-xmlreader \ | |
--disable-xmlwriter \ | |
--without-pcre-jit \ | |
--disable-opcache-jit \ | |
--enable-phpdbg \ | |
--enable-fpm \ | |
--with-pdo-mysql=mysqlnd \ | |
--with-mysqli=mysqlnd \ | |
--disable-mysqlnd-compression-support \ | |
--without-pear \ | |
--enable-exif \ | |
--enable-sysvsem \ | |
--enable-sysvshm \ | |
--enable-shmop \ | |
--enable-pcntl \ | |
--enable-mbstring \ | |
--disable-mbregex \ | |
--enable-sockets \ | |
--enable-bcmath \ | |
--enable-calendar \ | |
--enable-ftp \ | |
--enable-zend-test \ | |
--enable-werror \ | |
--enable-memory-sanitizer \ | |
--with-config-file-path=/etc \ | |
--with-config-file-scan-dir=/etc/php.d \ | |
--enable-dl-test=shared | |
- name: make | |
run: make -j$(/usr/bin/nproc) >/dev/null | |
- name: make install | |
run: | | |
sudo make install | |
sudo mkdir -p /etc/php.d | |
sudo chmod 777 /etc/php.d | |
echo mysqli.default_socket=/var/run/mysqld/mysqld.sock > /etc/php.d/mysqli.ini | |
echo pdo_mysql.default_socket=/var/run/mysqld/mysqld.sock > /etc/php.d/pdo_mysql.ini | |
- name: Setup | |
run: | | |
set -x | |
sudo service mysql start | |
mysql -uroot -proot -e "CREATE DATABASE IF NOT EXISTS test" | |
# Ensure local_infile tests can run. | |
mysql -uroot -proot -e "SET GLOBAL local_infile = true" | |
sudo locale-gen de_DE | |
- name: Test | |
uses: ./.github/actions/test-linux | |
with: | |
runTestsParameters: >- | |
--msan | |
- name: Test Opcache | |
uses: ./.github/actions/test-linux | |
with: | |
runTestsParameters: >- | |
--msan | |
-d zend_extension=opcache.so | |
-d opcache.enable_cli=1 | |
- name: Verify generated files are up to date | |
uses: ./.github/actions/verify-generated-files | |
- name: Notify Slack | |
if: failure() | |
uses: ./.github/actions/notify-slack | |
with: | |
token: ${{ secrets.ACTION_MONITORING_SLACK }} | |
LIBMYSQLCLIENT: | |
needs: GENERATE_MATRIX | |
if: ${{ needs.GENERATE_MATRIX.outputs.branches != '[]' }} | |
strategy: | |
fail-fast: false | |
matrix: | |
branch: ${{ fromJson(needs.GENERATE_MATRIX.outputs.branches) }} | |
name: "${{ matrix.branch.name }}_LIBMYSQLCLIENT" | |
runs-on: ubuntu-${{ matrix.branch.version.minor >= 3 && '22.04' || '20.04' }} | |
steps: | |
- name: git checkout | |
uses: actions/checkout@v4 | |
with: | |
ref: ${{ matrix.branch.ref }} | |
- name: apt | |
run: | | |
sudo apt-get update -y | true | |
sudo apt install bison re2c | |
- name: Setup | |
run: | | |
sudo service mysql start | |
mysql -uroot -proot -e "CREATE DATABASE IF NOT EXISTS test" | |
# Ensure local_infile tests can run. | |
mysql -uroot -proot -e "SET GLOBAL local_infile = true" | |
- name: Build mysql-8.0 | |
uses: ./.github/actions/build-libmysqlclient | |
with: | |
configurationParameters: --enable-werror | |
libmysql: mysql-8.0.37-linux-glibc2.28-x86_64.tar.xz | |
withMysqli: ${{ matrix.branch.ref == 'PHP-8.1' }} | |
- name: Test mysql-8.0 | |
uses: ./.github/actions/test-libmysqlclient | |
with: | |
withMysqli: ${{ matrix.branch.ref == 'PHP-8.1' }} | |
- name: Build mysql-8.4 | |
uses: ./.github/actions/build-libmysqlclient | |
with: | |
configurationParameters: --enable-werror | |
libmysql: mysql-8.4.0-linux-glibc2.28-x86_64.tar.xz | |
withMysqli: ${{ matrix.branch.ref == 'PHP-8.1' }} | |
- name: Test mysql-8.4 | |
uses: ./.github/actions/test-libmysqlclient | |
with: | |
withMysqli: ${{ matrix.branch.ref == 'PHP-8.1' }} | |
- name: Verify generated files are up to date | |
uses: ./.github/actions/verify-generated-files | |
- name: Notify Slack | |
if: failure() | |
uses: ./.github/actions/notify-slack | |
with: | |
token: ${{ secrets.ACTION_MONITORING_SLACK }} | |
PECL: | |
if: github.repository == 'php/php-src' || github.event_name == 'workflow_dispatch' | |
runs-on: ubuntu-22.04 | |
env: | |
CC: ccache gcc | |
CXX: ccache g++ | |
steps: | |
- name: git checkout PHP | |
uses: actions/checkout@v4 | |
with: | |
path: php | |
- name: git checkout apcu | |
uses: actions/checkout@v4 | |
with: | |
repository: krakjoe/apcu | |
path: apcu | |
- name: git checkout imagick | |
uses: actions/checkout@v4 | |
with: | |
repository: Imagick/imagick | |
path: imagick | |
- name: git checkout memcached | |
uses: actions/checkout@v4 | |
with: | |
repository: php-memcached-dev/php-memcached | |
path: memcached | |
- name: git checkout redis | |
# Currently fails to build | |
if: false | |
uses: actions/checkout@v4 | |
with: | |
repository: phpredis/phpredis | |
path: redis | |
- name: git checkout xdebug | |
uses: actions/checkout@v4 | |
with: | |
repository: xdebug/xdebug | |
path: xdebug | |
- name: git checkout yaml | |
uses: actions/checkout@v4 | |
with: | |
repository: php/pecl-file_formats-yaml | |
path: yaml | |
- name: apt | |
run: | | |
sudo apt-get update | |
sudo apt-get install -y --no-install-recommends \ | |
ccache \ | |
libmemcached-dev \ | |
bison \ | |
re2c | |
- name: ccache | |
uses: hendrikmuhs/[email protected] | |
with: | |
key: "${{github.job}}-${{hashFiles('php/main/php_version.h')}}" | |
append-timestamp: false | |
save: ${{ github.event_name != 'pull_request' }} | |
- name: build PHP | |
run: | | |
cd php | |
./buildconf --force | |
./configure \ | |
--enable-option-checking=fatal \ | |
--prefix=/opt/php \ | |
--enable-cli \ | |
--disable-all \ | |
--enable-session \ | |
--enable-werror | |
make -j$(/usr/bin/nproc) | |
sudo make install | |
- name: build apcu | |
run: | | |
cd apcu | |
/opt/php/bin/phpize | |
./configure --prefix=/opt/php --with-php-config=/opt/php/bin/php-config | |
make -j$(/usr/bin/nproc) | |
- name: build imagick | |
run: | | |
cd imagick | |
/opt/php/bin/phpize | |
./configure --prefix=/opt/php --with-php-config=/opt/php/bin/php-config | |
make -j$(/usr/bin/nproc) | |
- name: build memcached | |
run: | | |
cd memcached | |
/opt/php/bin/phpize | |
./configure --prefix=/opt/php --with-php-config=/opt/php/bin/php-config | |
make -j$(/usr/bin/nproc) | |
- name: build redis | |
# Currently fails to build | |
if: false | |
run: | | |
cd redis | |
/opt/php/bin/phpize | |
./configure --prefix=/opt/php --with-php-config=/opt/php/bin/php-config | |
make -j$(/usr/bin/nproc) | |
- name: build xdebug | |
run: | | |
cd xdebug | |
/opt/php/bin/phpize | |
./configure --prefix=/opt/php --with-php-config=/opt/php/bin/php-config | |
make -j$(/usr/bin/nproc) | |
- name: build yaml | |
run: | | |
cd yaml | |
/opt/php/bin/phpize | |
./configure --prefix=/opt/php --with-php-config=/opt/php/bin/php-config | |
make -j$(/usr/bin/nproc) | |
- name: Notify Slack | |
if: failure() | |
uses: ./.github/actions/notify-slack | |
with: | |
token: ${{ secrets.ACTION_MONITORING_SLACK }} | |
WINDOWS: | |
needs: GENERATE_MATRIX | |
if: ${{ needs.GENERATE_MATRIX.outputs.branches != '[]' }} | |
strategy: | |
fail-fast: false | |
matrix: | |
include: ${{ fromJson(needs.GENERATE_MATRIX.outputs.windows-matrix-include) }} | |
name: "${{ matrix.branch.name }}_WINDOWS_${{ matrix.x64 && 'X64' || 'X86' }}_${{ matrix.zts && 'ZTS' || 'NTS' }}" | |
runs-on: ${{ (matrix.branch.version.minor >= 4) && 'windows-2022' || 'windows-2019' }} | |
env: | |
PHP_BUILD_CACHE_BASE_DIR: C:\build-cache | |
PHP_BUILD_OBJ_DIR: C:\obj | |
PHP_BUILD_CACHE_SDK_DIR: C:\build-cache\sdk | |
PHP_BUILD_SDK_BRANCH: php-sdk-2.3.0 | |
PHP_BUILD_CRT: ${{ (matrix.branch.version.minor >= 4) && 'vs17' || 'vs16' }} | |
PLATFORM: ${{ matrix.x64 && 'x64' || 'x86' }} | |
THREAD_SAFE: "${{ matrix.zts && '1' || '0' }}" | |
INTRINSICS: "${{ matrix.zts && 'AVX2' || '' }}" | |
PARALLEL: -j2 | |
OPCACHE: "${{ matrix.opcache && '1' || '0' }}" | |
steps: | |
- name: git config | |
run: git config --global core.autocrlf false && git config --global core.eol lf | |
- name: git checkout | |
uses: actions/checkout@v4 | |
with: | |
ref: ${{ matrix.branch.ref }} | |
- name: Setup | |
uses: ./.github/actions/setup-windows | |
- name: Build | |
run: .github/scripts/windows/build.bat | |
- name: Test | |
run: .github/scripts/windows/test.bat |