Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Install PHP5.2/5.3 on trusty #2049

Merged
merged 55 commits into from
Jul 28, 2017
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
55 commits
Select commit Hold shift + click to select a range
e4003ff
Install PHP5.2/5.3 on trusty
notnownikki Jul 27, 2017
c8d6e2d
Cannot request PHP5.2, request PHP7.1 and switch instead
notnownikki Jul 27, 2017
d8260ad
Work out why it's building both php versions...
notnownikki Jul 27, 2017
b1b226f
and again
notnownikki Jul 27, 2017
1b13149
tail build log to prevent travis aborting the job
notnownikki Jul 27, 2017
0c7a85a
Actually run the tail in the background this time...
notnownikki Jul 27, 2017
66dee1d
debugging again
notnownikki Jul 27, 2017
1897cab
better pre-built check, prevent phpbrew crash
notnownikki Jul 27, 2017
c8e13f7
Have a php-utils-bin dir, restore working directory after php build
notnownikki Jul 27, 2017
8aefb15
Confirm versions in the test output
notnownikki Jul 27, 2017
342d101
Make sure phpbrew is on the path
notnownikki Jul 27, 2017
46cfe03
Adding caching, so it's easier to work out why we're using the wrong …
notnownikki Jul 27, 2017
f3941b5
confirm versions in main script
notnownikki Jul 27, 2017
3860847
debugging
notnownikki Jul 27, 2017
c2305df
more debugging
notnownikki Jul 27, 2017
23ebced
even more debugging
notnownikki Jul 27, 2017
065d4f0
PHPUnit shim
notnownikki Jul 27, 2017
cc7bcb7
Path fix
notnownikki Jul 27, 2017
b437869
deeeeeeeeebug
notnownikki Jul 27, 2017
6027806
fix shim generation
notnownikki Jul 27, 2017
bf5b34c
Restore original working dir
notnownikki Jul 27, 2017
26af1ec
Echo versions used in test
notnownikki Jul 27, 2017
bf8a10e
shim fix
notnownikki Jul 27, 2017
37ac2fc
Dont use shared libs for openssl or mysql, patch openssl code to compile
notnownikki Jul 27, 2017
efcbd66
Fix patches
notnownikki Jul 27, 2017
bb4cab3
Move patches, finally get mysql compiling locally. Cry a lot.
notnownikki Jul 27, 2017
0497eeb
Re-enable the rest of the test matrix, re-enable caching
notnownikki Jul 27, 2017
773b772
Move php build/install into its own script, add patches
notnownikki Jul 27, 2017
484ca3a
phpunit shim exit with exit code of phpunit, fix revision of phpbrew
notnownikki Jul 27, 2017
dd54882
source, not spawn
notnownikki Jul 27, 2017
d87839d
Source, not spawn!
notnownikki Jul 27, 2017
bccc478
Fix relative paths
notnownikki Jul 27, 2017
658f352
Always make our utils dir
notnownikki Jul 27, 2017
2cfb5a5
do not use our phpunit shim unless running an old php version
notnownikki Jul 27, 2017
6d64fa5
Trying with old php version as well
notnownikki Jul 27, 2017
5ebf52f
Enable all tests again
notnownikki Jul 27, 2017
455e4b0
Merge branch 'master' into try/php-5-2-on-trusty
notnownikki Jul 27, 2017
a516690
Testing PHP5.3
notnownikki Jul 27, 2017
7b1346c
Enable all jobs again, enable cache for .phpbrew
notnownikki Jul 27, 2017
32c7533
Debug, cache is causing problems
notnownikki Jul 27, 2017
75d7f9f
apt-gets are failing
notnownikki Jul 27, 2017
a4f8ce9
Always install phpbrew if using old PHP
notnownikki Jul 27, 2017
e7667c3
Always install phpunit when using old PHP
notnownikki Jul 27, 2017
0abeba6
Fix path to phpunit3.6
notnownikki Jul 27, 2017
7ebc7d0
Better error checking, hopefully better caching too
notnownikki Jul 27, 2017
c2712d0
Bundle the phpbrew bashrc, better caching
notnownikki Jul 27, 2017
1c9948c
Always build both old PHPs, or we get cache races
notnownikki Jul 27, 2017
d41b45b
Reset php env after installing Symfony libs with pear under php5.2
notnownikki Jul 27, 2017
4447192
Fix order of phpbrew manual reset
notnownikki Jul 27, 2017
10ff765
Only make utils bin if using old PHP versions
notnownikki Jul 27, 2017
9309a3a
Simpler phpunit installation
notnownikki Jul 28, 2017
b973a38
Fix PHP version check
notnownikki Jul 28, 2017
d021c5d
Check phpunit catches failures
notnownikki Jul 28, 2017
5913b80
Revert phpunit fail test, add patches README
notnownikki Jul 28, 2017
6541cdb
Corrected comments in installer script
notnownikki Jul 28, 2017
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 11 additions & 11 deletions .travis.yml
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ cache:
directories:
- vendor
- $HOME/.composer/cache
- $HOME/.phpbrew
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't feel too strongly about this, but because there are already phpunit shims injected by Travis, I'd rather only have this around when we actually need it, so that anyone who needs to debug this in the future has a slightly easier time figuring out what phpunit is actually getting run.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actually, I'm simplifying this so it works as before, with a phpunit-bin directory and a single phpunit executable file in there. Makes things much easier to follow, and we don't need our shim.


