Ivy is great for managing dependencies, but it isn't meant to handle the entire software lifecycle across many modules. That said, it does have several features that seem to support it (such as the status
and branch
attributes), and the ivy best practices blurb alludes to being able to promote integration revisions to milestone or release, "with some work".
Unfortunately I haven't found definitive guidance on how to manage the dev -> test -> deploy cycle. Here are some things I want to achieve:
(Given that devs typically work across many modules in a local workspace)
Some things I'm fairly clear about are:
status
should be used to denote whether that revision is meant only for development, is ready for testing, or is ready for productionbranch
attribute should be sufficient to handle different project branchesHere is what I'm grappling with:
Say I have these modules checked out in my workspace:
Now I'm happy with module a, and decide to publish a milestone using the checked out versions in my workspace. What needs to happen in the repo is:
e-1.0-RC1
gets publishedd-1.1-RC2
gets published, referencing e-1.0-RC1
as a dependencyc-2.0-RC1
gets published, referencing d-1.1-RC2
as a dependencyb-3.3-RC1
gets published, referencing e-1.0-RC1
as a dependencya-7.1-RC2
gets published, referencing c-2.0-RC1
and b-3.3-RC1
as dependencies.If I try to roll my own for this, I'd probably end up doing some workspace management, ivy.xml find & replace, etc. Before I open that can of worms, I'd like to get some opinions. What's the best way to tackle this?
You can use recursive delivery to publish modules and their dependencies with a higher status.
Using your example:
e-1.0-RC1
gets published with an integration
statusd-1.1-RC2
gets published with an integration
status, referencing e-1.0-RC1
as a dependencyc-2.0-RC1
gets published with an integration
status, referencing d-1.1-RC2
as a dependencyb-3.3-RC1
gets published with an integration
status, referencing e-1.0-RC1
as a dependencya-7.1-RC2
gets published with an integration
status, referencing c-2.0-RC1
and b-3.3-RC1
as dependencies.a-7.1-RC2
to a milestone
status, so you do a recusive delivery (use the delivertarget
attribute). This will recursively call the delivertarget
for each dependency that has a status lower than milestone
and publish it with a milestone
status.The nice thing about this, is that you don't need (or want) to have each project checked out in your workspace, just a
. This also means that it's much easier to create a deployment pipeline and have your CI server:
a
, a
,a
as integration
, a
to a System Test environment, a
from integration
to milestone
(which promotes it's dependencies)a
to a Acceptance Test environment,a
from milestone
to release
(which promotes it's dependencies)a
to production (or upload it to a download site)At no time does the pipeline need to access the dependant projects and, since the recursive delivery is generic, when you add or remove dependencies (via your ivy.xml files), you don't need to change anything in your pipeline.
I've marked this answer as a community wiki. Anyone else care to expand on it or correct anything I got wrong?
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With