73 lines
2.7 KiB
Markdown
73 lines
2.7 KiB
Markdown
# 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.
|