before_install:
- nvm install 7 && nvm use 7
Expand All @@ -22,9 +23,10 @@ matrix:
env: WP_VERSION=latest
- php: 5.6
env: WP_VERSION=latest
- php: 5.2
env: WP_VERSION=latest
dist: precise
- php: 7.1
env: WP_VERSION=latest SWITCH_TO_PHP=5.3
- php: 7.1
env: WP_VERSION=latest SWITCH_TO_PHP=5.2
- php: 5.6
env: TRAVISCI=phpcs
- php: 7.1
Expand All @@ -34,15 +36,10 @@ before_script:
- export PATH="$HOME/.composer/vendor/bin:$PATH"
- |
if [[ ! -z "$WP_VERSION" ]] ; then
set -e
bash bin/install-wp-tests.sh wordpress_test root '' localhost $WP_VERSION
if [[ ${TRAVIS_PHP_VERSION:0:2} == "5." ]]; then
mkdir -p $HOME/phpunit-bin
wget -O $HOME/phpunit-bin/phpunit https://phar.phpunit.de/phpunit-4.8.phar
chmod +x $HOME/phpunit-bin/phpunit
export PATH=$PATH:$HOME/phpunit-bin/
else
composer global require "phpunit/phpunit=5.7.*"
fi
source bin/install-php-phpunit.sh
set +e
fi
- |
if [[ "$TRAVISCI" == "phpcs" ]] ; then
Expand All @@ -65,6 +62,9 @@ script:
sleep .2 # Otherwise Travis doesn't want to print the whole message
exit 1
fi
echo Running with the following versions:
php -v
phpunit -v
# Check parser syntax
php lib/parser.php || exit 1
# Run PHPUnit tests
Expand Down
124 changes: 124 additions & 0 deletions bin/install-php-phpunit.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,124 @@
#!/bin/bash

# Uses phpbrew to install older php versions on modern(ish) distros.
# Installs the correct version of phpunit for the requested php
# version. ~/.phpbrew is expected to be cached so we only have
# to build php the first time.

# we have to save and restore the original working directory, because
# phpbrew can mess up if we don't run it from the home directory
ORIG_DIR=`pwd`;
THIS_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
PHP52_PATH=$HOME/.phpbrew/php/php-5.2.17

# install phpunit

mkdir -p $HOME/phpunit-bin

