Drupal 9 CI
This repository provides the foundation to implement Continuous Integration in a Drupal 9 project using any of the following CI providers:
If you want to test an individual module instead of a Drupal project, see Andrew Berry's drupal_tests.
Here is a clip that shows how it works for CircleCI.
Requirements
The scripts assume that you have a Drupal 9 project created using drupal-project, which sets a well known foundation. If your project's directory structure differs from what drupal-project sets up, you will need to adjust the CI scripts.
It's also recommended to adjust your project to add a subset of the settings.php
file into
version control and rely on settings.local.php
for setting the database connection. The CI scripts
have their own settings.local.php
which is copied at build time into web/sites/default
.
DocumentRoot: web vs docroot
By default, Apache and the rest of the code is set up to have the DocumentRoot
folder as web
. If
your project uses docroot
instead, the easiest thing to do is to symlink one to the other. This can be
done adding a line like this one
before running Apache (you will need to adapt paths).
Alternatively you can go through the files and replace as needed. You can see a list of affected files in this comment.
Installation
CircleCI
Demo repository | Deep dive article
Download the drupal9ci
binary from https://github.com/Lullabot/drupal9ci/releases into the project root
and run the command as ./drupal9ci
and select CircleCI. Once complete, continue below to complete the setup.
Sign up at CircleCI and allow access to your project's repository.
Happy CI-ing! :-D. From now every time you create a pull request, CircleCI will run the set of jobs and report their result like in the following screenshot:
For an overview of the CircleCI features, have a look at this article from the Lullabot blog.
Using a custom Docker image
The CircleCI configuration file uses a custom Docker image that extends from the official Drupal image. If this image does not fit your project's architecture then consider creating your own image based out of it.
Travis CI
Demo repository | Deep dive article
Download the drupal9ci
binary from https://github.com/Lullabot/drupal9ci/releases into the project root
and run the command as ./drupal9ci
and select Travis CI. Once complete, continue below to complete the setup.
Sign up at Travis CI and allow access to your project's repository:
Happy CI-ing! :-D. From now on every pull request will trigger a build in Travis and its progress will be visible like in the following screenshot:
For you to see the result of the individual jobs, you need to click at the Details link from the above screenshot:
Setting up code coverage reports
Coveralls.io is a third party tool that can host and present PHPUnit code coverage reports in a neat way within a pull request. Here is how to set it up:
Register at https://coveralls.io using your GitHub account and then add your repository like in the following screenshot:
Then take the chance to adjust a couple settings to get cleaner feedback in pull requests:
That's it! Here is a sample report which you can see by clicking at Details at the pull request's status message:
GitLab CI
Demo repository | Deep dive article
Download the drupal9ci
binary from https://github.com/Lullabot/drupal9ci/releases into the project root
and run the command as ./drupal9ci
and select GitLab CI. Once complete, continue below to complete the setup.
Review, commit, and push the resulting changes. After doing that, navigate to the project's homepage at GitLab and open the CI / CD >> Pipelines section. You should see a running pipeline like the following one:
GitHub Actions
Download the drupal9ci
binary from https://github.com/Lullabot/drupal9ci/releases into the project root
and run the command as ./drupal9ci
and select GitHub Actions. Once complete, continue below to complete the setup.
Review, commit, and push the resulting changes. After doing that, navigate to the repository's homepage at GitHub and open the Actions tab. You should see a running workflow like the following one:
Bitbucket
Download the drupal9ci
binary from https://github.com/Lullabot/drupal9ci/releases into the project root
and run the command as ./drupal9ci
and select Bitbucket. Once complete, continue below to complete the setup.
Review, commit, and push the resulting changes. After doing that, navigate to the repository's homepage at Bitbucket and open the Pipelines tab. You should see a running workflow like the following one:
Setting up the Behat and Cypress jobs for all platforms
The Behat and Cypress jobs require a running Drupal 9 site. The repository contains the code, but for running tests in a realistic environment you need:
1. A recent copy of the production environment's database
There are several ways to accomplish this:
Using a prepopulated Docker database image
See Achieve Rocketship-Fast Jobs in CircleCI by Preinstalling the Database
Travis
If you have Drush site aliases, and your repository is private, then follow these
instructions to add an SSH key.
Next, set up a drush site alias. Finally, adjust the Behat job to run drush @my.alias sql-cli
.
CircleCI
If you have Drush site aliases, then at the CircleCI dashboard go to the project's permissions
and add an SSH key. Next, add drush @my.alias sql-cli
to the Behat job at .circleci/config.yml
.
Alternative
Alternatively, upload a sanitized database
dump somewhere and set up the DB_DUMP_URL
environment variable so the job can download it.
A sample implementation is to use Dropbox API. See this repository for further details.
2. The production environment's files directory
If you have a site alias, then add drush rsync @my.alias @self
to the Behat job. Alternatively,
use Stage File Proxy module.