drupal/.gitlab-ci/pipeline.yml

243 lines
9.2 KiB
YAML
Raw Blame History

This file contains invisible Unicode characters!

This file contains invisible Unicode characters that may be processed differently from what appears below. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to reveal hidden characters.

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

# cspell:ignore drupaltestbot drupaltestbotpw
stages:
- 🗜️ Test
#############
# Templates #
#############
default:
interruptible: true
retry:
max: 2
when:
- unknown_failure
- api_failure
- stuck_or_timeout_failure
- runner_system_failure
- scheduler_failure
image:
name: $_CONFIG_DOCKERHUB_ROOT/php-$_TARGET_PHP-apache:production
before_script:
- |
[[ $_TARGET_DB == sqlite* ]] && export SIMPLETEST_DB=sqlite://localhost/$CI_PROJECT_DIR/sites/default/files/db.sqlite?module=sqlite
[[ $_TARGET_DB == mysql* ]] && export SIMPLETEST_DB=mysql://$MYSQL_USER:$MYSQL_PASSWORD@database/$MYSQL_DATABASE?module=mysql
[[ $_TARGET_DB == mariadb* ]] && export SIMPLETEST_DB=mysql://$MYSQL_USER:$MYSQL_PASSWORD@database/$MYSQL_DATABASE?module=mysql
[[ $_TARGET_DB == pgsql* ]] && export SIMPLETEST_DB=pgsql://$POSTGRES_USER:$POSTGRES_PASSWORD@database/$POSTGRES_DB?module=pgsql
- echo "SIMPLETEST_DB = $SIMPLETEST_DB"
- $CI_PROJECT_DIR/.gitlab-ci/scripts/server-setup.sh
after_script:
- sed -i "s#$CI_PROJECT_DIR/##" ./sites/default/files/simpletest/phpunit-*.xml || true
artifacts:
when: always
expire_in: 6 mos
reports:
junit: ./sites/default/files/simpletest/phpunit-*.xml
paths:
- ./sites/default/files/simpletest/phpunit-*.xml
- ./sites/simpletest/browser_output
- '*.log'
.default-job-settings: &default-job-settings
stage: 🗜️ Test
rules:
- if: $CI_PIPELINE_SOURCE == "parent_pipeline" && $PERFORMANCE_TEST != "1"
.with-composer: &with-composer
needs:
- pipeline: $PARENT_PIPELINE_ID
job: '📦️ Composer'
.with-composer-and-yarn: &with-composer-and-yarn
needs:
- pipeline: $PARENT_PIPELINE_ID
job: '📦️ Composer'
- pipeline: $PARENT_PIPELINE_ID
job: '📦️ Yarn'
variables:
FF_NETWORK_PER_BUILD: 1
SIMPLETEST_BASE_URL: http://localhost/subdirectory
DB_DRIVER: mysql
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: mysql
MYSQL_USER: drupaltestbot
MYSQL_PASSWORD: drupaltestbotpw
POSTGRES_DB: drupaltestbot
POSTGRES_USER: drupaltestbot
POSTGRES_PASSWORD: drupaltestbotpw
MINK_DRIVER_ARGS_WEBDRIVER: '["chrome", {"browserName":"chrome","chromeOptions":{"args":["--disable-dev-shm-usage","--disable-gpu","--headless","--dns-prefetch-disable"]}}, "http://localhost:9515"]'
CI_PARALLEL_NODE_INDEX: $CI_NODE_INDEX
CI_PARALLEL_NODE_TOTAL: $CI_NODE_TOTAL
.with-database: &with-database
name: $_CONFIG_DOCKERHUB_ROOT/$_TARGET_DB:production
alias: database
.with-chrome: &with-chrome
name: $_CONFIG_DOCKERHUB_ROOT/chromedriver:production
alias: chrome
entrypoint:
- chromedriver
- "--no-sandbox"
- "--log-path=/builds/chromedriver.log"
- "--whitelisted-ips="
- "--allowed-origins=*"
.run-tests: &run-tests
script:
# Need to pass this along directly.
- sudo MINK_DRIVER_ARGS_WEBDRIVER="$MINK_DRIVER_ARGS_WEBDRIVER" -u www-data php ./core/scripts/run-tests.sh --color --keep-results --types "$TESTSUITE" --concurrency "$CONCURRENCY" --repeat "1" --sqlite "./sites/default/files/tests.sqlite" --dburl $SIMPLETEST_DB --url $SIMPLETEST_BASE_URL --verbose --non-html --all --ci-parallel-node-index $CI_PARALLEL_NODE_INDEX --ci-parallel-node-total $CI_PARALLEL_NODE_TOTAL
.run-repeat-class-test: &run-repeat-class-test
script:
- echo " Running class ${REPEAT_TEST_CLASS}"
- |
if [[ $REPEAT_TEST_CLASS == "Drupal\Tests\Change\Me" ]]; then
echo '❗ You need to change the REPEAT_TEST_CLASS variable to an existing class before running the job.'
echo ' You just need to click on the job that you want to run (do not press the play button straight away) and then set the following:'
echo ' "Key" to "REPEAT_TEST_CLASS" and "Value" to "Drupal\Tests\ckeditor5\FunctionalJavascript\MediaLinkabilityTest"';
exit 1;
else
sudo MINK_DRIVER_ARGS_WEBDRIVER="$MINK_DRIVER_ARGS_WEBDRIVER" -u www-data php ./core/scripts/run-tests.sh --color --keep-results --concurrency "$CONCURRENCY" --repeat "100" --sqlite "./sites/default/files/tests.sqlite" --dburl $SIMPLETEST_DB --url $SIMPLETEST_BASE_URL --verbose --non-html --class $REPEAT_TEST_CLASS
fi
################
# Jobs
#
# Jobs define what scripts are actually executed in each stage.
#
# The 'rules' keyword can also be used to define conditions for each job.
#
# Documentation: https://docs.gitlab.com/ee/ci/jobs/
################
'🩹 Test-only changes':
<<: [ *with-composer, *default-job-settings ]
when: manual
allow_failure: true
services:
- <<: *with-database
- <<: *with-chrome
script:
- $CI_PROJECT_DIR/.gitlab-ci/scripts/test-only.sh
'🖱️️️ PHPUnit Functional Javascript':
<<: [ *with-composer, *run-tests, *default-job-settings ]
parallel: 2
variables:
TESTSUITE: PHPUnit-FunctionalJavascript
CONCURRENCY: 15
KUBERNETES_CPU_REQUEST: "24"
services:
- <<: *with-database
- <<: *with-chrome
after_script:
- sed -i "s#$CI_PROJECT_DIR/##" ./sites/default/files/simpletest/phpunit-*.xml || true
- cp /builds/chromedriver.log ./
'🌐️️ PHPUnit Functional':
<<: [ *with-composer, *run-tests, *default-job-settings ]
parallel: 7
variables:
TESTSUITE: PHPUnit-Functional
KUBERNETES_CPU_REQUEST: "24"
services:
- <<: *with-database
'⚙️️ PHPUnit Kernel':
<<: [ *with-composer, *run-tests, *default-job-settings ]
parallel: 3
variables:
TESTSUITE: PHPUnit-Kernel
KUBERNETES_CPU_REQUEST: "16"
services:
- <<: *with-database
'👷️️️ PHPUnit Build':
<<: [ *with-composer, *run-tests, *default-job-settings ]
variables:
TESTSUITE: PHPUnit-Build
KUBERNETES_CPU_REQUEST: "2"
services:
- <<: *with-database
'⚡️ PHPUnit Unit':
<<: [ *with-composer, *run-tests, *default-job-settings ]
services:
# There are some unit tests that need a database.
# @todo Remove after https://www.drupal.org/project/drupal/issues/3386217
- <<: *with-database
variables:
TESTSUITE: PHPUnit-Unit
KUBERNETES_CPU_REQUEST: "16"
'🦉️️️ Nightwatch':
<<: [ *with-composer-and-yarn, *default-job-settings ]
variables:
KUBERNETES_CPU_REQUEST: "24"
services:
- <<: *with-database
- <<: *with-chrome
script:
- export DRUPAL_TEST_DB_URL=$SIMPLETEST_DB
- cp ./core/.env.example ./core/.env
# dotenv-safe/config does not support environment variables
# @see https://github.com/rolodato/dotenv-safe/issues/126
# @todo move this to `variables` when the above is resolved
- echo "DRUPAL_TEST_BASE_URL='http://localhost/subdirectory'" >> ./core/.env
- echo "DRUPAL_TEST_CHROMEDRIVER_AUTOSTART=false" >> ./core/.env
- echo "DRUPAL_TEST_DB_URL='${DRUPAL_TEST_DB_URL}'" >> ./core/.env
- echo "DRUPAL_TEST_WEBDRIVER_HOSTNAME='localhost'" >> ./core/.env
- echo "DRUPAL_TEST_WEBDRIVER_CHROME_ARGS='--disable-dev-shm-usage --disable-gpu --headless --dns-prefetch-disable'" >> ./core/.env
- echo "DRUPAL_TEST_WEBDRIVER_PORT='9515'" >> ./core/.env
- echo "DRUPAL_NIGHTWATCH_OUTPUT='"../nightwatch_output"'" >> ./core/.env
- echo "COLUMNS=1000" >> ./core/.env
- chown -R www-data:www-data ./sites /var/www
- sudo -u www-data yarn run --cwd=./core test:nightwatch --workers=4
after_script:
- cp /builds/chromedriver.log ./
artifacts:
when: always
expire_in: 6 mos
reports:
junit: ./nightwatch_output/**/*.xml
paths:
- ./nightwatch_output
- '*.log'
'🔁 Repeat Class Test':
<<: [ *with-composer, *run-repeat-class-test, *default-job-settings ]
when: manual
allow_failure: true
variables:
REPEAT_TEST_CLASS: 'Drupal\Tests\Change\Me'
services:
- <<: *with-database
'🚲 Performance tests':
<<: [ *with-composer, *default-job-settings ]
rules:
- if: $PERFORMANCE_TEST == "1"
variables:
KUBERNETES_CPU_REQUEST: "24"
MINK_DRIVER_ARGS_WEBDRIVER: '["chrome", {"browserName":"chrome","chromeOptions":{"args":["--disable-dev-shm-usage","--disable-gpu","--headless","--no-sandbox"]}}, "http://chrome:9515"]'
tags:
- performance-test-runner
services:
- <<: *with-database
- <<: *with-chrome
script:
# Determine DB driver.
- |
[[ $_TARGET_DB == sqlite* ]] && export SIMPLETEST_DB=sqlite://localhost/subdirectory/sites/default/files/db.sqlite?module=sqlite
[[ $_TARGET_DB == mysql* ]] && export SIMPLETEST_DB=mysql://$MYSQL_USER:$MYSQL_PASSWORD@database/$MYSQL_DATABASE?module=mysql
[[ $_TARGET_DB == mariadb* ]] && export SIMPLETEST_DB=mysql://$MYSQL_USER:$MYSQL_PASSWORD@database/$MYSQL_DATABASE?module=mysql
[[ $_TARGET_DB == pgsql* ]] && export SIMPLETEST_DB=pgsql://$POSTGRES_USER:$POSTGRES_PASSWORD@database/$POSTGRES_DB?module=pgsql
- export OTEL_COLLECTOR="$OTEL_COLLECTOR"
- mkdir -p ./sites/simpletest ./sites/default/files ./build/logs/junit /var/www/.composer
- chown -R www-data:www-data ./sites ./build/logs/junit ./vendor /var/www/
- sudo -u www-data git config --global --add safe.directory $CI_PROJECT_DIR
- sudo SIMPLETEST_BASE_URL="http://$HOSTNAME/subdirectory" SIMPLETEST_DB="$SIMPLETEST_DB" MINK_DRIVER_ARGS_WEBDRIVER="$MINK_DRIVER_ARGS_WEBDRIVER" OTEL_COLLECTOR="$OTEL_COLLECTOR" -u www-data ./vendor/bin/phpunit --verbose -c core --group OpenTelemetry --log-junit=./sites/default/files/simpletest/phpunit-performance.xml