if [[ ${SWITCH_TO_PHP:0:3} == "5.2" ]]; then
# use the phpunit in the PHP5.2 installation
ln -s ${PHP52_PATH}/lib/php/phpunit/phpunit.php $HOME/phpunit-bin/phpunit
elif [[ ${TRAVIS_PHP_VERSION:0:2} == "5." ]] || [[ ${SWITCH_TO_PHP:0:2} == "5." ]]; then
wget -O $HOME/phpunit-bin/phpunit https://phar.phpunit.de/phpunit-4.8.phar
chmod +x $HOME/phpunit-bin/phpunit
else
composer global require "phpunit/phpunit=6.*"
fi

export PATH=$HOME/phpunit-bin/:$PATH

if [[ ${SWITCH_TO_PHP:0:3} == "5.2" ]] || [[ ${SWITCH_TO_PHP:0:3} == "5.3" ]]; then
PHPBREW_BUILT_CHECK=$HOME/.phpbrew/bashrc

# directory to store phpbrew and old phpunit in
mkdir -p $HOME/php-utils-bin

# install phpbrew
curl -L -o $HOME/php-utils-bin/phpbrew https://github.com/phpbrew/phpbrew/raw/f6a422e1ba49293ee73bc4c317795c021bc57020/phpbrew
chmod +x $HOME/php-utils-bin/phpbrew

# needs to be on the path for switching php versions to work
export PATH=$HOME/php-utils-bin:$PATH

# php and phpunit3.6 installs should be cached, only build if they're not there.
if [ ! -f $PHPBREW_BUILT_CHECK ]; then

# init with known --old to get 5.2 and 5.3
$HOME/php-utils-bin/phpbrew init
$HOME/php-utils-bin/phpbrew known --old

# build PHP5.2
tail -F $HOME/.phpbrew/build/php-5.2.17/build.log &
TAIL_PID=$!
$HOME/php-utils-bin/phpbrew install --patch ${THIS_DIR}/patches/node.patch --patch ${THIS_DIR}/patches/openssl.patch 5.2 +default +mysql +pdo \
+gettext +phar +openssl -- --with-openssl-dir=/usr/include/openssl --enable-spl --with-mysql --with-mysqli=/usr/bin/mysql_config --with-pdo-mysql=/usr
kill -TERM $TAIL_PID

# build PHP5.3
tail -F $HOME/.phpbrew/build/php-5.3.29/build.log &
TAIL_PID=$!
$HOME/php-utils-bin/phpbrew install --patch ${THIS_DIR}/patches/node.patch --patch ${THIS_DIR}/patches/openssl.patch 5.3 +default +mysql +pdo \
+gettext +phar +openssl -- --with-openssl-dir=/usr/include/openssl --enable-spl --with-mysql --with-mysqli=/usr/bin/mysql_config --with-pdo-mysql=/usr
kill -TERM $TAIL_PID

# install PHPUnit 3.6. The only install method available is from source, using git branches old
# enough that they don't rely on any PHP5.3+ features. This clones each needed dependency
# and then we add the paths to the include_path by setting up an extra .ini file
cd ${PHP52_PATH}/lib/php

# dependencies
git clone --depth=1 --branch=1.1 git://github.com/sebastianbergmann/dbunit.git
git clone --depth=1 --branch=1.1 git://github.com/sebastianbergmann/php-code-coverage.git
git clone --depth=1 --branch=1.3.2 git://github.com/sebastianbergmann/php-file-iterator.git
git clone --depth=1 --branch=1.1.1 git://github.com/sebastianbergmann/php-invoker.git
git clone --depth=1 --branch=1.1.2 git://github.com/sebastianbergmann/php-text-template.git
git clone --depth=1 --branch=1.0.3 git://github.com/sebastianbergmann/php-timer.git
git clone --depth=1 --branch=1.1.4 git://github.com/sebastianbergmann/php-token-stream.git
git clone --depth=1 --branch=1.1 git://github.com/sebastianbergmann/phpunit-mock-objects.git
git clone --depth=1 --branch=1.1 git://github.com/sebastianbergmann/phpunit-selenium.git
git clone --depth=1 --branch=1.0.0 git://github.com/sebastianbergmann/phpunit-story.git

