mirror of
https://github.com/harness/drone.git
synced 2025-05-11 22:50:11 +08:00
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:
parent
335eaa73c1
commit
d3d1ba32ff
@ -30,6 +30,142 @@ import (
|
|||||||
"github.com/harness/gitness/types/enum"
|
"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.
|
// setupGitspaceAndIDE initializes Gitspace and IDE by registering and executing the setup steps.
|
||||||
func (e *EmbeddedDockerOrchestrator) setupGitspaceAndIDE(
|
func (e *EmbeddedDockerOrchestrator) setupGitspaceAndIDE(
|
||||||
ctx context.Context,
|
ctx context.Context,
|
||||||
@ -45,58 +181,18 @@ func (e *EmbeddedDockerOrchestrator) setupGitspaceAndIDE(
|
|||||||
devcontainerConfig := resolvedRepoDetails.DevcontainerConfig
|
devcontainerConfig := resolvedRepoDetails.DevcontainerConfig
|
||||||
codeRepoDir := filepath.Join(homeDir, resolvedRepoDetails.RepoName)
|
codeRepoDir := filepath.Join(homeDir, resolvedRepoDetails.RepoName)
|
||||||
|
|
||||||
// Register setup steps
|
steps := e.buildSetupSteps(
|
||||||
e.RegisterStep("Validate Supported OS", ValidateSupportedOS, true)
|
ctx,
|
||||||
e.RegisterStep("Manage User",
|
ideService,
|
||||||
func(ctx context.Context, exec *devcontainer.Exec, gitspaceLogger gitspaceTypes.GitspaceLogger) error {
|
gitspaceConfig,
|
||||||
return ManageUser(ctx, exec, e.userService, gitspaceLogger)
|
resolvedRepoDetails,
|
||||||
}, true)
|
defaultBaseImage,
|
||||||
e.RegisterStep("Set environment",
|
environment,
|
||||||
func(ctx context.Context, exec *devcontainer.Exec, gitspaceLogger gitspaceTypes.GitspaceLogger) error {
|
devcontainerConfig,
|
||||||
return SetEnv(ctx, exec, gitspaceLogger, environment)
|
codeRepoDir)
|
||||||
}, 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)
|
|
||||||
|
|
||||||
// Execute the registered steps
|
// 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 err
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
|
@ -41,34 +41,20 @@ const (
|
|||||||
)
|
)
|
||||||
|
|
||||||
type EmbeddedDockerOrchestrator struct {
|
type EmbeddedDockerOrchestrator struct {
|
||||||
steps []gitspaceTypes.Step // Steps registry
|
|
||||||
dockerClientFactory *infraprovider.DockerClientFactory
|
dockerClientFactory *infraprovider.DockerClientFactory
|
||||||
statefulLogger *logutil.StatefulLogger
|
statefulLogger *logutil.StatefulLogger
|
||||||
gitService git.Service
|
gitService git.Service
|
||||||
userService user.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.
|
// ExecuteSteps executes all registered steps in sequence, respecting stopOnFailure flag.
|
||||||
func (e *EmbeddedDockerOrchestrator) ExecuteSteps(
|
func (e *EmbeddedDockerOrchestrator) ExecuteSteps(
|
||||||
ctx context.Context,
|
ctx context.Context,
|
||||||
exec *devcontainer.Exec,
|
exec *devcontainer.Exec,
|
||||||
gitspaceLogger gitspaceTypes.GitspaceLogger,
|
gitspaceLogger gitspaceTypes.GitspaceLogger,
|
||||||
|
steps []gitspaceTypes.Step,
|
||||||
) error {
|
) error {
|
||||||
for _, step := range e.steps {
|
for _, step := range steps {
|
||||||
// Execute the step
|
// Execute the step
|
||||||
if err := step.Execute(ctx, exec, gitspaceLogger); err != nil {
|
if err := step.Execute(ctx, exec, gitspaceLogger); err != nil {
|
||||||
// Log the error and decide whether to stop or continue based on stopOnFailure flag
|
// Log the error and decide whether to stop or continue based on stopOnFailure flag
|
||||||
|
Loading…
Reference in New Issue
Block a user