diff --git a/Build/Scripts/runTests.sh b/Build/Scripts/runTests.sh index e846e5f58bc6..5afa8f2ded7c 100755 --- a/Build/Scripts/runTests.sh +++ b/Build/Scripts/runTests.sh @@ -1,7 +1,7 @@ #!/usr/bin/env bash # -# TYPO3 core test runner based on docker. +# TYPO3 core test runner based on docker or podman # waitFor() { @@ -24,6 +24,7 @@ waitFor() { 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 ${CONTAINER_BIN} rm -f ${ATTACHED_CONTAINER} >/dev/null done ${CONTAINER_BIN} network rm ${NETWORK} >/dev/null @@ -213,6 +214,11 @@ Options: - unitJavascript: JavaScript unit tests - unitRandom: PHP unit tests in random order, add -o to use specific seed + -b + Container environment: + - docker (default) + - podman + -a Only with -s functional|functionalDeprecated Specifies to use another driver, following combinations are available: @@ -249,7 +255,7 @@ Options: - 10.9 short-term, maintained until 2023-08 - 10.10 short-term, maintained until 2023-11 - 10.11 long-term, maintained until 2028-02 - With "-d mariadb": + With "-d mysql": - 5.5 unmaintained since 2018-12 (default) - 5.6 unmaintained since 2021-02 - 5.7 maintained until 2023-10 @@ -352,12 +358,19 @@ EOF } # Test if docker exists, else exit out with error -if ! type "docker" >/dev/null; then - echo "This script relies on docker. Please install" >&2 +if ! type "docker" >/dev/null 2>&1 && ! type "podman" >/dev/null 2>&1; then + echo "This script relies on docker or podman. Please install" >&2 exit 1 fi -# Option defaults +# 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 +CORE_ROOT="${PWD}" + +# Default variables TEST_SUITE="unit" DBMS="sqlite" DBMS_VERSION="" @@ -372,6 +385,16 @@ DATABASE_DRIVER="" CHUNKS=0 THISCHUNK=0 CONTAINER_BIN="docker" +COMPOSER_ROOT_VERSION="11.5.x-dev" +PHPSTAN_CONFIG_FILE="phpstan.local.neon" +CONTAINER_INTERACTIVE="-it --init" +HOST_UID=$(id -u) +HOST_PID=$(id -g) +USERSET="" +SUFFIX=$(echo $RANDOM) +NETWORK="typo3-core-${SUFFIX}" +CI_PARAMS="" +CONTAINER_HOST="host.docker.internal" # Option parsing updates above default vars # Reset in case getopts has been used previously in the shell @@ -379,11 +402,17 @@ OPTIND=1 # Array for invalid options INVALID_OPTIONS=() # Simple option parsing based on getopts (! not getopt) -while getopts ":a:s:c:d:i:p:e:xy:o:nhug" OPT; do +while getopts ":a:b:s:c:d:i:p:e:xy:o:nhug" OPT; do case ${OPT} in s) TEST_SUITE=${OPTARG} ;; + b) + if ! [[ ${OPTARG} =~ ^(docker|podman)$ ]]; then + INVALID_OPTIONS+=("${OPTARG}") + fi + CONTAINER_BIN=${OPTARG} + ;; a) DATABASE_DRIVER=${OPTARG} ;; @@ -456,80 +485,71 @@ fi handleDbmsOptions -COMPOSER_ROOT_VERSION="11.5.x-dev" -HOST_UID=$(id -u) -USERSET="" -if [ $(uname) != "Darwin" ]; then - USERSET="--user $HOST_UID" -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 -CORE_ROOT="${PWD}" - -# Create .cache dir: composer and various npm jobs need this. -mkdir -p .cache -mkdir -p typo3temp/var/tests - -PHPSTAN_CONFIG_FILE="phpstan.local.neon" -IMAGE_PREFIX="docker.io/" -# Non-CI fetches TYPO3 images (php and nodejs) from ghcr.io -TYPO3_IMAGE_PREFIX="ghcr.io/" -CONTAINER_INTERACTIVE="-it --init" - -IS_CORE_CI=0 -# ENV var "CI" is set by gitlab-ci. We use it here to distinct 'local' and 'CI' environment. +# ENV var "CI" is set by gitlab-ci. Use it to force some CI details. if [ "${CI}" == "true" ]; then - IS_CORE_CI=1 PHPSTAN_CONFIG_FILE="phpstan.ci.neon" - # In CI, we need to pull images from docker.io for the registry proxy to kick in. - TYPO3_IMAGE_PREFIX="docker.io/" - IMAGE_PREFIX="" CONTAINER_INTERACTIVE="" + CONTAINER_BIN="podman" + CI_PARAMS="--pull=never" fi -IMAGE_PHP="${TYPO3_IMAGE_PREFIX}typo3/core-testing-$(echo "php${PHP_VERSION}" | sed -e 's/\.//'):latest" -IMAGE_NODEJS="${TYPO3_IMAGE_PREFIX}typo3/core-testing-js:latest" -IMAGE_NODEJS_CHROME="${TYPO3_IMAGE_PREFIX}typo3/core-testing-js-chrome:latest" -IMAGE_ALPINE="${IMAGE_PREFIX}alpine:3.8" -IMAGE_SELENIUM="${IMAGE_PREFIX}selenium/standalone-chrome:4.0.0-20211102" -IMAGE_REDIS="${IMAGE_PREFIX}redis:4-alpine" -IMAGE_MEMCACHED="${IMAGE_PREFIX}memcached:1.5-alpine" -IMAGE_MARIADB="${IMAGE_PREFIX}mariadb:${DBMS_VERSION}" -IMAGE_MYSQL="${IMAGE_PREFIX}mysql:${DBMS_VERSION}" -IMAGE_POSTGRES="${IMAGE_PREFIX}postgres:${DBMS_VERSION}-alpine" -IMAGE_MSSQL="${IMAGE_PREFIX}typo3/core-testing-mssql2019:latest" +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 or use -b option to select one." >&2 + exit 1 +fi + +IMAGE_PHP="ghcr.io/typo3/core-testing-$(echo "php${PHP_VERSION}" | sed -e 's/\.//'):latest" +IMAGE_NODEJS="ghcr.io/typo3/core-testing-js:latest" +IMAGE_NODEJS_CHROME="ghcr.io/typo3/core-testing-js-chrome:latest" +IMAGE_ALPINE="docker.io/alpine:3.8" +IMAGE_SELENIUM="docker.io/selenium/standalone-chrome:4.0.0-20211102" +IMAGE_REDIS="docker.io/redis:4-alpine" +IMAGE_MEMCACHED="docker.io/memcached:1.5-alpine" +IMAGE_MARIADB="docker.io/mariadb:${DBMS_VERSION}" +IMAGE_MYSQL="docker.io/mysql:${DBMS_VERSION}" +IMAGE_POSTGRES="docker.io/postgres:${DBMS_VERSION}-alpine" # Detect arm64 to use seleniarm image. ARCH=$(uname -m) if [ ${ARCH} = "arm64" ]; then - IMAGE_SELENIUM="${IMAGE_PREFIX}seleniarm/standalone-chromium:4.1.2-20220227" - echo "Architecture" ${ARCH} "requires" ${IMAGE_SELENIUM} "to run acceptance tests." + IMAGE_SELENIUM="docker.io/seleniarm/standalone-chromium:4.1.2-20220227" fi # Set $1 to first mass argument, this is the optional test file or test directory to execute shift $((OPTIND - 1)) TEST_FILE=${1} -SUFFIX=$(echo $RANDOM) -NETWORK="typo3-core-${SUFFIX}" +# Create .cache dir: composer and various npm jobs need this. +mkdir -p .cache +mkdir -p typo3temp/var/tests + ${CONTAINER_BIN} network create ${NETWORK} >/dev/null -CONTAINER_COMMON_PARAMS="${CONTAINER_INTERACTIVE} --rm --network $NETWORK --add-host "host.docker.internal:host-gateway" $USERSET -v ${CORE_ROOT}:${CORE_ROOT} -w ${CORE_ROOT}" COMPOSER_IGNORE_PLATFORM_REQ="" if [ "${PHP_VERSION}" = "8.3" ]; then COMPOSER_IGNORE_PLATFORM_REQ="--ignore-platform-req=php+" fi +if [ ${CONTAINER_BIN} = "docker" ]; then + # docker needs the add-host for xdebug remote debugging. podman has host.container.internal built in + CONTAINER_COMMON_PARAMS="${CONTAINER_INTERACTIVE} --rm --network ${NETWORK} --add-host "${CONTAINER_HOST}:host-gateway" ${USERSET} -v ${CORE_ROOT}:${CORE_ROOT} -w ${CORE_ROOT}" +else + # podman + CONTAINER_HOST="host.containers.internal" + CONTAINER_COMMON_PARAMS="${CONTAINER_INTERACTIVE} ${CI_PARAMS} --rm --network ${NETWORK} -v ${CORE_ROOT}:${CORE_ROOT} -w ${CORE_ROOT}" +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" + XDEBUG_CONFIG="client_port=${PHP_XDEBUG_PORT} client_host=${CONTAINER_HOST}" fi # Suite execution @@ -549,8 +569,8 @@ case ${TEST_SUITE} in if [ "${ACCEPTANCE_HEADLESS}" -eq 0 ]; then SELENIUM_GRID="-p 7900:7900 -e SE_VNC_NO_PASSWORD=1 -e VNC_NO_PASSWORD=1" fi - ${CONTAINER_BIN} run -d ${SELENIUM_GRID} --name ac-chrome-${SUFFIX} --network ${NETWORK} --network-alias chrome --tmpfs /dev/shm:rw,nosuid,nodev,noexec,relatime ${IMAGE_SELENIUM} >/dev/null - ${CONTAINER_BIN} run -d --name ac-web-${SUFFIX} --network ${NETWORK} --network-alias web --add-host "host.docker.internal:host-gateway" $USERSET -v ${CORE_ROOT}:${CORE_ROOT} ${XDEBUG_MODE} -e XDEBUG_CONFIG="${XDEBUG_CONFIG}" ${IMAGE_PHP} php -S web:8000 -t ${CORE_ROOT} >/dev/null + ${CONTAINER_BIN} run ${CI_PARAMS} -d ${SELENIUM_GRID} --name ac-chrome-${SUFFIX} --network ${NETWORK} --network-alias chrome --tmpfs /dev/shm:rw,nosuid,nodev,noexec ${IMAGE_SELENIUM} >/dev/null + ${CONTAINER_BIN} run ${CI_PARAMS} -d --name ac-web-${SUFFIX} --network ${NETWORK} --network-alias web --add-host "${CONTAINER_HOST}:host-gateway" ${USERSET} -v ${CORE_ROOT}:${CORE_ROOT} ${XDEBUG_MODE} -e XDEBUG_CONFIG="${XDEBUG_CONFIG}" ${IMAGE_PHP} php -S web:8000 -t ${CORE_ROOT} >/dev/null waitFor chrome 4444 waitFor chrome 7900 waitFor web 8000 @@ -561,23 +581,26 @@ case ${TEST_SUITE} in fi case ${DBMS} in mariadb) - ${CONTAINER_BIN} run --name mariadb-ac-${SUFFIX} --network ${NETWORK} -d -e MYSQL_ROOT_PASSWORD=funcp --tmpfs /var/lib/mysql/:rw,noexec,nosuid ${IMAGE_MARIADB} >/dev/null + ${CONTAINER_BIN} run ${CI_PARAMS} --name mariadb-ac-${SUFFIX} --network ${NETWORK} -d -e MYSQL_ROOT_PASSWORD=funcp --tmpfs /var/lib/mysql/:rw,noexec,nosuid ${IMAGE_MARIADB} >/dev/null + DATABASE_IP=$(${CONTAINER_BIN} inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' mariadb-ac-${SUFFIX}) waitFor mariadb-ac-${SUFFIX} 3306 - CONTAINERPARAMS="-e typo3DatabaseName=func_test -e typo3DatabaseUsername=root -e typo3DatabasePassword=funcp -e typo3DatabaseHost=mariadb-ac-${SUFFIX}" + CONTAINERPARAMS="-e typo3DatabaseName=func_test -e typo3DatabaseUsername=root -e typo3DatabasePassword=funcp -e typo3DatabaseHost=${DATABASE_IP}" ${CONTAINER_BIN} run ${CONTAINER_COMMON_PARAMS} --name ac-mariadb ${XDEBUG_MODE} -e XDEBUG_CONFIG="${XDEBUG_CONFIG}" ${CONTAINERPARAMS} ${IMAGE_PHP} ${COMMAND} SUITE_EXIT_CODE=$? ;; mysql) - ${CONTAINER_BIN} run --name mysql-ac-${SUFFIX} --network ${NETWORK} -d -e MYSQL_ROOT_PASSWORD=funcp --tmpfs /var/lib/mysql/:rw,noexec,nosuid ${IMAGE_MYSQL} >/dev/null + ${CONTAINER_BIN} run ${CI_PARAMS} --name mysql-ac-${SUFFIX} --network ${NETWORK} -d -e MYSQL_ROOT_PASSWORD=funcp --tmpfs /var/lib/mysql/:rw,noexec,nosuid ${IMAGE_MYSQL} >/dev/null + DATABASE_IP=$(${CONTAINER_BIN} inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' mysql-ac-${SUFFIX}) waitFor mysql-ac-${SUFFIX} 3306 - CONTAINERPARAMS="-e typo3DatabaseName=func_test -e typo3DatabaseUsername=root -e typo3DatabasePassword=funcp -e typo3DatabaseHost=mysql-ac-${SUFFIX}" + CONTAINERPARAMS="-e typo3DatabaseName=func_test -e typo3DatabaseUsername=root -e typo3DatabasePassword=funcp -e typo3DatabaseHost=${DATABASE_IP}" ${CONTAINER_BIN} run ${CONTAINER_COMMON_PARAMS} --name ac-mysql ${XDEBUG_MODE} -e XDEBUG_CONFIG="${XDEBUG_CONFIG}" ${CONTAINERPARAMS} ${IMAGE_PHP} ${COMMAND} SUITE_EXIT_CODE=$? ;; postgres) - ${CONTAINER_BIN} run --name postgres-ac-${SUFFIX} --network ${NETWORK} -d -e POSTGRES_PASSWORD=funcp -e POSTGRES_USER=funcu --tmpfs /var/lib/postgresql/data:rw,noexec,nosuid ${IMAGE_POSTGRES} >/dev/null + ${CONTAINER_BIN} run ${CI_PARAMS} --name postgres-ac-${SUFFIX} --network ${NETWORK} -d -e POSTGRES_PASSWORD=funcp -e POSTGRES_USER=funcu --tmpfs /var/lib/postgresql/data:rw,noexec,nosuid ${IMAGE_POSTGRES} >/dev/null + DATABASE_IP=$(${CONTAINER_BIN} inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' postgres-ac-${SUFFIX}) waitFor postgres-ac-${SUFFIX} 5432 - CONTAINERPARAMS="-e typo3DatabaseDriver=pdo_pgsql -e typo3DatabaseName=func_test -e typo3DatabaseUsername=funcu -e typo3DatabasePassword=funcp -e typo3DatabaseHost=postgres-ac-${SUFFIX}" + CONTAINERPARAMS="-e typo3DatabaseDriver=pdo_pgsql -e typo3DatabaseName=func_test -e typo3DatabaseUsername=funcu -e typo3DatabasePassword=funcp -e typo3DatabaseHost=${DATABASE_IP}" ${CONTAINER_BIN} run ${CONTAINER_COMMON_PARAMS} --name ac-postgres ${XDEBUG_MODE} -e XDEBUG_CONFIG="${XDEBUG_CONFIG}" ${CONTAINERPARAMS} ${IMAGE_PHP} ${COMMAND} SUITE_EXIT_CODE=$? ;; @@ -594,8 +617,13 @@ case ${TEST_SUITE} in if [ "${ACCEPTANCE_HEADLESS}" -eq 0 ]; then SELENIUM_GRID="-p 7900:7900 -e SE_VNC_NO_PASSWORD=1 -e VNC_NO_PASSWORD=1" fi - ${CONTAINER_BIN} run -d ${SELENIUM_GRID} --name ac-istall-chrome-${SUFFIX} --network ${NETWORK} --network-alias chrome --tmpfs /dev/shm:rw,nosuid,nodev,noexec,relatime ${IMAGE_SELENIUM} >/dev/null - ${CONTAINER_BIN} run -d --name ac-install-web-${SUFFIX} --network ${NETWORK} --network-alias web --add-host "host.docker.internal:host-gateway" $USERSET -v ${CORE_ROOT}:${CORE_ROOT} ${XDEBUG_MODE} -e XDEBUG_CONFIG="${XDEBUG_CONFIG}" ${IMAGE_PHP} php -S web:8000 -t ${CORE_ROOT} >/dev/null + if [ ${CONTAINER_BIN} = "docker" ]; then + ${CONTAINER_BIN} run -d ${SELENIUM_GRID} --name ac-istall-chrome-${SUFFIX} --network ${NETWORK} --network-alias chrome --tmpfs /dev/shm:rw,nosuid,nodev,noexec ${IMAGE_SELENIUM} >/dev/null + ${CONTAINER_BIN} run -d --name ac-install-web-${SUFFIX} --network ${NETWORK} --network-alias web --add-host "${CONTAINER_HOST}:host-gateway" ${USERSET} -v ${CORE_ROOT}:${CORE_ROOT} ${XDEBUG_MODE} -e XDEBUG_CONFIG="${XDEBUG_CONFIG}" ${IMAGE_PHP} php -S web:8000 -t ${CORE_ROOT} >/dev/null + else + ${CONTAINER_BIN} run ${CI_PARAMS} -d ${SELENIUM_GRID} --name ac-istall-chrome-${SUFFIX} --network ${NETWORK} --network-alias chrome --tmpfs /dev/shm:rw,nosuid,nodev,noexec ${IMAGE_SELENIUM} >/dev/null + ${CONTAINER_BIN} run ${CI_PARAMS} -d --name ac-install-web-${SUFFIX} --network ${NETWORK} --network-alias web --add-host "${CONTAINER_HOST}:host-gateway" -v ${CORE_ROOT}:${CORE_ROOT} ${XDEBUG_MODE} -e XDEBUG_CONFIG="${XDEBUG_CONFIG}" ${IMAGE_PHP} php -S web:8000 -t ${CORE_ROOT} >/dev/null + fi waitFor chrome 4444 waitFor chrome 7900 waitFor web 8000 @@ -610,9 +638,10 @@ case ${TEST_SUITE} in if [ "${ACCEPTANCE_HEADLESS}" -eq 1 ]; then CODECEPION_ENV="--env mysql,headless" fi - ${CONTAINER_BIN} run --name mariadb-ac-install-${SUFFIX} --network ${NETWORK} -d -e MYSQL_ROOT_PASSWORD=funcp --tmpfs /var/lib/mysql/:rw,noexec,nosuid ${IMAGE_MARIADB} >/dev/null + ${CONTAINER_BIN} run ${CI_PARAMS} --name mariadb-ac-install-${SUFFIX} --network ${NETWORK} -d -e MYSQL_ROOT_PASSWORD=funcp --tmpfs /var/lib/mysql/:rw,noexec,nosuid ${IMAGE_MARIADB} >/dev/null + DATABASE_IP=$(${CONTAINER_BIN} inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' mariadb-ac-install-${SUFFIX}) waitFor mariadb-ac-install-${SUFFIX} 3306 - CONTAINERPARAMS="-e typo3InstallMysqlDatabaseName=func_test -e typo3InstallMysqlDatabaseUsername=root -e typo3InstallMysqlDatabasePassword=funcp -e typo3InstallMysqlDatabaseHost=mariadb-ac-install-${SUFFIX}" + CONTAINERPARAMS="-e typo3InstallMysqlDatabaseName=func_test -e typo3InstallMysqlDatabaseUsername=root -e typo3InstallMysqlDatabasePassword=funcp -e typo3InstallMysqlDatabaseHost=${DATABASE_IP}" COMMAND="bin/codecept run Install -d -c typo3/sysext/core/Tests/codeception.yml ${EXTRA_TEST_OPTIONS} ${CODECEPION_ENV} --html reports.html" ${CONTAINER_BIN} run ${CONTAINER_COMMON_PARAMS} --name ac-install-mariadb ${XDEBUG_MODE} -e XDEBUG_CONFIG="${XDEBUG_CONFIG}" ${CONTAINERPARAMS} ${IMAGE_PHP} ${COMMAND} SUITE_EXIT_CODE=$? @@ -622,9 +651,10 @@ case ${TEST_SUITE} in if [ "${ACCEPTANCE_HEADLESS}" -eq 1 ]; then CODECEPION_ENV="--env mysql,headless" fi - ${CONTAINER_BIN} run --name mysql-ac-install-${SUFFIX} --network ${NETWORK} -d -e MYSQL_ROOT_PASSWORD=funcp --tmpfs /var/lib/mysql/:rw,noexec,nosuid ${IMAGE_MYSQL} >/dev/null + ${CONTAINER_BIN} run ${CI_PARAMS} --name mysql-ac-install-${SUFFIX} --network ${NETWORK} -d -e MYSQL_ROOT_PASSWORD=funcp --tmpfs /var/lib/mysql/:rw,noexec,nosuid ${IMAGE_MYSQL} >/dev/null + DATABASE_IP=$(${CONTAINER_BIN} inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' mysql-ac-install-${SUFFIX}) waitFor mysql-ac-install-${SUFFIX} 3306 - CONTAINERPARAMS="-e typo3InstallMysqlDatabaseName=func_test -e typo3InstallMysqlDatabaseUsername=root -e typo3InstallMysqlDatabasePassword=funcp -e typo3InstallMysqlDatabaseHost=mysql-ac-install-${SUFFIX}" + CONTAINERPARAMS="-e typo3InstallMysqlDatabaseName=func_test -e typo3InstallMysqlDatabaseUsername=root -e typo3InstallMysqlDatabasePassword=funcp -e typo3InstallMysqlDatabaseHost=${DATABASE_IP}" COMMAND="bin/codecept run Install -d -c typo3/sysext/core/Tests/codeception.yml ${EXTRA_TEST_OPTIONS} ${CODECEPION_ENV} --html reports.html" ${CONTAINER_BIN} run ${CONTAINER_COMMON_PARAMS} --name ac-install-mysql ${XDEBUG_MODE} -e XDEBUG_CONFIG="${XDEBUG_CONFIG}" ${CONTAINERPARAMS} ${IMAGE_PHP} ${COMMAND} SUITE_EXIT_CODE=$? @@ -634,9 +664,10 @@ case ${TEST_SUITE} in if [ "${ACCEPTANCE_HEADLESS}" -eq 1 ]; then CODECEPION_ENV="--env postgresql,headless" fi - ${CONTAINER_BIN} run --name postgres-ac-install-${SUFFIX} --network ${NETWORK} -d -e POSTGRES_PASSWORD=funcp -e POSTGRES_USER=funcu --tmpfs /var/lib/postgresql/data:rw,noexec,nosuid ${IMAGE_POSTGRES} >/dev/null + ${CONTAINER_BIN} run ${CI_PARAMS} --name postgres-ac-install-${SUFFIX} --network ${NETWORK} -d -e POSTGRES_PASSWORD=funcp -e POSTGRES_USER=funcu --tmpfs /var/lib/postgresql/data:rw,noexec,nosuid ${IMAGE_POSTGRES} >/dev/null + DATABASE_IP=$(${CONTAINER_BIN} inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' postgres-ac-install-${SUFFIX}) waitFor postgres-ac-install-${SUFFIX} 5432 - CONTAINERPARAMS="-e typo3InstallPostgresqlDatabasePort=5432 -e typo3InstallPostgresqlDatabaseName=${USER} -e typo3InstallPostgresqlDatabaseHost=postgres-ac-install-${SUFFIX} -e typo3InstallPostgresqlDatabaseUsername=funcu -e typo3InstallPostgresqlDatabasePassword=funcp" + CONTAINERPARAMS="-e typo3InstallPostgresqlDatabasePort=5432 -e typo3InstallPostgresqlDatabaseName=${USER} -e typo3InstallPostgresqlDatabaseHost=${DATABASE_IP} -e typo3InstallPostgresqlDatabaseUsername=funcu -e typo3InstallPostgresqlDatabasePassword=funcp" COMMAND="bin/codecept run Install -d -c typo3/sysext/core/Tests/codeception.yml ${EXTRA_TEST_OPTIONS} ${CODECEPION_ENV} --html reports.html" ${CONTAINER_BIN} run ${CONTAINER_COMMON_PARAMS} --name ac-install-postgres ${XDEBUG_MODE} -e XDEBUG_CONFIG="${XDEBUG_CONFIG}" ${CONTAINERPARAMS} ${IMAGE_PHP} ${COMMAND} SUITE_EXIT_CODE=$? @@ -647,7 +678,7 @@ case ${TEST_SUITE} in if [ "${ACCEPTANCE_HEADLESS}" -eq 1 ]; then CODECEPION_ENV="--env sqlite,headless" fi - CONTAINERPARAMS="-e typo3DatabaseDriver=pdo_sqlite --tmpfs ${CORE_ROOT}/typo3temp/var/tests/functional-sqlite-dbs/:rw,noexec,nosuid,uid=${HOST_UID}" + CONTAINERPARAMS="-e typo3DatabaseDriver=pdo_sqlite --tmpfs ${CORE_ROOT}/typo3temp/var/tests/functional-sqlite-dbs/:rw,noexec,nosuid" COMMAND="bin/codecept run Install -d -c typo3/sysext/core/Tests/codeception.yml ${EXTRA_TEST_OPTIONS} ${CODECEPION_ENV} --html reports.html" ${CONTAINER_BIN} run ${CONTAINER_COMMON_PARAMS} --name ac-install-sqlite ${XDEBUG_MODE} -e XDEBUG_CONFIG="${XDEBUG_CONFIG}" ${CONTAINERPARAMS} ${IMAGE_PHP} ${COMMAND} SUITE_EXIT_CODE=$? @@ -779,15 +810,15 @@ case ${TEST_SUITE} in else COMMAND="bin/phpunit -c Build/phpunit/FunctionalTests.xml --exclude-group not-${DBMS} ${EXTRA_TEST_OPTIONS} ${TEST_FILE}" fi - ${CONTAINER_BIN} run --name redis-func-${SUFFIX} --network ${NETWORK} -d ${IMAGE_REDIS} >/dev/null - ${CONTAINER_BIN} run --name memcached-func-${SUFFIX} --network ${NETWORK} -d ${IMAGE_MEMCACHED} >/dev/null + ${CONTAINER_BIN} run ${CI_PARAMS} --name redis-func-${SUFFIX} --network ${NETWORK} -d ${IMAGE_REDIS} >/dev/null + ${CONTAINER_BIN} run ${CI_PARAMS} --name memcached-func-${SUFFIX} --network ${NETWORK} -d ${IMAGE_MEMCACHED} >/dev/null waitFor redis-func-${SUFFIX} 6379 waitFor memcached-func-${SUFFIX} 11211 CONTAINER_COMMON_PARAMS="${CONTAINER_COMMON_PARAMS} -e typo3TestingRedisHost=redis-func-${SUFFIX} -e typo3TestingMemcachedHost=memcached-func-${SUFFIX}" case ${DBMS} in mariadb) echo "Using driver: ${DATABASE_DRIVER}" - ${CONTAINER_BIN} run --name mariadb-func-${SUFFIX} --network ${NETWORK} -d -e MYSQL_ROOT_PASSWORD=funcp --tmpfs /var/lib/mysql/:rw,noexec,nosuid ${IMAGE_MARIADB} >/dev/null + ${CONTAINER_BIN} run ${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} @@ -795,7 +826,7 @@ case ${TEST_SUITE} in ;; mysql) echo "Using driver: ${DATABASE_DRIVER}" - ${CONTAINER_BIN} run --name mysql-func-${SUFFIX} --network ${NETWORK} -d -e MYSQL_ROOT_PASSWORD=funcp --tmpfs /var/lib/mysql/:rw,noexec,nosuid ${IMAGE_MYSQL} >/dev/null + ${CONTAINER_BIN} run ${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} @@ -810,7 +841,7 @@ case ${TEST_SUITE} in SUITE_EXIT_CODE=$? ;; postgres) - ${CONTAINER_BIN} run --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 + ${CONTAINER_BIN} run ${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} @@ -819,7 +850,7 @@ case ${TEST_SUITE} in sqlite) # create sqlite tmpfs mount typo3temp/var/tests/functional-sqlite-dbs/ to avoid permission issues mkdir -p "${CORE_ROOT}/typo3temp/var/tests/functional-sqlite-dbs/" - CONTAINERPARAMS="-e typo3DatabaseDriver=pdo_sqlite --tmpfs ${CORE_ROOT}/typo3temp/var/tests/functional-sqlite-dbs/:rw,noexec,nosuid,uid=${HOST_UID}" + CONTAINERPARAMS="-e typo3DatabaseDriver=pdo_sqlite --tmpfs ${CORE_ROOT}/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=$? ;; @@ -827,15 +858,15 @@ case ${TEST_SUITE} in ;; functionalDeprecated) COMMAND="bin/phpunit -c Build/phpunit/FunctionalTestsDeprecated.xml --exclude-group not-${DBMS} ${EXTRA_TEST_OPTIONS} ${TEST_FILE}" - ${CONTAINER_BIN} run --name redis-func-dep-${SUFFIX} --network ${NETWORK} -d ${IMAGE_REDIS} >/dev/null - ${CONTAINER_BIN} run --name memcached-func-dep-${SUFFIX} --network ${NETWORK} -d ${IMAGE_MEMCACHED} >/dev/null + ${CONTAINER_BIN} run ${CI_PARAMS} --name redis-func-dep-${SUFFIX} --network ${NETWORK} -d ${IMAGE_REDIS} >/dev/null + ${CONTAINER_BIN} run ${CI_PARAMS} --name memcached-func-dep-${SUFFIX} --network ${NETWORK} -d ${IMAGE_MEMCACHED} >/dev/null waitFor redis-func-dep-${SUFFIX} 6379 waitFor memcached-func-dep-${SUFFIX} 11211 CONTAINER_COMMON_PARAMS="${CONTAINER_COMMON_PARAMS} -e typo3TestingRedisHost=redis-func-dep-${SUFFIX} -e typo3TestingMemcachedHost=memcached-func-dep-${SUFFIX}" case ${DBMS} in mariadb) echo "Using driver: ${DATABASE_DRIVER}" - ${CONTAINER_BIN} run --name mariadb-func-dep-${SUFFIX} --network ${NETWORK} -d -e MYSQL_ROOT_PASSWORD=funcp --tmpfs /var/lib/mysql/:rw,noexec,nosuid ${IMAGE_MARIADB} >/dev/null + ${CONTAINER_BIN} run ${CI_PARAMS} --name mariadb-func-dep-${SUFFIX} --network ${NETWORK} -d -e MYSQL_ROOT_PASSWORD=funcp --tmpfs /var/lib/mysql/:rw,noexec,nosuid ${IMAGE_MARIADB} >/dev/null waitFor mariadb-func-dep-${SUFFIX} 3306 CONTAINERPARAMS="-e typo3DatabaseDriver=${DATABASE_DRIVER} -e typo3DatabaseName=func_test -e typo3DatabaseUsername=root -e typo3DatabaseHost=mariadb-func-dep-${SUFFIX} -e typo3DatabasePassword=funcp" ${CONTAINER_BIN} run ${CONTAINER_COMMON_PARAMS} --name functional-deprecated-${SUFFIX} ${XDEBUG_MODE} -e XDEBUG_CONFIG="${XDEBUG_CONFIG}" ${CONTAINERPARAMS} ${IMAGE_PHP} ${COMMAND} @@ -843,7 +874,7 @@ case ${TEST_SUITE} in ;; mysql) echo "Using driver: ${DATABASE_DRIVER}" - ${CONTAINER_BIN} run --name mysql-func-dep-${SUFFIX} --network ${NETWORK} -d -e MYSQL_ROOT_PASSWORD=funcp --tmpfs /var/lib/mysql/:rw,noexec,nosuid ${IMAGE_MYSQL} >/dev/null + ${CONTAINER_BIN} run ${CI_PARAMS} --name mysql-func-dep-${SUFFIX} --network ${NETWORK} -d -e MYSQL_ROOT_PASSWORD=funcp --tmpfs /var/lib/mysql/:rw,noexec,nosuid ${IMAGE_MYSQL} >/dev/null waitFor mysql-func-dep-${SUFFIX} 3306 CONTAINERPARAMS="-e typo3DatabaseDriver=${DATABASE_DRIVER} -e typo3DatabaseName=func_test -e typo3DatabaseUsername=root -e typo3DatabaseHost=mysql-func-dep-${SUFFIX} -e typo3DatabasePassword=funcp" ${CONTAINER_BIN} run ${CONTAINER_COMMON_PARAMS} --name functional-deprecated-${SUFFIX} ${XDEBUG_MODE} -e XDEBUG_CONFIG="${XDEBUG_CONFIG}" ${CONTAINERPARAMS} ${IMAGE_PHP} ${COMMAND} @@ -858,7 +889,7 @@ case ${TEST_SUITE} in SUITE_EXIT_CODE=$? ;; postgres) - ${CONTAINER_BIN} run --name postgres-func-dep-${SUFFIX} --network ${NETWORK} -d -e POSTGRES_PASSWORD=funcp -e POSTGRES_USER=funcu --tmpfs /var/lib/postgresql/data:rw,noexec,nosuid ${IMAGE_POSTGRES} >/dev/null + ${CONTAINER_BIN} run ${CI_PARAMS} --name postgres-func-dep-${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-dep-${SUFFIX} 5432 CONTAINERPARAMS="-e typo3DatabaseDriver=pdo_pgsql -e typo3DatabaseName=bamboo -e typo3DatabaseUsername=funcu -e typo3DatabaseHost=postgres-func-dep-${SUFFIX} -e typo3DatabasePassword=funcp" ${CONTAINER_BIN} run ${CONTAINER_COMMON_PARAMS} --name functional-deprecated-${SUFFIX} ${XDEBUG_MODE} -e XDEBUG_CONFIG="${XDEBUG_CONFIG}" ${CONTAINERPARAMS} ${IMAGE_PHP} ${COMMAND} @@ -867,7 +898,7 @@ case ${TEST_SUITE} in sqlite) # create sqlite tmpfs mount typo3temp/var/tests/functional-sqlite-dbs/ to avoid permission issues mkdir -p "${CORE_ROOT}/typo3temp/var/tests/functional-sqlite-dbs/" - CONTAINERPARAMS="-e typo3DatabaseDriver=pdo_sqlite --tmpfs ${CORE_ROOT}/typo3temp/var/tests/functional-sqlite-dbs/:rw,noexec,nosuid,uid=${HOST_UID}" + CONTAINERPARAMS="-e typo3DatabaseDriver=pdo_sqlite --tmpfs ${CORE_ROOT}/typo3temp/var/tests/functional-sqlite-dbs/:rw,noexec,nosuid" ${CONTAINER_BIN} run ${CONTAINER_COMMON_PARAMS} --name functional-deprecated-${SUFFIX} ${XDEBUG_MODE} -e XDEBUG_CONFIG="${XDEBUG_CONFIG}" ${CONTAINERPARAMS} ${IMAGE_PHP} ${COMMAND} SUITE_EXIT_CODE=$? ;; @@ -930,12 +961,12 @@ case ${TEST_SUITE} in ${CONTAINER_BIN} volume ls -q -f driver=local -f dangling=true | awk '$0 ~ /^[0-9a-f]{64}$/ { print }' | xargs -I {} ${CONTAINER_BIN} volume rm {} echo "" # pull typo3/core-testing-*:latest versions of those ones that exist locally - echo "> pull ${TYPO3_IMAGE_PREFIX}typo3/core-testing-*:latest versions of those ones that exist locally" - ${CONTAINER_BIN} images ${TYPO3_IMAGE_PREFIX}typo3/core-testing-*:latest --format "{{.Repository}}:latest" | xargs -I {} ${CONTAINER_BIN} pull {} + echo "> pull ghcr.io/typo3/core-testing-*:latest versions of those ones that exist locally" + ${CONTAINER_BIN} images ghcr.io/typo3/core-testing-*:latest --format "{{.Repository}}:latest" | xargs -I {} ${CONTAINER_BIN} pull {} echo "" # remove "dangling" typo3/core-testing-* images (those tagged as ) - echo "> remove \"dangling\" ${TYPO3_IMAGE_PREFIX}typo3/core-testing-* images (those tagged as )" - ${CONTAINER_BIN} images ${TYPO3_IMAGE_PREFIX}typo3/core-testing-* --filter "dangling=true" --format "{{.ID}}" | xargs -I {} ${CONTAINER_BIN} rmi -f {} + echo "> remove \"dangling\" ghcr.io/typo3/core-testing-* images (those tagged as )" + ${CONTAINER_BIN} images ghcr.io/typo3/core-testing-* --filter "dangling=true" --format "{{.ID}}" | xargs -I {} ${CONTAINER_BIN} rmi -f {} echo "" ;; *) @@ -953,11 +984,7 @@ cleanUp 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 "Container runtime: ${CONTAINER_BIN}" >&2 echo "PHP: ${PHP_VERSION}" >&2 if [[ ${TEST_SUITE} =~ ^(functional|functionalDeprecated|acceptance|acceptanceInstall)$ ]]; then case "${DBMS}" in diff --git a/Build/gitlab-ci.yml b/Build/gitlab-ci.yml index 84d7e140354d..fab93936371f 100644 --- a/Build/gitlab-ci.yml +++ b/Build/gitlab-ci.yml @@ -1,6 +1,6 @@ default: # Always retry a failed job, so it has a chance to recover from a faulty machine, network or timing issue - retry: 1 + retry: 2 # Any job taking longer than this is considered 'failed' timeout: 30m @@ -10,16 +10,6 @@ variables: # and fails with package conflicts. Having a full clone by setting depth 0 # prevents this, so we don't need to fiddle with COMPOSER_ROOT_VERSION env var. GIT_DEPTH: 0 - # Remove the usage of umask 0000 call for jobs executed with docker executor. - # gitlab repo clones otherwise lead to funny file permissions, - # which especially confuses runTests.sh -s checkPermissions - FF_DISABLE_UMASK_FOR_DOCKER_EXECUTOR: 1 - # Each script line from will be in a collapsible section in the job output - # and show the duration of each line. - FF_SCRIPT_SECTIONS: 1 - # The project directory will be cleaned up at the end of the build with a - # series of git clean commands, with our git fetch strategy. - FF_ENABLE_JOB_CLEANUP: 1 cache: # Default caching of .cache directory if a job does not override it. @@ -36,23 +26,6 @@ cache: paths: - .cache -services: - # Each job starts two containers: This dind container that starts a docker - # daemon, plus a casual container that executes runTests.sh for single jobs - # to start containers within the dind container. - # @todo Using custom dind image meanwhile to mitigate gitlab-runner healthcheck issue: - # See: https://gitlab.com/gitlab-org/gitlab-runner/-/issues/29130 - # Original: docker:20.10-dind - - name: typo3/core-testing-docker-dind:latest - alias: docker - -# This is *never* overridden in single jobs. All jobs start a 'dind' service -# so runTests.sh starts 'sub' containers within the dind container, and this -# main entry point container executes runTests.sh to start containers. -# @todo ^1.2 builds seems to be broken. This leads to endless pulls by not using the proxy registry and failing -# acceptance install tests. Pin it to latest working version and investigate later. -image: typo3/core-testing-docker:1.1.0 - stages: # Stages for pre-merge - main diff --git a/Build/gitlab-ci/nightly/acceptance-application.yml b/Build/gitlab-ci/nightly/acceptance-application.yml index 6a98abf1267e..82e6605a8f55 100644 --- a/Build/gitlab-ci/nightly/acceptance-application.yml +++ b/Build/gitlab-ci/nightly/acceptance-application.yml @@ -1,5 +1,7 @@ acceptance application mariadb 10.3 php 7.4 locked: stage: acceptance + tags: + - metal2 needs: [] only: - schedules @@ -14,6 +16,8 @@ acceptance application mariadb 10.3 php 7.4 locked: - Build/Scripts/runTests.sh -s acceptance -d mariadb -i 10.3 -p 7.4 -c $CI_NODE_INDEX/$CI_NODE_TOTAL acceptance application mariadb 10.3 php 7.4 max: stage: acceptance + tags: + - metal2 needs: [] only: - schedules @@ -32,6 +36,8 @@ acceptance application mariadb 10.3 php 7.4 max: - Build/Scripts/runTests.sh -s acceptance -d mariadb -i 10.3 -p 7.4 -c $CI_NODE_INDEX/$CI_NODE_TOTAL acceptance application mariadb 10.3 php 7.4 min: stage: acceptance + tags: + - metal2 needs: [] only: - schedules @@ -51,6 +57,8 @@ acceptance application mariadb 10.3 php 7.4 min: acceptance application mariadb 10.3 php 8.0 locked: stage: acceptance + tags: + - metal2 needs: [] only: - schedules @@ -65,6 +73,8 @@ acceptance application mariadb 10.3 php 8.0 locked: - Build/Scripts/runTests.sh -s acceptance -d mariadb -i 10.3 -p 8.0 -c $CI_NODE_INDEX/$CI_NODE_TOTAL acceptance application mariadb 10.3 php 8.0 max: stage: acceptance + tags: + - metal2 needs: [] only: - schedules @@ -83,6 +93,8 @@ acceptance application mariadb 10.3 php 8.0 max: - Build/Scripts/runTests.sh -s acceptance -d mariadb -i 10.3 -p 8.0 -c $CI_NODE_INDEX/$CI_NODE_TOTAL acceptance application mariadb 10.3 php 8.0 min: stage: acceptance + tags: + - metal2 needs: [] only: - schedules @@ -102,6 +114,8 @@ acceptance application mariadb 10.3 php 8.0 min: acceptance application mariadb 10.10 php 8.2 locked: stage: acceptance + tags: + - metal2 needs: [] only: - schedules @@ -116,6 +130,8 @@ acceptance application mariadb 10.10 php 8.2 locked: - Build/Scripts/runTests.sh -s acceptance -d mariadb -i 10.10 -p 8.2 -c $CI_NODE_INDEX/$CI_NODE_TOTAL acceptance application mariadb 10.10 php 8.2 max: stage: acceptance + tags: + - metal2 needs: [] only: - schedules @@ -134,6 +150,8 @@ acceptance application mariadb 10.10 php 8.2 max: - Build/Scripts/runTests.sh -s acceptance -d mariadb -i 10.10 -p 8.2 -c $CI_NODE_INDEX/$CI_NODE_TOTAL acceptance application mariadb 10.10 php 8.2 min: stage: acceptance + tags: + - metal2 needs: [] only: - schedules diff --git a/Build/gitlab-ci/nightly/acceptance-install.yml b/Build/gitlab-ci/nightly/acceptance-install.yml index 697d38f930e3..7101a8c00b73 100644 --- a/Build/gitlab-ci/nightly/acceptance-install.yml +++ b/Build/gitlab-ci/nightly/acceptance-install.yml @@ -1,5 +1,7 @@ acceptance install mariadb 10.3 php 7.4 locked: stage: acceptance + tags: + - metal2 needs: [] only: - schedules @@ -12,6 +14,8 @@ acceptance install mariadb 10.3 php 7.4 locked: - Build/Scripts/runTests.sh -s acceptanceInstall -d mariadb -i 10.3 -p 7.4 acceptance install mariadb 10.3 php 7.4 max: stage: acceptance + tags: + - metal2 needs: [] only: - schedules @@ -28,6 +32,8 @@ acceptance install mariadb 10.3 php 7.4 max: - Build/Scripts/runTests.sh -s acceptanceInstall -d mariadb -i 10.3 -p 7.4 acceptance install mariadb 10.3 php 7.4 min: stage: acceptance + tags: + - metal2 needs: [] only: - schedules @@ -45,6 +51,8 @@ acceptance install mariadb 10.3 php 7.4 min: acceptance install mariadb 10.3 php 8.0 locked: stage: acceptance + tags: + - metal2 needs: [] only: - schedules @@ -57,6 +65,8 @@ acceptance install mariadb 10.3 php 8.0 locked: - Build/Scripts/runTests.sh -s acceptanceInstall -d mariadb -i 10.6 -p 8.0 acceptance install mariadb 10.3 php 8.0 max: stage: acceptance + tags: + - metal2 needs: [] only: - schedules @@ -73,6 +83,8 @@ acceptance install mariadb 10.3 php 8.0 max: - Build/Scripts/runTests.sh -s acceptanceInstall -d mariadb -i 10.6 -p 8.0 acceptance install mariadb 10.3 php 8.0 min: stage: acceptance + tags: + - metal2 needs: [] only: - schedules @@ -90,6 +102,8 @@ acceptance install mariadb 10.3 php 8.0 min: acceptance install mariadb 10.3 php 8.1 locked: stage: acceptance + tags: + - metal2 needs: [] only: - schedules @@ -102,6 +116,8 @@ acceptance install mariadb 10.3 php 8.1 locked: - Build/Scripts/runTests.sh -s acceptanceInstall -d mariadb -i 10.3 -p 8.1 acceptance install mariadb 10.3 php 8.1 max: stage: acceptance + tags: + - metal2 needs: [] only: - schedules @@ -118,6 +134,8 @@ acceptance install mariadb 10.3 php 8.1 max: - Build/Scripts/runTests.sh -s acceptanceInstall -d mariadb -i 10.3 -p 8.1 acceptance install mariadb 10.3 php 8.1 min: stage: acceptance + tags: + - metal2 needs: [] only: - schedules @@ -135,6 +153,8 @@ acceptance install mariadb 10.3 php 8.1 min: acceptance install mariadb 10.10 php 8.2 locked: stage: acceptance + tags: + - metal2 needs: [] only: - schedules @@ -147,6 +167,8 @@ acceptance install mariadb 10.10 php 8.2 locked: - Build/Scripts/runTests.sh -s acceptanceInstall -d mariadb -i 10.10 -p 8.2 acceptance install mariadb 10.3 php 8.2 max: stage: acceptance + tags: + - metal2 needs: [] only: - schedules @@ -163,6 +185,8 @@ acceptance install mariadb 10.3 php 8.2 max: - Build/Scripts/runTests.sh -s acceptanceInstall -d mariadb -i 10.10 -p 8.2 acceptance install mariadb 10.10 php 8.2 min: stage: acceptance + tags: + - metal2 needs: [] only: - schedules @@ -180,6 +204,8 @@ acceptance install mariadb 10.10 php 8.2 min: acceptance install mysql php 7.4: stage: acceptance + tags: + - metal2 needs: [] only: - schedules @@ -192,6 +218,8 @@ acceptance install mysql php 7.4: - Build/Scripts/runTests.sh -s acceptanceInstall -d mysql -i 5.5 -p 7.4 acceptance install mysql php 7.4 max: stage: acceptance + tags: + - metal2 needs: [] only: - schedules @@ -208,6 +236,8 @@ acceptance install mysql php 7.4 max: - Build/Scripts/runTests.sh -s acceptanceInstall -d mysql -i 5.5 -p 7.4 acceptance install mysql php 7.4 min: stage: acceptance + tags: + - metal2 needs: [] only: - schedules @@ -225,6 +255,8 @@ acceptance install mysql php 7.4 min: acceptance install mysql php 8.0: stage: acceptance + tags: + - metal2 needs: [] only: - schedules @@ -237,6 +269,8 @@ acceptance install mysql php 8.0: - Build/Scripts/runTests.sh -s acceptanceInstall -d mysql -i 5.5 -p 8.0 acceptance install mysql php 8.0 max: stage: acceptance + tags: + - metal2 needs: [] only: - schedules @@ -253,6 +287,8 @@ acceptance install mysql php 8.0 max: - Build/Scripts/runTests.sh -s acceptanceInstall -d mysql -i 5.5 -p 8.0 acceptance install mysql php 8.0 min: stage: acceptance + tags: + - metal2 needs: [] only: - schedules @@ -270,6 +306,8 @@ acceptance install mysql php 8.0 min: acceptance install mysql php 8.1: stage: acceptance + tags: + - metal2 needs: [] only: - schedules @@ -282,6 +320,8 @@ acceptance install mysql php 8.1: - Build/Scripts/runTests.sh -s acceptanceInstall -d mysql -i 5.5 -p 8.1 acceptance install mysql php 8.1 max: stage: acceptance + tags: + - metal2 needs: [] only: - schedules @@ -298,6 +338,8 @@ acceptance install mysql php 8.1 max: - Build/Scripts/runTests.sh -s acceptanceInstall -d mysql -i 5.5 -p 8.1 acceptance install mysql php 8.1 min: stage: acceptance + tags: + - metal2 needs: [] only: - schedules @@ -315,6 +357,8 @@ acceptance install mysql php 8.1 min: acceptance install postgres php 7.4 locked: stage: acceptance + tags: + - metal2 needs: [] only: - schedules @@ -327,6 +371,8 @@ acceptance install postgres php 7.4 locked: - Build/Scripts/runTests.sh -s acceptanceInstall -d postgres -i 10 -p 7.4 acceptance install postgres php 7.4 max: stage: acceptance + tags: + - metal2 needs: [] only: - schedules @@ -343,6 +389,8 @@ acceptance install postgres php 7.4 max: - Build/Scripts/runTests.sh -s acceptanceInstall -d postgres -i 10 -p 7.4 acceptance install postgres php 7.4 min: stage: acceptance + tags: + - metal2 needs: [] only: - schedules @@ -360,6 +408,8 @@ acceptance install postgres php 7.4 min: acceptance install postgres php 8.0 locked: stage: acceptance + tags: + - metal2 needs: [] only: - schedules @@ -372,6 +422,8 @@ acceptance install postgres php 8.0 locked: - Build/Scripts/runTests.sh -s acceptanceInstall -d postgres -i 10 -p 8.0 acceptance install postgres php 8.0 max: stage: acceptance + tags: + - metal2 needs: [] only: - schedules @@ -388,6 +440,8 @@ acceptance install postgres php 8.0 max: - Build/Scripts/runTests.sh -s acceptanceInstall -d postgres -i 10 -p 8.0 acceptance install postgres php 8.0 min: stage: acceptance + tags: + - metal2 needs: [] only: - schedules @@ -405,6 +459,8 @@ acceptance install postgres php 8.0 min: acceptance install postgres php 8.1 locked: stage: acceptance + tags: + - metal2 needs: [] only: - schedules @@ -417,6 +473,8 @@ acceptance install postgres php 8.1 locked: - Build/Scripts/runTests.sh -s acceptanceInstall -d postgres -i 10 -p 8.1 acceptance install postgres php 8.1 max: stage: acceptance + tags: + - metal2 needs: [] only: - schedules @@ -433,6 +491,8 @@ acceptance install postgres php 8.1 max: - Build/Scripts/runTests.sh -s acceptanceInstall -d postgres -i 10 -p 8.1 acceptance install postgres php 8.1 min: stage: acceptance + tags: + - metal2 needs: [] only: - schedules @@ -450,6 +510,8 @@ acceptance install postgres php 8.1 min: acceptance install sqlite php 7.4 locked: stage: acceptance + tags: + - metal2 needs: [] only: - schedules @@ -462,6 +524,8 @@ acceptance install sqlite php 7.4 locked: - Build/Scripts/runTests.sh -s acceptanceInstall -d sqlite -p 7.4 acceptance install sqlite php 7.4 max: stage: acceptance + tags: + - metal2 needs: [] only: - schedules @@ -478,6 +542,8 @@ acceptance install sqlite php 7.4 max: - Build/Scripts/runTests.sh -s acceptanceInstall -d sqlite -p 7.4 acceptance install sqlite php 7.4 min: stage: acceptance + tags: + - metal2 needs: [] only: - schedules @@ -495,6 +561,8 @@ acceptance install sqlite php 7.4 min: acceptance install sqlite php 8.0 locked: stage: acceptance + tags: + - metal2 needs: [] only: - schedules @@ -507,6 +575,8 @@ acceptance install sqlite php 8.0 locked: - Build/Scripts/runTests.sh -s acceptanceInstall -d sqlite -p 8.0 acceptance install sqlite php 8.0 max: stage: acceptance + tags: + - metal2 needs: [] only: - schedules @@ -523,6 +593,8 @@ acceptance install sqlite php 8.0 max: - Build/Scripts/runTests.sh -s acceptanceInstall -d sqlite -p 8.0 acceptance install sqlite php 8.0 min: stage: acceptance + tags: + - metal2 needs: [] only: - schedules @@ -540,6 +612,8 @@ acceptance install sqlite php 8.0 min: acceptance install sqlite php 8.1 locked: stage: acceptance + tags: + - metal2 needs: [] only: - schedules @@ -552,6 +626,8 @@ acceptance install sqlite php 8.1 locked: - Build/Scripts/runTests.sh -s acceptanceInstall -d sqlite -p 8.1 acceptance install sqlite php 8.1 max: stage: acceptance + tags: + - metal2 needs: [] only: - schedules @@ -568,6 +644,8 @@ acceptance install sqlite php 8.1 max: - Build/Scripts/runTests.sh -s acceptanceInstall -d sqlite -p 8.1 acceptance install sqlite php 8.1 min: stage: acceptance + tags: + - metal2 needs: [] only: - schedules diff --git a/Build/gitlab-ci/nightly/functional.yml b/Build/gitlab-ci/nightly/functional.yml index 47c98a6eab86..4bd3d3694bfe 100644 --- a/Build/gitlab-ci/nightly/functional.yml +++ b/Build/gitlab-ci/nightly/functional.yml @@ -1,5 +1,7 @@ functional deprecated mariadb 10.3 php 7.4 locked: stage: functional + tags: + - metal2 needs: [] only: - schedules @@ -8,6 +10,8 @@ functional deprecated mariadb 10.3 php 7.4 locked: - Build/Scripts/runTests.sh -s functionalDeprecated -d mariadb -i 10.3 -p 7.4 functional deprecated mariadb 10.3 php 7.4 max: stage: functional + tags: + - metal2 needs: [] only: - schedules @@ -20,6 +24,8 @@ functional deprecated mariadb 10.3 php 7.4 max: - Build/Scripts/runTests.sh -s functionalDeprecated -d mariadb -i 10.3 -p 7.4 functional deprecated mariadb 10.3 php 7.4 min: stage: functional + tags: + - metal2 needs: [] only: - schedules @@ -33,6 +39,8 @@ functional deprecated mariadb 10.3 php 7.4 min: functional deprecated mariadb 10.5 php 8.3 locked: stage: functional + tags: + - metal2 needs: [] only: - schedules @@ -41,6 +49,8 @@ functional deprecated mariadb 10.5 php 8.3 locked: - Build/Scripts/runTests.sh -s functionalDeprecated -d mariadb -i 10.5 -p 8.3 functional deprecated mariadb 10.5 php 8.2 max: stage: functional + tags: + - metal2 needs: [] only: - schedules @@ -53,6 +63,8 @@ functional deprecated mariadb 10.5 php 8.2 max: - Build/Scripts/runTests.sh -s functionalDeprecated -d mariadb -i 10.5 -p 8.3 functional deprecated mariadb 10.5 php 8.3 min: stage: functional + tags: + - metal2 needs: [] only: - schedules @@ -66,6 +78,8 @@ functional deprecated mariadb 10.5 php 8.3 min: functional deprecated mariadb 10.10 php 8.3 locked: stage: functional + tags: + - metal2 needs: [] only: - schedules @@ -74,6 +88,8 @@ functional deprecated mariadb 10.10 php 8.3 locked: - Build/Scripts/runTests.sh -s functionalDeprecated -d mariadb -i 10.10 -p 8.3 functional deprecated mariadb 10.10 php 8.3 max: stage: functional + tags: + - metal2 needs: [] only: - schedules @@ -86,6 +102,8 @@ functional deprecated mariadb 10.10 php 8.3 max: - Build/Scripts/runTests.sh -s functionalDeprecated -d mariadb -i 10.10 -p 8.3 functional deprecated mariadb 10.10 php 8.3 min: stage: functional + tags: + - metal2 needs: [] only: - schedules @@ -99,6 +117,8 @@ functional deprecated mariadb 10.10 php 8.3 min: functional deprecated mysql 5.5 php 7.4 locked: stage: functional + tags: + - metal2 needs: [] only: - schedules @@ -107,6 +127,8 @@ functional deprecated mysql 5.5 php 7.4 locked: - Build/Scripts/runTests.sh -s functionalDeprecated -d mysql -i 5.5 -p 7.4 functional deprecated mysql 5.5 php 7.4 max: stage: functional + tags: + - metal2 needs: [] only: - schedules @@ -119,6 +141,8 @@ functional deprecated mysql 5.5 php 7.4 max: - Build/Scripts/runTests.sh -s functionalDeprecated -d mysql -i 5.5 -p 7.4 functional deprecated mysql 5.5 php 7.4 min: stage: functional + tags: + - metal2 needs: [] only: - schedules @@ -132,6 +156,8 @@ functional deprecated mysql 5.5 php 7.4 min: functional deprecated postgres 10 php 7.4 locked: stage: functional + tags: + - metal2 needs: [] only: - schedules @@ -140,6 +166,8 @@ functional deprecated postgres 10 php 7.4 locked: - Build/Scripts/runTests.sh -s functionalDeprecated -d postgres -i 10 -p 7.4 functional deprecated postgres 10 php 7.4 max: stage: functional + tags: + - metal2 needs: [] only: - schedules @@ -152,6 +180,8 @@ functional deprecated postgres 10 php 7.4 max: - Build/Scripts/runTests.sh -s functionalDeprecated -d postgres -i 10 -p 7.4 functional deprecated postgres 10 php 7.4 min: stage: functional + tags: + - metal2 needs: [] only: - schedules @@ -165,6 +195,8 @@ functional deprecated postgres 10 php 7.4 min: functional deprecated sqlite php 8.1 locked: stage: functional + tags: + - metal2 needs: [] only: - schedules @@ -173,6 +205,8 @@ functional deprecated sqlite php 8.1 locked: - Build/Scripts/runTests.sh -s functionalDeprecated -d sqlite -p 8.1 functional deprecated sqlite php 8.1 max: stage: functional + tags: + - metal2 needs: [] only: - schedules @@ -185,6 +219,8 @@ functional deprecated sqlite php 8.1 max: - Build/Scripts/runTests.sh -s functionalDeprecated -d sqlite -p 8.1 functional deprecated sqlite php 8.1 min: stage: functional + tags: + - metal2 needs: [] only: - schedules @@ -199,6 +235,8 @@ functional deprecated sqlite php 8.1 min: functional mariadb 10.3 php 7.4 locked: stage: functional + tags: + - metal2 needs: [] only: - schedules @@ -208,6 +246,8 @@ functional mariadb 10.3 php 7.4 locked: - Build/Scripts/runTests.sh -s functional -d mariadb -i 10.3 -p 7.4 -c $CI_NODE_INDEX/$CI_NODE_TOTAL functional mariadb 10.3 php 7.4 max: stage: functional + tags: + - metal2 needs: [] only: - schedules @@ -221,6 +261,8 @@ functional mariadb 10.3 php 7.4 max: - Build/Scripts/runTests.sh -s functional -d mariadb -i 10.3 -p 7.4 -c $CI_NODE_INDEX/$CI_NODE_TOTAL functional mariadb 10.3 php 7.4 min: stage: functional + tags: + - metal2 needs: [] only: - schedules @@ -235,6 +277,8 @@ functional mariadb 10.3 php 7.4 min: functional mariadb 10.10 php 8.3 locked: stage: functional + tags: + - metal2 needs: [] only: - schedules @@ -244,6 +288,8 @@ functional mariadb 10.10 php 8.3 locked: - Build/Scripts/runTests.sh -s functional -d mariadb -i 10.10 -p 8.3 -c $CI_NODE_INDEX/$CI_NODE_TOTAL functional mariadb 10.10 php 8.3 max: stage: functional + tags: + - metal2 needs: [] only: - schedules @@ -257,6 +303,8 @@ functional mariadb 10.10 php 8.3 max: - Build/Scripts/runTests.sh -s functional -d mariadb -i 10.10 -p 8.3 -c $CI_NODE_INDEX/$CI_NODE_TOTAL functional mariadb 10.10 php 8.3 min: stage: functional + tags: + - metal2 needs: [] only: - schedules @@ -271,6 +319,8 @@ functional mariadb 10.10 php 8.3 min: functional mysql 5.5 php 7.4 locked: stage: functional + tags: + - metal2 needs: [] only: - schedules @@ -280,6 +330,8 @@ functional mysql 5.5 php 7.4 locked: - Build/Scripts/runTests.sh -s functional -d mysql -i 5.5 -p 7.4 -c $CI_NODE_INDEX/$CI_NODE_TOTAL functional mysql 5.5 php 7.4 max: stage: functional + tags: + - metal2 needs: [] only: - schedules @@ -293,6 +345,8 @@ functional mysql 5.5 php 7.4 max: - Build/Scripts/runTests.sh -s functional -d mysql -i 5.5 -p 7.4 -c $CI_NODE_INDEX/$CI_NODE_TOTAL functional mysql 5.5 php 7.4 min: stage: functional + tags: + - metal2 needs: [] only: - schedules @@ -307,6 +361,8 @@ functional mysql 5.5 php 7.4 min: functional postgres 10 php 7.4 locked: stage: functional + tags: + - metal2 needs: [] only: - schedules @@ -316,6 +372,8 @@ functional postgres 10 php 7.4 locked: - Build/Scripts/runTests.sh -s functional -d postgres -i 10 -p 7.4 -c $CI_NODE_INDEX/$CI_NODE_TOTAL functional postgres 10 php 7.4 max: stage: functional + tags: + - metal2 needs: [] only: - schedules @@ -329,6 +387,8 @@ functional postgres 10 php 7.4 max: - Build/Scripts/runTests.sh -s functional -d postgres -i 10 -p 7.4 -c $CI_NODE_INDEX/$CI_NODE_TOTAL functional postgres 10 php 7.4 min: stage: functional + tags: + - metal2 needs: [] only: - schedules @@ -343,6 +403,8 @@ functional postgres 10 php 7.4 min: functional postgres 10 php 8.3 locked: stage: functional + tags: + - metal2 needs: [] only: - schedules @@ -352,6 +414,8 @@ functional postgres 10 php 8.3 locked: - Build/Scripts/runTests.sh -s functional -d postgres -i 10 -p 8.3 -c $CI_NODE_INDEX/$CI_NODE_TOTAL functional postgres 10 php 8.3 max: stage: functional + tags: + - metal2 needs: [] only: - schedules @@ -365,6 +429,8 @@ functional postgres 10 php 8.3 max: - Build/Scripts/runTests.sh -s functional -d postgres -i 10 -p 8.3 -c $CI_NODE_INDEX/$CI_NODE_TOTAL functional postgres 10 php 8.3 min: stage: functional + tags: + - metal2 needs: [] only: - schedules @@ -379,6 +445,8 @@ functional postgres 10 php 8.3 min: functional sqlite php 7.4 locked: stage: functional + tags: + - metal2 needs: [] only: - schedules @@ -388,6 +456,8 @@ functional sqlite php 7.4 locked: - Build/Scripts/runTests.sh -s functional -d sqlite -p 7.4 -c $CI_NODE_INDEX/$CI_NODE_TOTAL functional sqlite php 7.4 max: stage: functional + tags: + - metal2 needs: [] only: - schedules @@ -401,6 +471,8 @@ functional sqlite php 7.4 max: - Build/Scripts/runTests.sh -s functional -d sqlite -p 7.4 -c $CI_NODE_INDEX/$CI_NODE_TOTAL functional sqlite php 7.4 min: stage: functional + tags: + - metal2 needs: [] only: - schedules @@ -415,6 +487,8 @@ functional sqlite php 7.4 min: functional sqlite php 8.3 locked: stage: functional + tags: + - metal2 needs: [] only: - schedules @@ -424,6 +498,8 @@ functional sqlite php 8.3 locked: - Build/Scripts/runTests.sh -s functional -d sqlite -p 8.3 -c $CI_NODE_INDEX/$CI_NODE_TOTAL functional sqlite php 8.3 max: stage: functional + tags: + - metal2 needs: [] only: - schedules @@ -437,6 +513,8 @@ functional sqlite php 8.3 max: - Build/Scripts/runTests.sh -s functional -d sqlite -p 8.3 -c $CI_NODE_INDEX/$CI_NODE_TOTAL functional sqlite php 8.3 min: stage: functional + tags: + - metal2 needs: [] only: - schedules diff --git a/Build/gitlab-ci/nightly/integrity.yml b/Build/gitlab-ci/nightly/integrity.yml index 5eb0a80fe22a..acbbab4eb05e 100644 --- a/Build/gitlab-ci/nightly/integrity.yml +++ b/Build/gitlab-ci/nightly/integrity.yml @@ -1,5 +1,7 @@ annotations php 7.4: stage: integrity + tags: + - metal2 needs: [] only: - schedules @@ -9,6 +11,8 @@ annotations php 7.4: cgl: stage: integrity + tags: + - metal2 needs: [] only: - schedules @@ -18,6 +22,8 @@ cgl: grunt clean: stage: integrity + tags: + - metal2 needs: [] only: - schedules @@ -30,6 +36,8 @@ grunt clean: integration various: stage: integrity + tags: + - metal2 needs: [] only: - schedules @@ -57,6 +65,8 @@ integration various: lint php 7.4: stage: integrity + tags: + - metal2 needs: [] only: - schedules @@ -64,6 +74,8 @@ lint php 7.4: - Build/Scripts/runTests.sh -s lintPhp -p 7.4 lint php 8.0: stage: integrity + tags: + - metal2 needs: [] only: - schedules @@ -71,6 +83,8 @@ lint php 8.0: - Build/Scripts/runTests.sh -s lintPhp -p 8.0 lint php 8.1: stage: integrity + tags: + - metal2 needs: [] only: - schedules @@ -78,6 +92,8 @@ lint php 8.1: - Build/Scripts/runTests.sh -s lintPhp -p 8.1 lint php 8.2: stage: integrity + tags: + - metal2 needs: [] only: - schedules @@ -86,6 +102,8 @@ lint php 8.2: lint scss ts html: stage: integrity + tags: + - metal2 needs: [] only: - schedules @@ -100,6 +118,8 @@ lint scss ts html: phpstan php 7.4: stage: integrity + tags: + - metal2 needs: [] only: - schedules diff --git a/Build/gitlab-ci/nightly/unit.yml b/Build/gitlab-ci/nightly/unit.yml index 1255c18e1e25..a9558c9d872d 100644 --- a/Build/gitlab-ci/nightly/unit.yml +++ b/Build/gitlab-ci/nightly/unit.yml @@ -1,5 +1,7 @@ unit javascript: stage: unit + tags: + - metal2 needs: [] only: - schedules @@ -13,6 +15,8 @@ unit javascript: unit php 7.4 locked: stage: unit + tags: + - metal2 needs: [] only: - schedules @@ -21,6 +25,8 @@ unit php 7.4 locked: - Build/Scripts/runTests.sh -s unit -p 7.4 unit php 7.4 locked deprecated: stage: unit + tags: + - metal2 needs: [] only: - schedules @@ -29,6 +35,8 @@ unit php 7.4 locked deprecated: - Build/Scripts/runTests.sh -s unitDeprecated -p 7.4 unit php 7.4 locked random: stage: unit + tags: + - metal2 needs: [] only: - schedules @@ -38,6 +46,8 @@ unit php 7.4 locked random: unit php 7.4 max: stage: unit + tags: + - metal2 needs: [] only: - schedules @@ -50,6 +60,8 @@ unit php 7.4 max: - Build/Scripts/runTests.sh -s unit -p 7.4 unit php 7.4 max deprecated: stage: unit + tags: + - metal2 needs: [] only: - schedules @@ -62,6 +74,8 @@ unit php 7.4 max deprecated: - Build/Scripts/runTests.sh -s unitDeprecated -p 7.4 unit php 7.4 max random: stage: unit + tags: + - metal2 needs: [] only: - schedules @@ -75,6 +89,8 @@ unit php 7.4 max random: unit php 7.4 min: stage: unit + tags: + - metal2 needs: [] only: - schedules @@ -87,6 +103,8 @@ unit php 7.4 min: - Build/Scripts/runTests.sh -s unit -p 7.4 unit php 7.4 min deprecated: stage: unit + tags: + - metal2 needs: [] only: - schedules @@ -99,6 +117,8 @@ unit php 7.4 min deprecated: - Build/Scripts/runTests.sh -s unitDeprecated -p 7.4 unit php 7.4 min random: stage: unit + tags: + - metal2 needs: [] only: - schedules @@ -112,6 +132,8 @@ unit php 7.4 min random: unit php 8.0 locked: stage: unit + tags: + - metal2 needs: [] only: - schedules @@ -120,6 +142,8 @@ unit php 8.0 locked: - Build/Scripts/runTests.sh -s unit -p 8.0 unit php 8.0 locked deprecated: stage: unit + tags: + - metal2 needs: [] only: - schedules @@ -128,6 +152,8 @@ unit php 8.0 locked deprecated: - Build/Scripts/runTests.sh -s unitDeprecated -p 8.0 unit php 8.0 locked random: stage: unit + tags: + - metal2 needs: [] only: - schedules @@ -137,6 +163,8 @@ unit php 8.0 locked random: unit php 8.0 max: stage: unit + tags: + - metal2 needs: [] only: - schedules @@ -149,6 +177,8 @@ unit php 8.0 max: - Build/Scripts/runTests.sh -s unit -p 8.0 unit php 8.0 max deprecated: stage: unit + tags: + - metal2 needs: [] only: - schedules @@ -161,6 +191,8 @@ unit php 8.0 max deprecated: - Build/Scripts/runTests.sh -s unitDeprecated -p 8.0 unit php 8.0 max random: stage: unit + tags: + - metal2 needs: [] only: - schedules @@ -174,6 +206,8 @@ unit php 8.0 max random: unit php 8.0 min: stage: unit + tags: + - metal2 needs: [] only: - schedules @@ -186,6 +220,8 @@ unit php 8.0 min: - Build/Scripts/runTests.sh -s unit -p 8.0 unit php 8.0 min deprecated: stage: unit + tags: + - metal2 needs: [] only: - schedules @@ -198,6 +234,8 @@ unit php 8.0 min deprecated: - Build/Scripts/runTests.sh -s unitDeprecated -p 8.0 unit php 8.0 min random: stage: unit + tags: + - metal2 needs: [] only: - schedules @@ -211,6 +249,8 @@ unit php 8.0 min random: unit php 8.1 locked: stage: unit + tags: + - metal2 needs: [] only: - schedules @@ -219,6 +259,8 @@ unit php 8.1 locked: - Build/Scripts/runTests.sh -s unit -p 8.1 unit php 8.1 locked deprecated: stage: unit + tags: + - metal2 needs: [] only: - schedules @@ -227,6 +269,8 @@ unit php 8.1 locked deprecated: - Build/Scripts/runTests.sh -s unitDeprecated -p 8.1 unit php 8.1 locked random: stage: unit + tags: + - metal2 needs: [] only: - schedules @@ -236,6 +280,8 @@ unit php 8.1 locked random: unit php 8.1 max: stage: unit + tags: + - metal2 needs: [] only: - schedules @@ -248,6 +294,8 @@ unit php 8.1 max: - Build/Scripts/runTests.sh -s unit -p 8.1 unit php 8.1 max deprecated: stage: unit + tags: + - metal2 needs: [] only: - schedules @@ -260,6 +308,8 @@ unit php 8.1 max deprecated: - Build/Scripts/runTests.sh -s unitDeprecated -p 8.1 unit php 8.1 max random: stage: unit + tags: + - metal2 needs: [] only: - schedules @@ -273,6 +323,8 @@ unit php 8.1 max random: unit php 8.1 min: stage: unit + tags: + - metal2 needs: [] only: - schedules @@ -285,6 +337,8 @@ unit php 8.1 min: - Build/Scripts/runTests.sh -s unit -p 8.1 unit php 8.1 min deprecated: stage: unit + tags: + - metal2 needs: [] only: - schedules @@ -297,6 +351,8 @@ unit php 8.1 min deprecated: - Build/Scripts/runTests.sh -s unitDeprecated -p 8.1 unit php 8.1 min random: stage: unit + tags: + - metal2 needs: [] only: - schedules @@ -310,6 +366,8 @@ unit php 8.1 min random: unit php 8.2 locked: stage: unit + tags: + - metal2 needs: [] only: - schedules @@ -318,6 +376,8 @@ unit php 8.2 locked: - Build/Scripts/runTests.sh -s unit -p 8.2 unit php 8.2 locked deprecated: stage: unit + tags: + - metal2 needs: [] only: - schedules @@ -326,6 +386,8 @@ unit php 8.2 locked deprecated: - Build/Scripts/runTests.sh -s unitDeprecated -p 8.2 unit php 8.2 locked random: stage: unit + tags: + - metal2 needs: [] only: - schedules @@ -335,6 +397,8 @@ unit php 8.2 locked random: unit php 8.2 max: stage: unit + tags: + - metal2 needs: [] only: - schedules @@ -347,6 +411,8 @@ unit php 8.2 max: - Build/Scripts/runTests.sh -s unit -p 8.2 unit php 8.2 max deprecated: stage: unit + tags: + - metal2 needs: [] only: - schedules @@ -359,6 +425,8 @@ unit php 8.2 max deprecated: - Build/Scripts/runTests.sh -s unitDeprecated -p 8.2 unit php 8.2 max random: stage: unit + tags: + - metal2 needs: [] only: - schedules @@ -372,6 +440,8 @@ unit php 8.2 max random: unit php 8.2 min: stage: unit + tags: + - metal2 needs: [] only: - schedules @@ -384,6 +454,8 @@ unit php 8.2 min: - Build/Scripts/runTests.sh -s unit -p 8.2 unit php 8.2 min deprecated: stage: unit + tags: + - metal2 needs: [] only: - schedules @@ -396,6 +468,8 @@ unit php 8.2 min deprecated: - Build/Scripts/runTests.sh -s unitDeprecated -p 8.2 unit php 8.2 min random: stage: unit + tags: + - metal2 needs: [] only: - schedules @@ -409,6 +483,8 @@ unit php 8.2 min random: unit php 8.3 locked: stage: unit + tags: + - metal2 needs: [] only: - schedules @@ -417,6 +493,8 @@ unit php 8.3 locked: - Build/Scripts/runTests.sh -s unit -p 8.3 unit php 8.3 locked deprecated: stage: unit + tags: + - metal2 needs: [] only: - schedules @@ -425,6 +503,8 @@ unit php 8.3 locked deprecated: - Build/Scripts/runTests.sh -s unitDeprecated -p 8.3 unit php 8.3 locked random: stage: unit + tags: + - metal2 needs: [] only: - schedules @@ -434,6 +514,8 @@ unit php 8.3 locked random: unit php 8.3 max: stage: unit + tags: + - metal2 needs: [] only: - schedules @@ -446,6 +528,8 @@ unit php 8.3 max: - Build/Scripts/runTests.sh -s unit -p 8.3 unit php 8.3 max deprecated: stage: unit + tags: + - metal2 needs: [] only: - schedules @@ -458,6 +542,8 @@ unit php 8.3 max deprecated: - Build/Scripts/runTests.sh -s unitDeprecated -p 8.3 unit php 8.3 max random: stage: unit + tags: + - metal2 needs: [] only: - schedules @@ -471,6 +557,8 @@ unit php 8.3 max random: unit php 8.3 min: stage: unit + tags: + - metal2 needs: [] only: - schedules @@ -483,6 +571,8 @@ unit php 8.3 min: - Build/Scripts/runTests.sh -s unit -p 8.3 unit php 8.3 min deprecated: stage: unit + tags: + - metal2 needs: [] only: - schedules @@ -495,6 +585,8 @@ unit php 8.3 min deprecated: - Build/Scripts/runTests.sh -s unitDeprecated -p 8.3 unit php 8.3 min random: stage: unit + tags: + - metal2 needs: [] only: - schedules diff --git a/Build/gitlab-ci/pre-merge/acceptance-application.yml b/Build/gitlab-ci/pre-merge/acceptance-application.yml index 7ecf8c510233..1c53e4576bee 100644 --- a/Build/gitlab-ci/pre-merge/acceptance-application.yml +++ b/Build/gitlab-ci/pre-merge/acceptance-application.yml @@ -1,5 +1,7 @@ acceptance application mariadb php 7.4 pre-merge: stage: main + tags: + - metal2 except: refs: - schedules @@ -16,6 +18,8 @@ acceptance application mariadb php 7.4 pre-merge: acceptance application mariadb php 8.3 pre-merge: stage: main + tags: + - metal2 except: refs: - schedules diff --git a/Build/gitlab-ci/pre-merge/acceptance-install.yml b/Build/gitlab-ci/pre-merge/acceptance-install.yml index b2ad1db1b1b9..da1922149635 100644 --- a/Build/gitlab-ci/pre-merge/acceptance-install.yml +++ b/Build/gitlab-ci/pre-merge/acceptance-install.yml @@ -1,5 +1,7 @@ acceptance install mariadb 10.3 php 7.4 pre-merge: stage: main + tags: + - metal2 except: refs: - schedules @@ -14,6 +16,8 @@ acceptance install mariadb 10.3 php 7.4 pre-merge: acceptance install mariadb 10.10 php 8.2 pre-merge: stage: main + tags: + - metal2 except: refs: - schedules @@ -28,6 +32,8 @@ acceptance install mariadb 10.10 php 8.2 pre-merge: acceptance install mysql php 8.2 pre-merge: stage: main + tags: + - metal2 except: refs: - schedules @@ -42,6 +48,8 @@ acceptance install mysql php 8.2 pre-merge: acceptance install postgres php 7.4 pre-merge: stage: main + tags: + - metal2 except: refs: - schedules @@ -56,6 +64,8 @@ acceptance install postgres php 7.4 pre-merge: acceptance install sqlite php 8.1 pre-merge: stage: main + tags: + - metal2 except: refs: - schedules diff --git a/Build/gitlab-ci/pre-merge/functional.yml b/Build/gitlab-ci/pre-merge/functional.yml index 3f1781538c90..25d223d72175 100644 --- a/Build/gitlab-ci/pre-merge/functional.yml +++ b/Build/gitlab-ci/pre-merge/functional.yml @@ -1,5 +1,7 @@ functional deprecated mariadb 10.3 php 8.1 pre-merge: stage: main + tags: + - metal2 except: refs: - schedules @@ -10,6 +12,8 @@ functional deprecated mariadb 10.3 php 8.1 pre-merge: functional deprecated postgres 10 php 7.4 pre-merge: stage: main + tags: + - metal2 except: refs: - schedules @@ -20,6 +24,8 @@ functional deprecated postgres 10 php 7.4 pre-merge: functional mariadb 10.3 php 8.0 pre-merge: stage: main + tags: + - metal2 except: refs: - schedules @@ -31,6 +37,8 @@ functional mariadb 10.3 php 8.0 pre-merge: functional postgres 10 php 8.3 pre-merge: stage: main + tags: + - metal2 except: refs: - schedules @@ -42,6 +50,8 @@ functional postgres 10 php 8.3 pre-merge: functional sqlite php 7.4 pre-merge: stage: main + tags: + - metal2 except: refs: - schedules diff --git a/Build/gitlab-ci/pre-merge/integrity.yml b/Build/gitlab-ci/pre-merge/integrity.yml index 78cefdac55c4..c50adfaba4bf 100644 --- a/Build/gitlab-ci/pre-merge/integrity.yml +++ b/Build/gitlab-ci/pre-merge/integrity.yml @@ -1,5 +1,7 @@ annotations php 7.4 pre-merge: stage: main + tags: + - metal2 except: refs: - schedules @@ -10,6 +12,8 @@ annotations php 7.4 pre-merge: cgl pre-merge: stage: main + tags: + - metal2 except: refs: - schedules @@ -20,6 +24,8 @@ cgl pre-merge: grunt clean pre-merge: stage: main + tags: + - metal2 except: refs: - schedules @@ -33,6 +39,8 @@ grunt clean pre-merge: integration various pre-merge: stage: main + tags: + - metal2 except: refs: - schedules @@ -61,6 +69,8 @@ integration various pre-merge: lint php 7.4 pre-merge: stage: main + tags: + - metal2 except: refs: - schedules @@ -71,6 +81,8 @@ lint php 7.4 pre-merge: lint php 8.2 pre-merge: stage: main + tags: + - metal2 except: refs: - schedules @@ -81,6 +93,8 @@ lint php 8.2 pre-merge: lint scss ts html pre-merge: stage: main + tags: + - metal2 except: refs: - schedules @@ -96,6 +110,8 @@ lint scss ts html pre-merge: phpstan php 7.4 pre-merge: stage: main + tags: + - metal2 except: refs: - schedules diff --git a/Build/gitlab-ci/pre-merge/unit.yml b/Build/gitlab-ci/pre-merge/unit.yml index e8302c48e315..481b354ea512 100644 --- a/Build/gitlab-ci/pre-merge/unit.yml +++ b/Build/gitlab-ci/pre-merge/unit.yml @@ -1,5 +1,7 @@ unit javascript pre-merge: stage: main + tags: + - metal2 except: refs: - schedules @@ -14,6 +16,8 @@ unit javascript pre-merge: unit php 7.4 deprecated pre-merge: stage: main + tags: + - metal2 except: refs: - schedules @@ -23,6 +27,8 @@ unit php 7.4 deprecated pre-merge: - Build/Scripts/runTests.sh -s unitDeprecated -p 7.4 unit php 7.4 pre-merge: stage: main + tags: + - metal2 except: refs: - schedules @@ -32,6 +38,8 @@ unit php 7.4 pre-merge: - Build/Scripts/runTests.sh -s unit -p 7.4 unit php 7.4 random pre-merge: stage: main + tags: + - metal2 except: refs: - schedules @@ -42,6 +50,8 @@ unit php 7.4 random pre-merge: unit php 8.1 deprecated pre-merge: stage: main + tags: + - metal2 except: refs: - schedules @@ -51,6 +61,8 @@ unit php 8.1 deprecated pre-merge: - Build/Scripts/runTests.sh -s unitDeprecated -p 8.1 unit php 8.1 pre-merge: stage: main + tags: + - metal2 except: refs: - schedules @@ -60,6 +72,8 @@ unit php 8.1 pre-merge: - Build/Scripts/runTests.sh -s unit -p 8.1 unit php 8.1 random pre-merge: stage: main + tags: + - metal2 except: refs: - schedules @@ -70,6 +84,8 @@ unit php 8.1 random pre-merge: unit php 8.2 pre-merge: stage: main + tags: + - metal2 except: refs: - schedules @@ -79,6 +95,8 @@ unit php 8.2 pre-merge: - Build/Scripts/runTests.sh -s unit -p 8.2 unit php 8.2 deprecated pre-merge: stage: main + tags: + - metal2 except: refs: - schedules @@ -89,6 +107,8 @@ unit php 8.2 deprecated pre-merge: unit php 8.3 pre-merge: stage: main + tags: + - metal2 except: refs: - schedules @@ -98,6 +118,8 @@ unit php 8.3 pre-merge: - Build/Scripts/runTests.sh -s unit -p 8.3 unit php 8.3 deprecated pre-merge: stage: main + tags: + - metal2 except: refs: - schedules diff --git a/Build/phpstan/phpstan.ci.neon b/Build/phpstan/phpstan.ci.neon index 31cf691e7467..31088e915f48 100644 --- a/Build/phpstan/phpstan.ci.neon +++ b/Build/phpstan/phpstan.ci.neon @@ -7,8 +7,6 @@ parameters: tmpDir: /tmp parallel: - # Don't be overly greedy on machines with more CPU's to be a good neighbor especially on CI - maximumNumberOfProcesses: 5 # @todo Process timeout raised as a intermediate solution. This should be further investigated if we can mitigate # the occurring subprocess timeout issue through other configurations and minimize the execution time again. processTimeout: 900.0 diff --git a/typo3/sysext/core/Tests/Acceptance/Application/FileList/FileClipboardCest.php b/typo3/sysext/core/Tests/Acceptance/Application/FileList/FileClipboardCest.php index 0cd92675d7c3..35b4b9631c6e 100644 --- a/typo3/sysext/core/Tests/Acceptance/Application/FileList/FileClipboardCest.php +++ b/typo3/sysext/core/Tests/Acceptance/Application/FileList/FileClipboardCest.php @@ -83,6 +83,7 @@ public function seeAddRemoveMultipleRecords(ApplicationTester $I): void $I->switchToContentFrame(); $I->amGoingTo('add multiple elements to clipboard'); + $I->wait(1); $I->click('Clipboard #1 (multi-selection mode)'); $I->click('.dropdown-toggle'); $I->click('button[data-multi-record-selection-check-action="check-all"]'); diff --git a/typo3/sysext/core/Tests/Acceptance/Application/FormEngine/FalMetadataCest.php b/typo3/sysext/core/Tests/Acceptance/Application/FormEngine/FalMetadataCest.php index 80c8ffabbc26..ce80f9e915fc 100644 --- a/typo3/sysext/core/Tests/Acceptance/Application/FormEngine/FalMetadataCest.php +++ b/typo3/sysext/core/Tests/Acceptance/Application/FormEngine/FalMetadataCest.php @@ -54,7 +54,9 @@ public function _before(ApplicationTester $I, PageTree $pageTree): void public function checkIfUpdatedFileMetadataIsUpdatedInContent(ApplicationTester $I, PageTree $pageTree, FileTree $fileTree): void { $I->amGoingTo('Create new CE with image'); + $I->wait(1); $I->click('.t3js-page-new-ce button'); + $I->wait(1); $I->switchToMainFrame(); $I->waitForElement('.t3js-modal.show'); $I->wait(3); @@ -67,6 +69,7 @@ public function checkIfUpdatedFileMetadataIsUpdatedInContent(ApplicationTester $ $I->click('Images'); $I->click('Add image'); $I->switchToWindow(); + $I->wait(2); $I->switchToIFrame('modal_frame'); $I->waitForElement('.svg-tree-wrapper .nodes .node', 5); $I->click('.node[title="styleguide"]'); @@ -146,6 +149,7 @@ public function checkIfUpdatedFileMetadataIsUpdatedInContent(ApplicationTester $ public function checkIfFileMetadataIsInheritedInContent(ApplicationTester $I): void { $I->amGoingTo('Create new CE with image with filled metadata'); + $I->wait(1); $I->click('.t3js-page-new-ce button'); $I->switchToMainFrame(); $I->waitForElement('.t3js-modal.show'); @@ -159,6 +163,7 @@ public function checkIfFileMetadataIsInheritedInContent(ApplicationTester $I): v $I->click('Images'); $I->click('Add image'); $I->switchToWindow(); + $I->wait(2); $I->switchToIFrame('modal_frame'); $I->waitForElement('.svg-tree-wrapper .nodes .node', 5); $I->click('.node[title="styleguide"]'); diff --git a/typo3/sysext/core/Tests/Acceptance/Application/FormEngine/InlineContentElementLocalizeSynchronizeCest.php b/typo3/sysext/core/Tests/Acceptance/Application/FormEngine/InlineContentElementLocalizeSynchronizeCest.php index 5e56f51b3b5b..d9b50e86ebe7 100644 --- a/typo3/sysext/core/Tests/Acceptance/Application/FormEngine/InlineContentElementLocalizeSynchronizeCest.php +++ b/typo3/sysext/core/Tests/Acceptance/Application/FormEngine/InlineContentElementLocalizeSynchronizeCest.php @@ -49,6 +49,7 @@ public function addingResourceToDefaultLangPageAddResourceToLocalizedPage(Applic $I->click('Images'); $I->click('span[data-identifier="actions-insert-record"]', 'div.active'); $I->switchToWindow(); + $I->wait(2); $I->switchToIFrame('modal_frame'); // Find page 'styleguide' in page tree of modal and click it $context = $I->executeInSelenium(function (RemoteWebDriver $webdriver) { @@ -65,8 +66,10 @@ public function addingResourceToDefaultLangPageAddResourceToLocalizedPage(Applic $I->waitForElementVisible('.module-docheader a[title="Close"]'); $I->click('.module-docheader a[title="Close"]'); $I->switchToWindow(); + $I->wait(1); $I->waitForText('Save and close'); $I->click('Save and close'); + $I->wait(1); // Switch to "All languages" view and localize content element $I->switchToContentFrame(); $I->waitForElementVisible('select[name=actionMenu]'); @@ -89,6 +92,7 @@ public function addingResourceToDefaultLangPageAddResourceToLocalizedPage(Applic $I->click('Images'); $I->click('span[data-identifier="actions-insert-record"]', 'div.active'); $I->switchToWindow(); + $I->wait(2); $I->switchToIFrame('modal_frame'); // Find page 'styleguide' in page tree of modal and click it $context = $I->executeInSelenium(function (RemoteWebDriver $webdriver) { @@ -104,8 +108,10 @@ public function addingResourceToDefaultLangPageAddResourceToLocalizedPage(Applic $I->switchToContentFrame(); $I->click('.module-docheader a[title="Close"]'); $I->switchToWindow(); + $I->wait(1); $I->waitForText('Save and close'); $I->click('Save and close'); + $I->wait(1); $I->waitForElementNotVisible('.t3js-modal.show'); // Open the localized element and see that the second image can be synchronized $I->switchToContentFrame(); diff --git a/typo3/sysext/core/Tests/Acceptance/Application/FormEngine/InlineFalCest.php b/typo3/sysext/core/Tests/Acceptance/Application/FormEngine/InlineFalCest.php index a7be00465210..4f4b4986f826 100644 --- a/typo3/sysext/core/Tests/Acceptance/Application/FormEngine/InlineFalCest.php +++ b/typo3/sysext/core/Tests/Acceptance/Application/FormEngine/InlineFalCest.php @@ -50,11 +50,14 @@ public function _before(ApplicationTester $I, PageTree $pageTree): void public function seeFalRelationInfo(ApplicationTester $I, ModalDialog $modalDialog): void { $infoButtonSelector = '.tab-content button[data-action="infowindow"]'; - + $I->wait(2); $filename = $I->grabTextFrom(self::$filenameSelector); $I->click($infoButtonSelector); + $I->wait(2); $modalDialog->canSeeDialog(); + $I->wait(2); $I->switchToIFrame('.modal-iframe'); + $I->wait(2); $modalTitle = $I->grabTextFrom('.card-title'); $I->assertStringContainsString($filename, $modalTitle); } diff --git a/typo3/sysext/core/Tests/Acceptance/Application/FormEngine/InlinePagesLocalizeResourceCest.php b/typo3/sysext/core/Tests/Acceptance/Application/FormEngine/InlinePagesLocalizeResourceCest.php index 511b5413f8e1..ec851f17a071 100644 --- a/typo3/sysext/core/Tests/Acceptance/Application/FormEngine/InlinePagesLocalizeResourceCest.php +++ b/typo3/sysext/core/Tests/Acceptance/Application/FormEngine/InlinePagesLocalizeResourceCest.php @@ -59,11 +59,14 @@ public function addingResourceToDefaultLangPageAddResourceToLocalizedPage(Applic $I->switchToContentFrame(); $I->click('.module-docheader a[title="Close"]'); $I->switchToWindow(); + $I->wait(1); $I->waitForText('Save and close'); $I->click('Save and close'); + $I->wait(1); // Edit the page translation and see if that resource has been added. $I->switchToContentFrame(); $I->waitForText('staticdata - language 1'); + $I->wait(1); $I->click('staticdata - language 1'); $I->waitForText('Edit Page "staticdata - language 1"', 3, 'h1'); $I->click('Resources'); diff --git a/typo3/sysext/core/Tests/Acceptance/Application/Frontend/SitemapXmlCest.php b/typo3/sysext/core/Tests/Acceptance/Application/Frontend/SitemapXmlCest.php index fc9b5bb47ad1..8344d33574d8 100644 --- a/typo3/sysext/core/Tests/Acceptance/Application/Frontend/SitemapXmlCest.php +++ b/typo3/sysext/core/Tests/Acceptance/Application/Frontend/SitemapXmlCest.php @@ -39,6 +39,7 @@ public function _before(ApplicationTester $I, PageTree $pageTree) $pageTree->openPath(['styleguide frontend demo']); $I->switchToContentFrame(); $I->waitForElementVisible('.t3js-module-docheader-bar a[title="View webpage"]'); + $I->wait(2); $I->click('.t3js-module-docheader-bar a[title="View webpage"]'); $I->executeInSelenium(function (RemoteWebDriver $webdriver) { $handles = $webdriver->getWindowHandles(); @@ -48,7 +49,6 @@ public function _before(ApplicationTester $I, PageTree $pageTree) // Get current url $url = $this->getCurrentURL($I); - // Add Sitemap parameter to URL $I->amOnUrl($url . '?type=1533906435'); } diff --git a/typo3/sysext/core/Tests/Acceptance/Application/Impexp/AbstractCest.php b/typo3/sysext/core/Tests/Acceptance/Application/Impexp/AbstractCest.php index 43c58d987d38..1939e1a118a0 100644 --- a/typo3/sysext/core/Tests/Acceptance/Application/Impexp/AbstractCest.php +++ b/typo3/sysext/core/Tests/Acceptance/Application/Impexp/AbstractCest.php @@ -52,8 +52,11 @@ protected function setPageAccess(ApplicationTester $I, PageTree $pageTree, array $I->waitForElement($this->inPageTree . ' .node', 5); $pageTree->openPath($pagePath); $I->switchToContentFrame(); + $I->wait(2); $I->waitForElementVisible('//table[@id="typo3-permissionList"]/tbody/tr[1]/td[2]/a[@title="Change permissions"]'); + $I->wait(2); $I->click('//table[@id="typo3-permissionList"]/tbody/tr[1]/td[2]/a[@title="Change permissions"]'); + $I->wait(2); $I->waitForElementVisible('#PermissionControllerEdit'); $I->selectOption('//select[@id="selectGroup"]', ['value' => $userGroupId]); $recursionLevelOption = $I->grabTextFrom('//select[@id="recursionLevel"]/option[' . $recursionLevel . ']'); diff --git a/typo3/sysext/core/Tests/Acceptance/Application/InstallTool/UpgradeCest.php b/typo3/sysext/core/Tests/Acceptance/Application/InstallTool/UpgradeCest.php index 5c4d5ba6d785..7a2901a4a28c 100644 --- a/typo3/sysext/core/Tests/Acceptance/Application/InstallTool/UpgradeCest.php +++ b/typo3/sysext/core/Tests/Acceptance/Application/InstallTool/UpgradeCest.php @@ -143,6 +143,7 @@ public function seeCheckTca(ApplicationTester $I, ModalDialog $modalDialog): voi public function seeCheckForBrokenExtensions(ApplicationTester $I, ModalDialog $modalDialog): void { + $I->wait(1); $I->click('Check Extension Compatibility'); $modalDialog->canSeeDialog(); $I->see('ext_localconf.php of all loaded extensions successfully loaded', ModalDialog::$openedModalSelector); diff --git a/typo3/sysext/core/Tests/Acceptance/Application/Recycler/RecyclerModuleCest.php b/typo3/sysext/core/Tests/Acceptance/Application/Recycler/RecyclerModuleCest.php index 9c56b976b82c..e16e601bc0ce 100644 --- a/typo3/sysext/core/Tests/Acceptance/Application/Recycler/RecyclerModuleCest.php +++ b/typo3/sysext/core/Tests/Acceptance/Application/Recycler/RecyclerModuleCest.php @@ -72,6 +72,7 @@ public function deleteAndRecoverRecords(ApplicationTester $I): void $this->goToRecyclerModule($I); // Select depth infinite + $I->wait(1); $I->selectOption('select[name="depth"]', 999); $I->amGoingTo('See if the deleted page its content appear in the recycler'); diff --git a/typo3/sysext/core/Tests/Acceptance/Application/Site/SiteModuleCest.php b/typo3/sysext/core/Tests/Acceptance/Application/Site/SiteModuleCest.php index a1a27d72a684..a32c91be0c03 100644 --- a/typo3/sysext/core/Tests/Acceptance/Application/Site/SiteModuleCest.php +++ b/typo3/sysext/core/Tests/Acceptance/Application/Site/SiteModuleCest.php @@ -17,11 +17,8 @@ namespace TYPO3\CMS\Core\Tests\Acceptance\Application\Site; -use Facebook\WebDriver\Remote\RemoteWebDriver; -use Facebook\WebDriver\Remote\RemoteWebElement; use TYPO3\CMS\Core\Tests\Acceptance\Support\ApplicationTester; use TYPO3\CMS\Core\Tests\Acceptance\Support\Helper\ModalDialog; -use TYPO3\CMS\Core\Tests\Acceptance\Support\Helper\PageTree; /** * Tests concerning Sites Module @@ -35,39 +32,35 @@ public function _before(ApplicationTester $I): void public function editExistingRecord(ApplicationTester $I, ModalDialog $modalDialog): void { - $acceptanceUrl = $I->grabModuleConfig('WebDriver', 'url'); - $acceptanceUrlWithTrailingSlash = rtrim($acceptanceUrl, '/') . '/'; - $I->amGoingTo('Access the site module'); $I->click('Sites'); $I->switchToContentFrame(); - $I->canSee('Site Configuration', 'h1'); + $I->see('Site Configuration', 'h1'); $I->amGoingTo('edit an automatically created site configuration'); $I->click('Edit'); $I->waitForElementNotVisible('#t3js-ui-block'); - $I->canSee('Edit Site Configuration', 'h1'); - $I->fillField('//input[contains(@data-formengine-input-name, "data[site]") and contains(@data-formengine-input-name, "[identifier]")]', 'autogenerated-1-c4ca4238a0'); - $I->fillField('//input[contains(@data-formengine-input-name, "data[site]") and contains(@data-formengine-input-name, "[base]")]', $acceptanceUrlWithTrailingSlash); + $I->see('Edit Site Configuration', 'h1'); $I->amGoingTo('Edit the default site language'); $I->click('Languages'); - $I->canSee('English [0] (en_US.UTF-8)'); + $I->see('English [0] (en_US.UTF-8)'); $I->click('div[data-table-unique-original-value=site_language_0] > div:nth-child(1) > div:nth-child(1)'); $I->waitForElementVisible('div[data-table-unique-original-value=site_language_0] > div.panel-collapse'); $I->fillField('//input[contains(@data-formengine-input-name, "data[site_language]") and contains(@data-formengine-input-name, "[title]")]', 'English Edit'); - $I->fillField('//input[contains(@data-formengine-input-name, "data[site_language]") and contains(@data-formengine-input-name, "[base]")]', $acceptanceUrlWithTrailingSlash); + $I->fillField('//input[contains(@data-formengine-input-name, "data[site_language]") and contains(@data-formengine-input-name, "[base]")]', '/'); $I->fillField('//input[contains(@data-formengine-input-name, "data[site_language]") and contains(@data-formengine-input-name, "[locale]")]', 'en_US.UTF-8'); $I->amGoingTo('Delete a site language'); - $I->canSee('styleguide demo language danish [1] (da_DK.UTF-8)'); + $I->see('styleguide demo language danish [1] (da_DK.UTF-8)'); $I->click('div[data-table-unique-original-value=site_language_1] > div:nth-child(1) > div:nth-child(1) > div:nth-child(3) button'); $modalDialog->canSeeDialog(); $I->click('button[name="yes"]', ModalDialog::$openedModalButtonContainerSelector); $I->waitForElementNotVisible(ModalDialog::$openedModalSelector, 30); $I->switchToContentFrame(); + $I->wait(2); $I->dontSee('styleguide demo language danish [1] (da_DK.UTF-8)'); - $I->canSee('styleguide demo language danish [1]', 'option'); + $I->see('styleguide demo language danish [1]', 'option'); $I->amGoingTo('Save the site configuration'); $saveButtonLink = '//*/button[@name="_savedok"][1]'; @@ -76,14 +69,14 @@ public function editExistingRecord(ApplicationTester $I, ModalDialog $modalDialo $I->waitForElementNotVisible('#t3js-ui-block'); $I->amGoingTo('Verify default site language has changed and danish is deleted'); - $I->canSee('English Edit [0] (en_US.UTF-8)'); + $I->see('English Edit [0] (en_US.UTF-8)'); $I->dontSee('styleguide demo language danish [1] (da_DK.UTF-8)'); $I->amGoingTo('Create a completely new site language'); $I->click('Create new language'); $I->waitForElementVisible('div.inlineIsNewRecord'); $I->scrollTo('div.inlineIsNewRecord'); - $I->canSee('[New language]'); + $I->see('[New language]'); $I->fillField('//input[contains(@data-formengine-input-name, "data[site_language]") and contains(@data-formengine-input-name, "[title]")]', 'New Language'); $I->fillField('//input[contains(@data-formengine-input-name, "data[site_language]") and contains(@data-formengine-input-name, "[base]")]', '/new-language/'); $I->fillField('//input[contains(@data-formengine-input-name, "data[site_language]") and contains(@data-formengine-input-name, "[locale]")]', 'C'); @@ -100,207 +93,6 @@ public function editExistingRecord(ApplicationTester $I, ModalDialog $modalDialo $I->amGoingTo('Close the site configuration form'); $I->click('Close'); $I->waitForElementVisible('table.table-striped'); - $I->canSee('Site Configuration', 'h1'); - $I->canSee('autogenerated-1-c4ca4238a0', 'code'); - - $I->amGoingTo('Ensure the previously added language is available and the default is prefilled in a new site configuration'); - $I->click('Add new site configuration for this site'); - $I->waitForElementNotVisible('#t3js-ui-block'); - $I->canSee('Create new Site Configuration', 'h1'); - $I->click('Languages'); - $I->canSee('New Language [5]', 'option'); - $I->canSee('English Edit [0] (en_US.UTF-8)'); - $title = $I->grabValueFrom('//input[contains(@data-formengine-input-name, "data[site_language]") and contains(@data-formengine-input-name, "[title]")]'); - $I->assertEquals('English Edit', $title); - $I->click('div.inlineIsNewRecord:nth-child(1) > div:nth-child(1) > div:nth-child(1)'); - - $I->amGoingTo('Verify new language can be added from selector box and deleted afterwards'); - $I->selectOption('.t3js-create-new-selector', '5'); - $I->waitForElementVisible('div.inlineIsNewRecord:nth-child(2)'); - $I->scrollTo('div.inlineIsNewRecord:nth-child(2)'); - $I->canSee('New Language [5] (C)'); - $I->click('div.inlineIsNewRecord:nth-child(2) > div:nth-child(1) > div:nth-child(1)'); - $I->canSee('/hr/'); - $I->click('div.inlineIsNewRecord:nth-child(2) > div:nth-child(1) > div:nth-child(1) > div:nth-child(3) button'); - $modalDialog->canSeeDialog(); - $I->click('button[name="yes"]', ModalDialog::$openedModalButtonContainerSelector); - $I->waitForElementNotVisible(ModalDialog::$openedModalSelector, 30); - $I->switchToContentFrame(); - $I->waitForText('New Language [5]'); - $I->see('New Language [5]', 'option'); - - $I->amGoingTo('Undo the generation of the new site configuration'); - $I->click('Close'); - $modalDialog->canSeeDialog(); - $I->click('button[name="yes"]', ModalDialog::$openedModalButtonContainerSelector); - $I->waitForElementNotVisible(ModalDialog::$openedModalSelector, 30); - $I->switchToContentFrame(); - $I->canSee('Add new site configuration for this site', 'a'); - } - - /** - * Add a default FE ts snipped to the existing site config and verify FE is rendered - * - * @depends editExistingRecord - */ - public function defaultFrontendRendering(ApplicationTester $I, PageTree $pageTree, ModalDialog $modalDialog): void - { - $I->amGoingTo('Create a default FE typoscript for the created site configuration'); - - // Select the root page - $I->switchToMainFrame(); - $I->amGoingTo('Access template module'); - $I->click('Template'); - // click on PID=0 - $I->waitForElement('svg .nodes .node'); - $I->clickWithLeftButton('#identifier-0_0 text.node-name'); - $I->switchToContentFrame(); - $I->waitForElementVisible('#ts-overview'); - $I->see('Template tools'); - - $I->amGoingTo('Select the root page and switch back to content frame'); - $I->switchToMainFrame(); - $I->click('Template'); - $pageTree->openPath(['styleguide TCA demo']); - $I->switchToContentFrame(); - $I->waitForText('Create new website'); - - $I->amGoingTo('Create a new template for the root page'); - $I->click("//input[@name='newWebsite']"); - $I->selectOption('.t3-js-jumpMenuBox', 'Info/Modify'); - $I->see('NEW SITE', 'h3'); - $I->waitForElement('table.table.table-striped'); - $I->see('Title'); - - $I->amGoingTo('Add the PAGE object'); - $I->click('Edit the whole template record'); - $I->waitForElement('#EditDocumentController'); - $I->fillField($this->getInputByLabel($I, 'Template Title'), 'Default Title'); - $I->click("//button[@name='_savedok']"); - $I->waitForElementNotVisible('#t3js-ui-block', 30); - $I->waitForElement('#EditDocumentController'); - $I->waitForElementNotVisible('#t3js-ui-block'); - - // watch out for new line after each instruction. Anything else doesn't work. - $config = 'page = PAGE -page.shortcutIcon = fileadmin/styleguide/bus_lane.jpg -page.10 = TEXT -page.10.value = This is a default text for default rendering without dynamic content creation -'; - $I->fillField($this->getInputByLabel($I, 'Setup', 'textarea'), $config); - $I->click('//button[@name="_savedok"]'); - $I->waitForElementNotVisible('#t3js-ui-block'); - - $I->amGoingTo('Call FE and verify it is properly rendered'); - $I->amOnPage('/'); - $I->canSee('This is a default text for default rendering without dynamic content creation'); - - $I->amGoingTo('Delete the site template record again'); - $I->amOnPage('/typo3/index.php'); - $I->click('Template'); - // click on PID=0 - $I->waitForElement('svg .nodes .node'); - $I->clickWithLeftButton('#identifier-0_0 text.node-name'); - $I->switchToContentFrame(); - $I->waitForElementVisible('#ts-overview'); - $I->switchToMainFrame(); - $pageTree->openPath(['styleguide TCA demo']); - $I->wait(0.2); - $I->switchToContentFrame(); - $I->click('Edit the whole template record'); - $I->waitForElement('#EditDocumentController'); - $I->click('Delete'); - $modalDialog->canSeeDialog(); - $I->click('button[name="yes"]', ModalDialog::$openedModalButtonContainerSelector); - $I->waitForElementNotVisible(ModalDialog::$openedModalSelector, 30); - $I->switchToContentFrame(); - $I->see('Create new website'); - } - - /** - * @depends defaultFrontendRendering - * @throws \Exception - */ - public function createSiteConfigIfNoneExists(ApplicationTester $I, ModalDialog $modalDialog): void - { - $acceptanceUrl = $I->grabModuleConfig('WebDriver', 'url'); - $acceptanceUrlWithTrailingSlash = rtrim($acceptanceUrl, '/') . '/'; - - $I->amGoingTo('Access the site module'); - $I->click('Sites'); - $I->switchToContentFrame(); - $I->canSee('Site Configuration', 'h1'); - - $I->amGoingTo('delete the auto generated config in order to create one manually'); - $I->click('Delete site configuration'); - $modalDialog->canSeeDialog(); - $modalDialog->clickButtonInDialog('Delete'); - $I->switchToContentFrame(); - - $I->amGoingTo('manually create a new site config for the existing root page'); - $I->click('Add new site configuration for this site'); - $I->waitForElementNotVisible('#t3js-ui-block'); - $I->canSee('Create new Site configuration'); - $I->fillField('//input[contains(@data-formengine-input-name, "data[site]") and contains(@data-formengine-input-name, "[identifier]")]', 'SitesTestIdentifier'); - $I->fillField('//input[contains(@data-formengine-input-name, "data[site]") and contains(@data-formengine-input-name, "[base]")]', $acceptanceUrlWithTrailingSlash); - $I->click('Languages'); - - $I->amGoingTo('Delete the automatically added default language and add it again from the selector afterwards'); - $I->click('div.inlineIsNewRecord > div:nth-child(1) > div:nth-child(1) > div:nth-child(3) button'); - $modalDialog->canSeeDialog(); - $I->click('button[name="yes"]', ModalDialog::$openedModalButtonContainerSelector); - $I->waitForElementNotVisible(ModalDialog::$openedModalSelector, 30); - $I->switchToContentFrame(); - $I->wait(1); - $I->canSee('English [0]', 'option'); - $I->selectOption('.t3js-create-new-selector', '0'); - $I->waitForElementVisible('div.inlineIsNewRecord:nth-child(1)'); - $I->fillField('//input[contains(@data-formengine-input-name, "data[site_language]") and contains(@data-formengine-input-name, "[title]")]', 'Homepage'); - $I->fillField('//input[contains(@data-formengine-input-name, "data[site_language]") and contains(@data-formengine-input-name, "[base]")]', $acceptanceUrlWithTrailingSlash); - $I->fillField('//input[contains(@data-formengine-input-name, "data[site_language]") and contains(@data-formengine-input-name, "[locale]")]', 'en_US.UTF-8'); - $saveButtonLink = '//*/button[@name="_savedok"][1]'; - $I->waitForElement($saveButtonLink, 30); - $I->click($saveButtonLink); - - $I->amGoingTo('Create and delete new site language. Verify "Placehoder" is not added to selector'); - $I->click('Languages'); - $I->click('Create new language'); - $I->waitForElementVisible('div.inlineIsNewRecord'); - $I->scrollTo('div.inlineIsNewRecord'); - $I->canSee('[New language]'); - $I->click('div.inlineIsNewRecord > div:nth-child(1) > div:nth-child(1) > div:nth-child(3) button'); - $modalDialog->canSeeDialog(); - $I->click('button[name="yes"]', ModalDialog::$openedModalButtonContainerSelector); - $I->waitForElementNotVisible(ModalDialog::$openedModalSelector, 30); - $I->switchToContentFrame(); - $I->dontSee('Placeholder'); - - $I->amGoingTo('Close site configuration and verify that it got saved'); - $I->waitForElementNotVisible('#t3js-ui-block'); - $I->click('div.module-docheader .btn.t3js-editform-close'); - $modalDialog->canSeeDialog(); - $I->click('button[name="save"]', ModalDialog::$openedModalButtonContainerSelector); - $I->waitForElementNotVisible(ModalDialog::$openedModalSelector, 30); - $I->switchToContentFrame(); - $I->waitForElementVisible('table.table-striped'); - $I->canSee('Site Configuration', 'h1'); - $I->canSee('SitesTestIdentifier'); - } - - /** - * Find input field by label name - */ - protected function getInputByLabel(ApplicationTester $I, string $labelName, string $tag = 'input[@type="text"]'): RemoteWebElement - { - $I->comment('Get input for label "' . $labelName . '"'); - return $I->executeInSelenium( - static function (RemoteWebDriver $webDriver) use ($labelName, $tag) { - return $webDriver->findElement( - \Facebook\WebDriver\WebDriverBy::xpath( - '//abbr[contains(text(),"' . $labelName . '")]/parent::*/parent::*/following-sibling::div//' . $tag - ) - ); - } - ); + $I->see('Site Configuration', 'h1'); } } diff --git a/typo3/sysext/core/Tests/Acceptance/Application/Template/TemplateCest.php b/typo3/sysext/core/Tests/Acceptance/Application/Template/TemplateCest.php index 93ca7f6eedb5..99d4e60c4aa5 100644 --- a/typo3/sysext/core/Tests/Acceptance/Application/Template/TemplateCest.php +++ b/typo3/sysext/core/Tests/Acceptance/Application/Template/TemplateCest.php @@ -46,6 +46,7 @@ public function pagesWithNoTemplateShouldShowButtonsToCreateTemplates(Applicatio $I->switchToContentFrame(); $I->waitForElementVisible('#ts-overview'); + $I->wait(2); $I->see('This is an overview of the pages in the database containing one or more template records. Click a page title to go to the page.'); $I->wantTo('show templates overview on website root page (uid = 1 and pid = 0)'); @@ -54,6 +55,7 @@ public function pagesWithNoTemplateShouldShowButtonsToCreateTemplates(Applicatio $I->clickWithLeftButton('//*[text()=\'styleguide TCA demo\']'); $I->switchToContentFrame(); $I->waitForText('No template'); + $I->wait(2); $I->see('There was no template on this page!'); $I->see('You need to create a template record below in order to edit your configuration.'); @@ -74,11 +76,13 @@ public function addANewSiteTemplate(ApplicationTester $I): void $I->clickWithLeftButton('//*[text()=\'styleguide TCA demo\']'); $I->switchToContentFrame(); $I->waitForText('Create new website'); + $I->wait(2); $I->click("//input[@name='newWebsite']"); $I->waitForText('Edit constants for template'); $I->wantTo('change to Info/Modify and see the template overview table'); $I->selectOption('.t3-js-jumpMenuBox', 'Info/Modify'); + $I->wait(3); $I->waitForElement('.table-striped'); $I->see('Title'); $I->see('Description'); @@ -111,6 +115,7 @@ public function addANewSiteTemplate(ApplicationTester $I): void $I->see('Acceptance Test Site'); $I->wantTo('change the template within the TypoScript Object Browser'); + $I->wait(1); $I->selectOption('.t3-js-jumpMenuBox', 'TypoScript Object Browser'); $I->waitForText('CONSTANTS ROOT'); $I->selectOption('//select[@name="SET[ts_browser_type]"]', 'Setup'); @@ -142,6 +147,7 @@ public function checkClosestTemplateButton(ApplicationTester $I): void $I->clickWithLeftButton('//*[text()=\'menu_sitemap_pages\']'); $I->switchToContentFrame(); $I->waitForText('No template'); + $I->wait(2); $I->see('There was no template on this page!'); $I->see('You need to create a template record below in order to edit your configuration.'); $I->seeLink('Click here to go.'); @@ -166,6 +172,7 @@ public function createExtensionTemplate(ApplicationTester $I): void $I->clickWithLeftButton('(//*[contains(concat(" ", normalize-space(@class), " "), " toggle ")])[4]'); $I->clickWithLeftButton('//*[text()=\'menu_sitemap_pages\']'); $I->switchToContentFrame(); + $I->wait(2); $I->waitForText('No template'); $I->see('There was no template on this page!'); $I->see('You need to create a template record below in order to edit your configuration.'); @@ -199,9 +206,9 @@ public function searchInTypoScriptObjectBrowser(ApplicationTester $I): void $I->switchToMainFrame(); $I->clickWithLeftButton('//*[text()=\'styleguide TCA demo\']'); $I->switchToContentFrame(); + $I->wait(2); $I->selectOption('.t3-js-jumpMenuBox', 'TypoScript Object Browser'); $I->waitForText('CONSTANTS ROOT'); - $I->amGoingTo('type "styles" into the search field and submit.'); $I->fillField('#search_field', 'styles'); $I->click("//input[@name='search']"); @@ -220,6 +227,7 @@ public function useObjectListInObjectBrowser(ApplicationTester $I): void $I->switchToContentFrame(); $I->amGoingTo('Switch to object browser.'); + $I->wait(2); $I->selectOption('.t3-js-jumpMenuBox', 'TypoScript Object Browser'); $I->waitForText('CONSTANTS ROOT'); $I->selectOption('select[name="SET[ts_browser_type]"]', 'Setup'); diff --git a/typo3/sysext/core/Tests/Acceptance/Application/Workspace/WorkspaceModuleCest.php b/typo3/sysext/core/Tests/Acceptance/Application/Workspace/WorkspaceModuleCest.php index 4a75681b5266..b30671e8e4ec 100644 --- a/typo3/sysext/core/Tests/Acceptance/Application/Workspace/WorkspaceModuleCest.php +++ b/typo3/sysext/core/Tests/Acceptance/Application/Workspace/WorkspaceModuleCest.php @@ -58,6 +58,7 @@ public function editPageTitleAndSeeChangeInWorkspaceModule(ApplicationTester $I, $I->comment('Rename page'); $I->switchToContentFrame(); $I->waitForElement('button[data-action="edit"]'); + $I->wait(1); $I->click('button[data-action="edit"]'); $I->wait(1); $I->fillField('input[class*="t3js-title-edit-input"]', $newPageTitle); diff --git a/typo3/sysext/core/Tests/Acceptance/Support/Helper/Mouse.php b/typo3/sysext/core/Tests/Acceptance/Support/Helper/Mouse.php index c437d270d0de..716841582f4b 100644 --- a/typo3/sysext/core/Tests/Acceptance/Support/Helper/Mouse.php +++ b/typo3/sysext/core/Tests/Acceptance/Support/Helper/Mouse.php @@ -101,6 +101,7 @@ protected function findElement(string $selector): RemoteWebElement { $I = $this->tester; try { + $I->wait(0.5); return $I->executeInSelenium(static function (RemoteWebDriver $webDriver) use ($selector) { return $webDriver->findElement(WebDriverBy::cssSelector($selector)); });