This repository is a reference implementation and start state for a modern Drupal 8 workflow utilizing Composer, Continuous Integration (CI), Automated Testing, and Pantheon. Even though this is a good starting point, you will need to customize and maintain the CI/testing set up for your projects.
This repository is meant to be copied one-time by the the Terminus Build Tools Plugin but can also be used as a template. It should not be cloned or forked directly.
The Terminus Build Tools plugin will scaffold a new project, including:
- A Git repository
- A free Pantheon sandbox site
- Continuous Integration configuration/credential set up
For more details and instructions on creating a new project, see the Terminus Build Tools Plugin.
Pantheon will serve the site from the /web
subdirectory due to the configuration in pantheon.yml
. This is necessary for a Composer based workflow. Having your website in this subdirectory also allows for tests, scripts, and other files related to your project to be stored in your repo without polluting your web document root or being web accessible from Pantheon. They may still be accessible from your version control project if it is public. See the pantheon.yml
documentation for details.
One of the directories moved to the git root is /config
. This directory holds Drupal's .yml
configuration files. In more traditional repo structure these files would live at /sites/default/config/
. Thanks to this line in settings.php
, the config is moved entirely outside of the web root.
This project uses Composer to manage third-party PHP dependencies.
The require
section of composer.json
should be used for any dependencies your web project needs, even those that might only be used on non-Live environments. All dependencies in require
will be pushed to Pantheon.
The require-dev
section should be used for dependencies that are not a part of the web application but are necesarry to build or test the project. Some example are php_codesniffer
and phpunit
. Dev dependencies will not be deployed to Pantheon.
If you are just browsing this repository on GitHub, you may not see some of the directories mentioned above. That is because Drupal core and contrib modules are installed via Composer and ignored in the .gitignore
file.
A custom, Composer version of Drupal 8 for Pantheon is used as the source for Drupal core.
Third party Drupal dependencies, such as contrib modules, are added to the project via composer.json
. The composer.lock
file keeps track of the exact version of dependency. Composer installer-paths
are used to ensure the Drupal dependencies are downloaded into the appropriate directory.
Non-Drupal dependencies are downloaded to the /vendor
directory.
This .ci
directory is where all of the scripts that run on Continuous Integration are stored. Provider specific configuration files, such as .circle/config.yml
and .gitlab-ci.yml
, make use of these scripts.
The scripts are organized into subdirectories of .ci
according to their function: build
, deploy
, or test
.
Steps for building an artifact suitable for deployment. Feel free to add other build scripts here, such as installing Node dependencies, depending on your needs.
.ci/build/php
installs PHP dependencies with Composer
Scripts for facilitating code deployment to Pantheon.
.ci/deploy/pantheon/create-multidev
creates a new Pantheon multidev environment for branches other than the default Git branch- Note that not all users have multidev access. Please consult the multidev FAQ doc for details.
.ci/deploy/pantheon/dev-multidev
deploys the built artifact to either the Pantheondev
or a multidev environment, depending on the Git branch
Scripts that run automated tests. Feel free to add or remove scripts here depending on your testing needs.
Static Testing .ci/test/static
and tests/unit
Static tests analyze code without executing it. It is good at detecting syntax error but not functionality.
.ci/test/static/run
Runs PHP CodeSniffer with Drupal coding standards, PHP Unit, and PHP syntax checking.tests/unit/bootstrap.php
Bootstraps the Composer autoloadertests/unit/TestAssert.php
An example Unit test. Project specific test files will need to be created intests/unit
.
Visual Regression Testing .ci/test/visual-regression
Visual regression testing uses a headless browser to take screenshots of web pages and compare them for visual differences.
.ci/test/visual-regression/run
Runs BackstopJS visual regression testing..ci/test/visual-regression/backstopConfig.js
The BackstopJS configuration file. Setting here will need to be updated for your project. For example, thepathsToTest
variable determines the URLs to test.
Behat Testing .ci/test/behat
and tests/behat
Behat is an acceptance/end-to-end testing framework written in PHP. It faciliates testing the fully built Drupal site on Pantheon infrastucture. The Drupal Behat Extension is used to help with integrating Behat and Drupal.
.ci/test/behat/initialize
creates a backup of the environment to be tested.ci/test/behat/run
sets theBEHAT_PARAMS
environment variable with dynamic information necessary for Behat and configure it to use Drush via Terminus and starts headless Chrome, and runs Behat.ci/test/behat/cleanup
restores the previously made database backup and saves screenshots taken by Behattests/behat/behat-pantheon.yml
Behat configuration file compatible with running tests against a Pantheon sitetests/behat/tests/behat/features
Where Behat test files, with the.feature
extension, should be stored. The provided example tests will need to be replaced with project specific tests.tests/behat/tests/behat/features/content.feature
A Behat test file which logs into the Drupal dashboard, creates nodes, users and terms, and verifies their existience in the Drupal admin interface and the front end of the site
When using this repository to manage your Drupal site, you will no longer use the Pantheon dashboard to update your Drupal version. Instead, you will manage your updates using Composer. Ensure your site is in Git mode, clone it locally, and then run composer commands from there. Commit and push your files back up to Pantheon as usual.