The Conceptual Stage

The Basics

Conceptually speaking, any given stage has the following phases:

Pre-Stage Actions

Anything that takes place before a stage actually begins. E.g., check that certain pre-conditions are met before proceeding.

Begin Stage Actions

Whatever should happen at the beginning of the stage. E.g., print or log some information for the user, capture timing information, etc.

Stage Body

The actual work of the stage itself, which is entirely dependent on the script you’re writing.

End Stage Actions

Whatever should happen at the end of the stage. E.g., print or log more information for the user, capture timing information, etc.

Post-Stage Actions

Anything that takes place after a stage has finished. E.g., check that certain post-conditions have been satisfied.

Depending on your script, some of these phases may be no-ops (e.g., pre-/post-stage actions), but conceptually they’re all there.

Skipping Stages

If we want to get a bit fancier, we can include another phase for Skip Stage Actions, which are whatever we want to do if we dynamically decide to skip a stage. Adding this feature changes the execution flow to the following:

        %%{init: {"theme": "neutral"}}%%
flowchart TD
   classDef style_plain fill:#ddd,stroke:#999
   classDef style_pre_stage fill:#fbb,stroke:#b77
   classDef style_begin_stage fill:#ede,stroke:#a9a
   classDef style_end_stage fill:#dfe,stroke:#9ba
   classDef style_post_stage fill:#fdc,stroke:#b98
   classDef style_skip_stage fill:#def,stroke:#9ab

   stage_entry(Stage Entry):::style_plain
   pre_stage_actions(Pre-Stage Actions):::style_pre_stage
   begin_stage_actions(Begin Stage Actions):::style_begin_stage
   execute_stage{{execute stage?}}:::style_plain
   stage_body(Stage Body):::style_plain
   skip_stage_actions(Skip Stage Actions):::style_skip_stage
   end_stage_actions(End Stage Actions):::style_end_stage
   post_stage_actions(Post-Stage Actions):::style_post_stage
   stage_exit(Stage Exit):::style_plain

   stage_entry --> pre_stage_actions
   pre_stage_actions --> begin_stage_actions
   begin_stage_actions --> execute_stage
   execute_stage -- Yes --> stage_body
   execute_stage -- No --> skip_stage_actions
   stage_body --> end_stage_actions
   skip_stage_actions --> end_stage_actions
   end_stage_actions --> post_stage_actions
   post_stage_actions --> stage_exit
    

Retrying Stages

If we want to get even fancier, we can allow for a stage to be automatically retried. Such flexibility is beneficial, because often you’re able to programmatically determine if something has gone wrong during a stage. In such circumstances, rather than requiring the user to see the problem, decide what to do, and then act, you can design the stage to automatically retry itself. In that case, we add a Retry Stage Actions phase, and the execution flow becomes the following:

        %%{init: {"theme": "neutral"}}%%
flowchart TD
   classDef style_plain fill:#ddd,stroke:#999
   classDef style_pre_stage fill:#fbb,stroke:#b77
   classDef style_begin_stage fill:#ede,stroke:#a9a
   classDef style_end_stage fill:#dfe,stroke:#9ba
   classDef style_post_stage fill:#fdc,stroke:#b98
   classDef style_skip_stage fill:#def,stroke:#9ab
   classDef style_retry_stage fill:#ffc,stroke:#bb8
   linkStyle default color:#000

   stage_entry(Stage Entry):::style_plain
   pre_stage_actions(Pre-Stage Actions):::style_pre_stage
   begin_stage_actions(Begin Stage Actions):::style_begin_stage
   execute_stage{{execute stage?}}:::style_plain
   stage_body(Stage Body):::style_plain
   skip_stage_actions(Skip Stage Actions):::style_skip_stage
   end_stage_actions(End Stage Actions):::style_end_stage
   retry_stage{{retry stage?}}:::style_retry_stage
   retry_stage_actions(Retry Stage Actions):::style_retry_stage
   post_stage_actions(Post-Stage Actions):::style_post_stage
   stage_exit(Stage Exit):::style_plain

   stage_entry --> pre_stage_actions
   pre_stage_actions --> begin_stage_actions
   begin_stage_actions --> execute_stage
   execute_stage -- Yes --> stage_body
   execute_stage -- No --> skip_stage_actions
   stage_body --> end_stage_actions
   skip_stage_actions --> end_stage_actions
   end_stage_actions --> retry_stage
   retry_stage -- Yes --> retry_stage_actions
   retry_stage_actions --> begin_stage_actions
   retry_stage -- No --> post_stage_actions
   post_stage_actions --> stage_exit
    

For details on how all the flexibility above is made available to the user, see Stage Implementation Details.