Hi,
I'm wondering what techniques people have used to safely extract features from existing plugins into new plugins.
At first glance a phased approach intuitively makes sense:
1. Plugin A exists.
2. Extract feature from A into new plugin B. Release B.
3. Delete feature code from A. Make A depend on B (to transitively inherit the feature). Release A.
4. Wait a while for adoption of new A version.
5. Remove the B dependency from A. Release A.
However there is a problem that some 3rd party Jenkins management tools (i.e. not Jenkins' own tools like Plugin Installation Manager CLI) do not download transitive plugin dependencies when they install a plugin.
One such example is the Puppet Jenkins module:
https://forge.puppet.com/modules/puppet/jenkins#plugin-dependencies
These tools usually offer plugin version pinning which mitigates the worst effects. However it would seem that as soon as step 3 happens and the Jenkins admin updates A, the extracted feature effectively disappears on their installation, unless they have somehow learned that they should also install B. So for this group of users there is no phased migration.
(Yes, Jenkins admins using these tools *should* run a non-production copy of Jenkins to test their changes before deploying, and yes they *should* read release notes before incrementing any plugin version... but this doesn't always happen.)
Do we consider these use cases when extracting features? If so do we employ any techniques to help e.g. major version increments?
Chris