mirror of https://github.com/harness/drone.git
feat: [CDE-472]: make IDE service args typed (#3092)
* feat: [CDE-472]: reduce verbosity of internal installation steps * feat: [CDE-472]: reduce verbosity of internal installation steps * feat: [CDE-472]: make IDE service args typedpull/3597/head
parent
02d3453ddd
commit
04b4dab207
|
@ -17,6 +17,7 @@ package common
|
|||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"strings"
|
||||
|
||||
"github.com/harness/gitness/app/gitspace/orchestrator/devcontainer"
|
||||
"github.com/harness/gitness/app/gitspace/orchestrator/template"
|
||||
|
@ -46,7 +47,7 @@ func ValidateSupportedOS(
|
|||
templateSupportedOSDistribution, err)
|
||||
}
|
||||
gitspaceLogger.Info("Validate supported OSes...")
|
||||
err = ExecuteCommandInHomeDirAndLog(ctx, exec, script, true, gitspaceLogger)
|
||||
err = ExecuteCommandInHomeDirAndLog(ctx, exec, script, true, gitspaceLogger, false)
|
||||
if err != nil {
|
||||
return fmt.Errorf("error while detecting os distribution: %w", err)
|
||||
}
|
||||
|
@ -93,7 +94,7 @@ func InstallToolsForVsCodeWeb(
|
|||
|
||||
gitspaceLogger.Info("Installing tools for vs code web inside container")
|
||||
gitspaceLogger.Info("Tools installation output...")
|
||||
err = ExecuteCommandInHomeDirAndLog(ctx, exec, script, true, gitspaceLogger)
|
||||
err = ExecuteCommandInHomeDirAndLog(ctx, exec, script, true, gitspaceLogger, false)
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to install tools for vs code web: %w", err)
|
||||
}
|
||||
|
@ -117,7 +118,7 @@ func InstallToolsForVsCode(
|
|||
}
|
||||
|
||||
gitspaceLogger.Info("Installing tools for vs code in container")
|
||||
err = ExecuteCommandInHomeDirAndLog(ctx, exec, script, true, gitspaceLogger)
|
||||
err = ExecuteCommandInHomeDirAndLog(ctx, exec, script, true, gitspaceLogger, false)
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to install tools for vs code: %w", err)
|
||||
}
|
||||
|
@ -140,7 +141,7 @@ func SetEnv(
|
|||
templateSetEnv, err)
|
||||
}
|
||||
gitspaceLogger.Info("Setting env...")
|
||||
err = ExecuteCommandInHomeDirAndLog(ctx, exec, script, true, gitspaceLogger)
|
||||
err = ExecuteCommandInHomeDirAndLog(ctx, exec, script, true, gitspaceLogger, true)
|
||||
if err != nil {
|
||||
return fmt.Errorf("error while setting env vars: %w", err)
|
||||
}
|
||||
|
@ -153,13 +154,17 @@ func ExecuteCommandInHomeDirAndLog(
|
|||
script string,
|
||||
root bool,
|
||||
gitspaceLogger types.GitspaceLogger,
|
||||
verbose bool,
|
||||
) error {
|
||||
outputCh := make(chan []byte)
|
||||
err := exec.ExecuteCommandInHomeDirectory(ctx, script, root, false, outputCh)
|
||||
for output := range outputCh {
|
||||
msg := string(output)
|
||||
// Log output from the command as a string
|
||||
if len(output) > 0 {
|
||||
gitspaceLogger.Info(string(output))
|
||||
if verbose || strings.HasPrefix(msg, devcontainer.LoggerErrorPrefix) {
|
||||
gitspaceLogger.Info(msg)
|
||||
}
|
||||
}
|
||||
}
|
||||
return err
|
||||
|
|
|
@ -197,8 +197,8 @@ func ExtractLifecycleCommands(actionType PostAction, devcontainerConfig types.De
|
|||
func ExtractIDECustomizations(
|
||||
ideService ide.IDE,
|
||||
devcontainerConfig types.DevcontainerConfig,
|
||||
) map[string]interface{} {
|
||||
var args = make(map[string]interface{})
|
||||
) map[gitspaceTypes.IDEArg]interface{} {
|
||||
var args = make(map[gitspaceTypes.IDEArg]interface{})
|
||||
if ideService.Type() == enum.IDETypeVSCodeWeb || ideService.Type() == enum.IDETypeVSCode {
|
||||
if devcontainerConfig.Customizations.ExtractVSCodeSpec() != nil {
|
||||
args[gitspaceTypes.VSCodeCustomizationArg] = *devcontainerConfig.Customizations.ExtractVSCodeSpec()
|
||||
|
|
|
@ -146,7 +146,7 @@ func SetupIDE(
|
|||
ctx context.Context,
|
||||
exec *devcontainer.Exec,
|
||||
ideService ide.IDE,
|
||||
args map[string]interface{},
|
||||
args map[gitspaceTypes.IDEArg]interface{},
|
||||
gitspaceLogger gitspaceTypes.GitspaceLogger,
|
||||
) error {
|
||||
gitspaceLogger.Info("Setting up IDE inside container: " + string(ideService.Type()))
|
||||
|
@ -161,7 +161,7 @@ func RunIDEWithArgs(
|
|||
ctx context.Context,
|
||||
exec *devcontainer.Exec,
|
||||
ideService ide.IDE,
|
||||
args map[string]interface{},
|
||||
args map[gitspaceTypes.IDEArg]interface{},
|
||||
gitspaceLogger gitspaceTypes.GitspaceLogger,
|
||||
) error {
|
||||
gitspaceLogger.Info("Running the IDE inside container: " + string(ideService.Type()))
|
||||
|
|
|
@ -32,6 +32,7 @@ import (
|
|||
|
||||
const RootUser = "root"
|
||||
const ErrMsgTCP = "unable to upgrade to tcp, received 200"
|
||||
const LoggerErrorPrefix = "ERR>> "
|
||||
|
||||
type Exec struct {
|
||||
ContainerName string
|
||||
|
@ -185,7 +186,7 @@ func (e *Exec) streamStdErr(stderr io.Reader, outputCh chan []byte, wg *sync.Wai
|
|||
defer wg.Done()
|
||||
stderrReader := bufio.NewScanner(stderr)
|
||||
for stderrReader.Scan() {
|
||||
outputCh <- []byte("ERR> " + stderrReader.Text())
|
||||
outputCh <- []byte(LoggerErrorPrefix + stderrReader.Text())
|
||||
}
|
||||
if err := stderrReader.Err(); err != nil {
|
||||
log.Println("Error reading stderr:", err)
|
||||
|
|
|
@ -54,7 +54,7 @@ func (g *ServiceImpl) Install(
|
|||
}
|
||||
gitspaceLogger.Info("Install git output...")
|
||||
gitspaceLogger.Info("Setting up git inside container")
|
||||
err = common.ExecuteCommandInHomeDirAndLog(ctx, exec, script, true, gitspaceLogger)
|
||||
err = common.ExecuteCommandInHomeDirAndLog(ctx, exec, script, true, gitspaceLogger, false)
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to setup git: %w", err)
|
||||
}
|
||||
|
@ -79,7 +79,7 @@ func (g *ServiceImpl) SetupCredentials(
|
|||
}
|
||||
gitspaceLogger.Info("Setting up git credentials output...")
|
||||
gitspaceLogger.Info("Setting up git credentials inside container")
|
||||
err = common.ExecuteCommandInHomeDirAndLog(ctx, exec, script, false, gitspaceLogger)
|
||||
err = common.ExecuteCommandInHomeDirAndLog(ctx, exec, script, false, gitspaceLogger, true)
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to setup git credentials: %w", err)
|
||||
}
|
||||
|
@ -117,7 +117,7 @@ func (g *ServiceImpl) CloneCode(
|
|||
"failed to generate scipt to clone code from template %s: %w", templateCloneCode, err)
|
||||
}
|
||||
gitspaceLogger.Info("Cloning code inside container")
|
||||
err = common.ExecuteCommandInHomeDirAndLog(ctx, exec, script, false, gitspaceLogger)
|
||||
err = common.ExecuteCommandInHomeDirAndLog(ctx, exec, script, false, gitspaceLogger, true)
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to clone code: %w", err)
|
||||
}
|
||||
|
|
|
@ -29,7 +29,7 @@ type IDE interface {
|
|||
Setup(
|
||||
ctx context.Context,
|
||||
exec *devcontainer.Exec,
|
||||
args map[string]interface{},
|
||||
args map[gitspaceTypes.IDEArg]interface{},
|
||||
gitspaceLogger gitspaceTypes.GitspaceLogger,
|
||||
) error
|
||||
|
||||
|
@ -37,7 +37,7 @@ type IDE interface {
|
|||
Run(
|
||||
ctx context.Context,
|
||||
exec *devcontainer.Exec,
|
||||
args map[string]interface{},
|
||||
args map[gitspaceTypes.IDEArg]interface{},
|
||||
gitspaceLogger gitspaceTypes.GitspaceLogger,
|
||||
) error
|
||||
|
||||
|
|
|
@ -51,7 +51,7 @@ func NewVsCodeService(config *VSCodeConfig) *VSCode {
|
|||
func (v *VSCode) Setup(
|
||||
ctx context.Context,
|
||||
exec *devcontainer.Exec,
|
||||
args map[string]interface{},
|
||||
args map[gitspaceTypes.IDEArg]interface{},
|
||||
gitspaceLogger gitspaceTypes.GitspaceLogger,
|
||||
) error {
|
||||
osInfoScript := common.GetOSInfoScript()
|
||||
|
@ -72,7 +72,7 @@ func (v *VSCode) Setup(
|
|||
|
||||
gitspaceLogger.Info("Installing ssh-server inside container")
|
||||
gitspaceLogger.Info("IDE setup output...")
|
||||
err = common.ExecuteCommandInHomeDirAndLog(ctx, exec, sshServerScript, true, gitspaceLogger)
|
||||
err = common.ExecuteCommandInHomeDirAndLog(ctx, exec, sshServerScript, true, gitspaceLogger, false)
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to setup SSH serverr: %w", err)
|
||||
}
|
||||
|
@ -85,7 +85,7 @@ func (v *VSCode) Setup(
|
|||
func (v *VSCode) Run(
|
||||
ctx context.Context,
|
||||
exec *devcontainer.Exec,
|
||||
_ map[string]interface{},
|
||||
_ map[gitspaceTypes.IDEArg]interface{},
|
||||
gitspaceLogger gitspaceTypes.GitspaceLogger,
|
||||
) error {
|
||||
payload := template.RunSSHServerPayload{
|
||||
|
@ -98,7 +98,7 @@ func (v *VSCode) Run(
|
|||
"failed to generate scipt to run ssh server from template %s: %w", templateRunSSHServer, err)
|
||||
}
|
||||
gitspaceLogger.Info("SSH server run output...")
|
||||
err = common.ExecuteCommandInHomeDirAndLog(ctx, exec, runSSHScript, true, gitspaceLogger)
|
||||
err = common.ExecuteCommandInHomeDirAndLog(ctx, exec, runSSHScript, true, gitspaceLogger, true)
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to run SSH server: %w", err)
|
||||
}
|
||||
|
@ -120,7 +120,7 @@ func (v *VSCode) Type() enum.IDEType {
|
|||
}
|
||||
|
||||
func (v *VSCode) updateVSCodeSetupPayload(
|
||||
args map[string]interface{},
|
||||
args map[gitspaceTypes.IDEArg]interface{},
|
||||
gitspaceLogger gitspaceTypes.GitspaceLogger,
|
||||
payload *template.SetupSSHServerPayload,
|
||||
) error {
|
||||
|
@ -139,7 +139,7 @@ func (v *VSCode) updateVSCodeSetupPayload(
|
|||
}
|
||||
|
||||
func (v *VSCode) handleVSCodeCustomization(
|
||||
args map[string]interface{},
|
||||
args map[gitspaceTypes.IDEArg]interface{},
|
||||
gitspaceLogger gitspaceTypes.GitspaceLogger,
|
||||
payload *template.SetupSSHServerPayload,
|
||||
) error {
|
||||
|
@ -155,7 +155,8 @@ func (v *VSCode) handleVSCodeCustomization(
|
|||
}
|
||||
|
||||
// Log customization details
|
||||
gitspaceLogger.Info(fmt.Sprintf("VSCode Customizations %v", vsCodeCustomizationSpecs))
|
||||
gitspaceLogger.Info(fmt.Sprintf(
|
||||
"VSCode Customizations : Extensions %v", vsCodeCustomizationSpecs.Extensions))
|
||||
|
||||
// Marshal extensions and set payload
|
||||
jsonData, err := json.Marshal(vsCodeCustomizationSpecs.Extensions)
|
||||
|
@ -169,7 +170,7 @@ func (v *VSCode) handleVSCodeCustomization(
|
|||
}
|
||||
|
||||
func (v *VSCode) handleRepoName(
|
||||
args map[string]interface{},
|
||||
args map[gitspaceTypes.IDEArg]interface{},
|
||||
payload *template.SetupSSHServerPayload,
|
||||
) error {
|
||||
repoName, exists := args[gitspaceTypes.IDERepoNameArg]
|
||||
|
|
|
@ -63,7 +63,7 @@ func NewVsCodeWebService(config *VSCodeWebConfig) *VSCodeWeb {
|
|||
func (v *VSCodeWeb) Setup(
|
||||
ctx context.Context,
|
||||
exec *devcontainer.Exec,
|
||||
args map[string]interface{},
|
||||
args map[gitspaceTypes.IDEArg]interface{},
|
||||
gitspaceLogger gitspaceTypes.GitspaceLogger,
|
||||
) error {
|
||||
gitspaceLogger.Info("Installing VSCode Web inside container...")
|
||||
|
@ -131,7 +131,7 @@ func (v *VSCodeWeb) updateMediaContent(ctx context.Context, exec *devcontainer.E
|
|||
func (v *VSCodeWeb) Run(
|
||||
ctx context.Context,
|
||||
exec *devcontainer.Exec,
|
||||
args map[string]interface{},
|
||||
args map[gitspaceTypes.IDEArg]interface{},
|
||||
gitspaceLogger gitspaceTypes.GitspaceLogger,
|
||||
) error {
|
||||
payload := &template.RunVSCodeWebPayload{
|
||||
|
@ -164,7 +164,7 @@ func (v *VSCodeWeb) Run(
|
|||
}
|
||||
|
||||
func updateRunPayloadFromArgs(
|
||||
args map[string]interface{},
|
||||
args map[gitspaceTypes.IDEArg]interface{},
|
||||
payload *template.RunVSCodeWebPayload,
|
||||
_ gitspaceTypes.GitspaceLogger,
|
||||
) error {
|
||||
|
@ -180,7 +180,7 @@ func updateRunPayloadFromArgs(
|
|||
}
|
||||
|
||||
func updateSetupPayloadFromArgs(
|
||||
args map[string]interface{},
|
||||
args map[gitspaceTypes.IDEArg]interface{},
|
||||
payload *template.SetupVSCodeWebPayload,
|
||||
gitspaceLogger gitspaceTypes.GitspaceLogger,
|
||||
) error {
|
||||
|
@ -191,7 +191,8 @@ func updateSetupPayloadFromArgs(
|
|||
return fmt.Errorf("customization is not of type VSCodeCustomizationSpecs")
|
||||
}
|
||||
payload.Extensions = vsCodeCustomizationSpecs.Extensions
|
||||
gitspaceLogger.Info(fmt.Sprintf("VSCode Customizations %v", vsCodeCustomizationSpecs))
|
||||
gitspaceLogger.Info(fmt.Sprintf(
|
||||
"VSCode Customizations: Extensions %v", vsCodeCustomizationSpecs.Extensions))
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
|
|
@ -53,7 +53,7 @@ func (u *ServiceImpl) Manage(
|
|||
}
|
||||
|
||||
gitspaceLogger.Info("Configuring user directory and credentials inside container")
|
||||
err = common.ExecuteCommandInHomeDirAndLog(ctx, exec, script, true, gitspaceLogger)
|
||||
err = common.ExecuteCommandInHomeDirAndLog(ctx, exec, script, true, gitspaceLogger, true)
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to setup user: %w", err)
|
||||
}
|
||||
|
|
|
@ -23,9 +23,13 @@ import (
|
|||
"github.com/rs/zerolog"
|
||||
)
|
||||
|
||||
const VSCodeCustomizationArg = "vscode_customization"
|
||||
const VSCodeProxyURIArg = "VSCODE_PROXY_URI"
|
||||
const IDERepoNameArg = "IDE_REPO_NAME"
|
||||
type IDEArg string
|
||||
|
||||
const (
|
||||
VSCodeCustomizationArg IDEArg = "VSCODE_CUSTOMIZATION"
|
||||
VSCodeProxyURIArg IDEArg = "VSCODE_PROXY_URI"
|
||||
IDERepoNameArg IDEArg = "IDE_REPO_NAME"
|
||||
)
|
||||
|
||||
type GitspaceLogger interface {
|
||||
Info(msg string)
|
||||
|
|
Loading…
Reference in New Issue