There are some things you want delivered as fast as humanly possible, like that first cup of coffee in the morning. How much could go wrong there? There are some things you’d prefer to not have rushed, like your kidney transplant. A Drupal 9 upgrade is somewhere in between.
The “15 minute to upgrade to Drupal 9” messaging floating around the web is a marketing tactic based on plain vanilla installs to french vanilla, nothing more. In practice, while the Drupal ecosystem is well-managed, it is still dependent on a lot of volunteer work by widely distributed independent developers. Drupal is not a single, unified thing. And that’s its superpower.
Drupal itself, “vanilla and out of the box,” may be comparatively easy to update from 8 to 9, especially now that it’s based on a very solid platform, Symfony. All the complex functionality that makes up a fully featured website beyond the status of a blog involves interactions between potentially dozens of contributed and custom modules. The interlocking dependencies of all these components absolutely must be carefully tested as they and their environment (Drupal itself) are updated. This is especially so in the case of integrations with external services, almost a certainty in today’s websites.
The key word here is “dependency.” Every significant collection of code (module) has dependencies, on libraries from the greater PHP world, on functionality provided by Drupal, on functionality provided by or to other modules. Our experience is that not all dependencies are equally attended to, nor are upgrade paths always plain vanilla, sometimes leading to “chicken and the egg” issues that have to be resolved.
An important contributing factor to the problem of dependencies is “deprecation”. A deprecated component is one for which a replacement must be used in a future code update, if the dependent code is to continue working. A lot of the core functionality in Drupal 9 is altered to the degree that contributed and custom modules that rely on it will break without potentially significant prior work. Fortunately, all of this code is marked in Drupal 8 with deprecation notices – notations along the lines of “this function is deprecated and will stop working in Drupal 9, please use this other function instead” – that are easily discovered with modern programming tools. But it is still necessary to find and resolve these deprecations in advance of the final Drupal 9 upgrade itself.
This is our experience over dozens of upgrades. That is to say, this is the way it really is, and is what all organizations and the Drupal developers attending to their websites can expect to deal with during major version upgrades. And one of the most important lessons from this collective experience – so important that it amounts to a doctrine – is that you never perform an upgrade in production without thorough testing in a non-critical environment. Some shops may hand wave this, but it is an absolutely universal professional practice. To do otherwise would be malpractice.
So, we’re here to help you with your Drupal 9 upgrade. It won’t be done in 15 minutes, but then we won’t accidentally leave any instruments in you after the surgery is completed.
Some things are worth giving a few more minutes to. Now, about that french vanilla coffee.