From d3d1ba32ffbecc82a755837df3e81ff326501a3b Mon Sep 17 00:00:00 2001 From: Ansuman Satapathy Date: Fri, 22 Nov 2024 05:03:50 +0000 Subject: [PATCH] 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. --- .../container/devcontainer_steps.go | 196 +++++++++++++----- .../container/embedded_docker_provider.go | 18 +- 2 files changed, 148 insertions(+), 66 deletions(-) diff --git a/app/gitspace/orchestrator/container/devcontainer_steps.go b/app/gitspace/orchestrator/container/devcontainer_steps.go index 7db9ee483..3ac7ddca8 100644 --- a/app/gitspace/orchestrator/container/devcontainer_steps.go +++ b/app/gitspace/orchestrator/container/devcontainer_steps.go @@ -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 diff --git a/app/gitspace/orchestrator/container/embedded_docker_provider.go b/app/gitspace/orchestrator/container/embedded_docker_provider.go index 8acef4c5c..8fc750f9a 100644 --- a/app/gitspace/orchestrator/container/embedded_docker_provider.go +++ b/app/gitspace/orchestrator/container/embedded_docker_provider.go @@ -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