mirror of
https://github.com/FriendsOfTYPO3/tea.git
synced 2024-11-26 08:16:13 +01:00
16aee3c836
The TYPO3 core `runTests.sh` contains the `-u` option to update the images and remove dangling images. Providing an image name and a `--filter` option is not supported by podmand and has not been discovered yet in the TYPO3 core implementation yet - and adopted with the recently sync of this repository implementation to the TYPO3 one. Both supported docker binaries `docker` and `podman` supportes filtering images using the `reference` filter option. Therefore, this change modifies the dangling image remove command to use double filter options. To verify that double filtering can be used, following command can be executed if already some images have been downloaded: ```shell podman images \ --filter "reference=ghcr.io/sbuerk/demo-core-testing-*" --filter "dangling=false" --format "{{.ID}}" docker images \ --filter "reference=ghcr.io/sbuerk/demo-core-testing-*" --filter "dangling=false" --format "{{.ID}}" ``` **Note:** `dangling=false` is used here instead of `dangling=true` like in `runTests.sh` Resolves: #1088
671 lines
28 KiB
Bash
Executable file
671 lines
28 KiB
Bash
Executable file
#!/usr/bin/env bash
|
|
|
|
#
|
|
# TYPO3 core test runner based on docker.
|
|
#
|
|
|
|
waitFor() {
|
|
local HOST=${1}
|
|
local PORT=${2}
|
|
local TESTCOMMAND="
|
|
COUNT=0;
|
|
while ! nc -z ${HOST} ${PORT}; do
|
|
if [ \"\${COUNT}\" -gt 10 ]; then
|
|
echo \"Can not connect to ${HOST} port ${PORT}. Aborting.\";
|
|
exit 1;
|
|
fi;
|
|
sleep 1;
|
|
COUNT=\$((COUNT + 1));
|
|
done;
|
|
"
|
|
${CONTAINER_BIN} run ${CONTAINER_COMMON_PARAMS} --name wait-for-${SUFFIX} ${XDEBUG_MODE} -e XDEBUG_CONFIG="${XDEBUG_CONFIG}" ${IMAGE_ALPINE} /bin/sh -c "${TESTCOMMAND}"
|
|
}
|
|
|
|
cleanUp() {
|
|
ATTACHED_CONTAINERS=$(${CONTAINER_BIN} ps --filter network=${NETWORK} --format='{{.Names}}')
|
|
for ATTACHED_CONTAINER in ${ATTACHED_CONTAINERS}; do
|
|
${CONTAINER_BIN} kill ${ATTACHED_CONTAINER} >/dev/null
|
|
done
|
|
${CONTAINER_BIN} network rm ${NETWORK} >/dev/null
|
|
}
|
|
|
|
handleDbmsOptions() {
|
|
# -a, -d, -i depend on each other. Validate input combinations and set defaults.
|
|
case ${DBMS} in
|
|
mariadb)
|
|
[ -z "${DATABASE_DRIVER}" ] && DATABASE_DRIVER="mysqli"
|
|
if [ "${DATABASE_DRIVER}" != "mysqli" ] && [ "${DATABASE_DRIVER}" != "pdo_mysql" ]; then
|
|
echo "Invalid combination -d ${DBMS} -a ${DATABASE_DRIVER}" >&2
|
|
echo >&2
|
|
echo "Use \".Build/Scripts/runTests.sh -h\" to display help and valid options" >&2
|
|
exit 1
|
|
fi
|
|
[ -z "${DBMS_VERSION}" ] && DBMS_VERSION="10.3"
|
|
if ! [[ ${DBMS_VERSION} =~ ^(10.3|10.4|10.5|10.6|10.7|10.8|10.9|10.10|10.11|11.0|11.1)$ ]]; then
|
|
echo "Invalid combination -d ${DBMS} -i ${DBMS_VERSION}" >&2
|
|
echo >&2
|
|
echo "Use \".Build/Scripts/runTests.sh -h\" to display help and valid options" >&2
|
|
exit 1
|
|
fi
|
|
;;
|
|
mysql)
|
|
[ -z "${DATABASE_DRIVER}" ] && DATABASE_DRIVER="mysqli"
|
|
if [ "${DATABASE_DRIVER}" != "mysqli" ] && [ "${DATABASE_DRIVER}" != "pdo_mysql" ]; then
|
|
echo "Invalid combination -d ${DBMS} -a ${DATABASE_DRIVER}" >&2
|
|
echo >&2
|
|
echo "Use \".Build/Scripts/runTests.sh -h\" to display help and valid options" >&2
|
|
exit 1
|
|
fi
|
|
[ -z "${DBMS_VERSION}" ] && DBMS_VERSION="8.0"
|
|
if ! [[ ${DBMS_VERSION} =~ ^(5.5|5.6|5.7|8.0)$ ]]; then
|
|
echo "Invalid combination -d ${DBMS} -i ${DBMS_VERSION}" >&2
|
|
echo >&2
|
|
echo "Use \".Build/Scripts/runTests.sh -h\" to display help and valid options" >&2
|
|
exit 1
|
|
fi
|
|
;;
|
|
postgres)
|
|
if [ -n "${DATABASE_DRIVER}" ]; then
|
|
echo "Invalid combination -d ${DBMS} -a ${DATABASE_DRIVER}" >&2
|
|
echo >&2
|
|
echo "Use \".Build/Scripts/runTests.sh -h\" to display help and valid options" >&2
|
|
exit 1
|
|
fi
|
|
[ -z "${DBMS_VERSION}" ] && DBMS_VERSION="10"
|
|
if ! [[ ${DBMS_VERSION} =~ ^(10|11|12|13|14|15)$ ]]; then
|
|
echo "Invalid combination -d ${DBMS} -i ${DBMS_VERSION}" >&2
|
|
echo >&2
|
|
echo "Use \".Build/Scripts/runTests.sh -h\" to display help and valid options" >&2
|
|
exit 1
|
|
fi
|
|
;;
|
|
sqlite)
|
|
if [ -n "${DATABASE_DRIVER}" ]; then
|
|
echo "Invalid combination -d ${DBMS} -a ${DATABASE_DRIVER}" >&2
|
|
echo >&2
|
|
echo "Use \".Build/Scripts/runTests.sh -h\" to display help and valid options" >&2
|
|
exit 1
|
|
fi
|
|
if [ -n "${DBMS_VERSION}" ]; then
|
|
echo "Invalid combination -d ${DBMS} -i ${DATABASE_DRIVER}" >&2
|
|
echo >&2
|
|
echo "Use \".Build/Scripts/runTests.sh -h\" to display help and valid options" >&2
|
|
exit 1
|
|
fi
|
|
;;
|
|
*)
|
|
echo "Invalid option -d ${DBMS}" >&2
|
|
echo >&2
|
|
echo "Use \".Build/Scripts/runTests.sh -h\" to display help and valid options" >&2
|
|
exit 1
|
|
;;
|
|
esac
|
|
}
|
|
|
|
cleanCacheFiles() {
|
|
echo -n "Clean caches ... "
|
|
rm -rf \
|
|
.Build/.cache \
|
|
.php-cs-fixer.cache
|
|
echo "done"
|
|
}
|
|
|
|
cleanTestFiles() {
|
|
# test related
|
|
echo -n "Clean test related files ... "
|
|
rm -rf \
|
|
.Build/Web/typo3temp/var/tests/
|
|
echo "done"
|
|
}
|
|
|
|
cleanRenderedDocumentationFiles() {
|
|
echo -n "Clean rendered documentation files ... "
|
|
rm -rf \
|
|
Documentation-GENERATED-temp
|
|
echo "done"
|
|
}
|
|
|
|
loadHelp() {
|
|
# Load help text into $HELP
|
|
read -r -d '' HELP <<EOF
|
|
TYPO3 core test runner. Execute unit, functional and other test suites in
|
|
a container based test environment. Handles execution of single test files,
|
|
sending xdebug information to a local IDE and more.
|
|
|
|
Usage: $0 [options] [file]
|
|
|
|
Options:
|
|
-s <...>
|
|
Specifies which test suite to run
|
|
- cgl: Checks the code style with the PHP Coding Standards Fixer (PHP-CS-Fixer).
|
|
- cglFix: Fixes the code style with PHP-CS-Fixer."
|
|
- clean: clean up build, cache and testing related files and folders
|
|
- cleanCache: clean up cache related files and folders
|
|
- cleanRenderedDocumentation: clean up rendered documentation files and folders (Documentation-GENERATED-temp)
|
|
- cleanTests: clean up test related files and folders
|
|
- composer: "composer" with all remaining arguments dispatched.
|
|
- composerInstallMax: "composer update", with no platform.php config.
|
|
- composerInstallMin: "composer update --prefer-lowest", with platform.php set to PHP version x.x.0.
|
|
- docsGenerate: Renders the extension ReST documentation.
|
|
- functional: PHP functional tests
|
|
- lintTypoScript: TypoScript linting
|
|
- lintPhp: PHP linting
|
|
- lintJson: JSON linting
|
|
- lintYaml: YAML linting
|
|
- phpstan: phpstan tests
|
|
- phpstanGenerateBaseline: regenerate phpstan baseline, handy after phpstan updates
|
|
- unit (default): PHP unit tests
|
|
- unitRandom: PHP unit tests in random order, add -o <number> to use specific seed
|
|
|
|
-a <mysqli|pdo_mysql>
|
|
Only with -s functional|functionalDeprecated
|
|
Specifies to use another driver, following combinations are available:
|
|
- mysql
|
|
- mysqli (default)
|
|
- pdo_mysql
|
|
- mariadb
|
|
- mysqli (default)
|
|
- pdo_mysql
|
|
|
|
-b <docker|podman>
|
|
Container environment:
|
|
- docker (default)
|
|
- podman
|
|
|
|
-d <sqlite|mariadb|mysql|postgres>
|
|
Only with -s functional|functionalDeprecated
|
|
Specifies on which DBMS tests are performed
|
|
- sqlite: (default): use sqlite
|
|
- mariadb: use mariadb
|
|
- mysql: use MySQL
|
|
- postgres: use postgres
|
|
|
|
-i version
|
|
Specify a specific database version
|
|
With "-d mariadb":
|
|
- 10.3 short-term, maintained until 2023-05-25 (default)
|
|
- 10.4 short-term, maintained until 2024-06-18
|
|
- 10.5 short-term, maintained until 2025-06-24
|
|
- 10.6 long-term, maintained until 2026-06
|
|
- 10.7 short-term, no longer maintained
|
|
- 10.8 short-term, maintained until 2023-05
|
|
- 10.9 short-term, maintained until 2023-08
|
|
- 10.10 short-term, maintained until 2023-11
|
|
- 10.11 long-term, maintained until 2028-02
|
|
- 11.0 development series
|
|
- 11.1 short-term development series
|
|
With "-d mysql":
|
|
- 5.5 unmaintained since 2018-12
|
|
- 5.6 unmaintained since 2021-02
|
|
- 5.7 maintained until 2023-10
|
|
- 8.0 maintained until 2026-04 (default)
|
|
With "-d postgres":
|
|
- 10 unmaintained since 2022-11-10 (default)
|
|
- 11 maintained until 2023-11-09
|
|
- 12 maintained until 2024-11-14
|
|
- 13 maintained until 2025-11-13
|
|
- 14 maintained until 2026-11-12
|
|
- 15 maintained until 2027-11-11
|
|
|
|
-t <11.5|12.4>
|
|
Only with -s composerInstall|composerInstallMin|composerInstallMax
|
|
Specifies the TYPO3 CORE Version to be used
|
|
- 11: (default) use TYPO3 v11 with typo3/cms-composer-installers ^3
|
|
- 12: use TYPO3 v12 with typo3/cms-composer-installers ^5
|
|
|
|
-p <7.4|8.0|8.1|8.2|8.3>
|
|
Specifies the PHP minor version to be used
|
|
- 7.4: use PHP 7.4
|
|
- 8.0: use PHP 8.0
|
|
- 8.1: (default) use PHP 8.1
|
|
- 8.2: use PHP 8.2
|
|
- 8.3: use PHP 8.3
|
|
|
|
-e "<phpunit options>"
|
|
Only with -s functional|functionalDeprecated|unit|unitDeprecated|unitRandom
|
|
Additional options to send to phpunit (unit & functional tests). For phpunit,
|
|
options starting with "--" must be added after options starting with "-".
|
|
Example -e "-v --filter canRetrieveValueWithGP" to enable verbose output AND filter tests
|
|
named "canRetrieveValueWithGP"
|
|
|
|
-x
|
|
Only with -s functional|functionalDeprecated|unit|unitDeprecated|unitRandom
|
|
Send information to host instance for test or system under test break points. This is especially
|
|
useful if a local PhpStorm instance is listening on default xdebug port 9003. A different port
|
|
can be selected with -y
|
|
|
|
-y <port>
|
|
Send xdebug information to a different port than default 9003 if an IDE like PhpStorm
|
|
is not listening on default port.
|
|
|
|
-o <number>
|
|
Only with -s unitRandom
|
|
Set specific random seed to replay a random run in this order again. The phpunit randomizer
|
|
outputs the used seed at the end (in gitlab core testing logs, too). Use that number to
|
|
replay the unit tests in that order.
|
|
|
|
-n
|
|
Only with -s cgl|composerNormalize
|
|
Activate dry-run in CGL check that does not actively change files and only prints broken ones.
|
|
|
|
-u
|
|
Update existing typo3/core-testing-*:latest container images and remove dangling local volumes.
|
|
New images are published once in a while and only the latest ones are supported by core testing.
|
|
Use this if weird test errors occur. Also removes obsolete image versions of typo3/core-testing-*.
|
|
|
|
-h
|
|
Show this help.
|
|
|
|
Examples:
|
|
# Run all core unit tests using PHP 8.1
|
|
./Build/Scripts/runTests.sh
|
|
./Build/Scripts/runTests.sh -s unit
|
|
|
|
# Run all core units tests and enable xdebug (have a PhpStorm listening on port 9003!)
|
|
./Build/Scripts/runTests.sh -x
|
|
|
|
# Run unit tests in phpunit verbose mode with xdebug on PHP 8.1 and filter for test canRetrieveValueWithGP
|
|
./Build/Scripts/runTests.sh -x -p 8.1 -e "-v --filter canRetrieveValueWithGP"
|
|
|
|
# Run functional tests in phpunit with a filtered test method name in a specified file
|
|
# example will currently execute two tests, both of which start with the search term
|
|
./Build/Scripts/runTests.sh -s functional -e "--filter deleteContent" typo3/sysext/core/Tests/Functional/DataHandling/Regular/Modify/ActionTest.php
|
|
|
|
# Run functional tests on postgres with xdebug, php 8.1 and execute a restricted set of tests
|
|
./Build/Scripts/runTests.sh -x -p 8.1 -s functional -d postgres typo3/sysext/core/Tests/Functional/Authentication
|
|
|
|
# Run functional tests on postgres 11
|
|
./Build/Scripts/runTests.sh -s functional -d postgres -i 11
|
|
EOF
|
|
}
|
|
|
|
# Test if docker exists, else exit out with error
|
|
if ! type "docker" >/dev/null 2>&1 && ! type "podman" >/dev/null 2>&1; then
|
|
echo "This script relies on docker or podman. Please install at least one of them" >&2
|
|
exit 1
|
|
fi
|
|
|
|
# Go to the directory this script is located, so everything else is relative
|
|
# to this dir, no matter from where this script is called, then go up two dirs.
|
|
THIS_SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null && pwd)"
|
|
cd "$THIS_SCRIPT_DIR" || exit 1
|
|
cd ../../ || exit 1
|
|
ROOT_DIR="${PWD}"
|
|
|
|
# Option defaults
|
|
TEST_SUITE="unit"
|
|
CORE_VERSION="11.5"
|
|
DBMS="sqlite"
|
|
DBMS_VERSION=""
|
|
PHP_VERSION="8.1"
|
|
PHP_XDEBUG_ON=0
|
|
PHP_XDEBUG_PORT=9003
|
|
EXTRA_TEST_OPTIONS=""
|
|
PHPUNIT_RANDOM=""
|
|
CGLCHECK_DRY_RUN=0
|
|
DATABASE_DRIVER=""
|
|
CONTAINER_BIN=""
|
|
DEFAULT_CONTAINER_BIN="docker"
|
|
DEFAULT_CI_CONTAINER_BIN="docker"
|
|
COMPOSER_ROOT_VERSION="3.0.x-dev"
|
|
CONTAINER_INTERACTIVE="-it --init"
|
|
HOST_UID=$(id -u)
|
|
HOST_PID=$(id -g)
|
|
USERSET=""
|
|
SUFFIX=$(echo $RANDOM)
|
|
NETWORK="friendsoftypo3-tea-${SUFFIX}"
|
|
CI_PARAMS=""
|
|
CONTAINER_HOST="host.docker.internal"
|
|
PHPSTAN_CONFIG_FILE="phpstan.neon"
|
|
IS_CORE_CI=0
|
|
|
|
# Option parsing updates above default vars
|
|
# Reset in case getopts has been used previously in the shell
|
|
OPTIND=1
|
|
# Array for invalid options
|
|
INVALID_OPTIONS=()
|
|
# Simple option parsing based on getopts (! not getopt)
|
|
while getopts "a:b:s:d:i:p:e:t:xy:o:nhu" OPT; do
|
|
case ${OPT} in
|
|
s)
|
|
TEST_SUITE=${OPTARG}
|
|
;;
|
|
a)
|
|
DATABASE_DRIVER=${OPTARG}
|
|
;;
|
|
b)
|
|
if ! [[ ${OPTARG} =~ ^(docker|podman)$ ]]; then
|
|
INVALID_OPTIONS+=("-b ${OPTARG}")
|
|
fi
|
|
CONTAINER_BIN=${OPTARG}
|
|
;;
|
|
d)
|
|
DBMS=${OPTARG}
|
|
;;
|
|
i)
|
|
DBMS_VERSION=${OPTARG}
|
|
;;
|
|
p)
|
|
PHP_VERSION=${OPTARG}
|
|
if ! [[ ${PHP_VERSION} =~ ^(7.4|8.0|8.1|8.2|8.3)$ ]]; then
|
|
INVALID_OPTIONS+=("-p ${OPTARG}")
|
|
fi
|
|
;;
|
|
e)
|
|
EXTRA_TEST_OPTIONS=${OPTARG}
|
|
;;
|
|
t)
|
|
CORE_VERSION=${OPTARG}
|
|
if ! [[ ${CORE_VERSION} =~ ^(11.5|12.4)$ ]]; then
|
|
INVALID_OPTIONS+=("-t ${OPTARG}")
|
|
fi
|
|
;;
|
|
x)
|
|
PHP_XDEBUG_ON=1
|
|
;;
|
|
y)
|
|
PHP_XDEBUG_PORT=${OPTARG}
|
|
;;
|
|
o)
|
|
PHPUNIT_RANDOM="--random-order-seed=${OPTARG}"
|
|
;;
|
|
n)
|
|
CGLCHECK_DRY_RUN=1
|
|
;;
|
|
h)
|
|
loadHelp
|
|
echo "${HELP}"
|
|
exit 0
|
|
;;
|
|
u)
|
|
TEST_SUITE=update
|
|
;;
|
|
\?)
|
|
INVALID_OPTIONS+=("-${OPTARG}")
|
|
;;
|
|
:)
|
|
INVALID_OPTIONS+=("-${OPTARG}")
|
|
;;
|
|
esac
|
|
done
|
|
|
|
# Exit on invalid options
|
|
if [ ${#INVALID_OPTIONS[@]} -ne 0 ]; then
|
|
echo "Invalid option(s):" >&2
|
|
for I in "${INVALID_OPTIONS[@]}"; do
|
|
echo ${I} >&2
|
|
done
|
|
echo >&2
|
|
echo "call \".Build/Scripts/runTests.sh -h\" to display help and valid options"
|
|
exit 1
|
|
fi
|
|
|
|
handleDbmsOptions
|
|
|
|
# ENV var "CI" is set by gitlab-ci. Use it to force some CI details.
|
|
if [ "${CI}" == "true" ]; then
|
|
IS_CORE_CI=1
|
|
CONTAINER_INTERACTIVE=""
|
|
# set default ci container binary, if not set using "-b" option
|
|
if [ "${CONTAINER_BIN}" == "" ]; then
|
|
CONTAINER_BIN="${DEFAULT_CI_CONTAINER_BIN}"
|
|
fi
|
|
CI_PARAMS="--pull=never"
|
|
fi
|
|
|
|
# set default container binary, if not set using "-b" option
|
|
if [ "${CONTAINER_BIN}" == "" ]; then
|
|
CONTAINER_BIN="${DEFAULT_CONTAINER_BIN}"
|
|
fi
|
|
|
|
if [ $(uname) != "Darwin" ] && [ "${CONTAINER_BIN}" == "docker" ]; then
|
|
# Run docker jobs as current user to prevent permission issues. Not needed with podman.
|
|
USERSET="--user $HOST_UID"
|
|
fi
|
|
|
|
if ! type ${CONTAINER_BIN} >/dev/null 2>&1; then
|
|
echo "Selected container environment \"${CONTAINER_BIN}\" not found. Please install \"${CONTAINER_BIN}\" or use -b option to select one." >&2
|
|
exit 1
|
|
fi
|
|
|
|
# Create .cache dir: composer need this.
|
|
mkdir -p .cache
|
|
mkdir -p .Build/Web/typo3temp/var/tests
|
|
|
|
IMAGE_PHP="ghcr.io/sbuerk/demo-core-testing-$(echo "php${PHP_VERSION}" | sed -e 's/\.//'):latest"
|
|
IMAGE_ALPINE="docker.io/alpine:3.8"
|
|
IMAGE_DOCS="ghcr.io/t3docs/render-documentation:latest"
|
|
IMAGE_MARIADB="docker.io/mariadb:${DBMS_VERSION}"
|
|
IMAGE_MYSQL="docker.io/mysql:${DBMS_VERSION}"
|
|
IMAGE_POSTGRES="docker.io/postgres:${DBMS_VERSION}-alpine"
|
|
|
|
# Set $1 to first mass argument, this is the optional test file or test directory to execute
|
|
shift $((OPTIND - 1))
|
|
TEST_FILE=${1}
|
|
|
|
${CONTAINER_BIN} network create ${NETWORK} >/dev/null
|
|
|
|
if [ "${CONTAINER_BIN}" == "docker" ]; then
|
|
CONTAINER_COMMON_PARAMS="${CONTAINER_INTERACTIVE} --rm --network ${NETWORK} --add-host "${CONTAINER_HOST}:host-gateway" ${USERSET} -v ${ROOT_DIR}:${ROOT_DIR} -w ${ROOT_DIR}"
|
|
else
|
|
# podman
|
|
CONTAINER_HOST="host.containers.internal"
|
|
CONTAINER_COMMON_PARAMS="${CONTAINER_INTERACTIVE} ${CI_PARAMS} --rm --network ${NETWORK} -v ${ROOT_DIR}:${ROOT_DIR} -w ${ROOT_DIR}"
|
|
fi
|
|
|
|
if [ ${PHP_XDEBUG_ON} -eq 0 ]; then
|
|
XDEBUG_MODE="-e XDEBUG_MODE=off"
|
|
XDEBUG_CONFIG=" "
|
|
else
|
|
XDEBUG_MODE="-e XDEBUG_MODE=debug -e XDEBUG_TRIGGER=foo"
|
|
XDEBUG_CONFIG="client_port=${PHP_XDEBUG_PORT} client_host=host.docker.internal"
|
|
fi
|
|
|
|
# Suite execution
|
|
case ${TEST_SUITE} in
|
|
cgl)
|
|
if [ "${CGLCHECK_DRY_RUN}" -eq 1 ]; then
|
|
COMMAND="composer ci:php:cs-fixer"
|
|
else
|
|
COMMAND="composer fix:php:cs"
|
|
fi
|
|
${CONTAINER_BIN} run ${CONTAINER_COMMON_PARAMS} --name composer-command-${SUFFIX} -e COMPOSER_CACHE_DIR=.cache/composer -e COMPOSER_ROOT_VERSION=${COMPOSER_ROOT_VERSION} ${IMAGE_PHP} /bin/sh -c "${COMMAND}"
|
|
SUITE_EXIT_CODE=$?
|
|
;;
|
|
clean)
|
|
cleanCacheFiles
|
|
cleanRenderedDocumentationFiles
|
|
cleanTestFiles
|
|
;;
|
|
cleanCache)
|
|
cleanCacheFiles
|
|
;;
|
|
cleanRenderedDocumentation)
|
|
cleanRenderedDocumentationFiles
|
|
;;
|
|
cleanTests)
|
|
cleanTestFiles
|
|
;;
|
|
composer)
|
|
COMMAND="composer $@"
|
|
${CONTAINER_BIN} run ${CONTAINER_COMMON_PARAMS} --name composer-command-${SUFFIX} -e COMPOSER_CACHE_DIR=.cache/composer -e COMPOSER_ROOT_VERSION=${COMPOSER_ROOT_VERSION} ${IMAGE_PHP} /bin/sh -c "${COMMAND}"
|
|
SUITE_EXIT_CODE=$?
|
|
;;
|
|
composerInstall)
|
|
COMMAND="composer install"
|
|
${CONTAINER_BIN} run ${CONTAINER_COMMON_PARAMS} --name composer-install-${SUFFIX} -e COMPOSER_CACHE_DIR=.cache/composer -e COMPOSER_ROOT_VERSION=${COMPOSER_ROOT_VERSION} ${IMAGE_PHP} /bin/sh -c "${COMMAND}"
|
|
SUITE_EXIT_CODE=$?
|
|
;;
|
|
composerInstallMax)
|
|
COMMAND="composer config --unset platform.php; composer require --no-ansi --no-interaction --no-progress --no-install typo3/cms-core:"^${CORE_VERSION}"; composer update --no-progress --no-interaction; composer dumpautoload; composer show"
|
|
${CONTAINER_BIN} run ${CONTAINER_COMMON_PARAMS} --name composer-install-max-${SUFFIX} -e COMPOSER_CACHE_DIR=.cache/composer -e COMPOSER_ROOT_VERSION=${COMPOSER_ROOT_VERSION} ${IMAGE_PHP} /bin/sh -c "${COMMAND}"
|
|
SUITE_EXIT_CODE=$?
|
|
;;
|
|
composerInstallMin)
|
|
COMMAND="composer config platform.php ${PHP_VERSION}.0; composer require --no-ansi --no-interaction --no-progress --no-install typo3/cms-core:"^${CORE_VERSION}"; composer update --prefer-lowest --no-progress --no-interaction; composer dumpautoload; composer show"
|
|
${CONTAINER_BIN} run ${CONTAINER_COMMON_PARAMS} --name composer-install-min-${SUFFIX} -e COMPOSER_CACHE_DIR=.cache/composer -e COMPOSER_ROOT_VERSION=${COMPOSER_ROOT_VERSION} ${IMAGE_PHP} /bin/sh -c "${COMMAND}"
|
|
SUITE_EXIT_CODE=$?
|
|
;;
|
|
composerNormalize)
|
|
COMMAND="composer ci:composer:normalize"
|
|
if [ "${CGLCHECK_DRY_RUN}" -eq 1 ]; then
|
|
COMMAND="composer ci:composer:normalize"
|
|
else
|
|
COMMAND="composer fix:composer:normalize"
|
|
fi
|
|
${CONTAINER_BIN} run ${CONTAINER_COMMON_PARAMS} --name composer-normalize-${SUFFIX} -e COMPOSER_CACHE_DIR=.cache/composer -e COMPOSER_ROOT_VERSION=${COMPOSER_ROOT_VERSION} ${IMAGE_DOCS} /bin/sh -c "${COMMAND}"
|
|
SUITE_EXIT_CODE=$?
|
|
;;
|
|
docsGenerate)
|
|
# @todo contact the documentation team for a future rootles podman version
|
|
if [ "${CONTAINER_BIN}" == "podman" ]; then
|
|
echo "-s docsGenerate is not usable with -b podman"
|
|
echo "TYPO3 Documentation Team needs to deal with this, and we will"
|
|
echo "see if the upcoming php based documentation rendering container"
|
|
echo "will support podman out-of-the-box"
|
|
echo ""
|
|
echo "Please use -b docker -s docsGenerate"
|
|
SUITE_EXIT_CODE=1
|
|
else
|
|
${CONTAINER_BIN} run --rm ${IMAGE_DOCS} show-shell-commands > generate-documentation.sh
|
|
echo 'dockrun_t3rd makehtml' >> generate-documentation.sh
|
|
bash generate-documentation.sh
|
|
rm -Rf generate-documentation.sh
|
|
SUITE_EXIT_CODE=$?
|
|
fi
|
|
;;
|
|
functional)
|
|
[ -z "${TEST_FILE}" ] && TEST_FILE="Tests/Functional"
|
|
COMMAND=".Build/bin/phpunit -c .Build/vendor/typo3/testing-framework/Resources/Core/Build/FunctionalTests.xml --exclude-group not-${DBMS} ${EXTRA_TEST_OPTIONS} ${TEST_FILE}"
|
|
case ${DBMS} in
|
|
mariadb)
|
|
echo "Using driver: ${DATABASE_DRIVER}"
|
|
${CONTAINER_BIN} run --rm ${CI_PARAMS} --name mariadb-func-${SUFFIX} --network ${NETWORK} -d -e MYSQL_ROOT_PASSWORD=funcp --tmpfs /var/lib/mysql/:rw,noexec,nosuid ${IMAGE_MARIADB} >/dev/null
|
|
waitFor mariadb-func-${SUFFIX} 3306
|
|
CONTAINERPARAMS="-e typo3DatabaseDriver=${DATABASE_DRIVER} -e typo3DatabaseName=func_test -e typo3DatabaseUsername=root -e typo3DatabaseHost=mariadb-func-${SUFFIX} -e typo3DatabasePassword=funcp"
|
|
${CONTAINER_BIN} run ${CONTAINER_COMMON_PARAMS} --name functional-${SUFFIX} ${XDEBUG_MODE} -e XDEBUG_CONFIG="${XDEBUG_CONFIG}" ${CONTAINERPARAMS} ${IMAGE_PHP} ${COMMAND}
|
|
SUITE_EXIT_CODE=$?
|
|
;;
|
|
mysql)
|
|
echo "Using driver: ${DATABASE_DRIVER}"
|
|
${CONTAINER_BIN} run --rm ${CI_PARAMS} --name mysql-func-${SUFFIX} --network ${NETWORK} -d -e MYSQL_ROOT_PASSWORD=funcp --tmpfs /var/lib/mysql/:rw,noexec,nosuid ${IMAGE_MYSQL} >/dev/null
|
|
waitFor mysql-func-${SUFFIX} 3306
|
|
CONTAINERPARAMS="-e typo3DatabaseDriver=${DATABASE_DRIVER} -e typo3DatabaseName=func_test -e typo3DatabaseUsername=root -e typo3DatabaseHost=mysql-func-${SUFFIX} -e typo3DatabasePassword=funcp"
|
|
${CONTAINER_BIN} run ${CONTAINER_COMMON_PARAMS} --name functional-${SUFFIX} ${XDEBUG_MODE} -e XDEBUG_CONFIG="${XDEBUG_CONFIG}" ${CONTAINERPARAMS} ${IMAGE_PHP} ${COMMAND}
|
|
SUITE_EXIT_CODE=$?
|
|
;;
|
|
postgres)
|
|
${CONTAINER_BIN} run --rm ${CI_PARAMS} --name postgres-func-${SUFFIX} --network ${NETWORK} -d -e POSTGRES_PASSWORD=funcp -e POSTGRES_USER=funcu --tmpfs /var/lib/postgresql/data:rw,noexec,nosuid ${IMAGE_POSTGRES} >/dev/null
|
|
waitFor postgres-func-${SUFFIX} 5432
|
|
CONTAINERPARAMS="-e typo3DatabaseDriver=pdo_pgsql -e typo3DatabaseName=bamboo -e typo3DatabaseUsername=funcu -e typo3DatabaseHost=postgres-func-${SUFFIX} -e typo3DatabasePassword=funcp"
|
|
${CONTAINER_BIN} run ${CONTAINER_COMMON_PARAMS} --name functional-${SUFFIX} ${XDEBUG_MODE} -e XDEBUG_CONFIG="${XDEBUG_CONFIG}" ${CONTAINERPARAMS} ${IMAGE_PHP} ${COMMAND}
|
|
SUITE_EXIT_CODE=$?
|
|
;;
|
|
sqlite)
|
|
# create sqlite tmpfs mount typo3temp/var/tests/functional-sqlite-dbs/ to avoid permission issues
|
|
mkdir -p "${ROOT_DIR}/typo3temp/var/tests/functional-sqlite-dbs/"
|
|
CONTAINERPARAMS="-e typo3DatabaseDriver=pdo_sqlite --tmpfs ${ROOT_DIR}/typo3temp/var/tests/functional-sqlite-dbs/:rw,noexec,nosuid"
|
|
${CONTAINER_BIN} run ${CONTAINER_COMMON_PARAMS} --name functional-${SUFFIX} ${XDEBUG_MODE} -e XDEBUG_CONFIG="${XDEBUG_CONFIG}" ${CONTAINERPARAMS} ${IMAGE_PHP} ${COMMAND}
|
|
SUITE_EXIT_CODE=$?
|
|
;;
|
|
esac
|
|
;;
|
|
lintTypoScript)
|
|
COMMAND="composer ci:ts:lint"
|
|
${CONTAINER_BIN} run ${CONTAINER_COMMON_PARAMS} --name composer-command-${SUFFIX} -e COMPOSER_CACHE_DIR=.cache/composer -e COMPOSER_ROOT_VERSION=${COMPOSER_ROOT_VERSION} ${IMAGE_PHP} /bin/sh -c "${COMMAND}"
|
|
SUITE_EXIT_CODE=$?
|
|
;;
|
|
lintPhp)
|
|
COMMAND="composer ci:php:lint"
|
|
${CONTAINER_BIN} run ${CONTAINER_COMMON_PARAMS} --name composer-command-${SUFFIX} -e COMPOSER_CACHE_DIR=.cache/composer -e COMPOSER_ROOT_VERSION=${COMPOSER_ROOT_VERSION} ${IMAGE_PHP} /bin/sh -c "${COMMAND}"
|
|
SUITE_EXIT_CODE=$?
|
|
;;
|
|
lintJson)
|
|
COMMAND="composer ci:json:lint"
|
|
${CONTAINER_BIN} run ${CONTAINER_COMMON_PARAMS} --name composer-command-${SUFFIX} -e COMPOSER_CACHE_DIR=.cache/composer -e COMPOSER_ROOT_VERSION=${COMPOSER_ROOT_VERSION} ${IMAGE_PHP} /bin/sh -c "${COMMAND}"
|
|
SUITE_EXIT_CODE=$?
|
|
;;
|
|
lintYaml)
|
|
COMMAND="composer ci:yaml:lint"
|
|
${CONTAINER_BIN} run ${CONTAINER_COMMON_PARAMS} --name composer-command-${SUFFIX} -e COMPOSER_CACHE_DIR=.cache/composer -e COMPOSER_ROOT_VERSION=${COMPOSER_ROOT_VERSION} ${IMAGE_PHP} /bin/sh -c "${COMMAND}"
|
|
SUITE_EXIT_CODE=$?
|
|
;;
|
|
phpstan)
|
|
COMMAND="composer ci:php:stan"
|
|
${CONTAINER_BIN} run ${CONTAINER_COMMON_PARAMS} --name composer-command-${SUFFIX} -e COMPOSER_CACHE_DIR=.cache/composer -e COMPOSER_ROOT_VERSION=${COMPOSER_ROOT_VERSION} ${IMAGE_PHP} /bin/sh -c "${COMMAND}"
|
|
SUITE_EXIT_CODE=$?
|
|
;;
|
|
phpstanGenerateBaseline)
|
|
COMMAND="composer phpstan:baseline"
|
|
${CONTAINER_BIN} run ${CONTAINER_COMMON_PARAMS} --name composer-command-${SUFFIX} -e COMPOSER_CACHE_DIR=.cache/composer -e COMPOSER_ROOT_VERSION=${COMPOSER_ROOT_VERSION} ${IMAGE_PHP} /bin/sh -c "${COMMAND}"
|
|
SUITE_EXIT_CODE=$?
|
|
;;
|
|
unit)
|
|
[ -z "${TEST_FILE}" ] && TEST_FILE="Tests/Unit"
|
|
${CONTAINER_BIN} run ${CONTAINER_COMMON_PARAMS} --name unit-${SUFFIX} ${XDEBUG_MODE} -e XDEBUG_CONFIG="${XDEBUG_CONFIG}" ${IMAGE_PHP} .Build/bin/phpunit -c .Build/vendor/typo3/testing-framework/Resources/Core/Build/UnitTests.xml ${EXTRA_TEST_OPTIONS} ${TEST_FILE}
|
|
SUITE_EXIT_CODE=$?
|
|
;;
|
|
unitRandom)
|
|
[ -z "${TEST_FILE}" ] && TEST_FILE="Tests/Unit"
|
|
${CONTAINER_BIN} run ${CONTAINER_COMMON_PARAMS} --name unit-random-${SUFFIX} ${XDEBUG_MODE} -e XDEBUG_CONFIG="${XDEBUG_CONFIG}" ${IMAGE_PHP} .Build/bin/phpunit -c .Build/vendor/typo3/testing-framework/Resources/Core/Build/UnitTests.xml --order-by=random ${EXTRA_TEST_OPTIONS} ${PHPUNIT_RANDOM} ${TEST_FILE}
|
|
SUITE_EXIT_CODE=$?
|
|
;;
|
|
update)
|
|
# pull typo3/core-testing-*:latest versions of those ones that exist locally
|
|
echo "> pull ghcr.io/sbuerk/demo-core-testing-*:latest versions of those ones that exist locally"
|
|
${CONTAINER_BIN} images ghcr.io/sbuerk/demo-core-testing-*:latest --format "{{.Repository}}:latest" | xargs -I {} ${CONTAINER_BIN} pull {}
|
|
echo ""
|
|
# remove "dangling" typo3/core-testing-* images (those tagged as <none>)
|
|
echo "> remove \"dangling\" ghcr.io/sbuerk/demo-core-testing-* images (those tagged as <none>)"
|
|
${CONTAINER_BIN} images --filter "reference=ghcr.io/sbuerk/demo-core-testing-*" --filter "dangling=true" --format "{{.ID}}" | xargs -I {} ${CONTAINER_BIN} rmi {}
|
|
echo ""
|
|
;;
|
|
*)
|
|
loadHelp
|
|
echo "Invalid -s option argument ${TEST_SUITE}" >&2
|
|
echo >&2
|
|
echo "${HELP}" >&2
|
|
exit 1
|
|
;;
|
|
esac
|
|
|
|
cleanUp
|
|
|
|
# Print summary
|
|
echo "" >&2
|
|
echo "###########################################################################" >&2
|
|
echo "Result of ${TEST_SUITE}" >&2
|
|
if [[ ${IS_CORE_CI} -eq 1 ]]; then
|
|
echo "Environment: CI" >&2
|
|
else
|
|
echo "Environment: local" >&2
|
|
fi
|
|
echo "PHP: ${PHP_VERSION}" >&2
|
|
echo "TYPO3: ${CORE_VERSION}" >&2
|
|
echo "CONTAINER_BIN: ${CONTAINER_BIN}"
|
|
if [[ ${TEST_SUITE} =~ ^functional$ ]]; then
|
|
case "${DBMS}" in
|
|
mariadb)
|
|
echo "DBMS: ${DBMS} version ${MARIADB_VERSION} driver ${DATABASE_DRIVER}" >&2
|
|
;;
|
|
mysql)
|
|
echo "DBMS: ${DBMS} version ${MYSQL_VERSION} driver ${DATABASE_DRIVER}" >&2
|
|
;;
|
|
postgres)
|
|
echo "DBMS: ${DBMS} version ${POSTGRES_VERSION}" >&2
|
|
;;
|
|
sqlite)
|
|
echo "DBMS: ${DBMS}" >&2
|
|
;;
|
|
esac
|
|
fi
|
|
if [[ ${SUITE_EXIT_CODE} -eq 0 ]]; then
|
|
echo "SUCCESS" >&2
|
|
else
|
|
echo "FAILURE" >&2
|
|
fi
|
|
echo "###########################################################################" >&2
|
|
echo "" >&2
|
|
|
|
# Exit with code of test suite - This script return non-zero if the executed test failed.
|
|
exit $SUITE_EXIT_CODE
|