This is more of a question than a suggestion--it occurred to me that we might want to encapsulate each step in Quibble as an instance of a Command object, so it becomes possible to create the execution plan before actually executing anything. Execution would happen in a second phase, in which we call each command sequentially.
There are several benefits to this approach. A few thoughts:
- Decoupling planning and execution code should make it easier to streamline and reuse components.
- More sophisticated and performant execution models become possible in the future, such as concurrency and dependency trees.
- We can run in a "no action" mode where the steps are printed but nothing is executed (other than cloning...)
One complication is that some steps cannot be fully planned until dependencies are resolved, for example we don't know whether selenium tests should be run until the repository is cloned. As a quick and dirty rough pass, we could split the job into high-level workflows which each have their own plan and execute phases, i.e. * clone just the ZUUL_PROJECT, plan and execute linting, then * clone remaining repos, plan and execute integrating tests.