fix: [CDE-525]: for each execution form a new list of steps to execute. (#3034)

* fix: [CDE-525]: for each execution form a new list of steps to execute.
This commit is contained in:
Ansuman Satapathy 2024-11-22 05:03:50 +00:00 committed by Harness
parent 335eaa73c1
commit d3d1ba32ff
2 changed files with 148 additions and 66 deletions

View File

@ -30,6 +30,142 @@ import (
"github.com/harness/gitness/types/enum"
)
// buildSetupSteps constructs the steps to be executed in the setup process.
func (e *EmbeddedDockerOrchestrator) buildSetupSteps(
_ context.Context,
ideService ide.IDE,
gitspaceConfig types.GitspaceConfig,
resolvedRepoDetails scm.ResolvedDetails,
defaultBaseImage string,
environment []string,
devcontainerConfig types.DevcontainerConfig,
codeRepoDir string,
) []gitspaceTypes.Step {
return []gitspaceTypes.Step{
{
Name: "Validate Supported OS",
Execute: ValidateSupportedOS,
StopOnFailure: true,
},
{
Name: "Manage User",
Execute: func(
ctx context.Context,
exec *devcontainer.Exec,
gitspaceLogger gitspaceTypes.GitspaceLogger,
) error {
return ManageUser(ctx, exec, e.userService, gitspaceLogger)
},
StopOnFailure: true,
},
{
Name: "Set environment",
Execute: func(
ctx context.Context,
exec *devcontainer.Exec,
gitspaceLogger gitspaceTypes.GitspaceLogger,
) error {
return SetEnv(ctx, exec, gitspaceLogger, environment)
},
StopOnFailure: true,
},
{
Name: "Install Tools",
Execute: func(
ctx context.Context,
exec *devcontainer.Exec,
gitspaceLogger gitspaceTypes.GitspaceLogger,
) error {
return InstallTools(ctx, exec, gitspaceLogger, gitspaceConfig.IDE)
},
StopOnFailure: true,
},
{
Name: "Setup IDE",
Execute: func(
ctx context.Context,
exec *devcontainer.Exec,
gitspaceLogger gitspaceTypes.GitspaceLogger,
) error {
return SetupIDE(ctx, exec, ideService, gitspaceLogger)
},
StopOnFailure: true,
},
{
Name: "Run IDE",
Execute: func(
ctx context.Context,
exec *devcontainer.Exec,
gitspaceLogger gitspaceTypes.GitspaceLogger,
) error {
return RunIDE(ctx, exec, ideService, gitspaceLogger)
},
StopOnFailure: true,
},
{
Name: "Install Git",
Execute: func(
ctx context.Context,
exec *devcontainer.Exec,
gitspaceLogger gitspaceTypes.GitspaceLogger,
) error {
return InstallGit(ctx, exec, e.gitService, gitspaceLogger)
},
StopOnFailure: true,
},
{
Name: "Setup Git Credentials",
Execute: func(
ctx context.Context,
exec *devcontainer.Exec,
gitspaceLogger gitspaceTypes.GitspaceLogger,
) error {
if resolvedRepoDetails.ResolvedCredentials.Credentials != nil {
return SetupGitCredentials(ctx, exec, resolvedRepoDetails, e.gitService, gitspaceLogger)
}
return nil
},
StopOnFailure: true,
},
{
Name: "Clone Code",
Execute: func(
ctx context.Context,
exec *devcontainer.Exec,
gitspaceLogger gitspaceTypes.GitspaceLogger,
) error {
return CloneCode(ctx, exec, defaultBaseImage, resolvedRepoDetails, e.gitService, gitspaceLogger)
},
StopOnFailure: true,
},
// Post-create and Post-start steps
{
Name: "Execute PostCreate Command",
Execute: func(
ctx context.Context,
exec *devcontainer.Exec,
gitspaceLogger gitspaceTypes.GitspaceLogger,
) error {
command := ExtractCommand(PostCreateAction, devcontainerConfig)
return ExecuteCommand(ctx, exec, codeRepoDir, gitspaceLogger, command, PostCreateAction)
},
StopOnFailure: false,
},
{
Name: "Execute PostStart Command",
Execute: func(
ctx context.Context,
exec *devcontainer.Exec,
gitspaceLogger gitspaceTypes.GitspaceLogger,
) error {
command := ExtractCommand(PostStartAction, devcontainerConfig)
return ExecuteCommand(ctx, exec, codeRepoDir, gitspaceLogger, command, PostStartAction)
},
StopOnFailure: false,
},
}
}
// setupGitspaceAndIDE initializes Gitspace and IDE by registering and executing the setup steps.
func (e *EmbeddedDockerOrchestrator) setupGitspaceAndIDE(
ctx context.Context,
@ -45,58 +181,18 @@ func (e *EmbeddedDockerOrchestrator) setupGitspaceAndIDE(
devcontainerConfig := resolvedRepoDetails.DevcontainerConfig
codeRepoDir := filepath.Join(homeDir, resolvedRepoDetails.RepoName)
// Register setup steps
e.RegisterStep("Validate Supported OS", ValidateSupportedOS, true)
e.RegisterStep("Manage User",
func(ctx context.Context, exec *devcontainer.Exec, gitspaceLogger gitspaceTypes.GitspaceLogger) error {
return ManageUser(ctx, exec, e.userService, gitspaceLogger)
}, true)
e.RegisterStep("Set environment",
func(ctx context.Context, exec *devcontainer.Exec, gitspaceLogger gitspaceTypes.GitspaceLogger) error {
return SetEnv(ctx, exec, gitspaceLogger, environment)
}, true)
e.RegisterStep("Install Tools",
func(ctx context.Context, exec *devcontainer.Exec, gitspaceLogger gitspaceTypes.GitspaceLogger) error {
return InstallTools(ctx, exec, gitspaceLogger, gitspaceConfig.IDE)
}, true)
e.RegisterStep("Setup IDE",
func(ctx context.Context, exec *devcontainer.Exec, gitspaceLogger gitspaceTypes.GitspaceLogger) error {
return SetupIDE(ctx, exec, ideService, gitspaceLogger)
}, true)
e.RegisterStep("Run IDE",
func(ctx context.Context, exec *devcontainer.Exec, gitspaceLogger gitspaceTypes.GitspaceLogger) error {
return RunIDE(ctx, exec, ideService, gitspaceLogger)
}, true)
e.RegisterStep("Install Git",
func(ctx context.Context, exec *devcontainer.Exec, gitspaceLogger gitspaceTypes.GitspaceLogger) error {
return InstallGit(ctx, exec, e.gitService, gitspaceLogger)
}, true)
e.RegisterStep("Setup Git Credentials",
func(ctx context.Context, exec *devcontainer.Exec, gitspaceLogger gitspaceTypes.GitspaceLogger) error {
if resolvedRepoDetails.ResolvedCredentials.Credentials != nil {
return SetupGitCredentials(ctx, exec, resolvedRepoDetails, e.gitService, gitspaceLogger)
}
return nil
}, true)
e.RegisterStep("Clone Code",
func(ctx context.Context, exec *devcontainer.Exec, gitspaceLogger gitspaceTypes.GitspaceLogger) error {
return CloneCode(ctx, exec, defaultBaseImage, resolvedRepoDetails, e.gitService, gitspaceLogger)
}, true)
// Register the Execute Command steps (PostCreate and PostStart)
e.RegisterStep("Execute PostCreate Command",
func(ctx context.Context, exec *devcontainer.Exec, gitspaceLogger gitspaceTypes.GitspaceLogger) error {
command := ExtractCommand(PostCreateAction, devcontainerConfig)
return ExecuteCommand(ctx, exec, codeRepoDir, gitspaceLogger, command, PostCreateAction)
}, false)
e.RegisterStep("Execute PostStart Command",
func(ctx context.Context, exec *devcontainer.Exec, gitspaceLogger gitspaceTypes.GitspaceLogger) error {
command := ExtractCommand(PostStartAction, devcontainerConfig)
return ExecuteCommand(ctx, exec, codeRepoDir, gitspaceLogger, command, PostStartAction)
}, false)
steps := e.buildSetupSteps(
ctx,
ideService,
gitspaceConfig,
resolvedRepoDetails,
defaultBaseImage,
environment,
devcontainerConfig,
codeRepoDir)
// Execute the registered steps
if err := e.ExecuteSteps(ctx, exec, gitspaceLogger); err != nil {
if err := e.ExecuteSteps(ctx, exec, gitspaceLogger, steps); err != nil {
return err
}
return nil

View File

@ -41,34 +41,20 @@ const (
)
type EmbeddedDockerOrchestrator struct {
steps []gitspaceTypes.Step // Steps registry
dockerClientFactory *infraprovider.DockerClientFactory
statefulLogger *logutil.StatefulLogger
gitService git.Service
userService user.Service
}
// RegisterStep registers a new setup step with an option to stop or continue on failure.
func (e *EmbeddedDockerOrchestrator) RegisterStep(
name string,
execute func(ctx context.Context, exec *devcontainer.Exec, logger gitspaceTypes.GitspaceLogger) error,
stopOnFailure bool,
) {
step := gitspaceTypes.Step{
Name: name,
Execute: execute,
StopOnFailure: stopOnFailure,
}
e.steps = append(e.steps, step)
}
// ExecuteSteps executes all registered steps in sequence, respecting stopOnFailure flag.
func (e *EmbeddedDockerOrchestrator) ExecuteSteps(
ctx context.Context,
exec *devcontainer.Exec,
gitspaceLogger gitspaceTypes.GitspaceLogger,
steps []gitspaceTypes.Step,
) error {
for _, step := range e.steps {
for _, step := range steps {
// Execute the step
if err := step.Execute(ctx, exec, gitspaceLogger); err != nil {
// Log the error and decide whether to stop or continue based on stopOnFailure flag