Add README_RUN.md to pkg/app for better understanding Run struct
Signed-off-by: yxxhero <aiopsclub@163.com>
This commit is contained in:
		
							parent
							
								
									acaaa34d69
								
							
						
					
					
						commit
						f42f134b1d
					
				|  | @ -0,0 +1,72 @@ | |||
| # Run Struct | ||||
| 
 | ||||
| ## Overview | ||||
| 
 | ||||
| The `Run` struct is a core component of Helmfile's execution model, responsible for orchestrating the preparation, execution, and cleanup phases of Helmfile commands. It provides a consistent workflow for all Helmfile operations while maintaining separation of concerns. | ||||
| 
 | ||||
| ## Core Mechanics | ||||
| 
 | ||||
| ### The Preparation-Execution-Cleanup Pattern | ||||
| 
 | ||||
| At the heart of the `Run` package is the `withPreparedCharts` method, which implements a functional programming pattern to standardize how Helmfile commands are executed: | ||||
| 
 | ||||
| ```go | ||||
| func (r *Run) withPreparedCharts(helmfileCommand string, opts state.ChartPrepareOptions, f func()) error { | ||||
|     // Preparation phase | ||||
|     // ... | ||||
| 
 | ||||
|     // Execution phase | ||||
|     f() | ||||
| 
 | ||||
|     // Cleanup phase | ||||
|     // ... | ||||
| } | ||||
| ``` | ||||
| 
 | ||||
| This pattern consists of three distinct phases: | ||||
| 
 | ||||
| 1. **Preparation Phase**: | ||||
|    - Validates the current state | ||||
|    - Syncs repositories if needed | ||||
|    - Creates temporary directories for chart downloads | ||||
|    - Triggers global prepare events | ||||
|    - Downloads and processes charts | ||||
| 
 | ||||
| 2. **Execution Phase**: | ||||
|    - Executes the command-specific logic provided as a function parameter | ||||
|    - Command implementations are decoupled from chart preparation | ||||
| 
 | ||||
| 3. **Cleanup Phase**: | ||||
|    - Triggers global cleanup events | ||||
|    - Handles resource cleanup | ||||
| 
 | ||||
| ### Usage Example | ||||
| 
 | ||||
| Commands like `diff`, `apply`, or `template` use this pattern by providing their specific implementation as a function: | ||||
| 
 | ||||
| ```go | ||||
| // Example: How the diff command uses withPreparedCharts | ||||
| err := run.withPreparedCharts("diff", opts, func() { | ||||
|     msg, matched, affected, errs = a.diff(run, c) | ||||
| }) | ||||
| ``` | ||||
| 
 | ||||
| ## Benefits | ||||
| 
 | ||||
| - **Consistent Workflow**: All commands follow the same preparation, execution, and cleanup flow | ||||
| - **Separation of Concerns**: Chart preparation logic is centralized and reused across commands | ||||
| - **Resource Management**: Temporary resources are properly created and cleaned up | ||||
| - **Extensibility**: New commands can be added by implementing their specific logic without duplicating preparation code | ||||
| 
 | ||||
| ## Key Components | ||||
| 
 | ||||
| - **ReleaseToChart**: Maps release identifiers to their prepared chart paths | ||||
| - **Chart Preparation**: Handles downloading, modifying, and preparing charts for use | ||||
| - **Repository Synchronization**: Ensures all required Helm repositories are available | ||||
| - **Event Triggers**: Executes global prepare and cleanup events at appropriate times | ||||
| 
 | ||||
| ## Implementation Details | ||||
| 
 | ||||
| The `Run` struct maintains state throughout the execution lifecycle, ensuring that charts are prepared only once and that all commands have access to the prepared charts through the `ReleaseToChart` map. | ||||
| 
 | ||||
| Commands can focus on their specific implementation while relying on the `withPreparedCharts` method to handle all the common preparation and cleanup tasks. | ||||
		Loading…
	
		Reference in New Issue