Using decision graphs for scheduling builds and tests¶
Decision graph (DG)¶
Decision graphs inputs can be either a setup of user queries requesting
builds or installs of tools or libraries
testsuite results
source creation
…
or a set of anod specification files.
The result is represented in a DAG (Directed Acyclic Graph) of potential actions to be taken.
Having a DG containing all possible paths is useful for:
conflicts detection
implementing different decision policies through resolvers
implementing static checks
Action graph (AG)¶
This is the set of actions that should be performed represented in a DAG. Its inputs are:
a decision graph (DG)
a decision resolver
The decision resolver is called for each decision node in the DG for which the ecision is either undecided, source of conflicts, or non explicit.
Using the AG (or even the DG) you can easily list resources, e.g. the list of packages that will be pushed to (or pulled from) the store and the VCS repositories required for completing the user request.
It also becomes easy to separate online and offline local operations, allowing for instance replaying push to store and notifications without having to execute the local operation twice.
Having such graphs gives better control on the system, e.g. to plug different store or notification systems, to upload packages to the store in parallel, …
electrolyt plans¶
The electrolyt plans are written in a very small Python based DSL that is transformed into a list of queries that are feeding the DG. It is independent from scheduling engine and DG/DA API.
For instance the following plan:
anod_build('specA', qualifier='debug=true')
with defaults(build='x86_64-windows'):
anod_build('specB', qualifier='mode=production')
is transformed into a list of e3.env.BaseEnv
objects that can be then used to build a DG.