From 4151623b9cca32e26e78b749dee3bf9d15c827e8 Mon Sep 17 00:00:00 2001 From: Mike Jolley Date: Mon, 10 Jun 2019 17:09:42 +0100 Subject: [PATCH] Travis setup --- .travis.yml | 28 +++++ unit-tests/bin/install.sh | 210 ++++++++++++++++++++++++++++++++++++++ unit-tests/bin/phpcs.sh | 11 ++ unit-tests/bin/phpunit.sh | 8 ++ unit-tests/bin/travis.sh | 12 +++ 5 files changed, 269 insertions(+) create mode 100644 .travis.yml create mode 100755 unit-tests/bin/install.sh create mode 100755 unit-tests/bin/phpcs.sh create mode 100755 unit-tests/bin/phpunit.sh create mode 100755 unit-tests/bin/travis.sh diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 00000000000..96d37559994 --- /dev/null +++ b/.travis.yml @@ -0,0 +1,28 @@ +language: php + +sudo: false + +matrix: + include: + - name: "PHP 7.2 unit tests, PHP Coding standards check and JS tests" + php: 7.2 + env: WP_VERSION=latest WP_MULTISITE=0 WP_CORE_DIR=/tmp/wordpress RUN_PHPCS=1 + - name: "PHP 7.1 unit tests" + php: 7.1 + env: WP_VERSION=latest WP_MULTISITE=0 WP_CORE_DIR=/tmp/wordpress + - name: "PHP 7.0 unit tests" + php: 7.0 + env: WP_VERSION=latest WP_MULTISITE=0 WP_CORE_DIR=/tmp/wordpress + - name: "PHP 5.6 unit tests" + php: 5.6 + env: WP_VERSION=latest WP_MULTISITE=0 WP_CORE_DIR=/tmp/wordpress + +before_script: + - phpenv config-rm xdebug.ini + - export PATH="$HOME/.composer/vendor/bin:$PATH" + - bash tests/bin/install.sh woocommerce_test root '' localhost $WP_VERSION + - bash bin/travis.sh before + +script: + - bash unit-tests/bin/phpunit.sh + - bash unit-tests/tests/bin/phpcs.sh \ No newline at end of file diff --git a/unit-tests/bin/install.sh b/unit-tests/bin/install.sh new file mode 100755 index 00000000000..fb72cc86ab5 --- /dev/null +++ b/unit-tests/bin/install.sh @@ -0,0 +1,210 @@ +#!/usr/bin/env bash + +if [ $# -lt 3 ]; then + echo "usage: $0 [db-host] [wp-version] [skip-database-creation]" + exit 1 +fi + +DB_NAME=$1 +DB_USER=$2 +DB_PASS=$3 +DB_HOST=${4-localhost} +WP_VERSION=${5-latest} +SKIP_DB_CREATE=${6-false} + +TMPDIR=${TMPDIR-/tmp} +TMPDIR=$(echo $TMPDIR | sed -e "s/\/$//") +WP_TESTS_DIR=${WP_TESTS_DIR-$TMPDIR/wordpress-tests-lib} +WP_CORE_DIR=${WP_CORE_DIR-$TMPDIR/wordpress/} + +# Error if WP < 5 +if [[ $WP_VERSION =~ ^([0-9]+)[0-9\.]+\-? ]]; then + if [ "5" -gt "${BASH_REMATCH[1]}" ]; then + echo "You must use WordPress 5.0 or greater." + exit 1 + fi +fi + +download() { + if [ `which curl` ]; then + curl -s "$1" > "$2"; + elif [ `which wget` ]; then + wget -nv -O "$2" "$1" + fi +} + +if [[ $WP_VERSION =~ ^[0-9]+\.[0-9]+$ ]]; then + WP_TESTS_TAG="branches/$WP_VERSION" +elif [[ $WP_VERSION =~ [0-9]+\.[0-9]+\.[0-9]+ ]]; then + if [[ $WP_VERSION =~ [0-9]+\.[0-9]+\.[0] ]]; then + # version x.x.0 means the first release of the major version, so strip off the .0 and download version x.x + WP_TESTS_TAG="tags/${WP_VERSION%??}" + else + WP_TESTS_TAG="tags/$WP_VERSION" + fi +elif [[ $WP_VERSION == 'nightly' || $WP_VERSION == 'trunk' ]]; then + WP_TESTS_TAG="trunk" +else + # http serves a single offer, whereas https serves multiple. we only want one + download http://api.wordpress.org/core/version-check/1.7/ $TMPDIR/wp-latest.json + grep '[0-9]+\.[0-9]+(\.[0-9]+)?' $TMPDIR/wp-latest.json + LATEST_VERSION=$(grep -o '"version":"[^"]*' $TMPDIR/wp-latest.json | sed 's/"version":"//') + if [[ -z "$LATEST_VERSION" ]]; then + echo "Latest WordPress version could not be found" + exit 1 + fi + WP_TESTS_TAG="tags/$LATEST_VERSION" +fi + +set -ex + +install_wp() { + + if [ -d $WP_CORE_DIR ]; then + return; + fi + + mkdir -p $WP_CORE_DIR + + if [[ $WP_VERSION == 'nightly' || $WP_VERSION == 'trunk' ]]; then + mkdir -p $TMPDIR/wordpress-nightly + download https://wordpress.org/nightly-builds/wordpress-latest.zip $TMPDIR/wordpress-nightly/wordpress-nightly.zip + unzip -q $TMPDIR/wordpress-nightly/wordpress-nightly.zip -d $TMPDIR/wordpress-nightly/ + mv $TMPDIR/wordpress-nightly/wordpress/* $WP_CORE_DIR + else + if [ $WP_VERSION == 'latest' ]; then + local ARCHIVE_NAME='latest' + elif [[ $WP_VERSION =~ [0-9]+\.[0-9]+ ]]; then + # https serves multiple offers, whereas http serves single. + download https://api.wordpress.org/core/version-check/1.7/ $TMPDIR/wp-latest.json + if [[ $WP_VERSION =~ [0-9]+\.[0-9]+\.[0] ]]; then + # version x.x.0 means the first release of the major version, so strip off the .0 and download version x.x + LATEST_VERSION=${WP_VERSION%??} + else + # otherwise, scan the releases and get the most up to date minor version of the major release + local VERSION_ESCAPED=`echo $WP_VERSION | sed 's/\./\\\\./g'` + LATEST_VERSION=$(grep -o '"version":"'$VERSION_ESCAPED'[^"]*' $TMPDIR/wp-latest.json | sed 's/"version":"//' | head -1) + fi + if [[ -z "$LATEST_VERSION" ]]; then + local ARCHIVE_NAME="wordpress-$WP_VERSION" + else + local ARCHIVE_NAME="wordpress-$LATEST_VERSION" + fi + else + local ARCHIVE_NAME="wordpress-$WP_VERSION" + fi + download https://wordpress.org/${ARCHIVE_NAME}.tar.gz $TMPDIR/wordpress.tar.gz + tar --strip-components=1 -zxmf $TMPDIR/wordpress.tar.gz -C $WP_CORE_DIR + fi + + download https://raw.github.com/markoheijnen/wp-mysqli/master/db.php $WP_CORE_DIR/wp-content/db.php +} + +install_test_suite() { + # portable in-place argument for both GNU sed and Mac OSX sed + if [[ $(uname -s) == 'Darwin' ]]; then + local ioption='-i .bak' + else + local ioption='-i' + fi + + # set up testing suite if it doesn't yet exist + if [ ! -d $WP_TESTS_DIR ]; then + # set up testing suite + mkdir -p $WP_TESTS_DIR + svn co --quiet https://develop.svn.wordpress.org/${WP_TESTS_TAG}/tests/phpunit/includes/ $WP_TESTS_DIR/includes + svn co --quiet https://develop.svn.wordpress.org/${WP_TESTS_TAG}/tests/phpunit/data/ $WP_TESTS_DIR/data + fi + + if [ ! -f wp-tests-config.php ]; then + download https://develop.svn.wordpress.org/${WP_TESTS_TAG}/wp-tests-config-sample.php "$WP_TESTS_DIR"/wp-tests-config.php + # remove all forward slashes in the end + WP_CORE_DIR=$(echo $WP_CORE_DIR | sed "s:/\+$::") + sed $ioption "s:dirname( __FILE__ ) . '/src/':'$WP_CORE_DIR/':" "$WP_TESTS_DIR"/wp-tests-config.php + sed $ioption "s/youremptytestdbnamehere/$DB_NAME/" "$WP_TESTS_DIR"/wp-tests-config.php + sed $ioption "s/yourusernamehere/$DB_USER/" "$WP_TESTS_DIR"/wp-tests-config.php + sed $ioption "s/yourpasswordhere/$DB_PASS/" "$WP_TESTS_DIR"/wp-tests-config.php + sed $ioption "s|localhost|${DB_HOST}|" "$WP_TESTS_DIR"/wp-tests-config.php + fi + +} + +install_db() { + + if [ ${SKIP_DB_CREATE} = "true" ]; then + return 0 + fi + + # parse DB_HOST for port or socket references + local PARTS=(${DB_HOST//\:/ }) + local DB_HOSTNAME=${PARTS[0]}; + local DB_SOCK_OR_PORT=${PARTS[1]}; + local EXTRA="" + + if ! [ -z $DB_HOSTNAME ] ; then + if [ $(echo $DB_SOCK_OR_PORT | grep -e '^[0-9]\{1,\}$') ]; then + EXTRA=" --host=$DB_HOSTNAME --port=$DB_SOCK_OR_PORT --protocol=tcp" + elif ! [ -z $DB_SOCK_OR_PORT ] ; then + EXTRA=" --socket=$DB_SOCK_OR_PORT" + elif ! [ -z $DB_HOSTNAME ] ; then + EXTRA=" --host=$DB_HOSTNAME --protocol=tcp" + fi + fi + + # create database + mysqladmin create $DB_NAME --user="$DB_USER" --password="$DB_PASS"$EXTRA +} + +install_deps() { + + # Script Variables + WP_SITE_URL="http://local.wordpress.test" + BRANCH=$TRAVIS_BRANCH + REPO=$TRAVIS_REPO_SLUG + WORKING_DIR="$PWD" + + if [ "$TRAVIS_PULL_REQUEST_BRANCH" != "" ]; then + BRANCH=$TRAVIS_PULL_REQUEST_BRANCH + REPO=$TRAVIS_PULL_REQUEST_SLUG + fi + + # Set up WordPress using wp-cli + mkdir -p "$WP_CORE_DIR" + cd "$WP_CORE_DIR" + + curl -O https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar + php wp-cli.phar core config --dbname=$DB_NAME --dbuser=$DB_USER --dbpass=$DB_PASS --dbhost=$DB_HOST --dbprefix=wptests_ + php wp-cli.phar core install --url="$WP_SITE_URL" --title="Example" --admin_user=admin --admin_password=password --admin_email=info@example.com --path=$WP_CORE_DIR --skip-email + + # Install WooCommerce + cd "wp-content/plugins/" + # As zip file does not include tests, we have to get it from git repo. + git clone --depth 1 https://github.com/woocommerce/woocommerce.git + cd "$WP_CORE_DIR" + php wp-cli.phar plugin activate woocommerce + + if [ "$TRAVIS_PULL_REQUEST_BRANCH" != "" ]; then + BRANCH="$(sed 's/#/%23/' <<<$BRANCH)" + # Install woocommerce-admin, the correct branch, if running from Travis CI. + php wp-cli.phar plugin install https://github.com/$REPO/archive/$BRANCH.zip --activate + fi + + # Install WooCommerce-Admin + git clone --depth 1 https://github.com/woocommerce/woocommerce-admin.git + cd "$WP_CORE_DIR" + php wp-cli.phar plugin activate woocommerce-admin + + if [ "$TRAVIS_PULL_REQUEST_BRANCH" != "" ]; then + BRANCH="$(sed 's/#/%23/' <<<$BRANCH)" + # Install woocommerce-admin, the correct branch, if running from Travis CI. + php wp-cli.phar plugin install https://github.com/$REPO/archive/$BRANCH.zip --activate + fi + + # Back to original dir + cd "$WORKING_DIR" +} + +install_wp +install_test_suite +install_db +install_deps \ No newline at end of file diff --git a/unit-tests/bin/phpcs.sh b/unit-tests/bin/phpcs.sh new file mode 100755 index 00000000000..5a2c8b48a05 --- /dev/null +++ b/unit-tests/bin/phpcs.sh @@ -0,0 +1,11 @@ +#!/usr/bin/env bash + +if [[ ${RUN_PHPCS} == 1 ]]; then + CHANGED_FILES=`git diff --name-only --diff-filter=ACMR $TRAVIS_COMMIT_RANGE | grep \\\\.php | awk '{print}' ORS=' '` + IGNORE="" + + if [ "$CHANGED_FILES" != "" ]; then + echo "Running Code Sniffer." + ./vendor/bin/phpcs --ignore=$IGNORE --encoding=utf-8 -s -n -p $CHANGED_FILES + fi +fi diff --git a/unit-tests/bin/phpunit.sh b/unit-tests/bin/phpunit.sh new file mode 100755 index 00000000000..ae5e4ef3f8a --- /dev/null +++ b/unit-tests/bin/phpunit.sh @@ -0,0 +1,8 @@ +#!/usr/bin/env bash +WORKING_DIR="$PWD" +cd "$WP_CORE_DIR/wp-content/plugins/woocommerce-rest-api/" +phpunit --version +phpunit -c phpunit.xml.dist +TEST_RESULT=$? +cd "$WORKING_DIR" +exit $TEST_RESULT diff --git a/unit-tests/bin/travis.sh b/unit-tests/bin/travis.sh new file mode 100755 index 00000000000..e7b020cc9ac --- /dev/null +++ b/unit-tests/bin/travis.sh @@ -0,0 +1,12 @@ +#!/usr/bin/env bash +# usage: travis.sh before|after + +if [ $1 == 'before' ]; then + + if [[ ${RUN_PHPCS} == 1 ]]; then + cd "$WP_CORE_DIR/wp-content/plugins/woocommerce-rest-api/" + # This can (currently) only run for PHP 7.1+ + composer install + fi + +fi