Class FlowExecution
- All Implemented Interfaces:
FlowActionStorage,GraphLookupView
This "interface" abstracts away workflow definition language, syntax, or its execution model, but it allows other code to listen on what's going on.
Persistence
FlowExecution must support persistence by XStream, which should
capture the state of execution at one point. The expectation is that when
the object gets deserialized, it'll start re-executing from that point.
- Author:
- Kohsuke Kawaguchi, Jesse Glick
-
Nested Class Summary
Nested classes/interfaces inherited from interface org.jenkinsci.plugins.workflow.graph.GraphLookupView
GraphLookupView.EnclosingBlocksIterable -
Field Summary
FieldsModifier and TypeFieldDescriptionprotected FlowDurabilityHintCheckForNull due to loading pre-durability runs.protected GraphLookupView -
Constructor Summary
Constructors -
Method Summary
Modifier and TypeMethodDescriptionabstract voidaddListener(GraphListener listener) Add a listener to changes in the flow graph structure.protected voidCalled after a restart and any attempts atStepExecution.onResume()have completed.booleanDetermines whether the activity currently being run should block a Jenkins restart.Return all enclosing block start nodes, as withGraphLookupView.findEnclosingBlockStart(FlowNode).Find the immediately enclosingBlockStartNodearound aFlowNodeDeprecated.org.springframework.security.core.AuthenticationLooks up authentication associated with this flow execution.final ThrowableIf this execution has completed with an error, report that.com.google.common.util.concurrent.ListenableFuture<List<org.jenkinsci.plugins.workflow.steps.StepExecution>>Deprecated.com.google.common.util.concurrent.ListenableFuture<List<org.jenkinsci.plugins.workflow.steps.StepExecution>>getCurrentExecutions(boolean innerMostOnly) Yields theStepExecutions that are currently executing.In the current flow graph, return all the "head" nodes where the graph is still growing.Get the durability level we're aiming for, or a default value if none is set (defaults may change as implementation evolve).getEndNode(BlockStartNode startNode) Find the end node corresponding to a start node, and can be used to tell if the block is completed.protected GraphLookupViewEventually this may be overridden if the FlowExecution has a better source of structural information, such as theFlowNodestorage.abstract FlowNodeLoads a node by its ID.abstract FlowExecutionOwnergetOwner()getUrl()Returns the URL of thisFlowExecution, relative to the context root of Jenkins.abstract voidinterrupt(Result r, CauseOfInterruption... causes) Interrupts the execution of a flow.booleanTests if the node is a currently running head, or the start of a block that has not completed executingbooleanChecks whether this flow execution has finished executing completely.abstract booleanShort forgetCurrentHeads().contains(n)but more efficient.Provide anIterableover all enclosing blocks, which can be used similarly toGraphLookupView.findAllEnclosingBlockStarts(FlowNode)but does lazy fetches rather than materializing a full result.voidonLoad()Deprecated.voidonLoad(FlowExecutionOwner owner) Should be called by the flow owner after it is deserialized.voidremoveListener(GraphListener listener) abstract voidstart()Called afterFlowDefinition.create(FlowExecutionOwner, List)to initiate the execution.Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, waitMethods inherited from interface org.jenkinsci.plugins.workflow.graph.FlowActionStorage
loadActions, saveActions
-
Field Details
-
internalGraphLookup
-
durabilityHint
CheckForNull due to loading pre-durability runs.
-
-
Constructor Details
-
FlowExecution
public FlowExecution()
-
-
Method Details
-
getInternalGraphLookup
Eventually this may be overridden if the FlowExecution has a better source of structural information, such as theFlowNodestorage. -
getDurabilityHint
Get the durability level we're aiming for, or a default value if none is set (defaults may change as implementation evolve).- Returns:
- Durability level we are aiming for with this execution.
-
start
Called afterFlowDefinition.create(FlowExecutionOwner, List)to initiate the execution. This method is not invoked on rehydrated execution. This separation ensures thatFlowExecutionOwneris functional when this method is called.- Throws:
IOException
-
onLoad
Should be called by the flow owner after it is deserialized.- Throws:
IOException
-
onLoad
Deprecated. -
getOwner
-
getCurrentHeads
In the current flow graph, return all the "head" nodes where the graph is still growing. If you think of a flow graph as a git repository, these heads correspond to branches. -
getCurrentExecutions
public com.google.common.util.concurrent.ListenableFuture<List<org.jenkinsci.plugins.workflow.steps.StepExecution>> getCurrentExecutions(boolean innerMostOnly) Yields theStepExecutions that are currently executing.StepExecutions are persisted as a part of the program state, so its lifecycle is independent ofFlowExecution, hence the asynchrony.Think of this as program counters of all the virtual threads.
The implementation should return results in the order that steps were started, insofar as that makes sense.
- Parameters:
innerMostOnly- if true, only return the innermost steps; if false, include any block-scoped steps running around them
-
getCurrentExecutions
@Deprecated public com.google.common.util.concurrent.ListenableFuture<List<org.jenkinsci.plugins.workflow.steps.StepExecution>> getCurrentExecutions()Deprecated. -
isCurrentHead
Short forgetCurrentHeads().contains(n)but more efficient. -
getUrl
Returns the URL of thisFlowExecution, relative to the context root of Jenkins.- Returns:
- String like "job/foo/32/execution/" with trailing slash but no leading slash.
- Throws:
IOException
-
interrupt
public abstract void interrupt(Result r, CauseOfInterruption... causes) throws IOException, InterruptedException Interrupts the execution of a flow. If any computation is going on synchronously, it will be interrupted/killed/etc. If it's in a suspended state waiting to be resurrected (such as waiting forStepContext.onSuccess(Object)), then it just marks the workflow as done with the specified status.If it's evaluating bodies (see
StepContext.newBodyInvoker(), then it's callback needs to be invoked.Do not use this from a step. Throw
FlowInterruptedExceptionor some other exception instead.- Throws:
IOExceptionInterruptedException- See Also:
-
StepExecution.stop(Throwable)Executor.interrupt(Result)
-
addListener
Add a listener to changes in the flow graph structure.- Parameters:
listener- a listener to add
-
removeListener
-
isComplete
public boolean isComplete()Checks whether this flow execution has finished executing completely. -
blocksRestart
public boolean blocksRestart()Determines whether the activity currently being run should block a Jenkins restart.- Returns:
- by default, true
- See Also:
-
getCauseOfFailure
If this execution has completed with an error, report that. This is a convenience method to look up the error result fromFlowEndNode. -
getNode
Loads a node by its ID. Also gives eachFlowNodea portion of the URL space.- Throws:
IOException- See Also:
-
getAuthentication2
@NonNull public org.springframework.security.core.Authentication getAuthentication2()Looks up authentication associated with this flow execution. For example, if a flow is configured to be a trusted agent of a user, that would be set here. A flow run triggered by a user manually might be associated with the runtime, or it might not.- Returns:
- an authentication;
ACL.SYSTEM2as a fallback, orJenkins.ANONYMOUS2if the flow is supposed to be limited to a specific user but that user cannot now be looked up
-
getAuthentication
Deprecated. -
isActive
@Restricted(org.kohsuke.accmod.restrictions.NoExternalUse.class) public boolean isActive(@NonNull FlowNode node) Description copied from interface:GraphLookupViewTests if the node is a currently running head, or the start of a block that has not completed executing- Specified by:
isActivein interfaceGraphLookupView- Throws:
IllegalArgumentException- If the inputFlowNodedoes not belong to this execution- See Also:
-
getEndNode
@CheckForNull @Restricted(org.kohsuke.accmod.restrictions.NoExternalUse.class) public BlockEndNode getEndNode(@NonNull BlockStartNode startNode) Description copied from interface:GraphLookupViewFind the end node corresponding to a start node, and can be used to tell if the block is completed.- Specified by:
getEndNodein interfaceGraphLookupView- Returns:
BlockEndNodematching the given start node, or null if block hasn't completed- Throws:
IllegalArgumentException- If the inputFlowNodedoes not belong to this execution- See Also:
-
findEnclosingBlockStart
@CheckForNull @Restricted(org.kohsuke.accmod.restrictions.NoExternalUse.class) public BlockStartNode findEnclosingBlockStart(@NonNull FlowNode node) Description copied from interface:GraphLookupViewFind the immediately enclosingBlockStartNodearound aFlowNode- Specified by:
findEnclosingBlockStartin interfaceGraphLookupView- Parameters:
node- Node to find block enclosing it - note that it this is a BlockStartNode, you will return the start of the block enclosing this one.- Returns:
- Null if node is a
FlowStartNodeorFlowEndNode - Throws:
IllegalArgumentException- If the inputFlowNodedoes not belong to this execution- See Also:
-
findAllEnclosingBlockStarts
@NonNull @Restricted(org.kohsuke.accmod.restrictions.NoExternalUse.class) public List<BlockStartNode> findAllEnclosingBlockStarts(@NonNull FlowNode node) Description copied from interface:GraphLookupViewReturn all enclosing block start nodes, as withGraphLookupView.findEnclosingBlockStart(FlowNode).Usage note:Prefer using
GraphLookupView.iterateEnclosingBlocks(FlowNode)unless you know you need ALL blocks, since that can lazy-load.- Specified by:
findAllEnclosingBlockStartsin interfaceGraphLookupView- Parameters:
node- Node to find enclosing blocks for- Returns:
- All enclosing block starts from the nearest-enclosing outward ("inside-out" order), or EMPTY_LIST if this is a start or end node
- Throws:
IllegalArgumentException- If the inputFlowNodedoes not belong to this execution- See Also:
-
iterateEnclosingBlocks
@NonNull @Restricted(org.kohsuke.accmod.restrictions.NoExternalUse.class) public Iterable<BlockStartNode> iterateEnclosingBlocks(@NonNull FlowNode node) Description copied from interface:GraphLookupViewProvide anIterableover all enclosing blocks, which can be used similarly toGraphLookupView.findAllEnclosingBlockStarts(FlowNode)but does lazy fetches rather than materializing a full result. Handy for for-each loops.Usage note:Prefer this to
GraphLookupView.findAllEnclosingBlockStarts(FlowNode)in most cases since it can evaluate lazily, unless you know you need all enclosing blocks.- Specified by:
iterateEnclosingBlocksin interfaceGraphLookupView- Parameters:
node- Node to find enclosing blocks for- Returns:
- Iterable over enclosing blocks, from the nearest-enclosing outward ("inside-out" order)
- Throws:
IllegalArgumentException- If the inputFlowNodedoes not belong to this execution- See Also:
-
afterStepExecutionsResumed
protected void afterStepExecutionsResumed()Called after a restart and any attempts atStepExecution.onResume()have completed. This is a signal that it is safe to resume program execution. By default, does nothing.
-
getAuthentication2()