# and the version of phpunit that we expect to run with php 5.2
git clone --depth=1 --branch=3.6 git://github.com/sebastianbergmann/phpunit.git

# fix up the version number of phpunit
sed -i 's/@package_version@/3.6-git/g' phpunit/PHPUnit/Runner/Version.php

# now set up an ini file that adds all of the above to include_path for the PHP5.2 install
mkdir -p ${PHP52_PATH}/var/db
echo "include_path=.:${PHP52_PATH}/lib/php:${PHP52_PATH}/lib/php/dbunit:${PHP52_PATH}/lib/php/php-code-coverage:${PHP52_PATH}/lib/php/php-file-iterator:${PHP52_PATH}/lib/php/php-invoker:${PHP52_PATH}/lib/php/php-text-template:${PHP52_PATH}/lib/php/php-timer:${PHP52_PATH}/lib/php/php-token-stream:${PHP52_PATH}/lib/php/phpunit-mock-objects:${PHP52_PATH}/lib/php/phpunit-selenium:${PHP52_PATH}/lib/php/phpunit-story:${PHP52_PATH}/lib/php/phpunit" > ${PHP52_PATH}/var/db/path.ini

# one more PHPUnit dependency that we need to install using pear under PHP5.2
cd $HOME
export PHPBREW_RC_ENABLE=1
source $HOME/.phpbrew/bashrc
phpbrew use 5.2.17
pear channel-discover pear.symfony-project.com
pear install pear.symfony-project.com/YAML-1.0.2

# manually go back to the system php, we can't use `phpbrew switch-off`
# because we're running a version of php that phpbrew doesn't work with at this point
unset PHPBREW_PHP
unset PHPBREW_PATH
__phpbrew_set_path
__phpbrew_reinit
eval `$BIN env`

