Continuous integration
An Eddy extension runs its CI on GitHub Actions. Each job runs the same tooling commands you run locally, so you can reproduce a CI failure locally on the same Drupal and PHP versions. This page lists the workflows, what their jobs run and which PHP and Drupal versions they test.
The workflows
Your extension gets the following workflows. In the table, your branches are the branches in the workflows' branch filters:
| Workflow | Runs on | What it does |
|---|---|---|
Test (test.yml) | Pushes to your branches and tags, and pull requests that target your branches | Tests the extension on the PHP and Drupal versions of the version matrix, and lints it once per Drupal major. |
Deploy (deploy.yml) | A successful Test run of a push | Mirrors the code to Drupal.org or another git remote. See Deployment. |
Draft release notes (draft-release-notes.yml) | Pushes to your branches and tags | Keeps a draft GitHub release up to date with the pull requests merged since the last published release. |
Auto Author Assign (assign-author.yml) | Opened and reopened pull requests | Assigns each pull request to its author. |
The installer sets the branch filters of test.yml and draft-release-notes.yml from its INSTALL_BRANCHES environment variable, such as 1.x,2.x. Without the variable, it keeps the push branches of your committed test.yml, or sets them to 1.x. See What the installer changes for the full rule. To build another branch later, such as 2.x, add it to the push branches of both files and to the pull_request branches of test.yml.
What each job runs
A lint job assembles the codebase and runs every linter you kept. A test job assembles the codebase, starts the webserver, provisions the site and runs the tests. Then it uploads the browser output and the coverage reports as workflow artifacts.
Builds resolve without a lock file, so each job caches Composer downloads under a key that changes every month. The cache stays warm, and each month's cache also stores the newer releases.
The version matrix
CI tests a selection of PHP and Drupal pairs. 10 jobs cover the lowest and highest supported PHP on each Drupal major. On Drupal 11 and 12, they also cover the next minor pre-release and the oldest tested minor:
| Job | PHP | Drupal | Role |
|---|---|---|---|
test-php-min-d10-stable | 8.3 | 10 | Drupal 10 on the lowest supported PHP |
test-php-max-d10-stable | 8.4 | 10 | Drupal 10 on the highest supported PHP |
test-php-min-d11-stable | 8.3 | 11 | Drupal 11 on the lowest supported PHP |
test-php-max-d11-stable | 8.5 | 11 | Drupal 11 on the highest supported PHP |
test-php-min-d11-legacy | 8.3 | 11.1.0 | Newest patch of the oldest tested Drupal 11 minor |
test-php-max-d11-canary | 8.5 | 11@beta | Next Drupal 11 minor pre-release |
test-php-min-d12-stable | 8.5 | 12 | Drupal 12 on the lowest supported PHP |
test-php-max-d12-stable | 8.5 | 12 | Drupal 12 on the highest supported PHP |
test-php-min-d12-legacy | 8.5 | 12.0.0 | Newest patch of the oldest tested Drupal 12 minor |
test-php-max-d12-canary | 8.5 | 12@beta | Next Drupal 12 minor pre-release |
The supported PHP versions are the ones Eddy tests each major on, from PHP 8.3, the floor of the tooling. The lint jobs run 1 per Drupal major:
| Job | PHP | Drupal |
|---|---|---|
lint-d10 | 8.4 | 10 |
lint-d11 | 8.5 | 11 |
lint-d12 | 8.5 | 12 |
Your extension gets only the jobs of the Drupal majors you selected in the installer. A test job's name gives its PHP bound (min or max), its Drupal major (d10, d11 or d12) and its release tier (stable, legacy or canary). A lint job's name gives its Drupal major. Each job's "Setup PHP" step shows the exact PHP version.
- Drupal versions float.
stablebuilds the newest stable release of the major.canarybuilds the newest release at beta stability or higher. That's the next minor's beta or release candidate when there is one, and the current stable release otherwise.legacypins an older minor and floats its patch.11.1.0builds the newest 11.1.x release, and12.0.0the newest 12.0.x. CI builds new releases with no change totest.yml. - PHP versions are pinned bounds. Each job sets an explicit PHP version. So
maxchanges when a newer PHP is added, andminonly when support for an old PHP is dropped. A scaffold update refreshes the PHP versions and thelegacypins.
Drupal 12
Drupal 12 requires PHP 8.5, so Eddy tests Drupal 12 on PHP 8.5 alone. Its lowest and highest supported PHP are the same, so test-php-min-d12-stable and test-php-max-d12-stable run the same versions. The jobs use the same kinds of values as the Drupal 11 jobs (12, 12.0.0 and 12@beta) and follow Drupal 12's releases on their own.
Until Drupal 12 has a stable release, every Drupal 12 job builds its newest pre-release. After 12.0.0 ships, all of them build that release. Then canary moves on to the 12.1 pre-releases, and legacy stays on the 12.0.x patches. To build Drupal 12 locally, see Drupal versions.
Next steps
- Configure CI - spreading tools across runners, letting a step fail and Codecov.
- Branch protection - the jobs to require before a merge.
- Drupal.org CI - the 1 setting that GitLab CI on Drupal.org needs.