diff --git a/.travis.yml b/.travis.yml index df421db808d..1f99b3c7f54 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,9 +1,9 @@ language: php -dist: trusty +dist: xenial cache: directories: - - $HOME/.composer/cache/files + - $HOME/.composer/cache addons: artifacts: @@ -23,80 +23,80 @@ env: - DRUPAL_BASE_URL="http://127.0.0.1:8080" - PATH="$PATH:$HOME/.composer/vendor/bin" - TRAVIS_NODE_VERSION="4" + - AWS_ACCESS_KEY_ID=$ARTIFACTS_KEY + - AWS_SECRET_ACCESS_KEY=$ARTIFACTS_SECRET stages: + - prepare for tests - test - - name: codecov - if: branch = 8.x-1.x-dev + - codecov jobs: include: - - script: robo job:check-coding-standards - - script: robo job:run-unit-tests - - script: robo job:check-module-circular-dependency - - script: robo job:run-kernel-tests "widgets-1,widgets-2,widgets-3,widgets-4,widgets-5" - - script: robo job:run-kernel-tests "publications-1,publications-2,wysiwyg,vsite,os,os-theme-preview" - - script: robo job:run-kernel-tests "cp-1,cp-2,other-1,other-2,cp-menu,profiles,redirect,cp-appearance,os-search" - - script: robo job:run-functional-tests "classes,events,pages,cp,media-browser,os-theme-preview,breadcrumbs,cp-menu,vsite_favicon" - - script: robo job:run-functional-tests "os-search,analytics,publications,cp-appearance,redirect,twitter,os,vsite,cp-import" - - script: robo job:run-functional-javascript-tests "publications,mailchimp,metatag,redirect,cp-appearance,vsite-preset" - - script: robo job:run-functional-javascript-tests "os-search,cp,profiles,classes,pages" - - script: robo job:run-functional-javascript-tests "events,vsite,widgets" - - script: robo job:run-functional-javascript-tests "os,os-theme-preview,blog,faq,news,presentations,cp-menu" + - stage: prepare for tests + script: robo job:check-coding-standards + - stage: prepare for tests + script: robo job:run-unit-tests + - stage: prepare for tests + script: robo job:check-module-circular-dependency + - stage: test + script: robo job:run-kernel-tests "widgets-1,widgets-2,widgets-3,widgets-4,widgets-5" +# - stage: test +# script: robo job:run-kernel-tests "publications-1,publications-2,wysiwyg,vsite,os,os-theme-preview" +# - stage: test +# script: robo job:run-kernel-tests "cp-1,cp-2,other-1,other-2,cp-menu,profiles,redirect,cp-appearance,os-search" +# - stage: test +# script: robo job:run-functional-tests "classes,events,pages,cp,media-browser,os-theme-preview,breadcrumbs,cp-menu,vsite_favicon" +# - stage: test +# script: robo job:run-functional-tests "os-search,analytics,publications,cp-appearance,redirect,twitter,os,vsite,cp-import" +# - stage: test +# script: robo job:run-functional-javascript-tests "publications,mailchimp,metatag,redirect,cp-appearance,vsite-preset" +# - stage: test +# script: robo job:run-functional-javascript-tests "os-search,cp,profiles,classes,pages" +# - stage: test +# script: robo job:run-functional-javascript-tests "events,vsite,widgets" +# - stage: test +# script: robo job:run-functional-javascript-tests "os,os-theme-preview,blog,faq,news,presentations,cp-menu" - stage: codecov script: robo job:run-unit-tests-code-coverage - after_success: bash <(curl -s https://codecov.io/bash) - stage: codecov script: robo job:run-kernel-tests-code-coverage "widgets-1" - after_success: bash <(curl -s https://codecov.io/bash) - stage: codecov script: robo job:run-kernel-tests-code-coverage "widgets-2" - after_success: bash <(curl -s https://codecov.io/bash) - stage: codecov script: robo job:run-kernel-tests-code-coverage "widgets-3" - after_success: bash <(curl -s https://codecov.io/bash) - stage: codecov script: robo job:run-kernel-tests-code-coverage "widgets-4" - after_success: bash <(curl -s https://codecov.io/bash) - stage: codecov script: robo job:run-kernel-tests-code-coverage "widgets-5" - after_success: bash <(curl -s https://codecov.io/bash) - stage: codecov script: robo job:run-kernel-tests-code-coverage "os-theme-preview,cp-appearance,profiles" - after_success: bash <(curl -s https://codecov.io/bash) - stage: codecov script: robo job:run-kernel-tests-code-coverage "publications-1,redirect" - after_success: bash <(curl -s https://codecov.io/bash) - stage: codecov script: robo job:run-kernel-tests-code-coverage "vsite" - after_success: bash <(curl -s https://codecov.io/bash) - stage: codecov script: robo job:run-kernel-tests-code-coverage "publications-2,wysiwyg" - after_success: bash <(curl -s https://codecov.io/bash) - stage: codecov script: robo job:run-kernel-tests-code-coverage "os" - after_success: bash <(curl -s https://codecov.io/bash) - stage: codecov script: robo job:run-kernel-tests-code-coverage "cp-1" - after_success: bash <(curl -s https://codecov.io/bash) - stage: codecov script: robo job:run-kernel-tests-code-coverage "cp-2" - after_success: bash <(curl -s https://codecov.io/bash) - stage: codecov script: robo job:run-kernel-tests-code-coverage "other-1" - after_success: bash <(curl -s https://codecov.io/bash) - stage: codecov script: robo job:run-kernel-tests-code-coverage "other-2" - after_success: bash <(curl -s https://codecov.io/bash) - stage: codecov script: robo job:run-kernel-tests-code-coverage "cp-menu" - after_success: bash <(curl -s https://codecov.io/bash) - stage: codecov script: robo job:run-kernel-tests-code-coverage "os-search" - after_success: bash <(curl -s https://codecov.io/bash) before_install: - echo 'sendmail_path = /bin/true' >> ~/.phpenv/versions/$(phpenv version-name)/etc/conf.d/travis.ini + - pyenv global 3.7.1 + - pip install -U pip + - pip install awscli install: - composer global require consolidation/robo:2.0.0 @@ -105,4 +105,6 @@ before_script: - cp .travis/RoboFile.php . after_failure: + - docker-compose logs php + - docker-compose logs mariadb - artifacts upload diff --git a/.travis/RoboFile.php b/.travis/RoboFile.php index 1c5202197fc..8b6db6cde7b 100644 --- a/.travis/RoboFile.php +++ b/.travis/RoboFile.php @@ -42,7 +42,8 @@ public function __construct() public function jobRunUnitTests($groups = '') { $collection = $this->collectionBuilder(); - $collection->addTaskList($this->buildEnvironment()); + $collection->addTaskList($this->buildDocker()); + $collection->addTaskList($this->buildComposer()); $collection->addTaskList($this->runUnitTests($groups)); return $collection->run(); } @@ -56,7 +57,8 @@ public function jobRunUnitTests($groups = '') public function jobRunUnitTestsCodeCoverage($groups = '') { $collection = $this->collectionBuilder(); - $collection->addTaskList($this->buildEnvironment()); + $collection->addTaskList($this->buildDocker()); + $collection->addTaskList($this->buildComposer()); $collection->addTaskList($this->enableXDebug()); $collection->addTaskList($this->runUnitTests($groups)); return $collection->run(); @@ -71,7 +73,8 @@ public function jobRunUnitTestsCodeCoverage($groups = '') public function jobCheckCodingStandards() { $collection = $this->collectionBuilder(); - $collection->addTaskList($this->buildEnvironment()); + $collection->addTaskList($this->buildDocker()); + $collection->addTaskList($this->buildComposer()); $collection->addTaskList($this->runCheckCodingStandards()); return $collection->run(); } @@ -85,9 +88,12 @@ public function jobCheckCodingStandards() public function jobCheckModuleCircularDependency() { $collection = $this->collectionBuilder(); - $collection->addTaskList($this->buildEnvironment()); + $collection->addTaskList($this->buildDocker()); + $collection->addTaskList($this->buildComposer()); $collection->addTaskList($this->installDrupal()); + $collection->addTaskList($this->uploadToAws()); $collection->addTaskList($this->runCheckModuleCircularDependency()); + $collection->addTaskList($this->installTestConfigs()); return $collection->run(); } @@ -101,7 +107,9 @@ public function jobRunKernelTests($groups = '') { $collection = $this->collectionBuilder(); $collection->addTaskList($this->buildEnvironment()); - $collection->addTaskList($this->installDrupal()); + $collection->addTaskList($this->buildDocker()); + $collection->addTaskList($this->buildComposer()); + $collection->addTaskList($this->importDatabase()); $collection->addTaskList($this->installTestConfigs()); $collection->addTaskList($this->runKernelTests($groups)); return $collection->run(); @@ -117,7 +125,9 @@ public function jobRunKernelTestsCodeCoverage($groups = '') { $collection = $this->collectionBuilder(); $collection->addTaskList($this->buildEnvironment()); - $collection->addTaskList($this->installDrupal()); + $collection->addTaskList($this->buildDocker()); + $collection->addTaskList($this->buildComposer()); + $collection->addTaskList($this->importDatabase()); $collection->addTaskList($this->installTestConfigs()); $collection->addTaskList($this->enableXDebug()); $collection->addTaskList($this->runKernelTests($groups)); @@ -136,7 +146,9 @@ public function jobRunFunctionalTests($groups = '') { $collection = $this->collectionBuilder(); $collection->addTaskList($this->buildEnvironment()); - $collection->addTaskList($this->installDrupal()); + $collection->addTaskList($this->buildDocker()); + $collection->addTaskList($this->buildComposer()); + $collection->addTaskList($this->importDatabase()); $collection->addTaskList($this->installTestConfigs()); $collection->addTaskList($this->runFunctionalTests($groups)); return $collection->run(); @@ -154,7 +166,9 @@ public function jobRunFunctionalJavascriptTests($groups = '') { $collection = $this->collectionBuilder(); $collection->addTaskList($this->buildEnvironment()); - $collection->addTaskList($this->installDrupal()); + $collection->addTaskList($this->buildDocker()); + $collection->addTaskList($this->buildComposer()); + $collection->addTaskList($this->importDatabase()); $collection->addTaskList($this->installTestConfigs()); $collection->addTaskList($this->runFunctionalJavascriptTests($groups)); return $collection->run(); @@ -171,6 +185,8 @@ public function jobRunBehatTests() $collection = $this->collectionBuilder(); $collection->addTaskList($this->downloadDatabase()); $collection->addTaskList($this->buildEnvironment()); + $collection->addTaskList($this->buildDocker()); + $collection->addTaskList($this->importDatabase()); $collection->addTask($this->waitForDrupal()); $collection->addTaskList($this->runUpdatePath()); $collection->addTaskList($this->runBehatTests()); @@ -198,35 +214,111 @@ protected function downloadDatabase() return $tasks; } - /** - * Builds the Docker environment. - * - * @return \Robo\Task\Base\Exec[] - * An array of tasks. - */ - protected function buildEnvironment() - { - $force = true; - $tasks = []; - $tasks[] = $this->taskFilesystemStack() - ->copy('.travis/docker-compose.yml', 'docker-compose.yml', $force) - ->copy('.travis/traefik.yml', 'traefik.yml', $force) - ->copy('.travis/.env', '.env', $force) - ->copy('.travis/config/behat.yml', 'tests/behat.yml', $force); - - $tasks[] = $this->taskExec('echo AWS_ACCESS_KEY_ID=' . getenv('ARTIFACTS_KEY') . ' >> .env'); - $tasks[] = $this->taskExec('echo AWS_SECRET_ACCESS_KEY=' . getenv('ARTIFACTS_SECRET') . ' >> .env'); - $tasks[] = $this->taskExec('echo AWS_ES_ACCESS_ENDPOINT=' . getenv('ARTIFACTS_ES_ENDPOINT') . ' >> .env'); - $tasks[] = $this->taskExec('docker-compose --verbose pull --parallel'); - $tasks[] = $this->taskExec('docker-compose up -d'); - $tasks[] = $this->taskExec('docker-compose exec -T php composer global require hirak/prestissimo'); - $tasks[] = $this->taskExec('make'); - $tasks[] = $this->taskExec('docker-compose exec -T php cp .travis/config/phpunit.xml web/core/phpunit.xml'); - $tasks[] = $this->taskExec('docker-compose exec -T php cp .travis/config//bootstrap.php web/core/tests/bootstrap.php'); - $tasks[] = $this->taskExec('docker-compose exec -T php mkdir -p web/sites/simpletest'); + /** + * Creates the Docker environment. + * + * @return \Robo\Task\Base\Exec[] + * An array of tasks. + */ + protected function buildDocker() + { + $force = true; + $tasks = []; + $tasks[] = $this->taskFilesystemStack() + ->copy('.travis/docker-compose.yml', 'docker-compose.yml', $force) + ->copy('.travis/traefik.yml', 'traefik.yml', $force) + ->copy('.travis/.env', '.env', $force) + ->copy('.travis/config/behat.yml', 'tests/behat.yml', $force); + + $tasks[] = $this->taskExec('echo AWS_ACCESS_KEY_ID=' . getenv('ARTIFACTS_KEY') . ' >> .env'); + $tasks[] = $this->taskExec('echo AWS_SECRET_ACCESS_KEY=' . getenv('ARTIFACTS_SECRET') . ' >> .env'); + $tasks[] = $this->taskExec('echo AWS_ES_ACCESS_ENDPOINT=' . getenv('ARTIFACTS_ES_ENDPOINT') . ' >> .env'); + $tasks[] = $this->taskExec('docker-compose pull --parallel'); + $tasks[] = $this->taskExec('docker-compose up -d'); + + return $tasks; + } - return $tasks; - } + /** + * Build environment. + * + * @return \Robo\Task\Base\Exec[] + * An array of tasks. + */ + protected function buildEnvironment() + { + $tasks = []; + + $tasks[] = $this->taskExec('aws s3 sync s3://$ARTIFACTS_BUCKET/build_files/$TRAVIS_BUILD_NUMBER .'); + $tasks[] = $this->taskExec('tar -Jxf os-build-${TRAVIS_BUILD_NUMBER}-custom_themes.tar.xz'); + $tasks[] = $this->taskExec('sudo chown -R 1000:1000 custom_themes'); + $tasks[] = $this->taskExec('ls -la'); + + return $tasks; + } + /** + * Import database. + * + * @return \Robo\Task\Base\Exec[] + * An array of tasks. + */ + protected function importDatabase() + { + $tasks = []; + + // Fix import issue. + $tasks[] = $this->taskExec('sudo tar -Jxf os-build-${TRAVIS_BUILD_NUMBER}-db.tar.xz web'); + $tasks[] = $this->taskExec('sudo tar -Jxf os-build-${TRAVIS_BUILD_NUMBER}-settings.tar.xz web/sites/default'); + $tasks[] = $this->taskExec('sudo tar -Jxf os-build-${TRAVIS_BUILD_NUMBER}-files.tar.xz web/sites/default'); + $tasks[] = $this->taskExec('sudo chown -R 1000:1000 web/sites/default'); + $tasks[] = $this->taskExec('ls -la'); + // Import sql. + $tasks[] = $this->taskExec('docker-compose exec -T php drush sqlq --file=./travis-backup.sql'); + + return $tasks; + } + + /** + * Create sql dump and compressed build and upload to S3. + * + * @return \Robo\Task\Base\Exec[] + * A collection of tasks. + */ + protected function uploadToAws() + { + $tasks[] = $this->taskExec('docker-compose exec -T php drush sql-dump --result-file=./travis-backup.sql'); + $tasks[] = $this->taskExec('ls -la'); + $tasks[] = $this->taskExec('tar -Jcf ${TRAVIS_BUILD_DIR}-${TRAVIS_BUILD_NUMBER}-db.tar.xz web/travis-backup.sql'); + $tasks[] = $this->taskExec('tar -Jcf ${TRAVIS_BUILD_DIR}-${TRAVIS_BUILD_NUMBER}-settings.tar.xz web/sites/default/settings.php'); + $tasks[] = $this->taskExec('tar -Jcf ${TRAVIS_BUILD_DIR}-${TRAVIS_BUILD_NUMBER}-custom_themes.tar.xz custom_themes'); + $tasks[] = $this->taskExec('tar -Jcf ${TRAVIS_BUILD_DIR}-${TRAVIS_BUILD_NUMBER}-files.tar.xz web/sites/default/files'); + $tasks[] = $this->taskExec('aws s3 cp ${TRAVIS_BUILD_DIR}-${TRAVIS_BUILD_NUMBER}-db.tar.xz s3://$ARTIFACTS_BUCKET/build_files/$TRAVIS_BUILD_NUMBER/os-build-${TRAVIS_BUILD_NUMBER}-db.tar.xz'); + $tasks[] = $this->taskExec('aws s3 cp ${TRAVIS_BUILD_DIR}-${TRAVIS_BUILD_NUMBER}-settings.tar.xz s3://$ARTIFACTS_BUCKET/build_files/$TRAVIS_BUILD_NUMBER/os-build-${TRAVIS_BUILD_NUMBER}-settings.tar.xz'); + $tasks[] = $this->taskExec('aws s3 cp ${TRAVIS_BUILD_DIR}-${TRAVIS_BUILD_NUMBER}-custom_themes.tar.xz s3://$ARTIFACTS_BUCKET/build_files/$TRAVIS_BUILD_NUMBER/os-build-${TRAVIS_BUILD_NUMBER}-custom_themes.tar.xz'); + $tasks[] = $this->taskExec('aws s3 cp ${TRAVIS_BUILD_DIR}-${TRAVIS_BUILD_NUMBER}-files.tar.xz s3://$ARTIFACTS_BUCKET/build_files/$TRAVIS_BUILD_NUMBER/os-build-${TRAVIS_BUILD_NUMBER}-files.tar.xz'); + + return $tasks; + } + + /** + * Builds the Code Base. + * + * @return \Robo\Task\Base\Exec[] + * An array of tasks. + */ + protected function buildComposer() + { + $force = true; + $tasks = []; + + $tasks[] = $this->taskExec('docker-compose exec -T php composer global require hirak/prestissimo'); + $tasks[] = $this->taskExec('make'); + $tasks[] = $this->taskExec('docker-compose exec -T php cp .travis/config/phpunit.xml web/core/phpunit.xml'); + $tasks[] = $this->taskExec('docker-compose exec -T php cp .travis/config//bootstrap.php web/core/tests/bootstrap.php'); + $tasks[] = $this->taskExec('docker-compose exec -T php mkdir -p web/sites/simpletest'); + + return $tasks; + } /** * Enables xdebug in the Docker environment. @@ -239,7 +331,6 @@ protected function enableXDebug() $tasks[] = $this->taskExecStack() ->exec('echo PHP_XDEBUG_ENABLED=1 >> .env') ->exec('docker-compose up -d'); - return $tasks; } diff --git a/.travis/docker-compose.yml b/.travis/docker-compose.yml index d8ff40527a5..adf9b609276 100644 --- a/.travis/docker-compose.yml +++ b/.travis/docker-compose.yml @@ -93,5 +93,6 @@ services: chrome: # Note: chrome 67/68 is giving errors so we pin to 65 for now. image: previousnext/chrome-headless:65 + container_name: "${PROJECT_NAME}_chrome" ports: - "9222:9222"