# clean up build directory
rm -rf $HOME/.phpbrew/build/*
fi

# all needed php versions and phpunit versions are installed, either from the above
# install script, or from travis cache, so switch to using them
cd $HOME
export PHPBREW_RC_ENABLE=1
source $HOME/.phpbrew/bashrc

if [[ ${SWITCH_TO_PHP:0:3} == "5.2" ]]; then
phpbrew use 5.2.17
else
phpbrew use 5.3.29
fi
fi

cd $ORIG_DIR
2 changes: 2 additions & 0 deletions bin/patches/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
This directory contains patches required to build
older versions of PHP on trusty.
51 changes: 51 additions & 0 deletions bin/patches/node.patch
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
--- ext/dom/node.c 2012-08-06 17:49:48.826716692 +0800
+++ ext/dom/node.c 2012-08-06 17:52:47.633484660 +0800
@@ -1895,9 +1895,17 @@ static void dom_canonicalization(INTERNA
RETVAL_FALSE;
} else {
if (mode == 0) {
+#ifdef LIBXML2_NEW_BUFFER
+ ret = xmlOutputBufferGetSize(buf);
+#else
ret = buf->buffer->use;
+#endif
if (ret > 0) {
+#ifdef LIBXML2_NEW_BUFFER
+ RETVAL_STRINGL((char *) xmlOutputBufferGetContent(buf), ret, 1);
+#else
RETVAL_STRINGL((char *) buf->buffer->content, ret, 1);
+#endif
} else {
RETVAL_EMPTY_STRING();
}
--- ext/dom/documenttype.c 2012-08-06 18:02:16.019640870 +0800
+++ ext/dom/documenttype.c 2012-08-06 18:06:16.612228905 +0800
@@ -205,7 +205,13 @@ int dom_documenttype_internal_subset_rea
if (buff != NULL) {
xmlNodeDumpOutput (buff, NULL, (xmlNodePtr) intsubset, 0, 0, NULL);
xmlOutputBufferFlush(buff);
+
+#ifdef LIBXML2_NEW_BUFFER
+ ZVAL_STRINGL(*retval, xmlOutputBufferGetContent(buff),
+ xmlOutputBufferGetSize(buff), 1);
+#else
ZVAL_STRINGL(*retval, buff->buffer->content, buff->buffer->use, 1);
+#endif
(void)xmlOutputBufferClose(buff);
return SUCCESS;
}
--- ext/simplexml/simplexml.c 2012-08-06 18:10:44.621017026 +0800
+++ ext/simplexml/simplexml.c 2012-08-06 18:12:48.016270419 +0800
@@ -1417,7 +1417,12 @@ SXE_METHOD(asXML)

xmlNodeDumpOutput(outbuf, (xmlDocPtr) sxe->document->ptr, node, 0, 0, ((xmlDocPtr) sxe->document->ptr)->encoding);
xmlOutputBufferFlush(outbuf);
+#ifdef LIBXML2_NEW_BUFFER
+ RETVAL_STRINGL((char *)xmlOutputBufferGetContent(outbuf),
+ xmlOutputBufferGetSize(outbuf), 1);
+#else
RETVAL_STRINGL((char *)outbuf->buffer->content, outbuf->buffer->use, 1);
+#endif
xmlOutputBufferClose(outbuf);
}
} else {
52 changes: 52 additions & 0 deletions bin/patches/openssl.patch
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
--- ext/openssl/xp_ssl.c
+++ ext/openssl/xp_ssl.c
@@ -328,10 +328,12 @@ static inline int php_openssl_setup_cryp
sslsock->is_client = 1;
method = SSLv23_client_method();
break;
+#ifndef OPENSSL_NO_SSL2
case STREAM_CRYPTO_METHOD_SSLv2_CLIENT:
sslsock->is_client = 1;
method = SSLv2_client_method();
break;
+#endif
case STREAM_CRYPTO_METHOD_SSLv3_CLIENT:
sslsock->is_client = 1;
method = SSLv3_client_method();
@@ -348,10 +350,12 @@ static inline int php_openssl_setup_cryp
sslsock->is_client = 0;
method = SSLv3_server_method();
break;
+#ifndef OPENSSL_NO_SSL2
case STREAM_CRYPTO_METHOD_SSLv2_SERVER:
sslsock->is_client = 0;
method = SSLv2_server_method();
break;
+#endif
case STREAM_CRYPTO_METHOD_TLS_SERVER:
sslsock->is_client = 0;
method = TLSv1_server_method();
@@ -629,9 +633,11 @@ static inline int php_openssl_tcp_sockop
case STREAM_CRYPTO_METHOD_SSLv23_CLIENT:
sock->method = STREAM_CRYPTO_METHOD_SSLv23_SERVER;
break;
+#ifndef OPENSSL_NO_SSL2
case STREAM_CRYPTO_METHOD_SSLv2_CLIENT:
sock->method = STREAM_CRYPTO_METHOD_SSLv2_SERVER;
break;
+#endif
case STREAM_CRYPTO_METHOD_SSLv3_CLIENT:
sock->method = STREAM_CRYPTO_METHOD_SSLv3_SERVER;
break;
@@ -911,9 +917,11 @@ php_stream *php_openssl_ssl_socket_facto
if (strncmp(proto, "ssl", protolen) == 0) {
sslsock->enable_on_connect = 1;
sslsock->method = STREAM_CRYPTO_METHOD_SSLv23_CLIENT;
+#ifndef OPENSSL_NO_SSL2
} else if (strncmp(proto, "sslv2", protolen) == 0) {
sslsock->enable_on_connect = 1;
sslsock->method = STREAM_CRYPTO_METHOD_SSLv2_CLIENT;
+#endif
} else if (strncmp(proto, "sslv3", protolen) == 0) {
sslsock->enable_on_connect = 1;
sslsock->method = STREAM_CRYPTO_METHOD_SSLv3_CLIENT;