From c00d40495f28c85cd4c3c4dba5d46ea1042239bf Mon Sep 17 00:00:00 2001 From: Robert Jandow Date: Sun, 24 Sep 2023 11:37:30 +0200 Subject: [PATCH 1/6] Add execution container --- HadesScheduler/docker/docker.go | 75 +++++++++++++++++++++++++++++---- HadesScheduler/docker/utils.go | 20 +++++++++ shared/payload/payload.go | 1 + 3 files changed, 88 insertions(+), 8 deletions(-) create mode 100644 HadesScheduler/docker/utils.go diff --git a/HadesScheduler/docker/docker.go b/HadesScheduler/docker/docker.go index 465ad76..562a4ca 100644 --- a/HadesScheduler/docker/docker.go +++ b/HadesScheduler/docker/docker.go @@ -6,14 +6,17 @@ import ( "github.com/Mtze/HadesCI/shared/utils" "github.com/docker/docker/api/types" "github.com/docker/docker/api/types/container" + "github.com/docker/docker/api/types/mount" "github.com/docker/docker/client" _ "github.com/docker/docker/client" log "github.com/sirupsen/logrus" + "os" ) const ( - cloneContainerImage = "alpine/git:latest" - sharedVolumeName = "shared" + cloneContainerImage = "alpine/git:latest" + resultContainerImage = "alpine:latest" + sharedVolumeName = "shared" ) var cli *client.Client @@ -32,8 +35,15 @@ func init() { func (d *Scheduler) ScheduleJob(job payload.BuildJob) error { ctx := context.Background() + // Pull the images + err := pullImages(ctx, cli, job.BuildConfig.ExecutionContainer, cloneContainerImage, resultContainerImage) + if err != nil { + log.WithError(err).Error("Failed to pull images") + return err + } + // Create the shared volume - err := createSharedVolume(ctx, cli, sharedVolumeName) + err = createSharedVolume(ctx, cli, sharedVolumeName) if err != nil { log.WithError(err).Error("Failed to create shared volume") return err @@ -46,6 +56,12 @@ func (d *Scheduler) ScheduleJob(job payload.BuildJob) error { return err } + err = executeRepository(ctx, cli, job) + if err != nil { + log.WithError(err).Error("Failed to execute repository") + return err + } + // TODO enable deletion of shared volume //time.Sleep(5 * time.Second) //err = deleteSharedVolume(ctx, cli, sharedVolumeName) @@ -57,13 +73,17 @@ func (d *Scheduler) ScheduleJob(job payload.BuildJob) error { return nil } -func cloneRepository(ctx context.Context, client *client.Client, repositories ...payload.Repository) error { - // Pull the image - _, err := client.ImagePull(ctx, cloneContainerImage, types.ImagePullOptions{}) - if err != nil { - return err +func pullImages(ctx context.Context, client *client.Client, images ...string) error { + for _, image := range images { + _, err := client.ImagePull(ctx, image, types.ImagePullOptions{}) + if err != nil { + return err + } } + return nil +} +func cloneRepository(ctx context.Context, client *client.Client, repositories ...payload.Repository) error { // Use the index to modify the slice in place for i := range repositories { repositories[i].Path = "/shared" + repositories[i].Path @@ -93,3 +113,42 @@ func cloneRepository(ctx context.Context, client *client.Client, repositories .. log.Infof("Container %s started with ID: %s\n", cloneContainerImage, resp.ID) return nil } + +func executeRepository(ctx context.Context, client *client.Client, buildConfig payload.BuildJob) error { + // First, write the Bash script to a temporary file + scriptPath, err := writeBashScriptToFile(buildConfig.BuildConfig.BuildScript) + if err != nil { + log.WithError(err).Error("Failed to write bash script to a temporary file") + return err + } + defer os.Remove(scriptPath) + + hostConfigWithScript := defaultHostConfig + hostConfigWithScript.Mounts = append(defaultHostConfig.Mounts, mount.Mount{ + Type: mount.TypeBind, + Source: scriptPath, + Target: "/tmp/script.sh", + }) + hostConfigWithScript.AutoRemove = false // TODO change to remove the container after execution + // Create the container + resp, err := client.ContainerCreate(ctx, &container.Config{ + Image: buildConfig.BuildConfig.ExecutionContainer, + Entrypoint: []string{"/bin/sh", "/tmp/script.sh"}, + Volumes: map[string]struct{}{ + "/shared": {}, + "/tmp/script.sh": {}, // this volume will hold our script + }, + }, &hostConfigWithScript, nil, nil, "") + if err != nil { + return err + } + + // Start the container + err = client.ContainerStart(ctx, resp.ID, types.ContainerStartOptions{}) + if err != nil { + return err + } + + log.Infof("Container %s started with ID: %s\n", buildConfig.BuildConfig.ExecutionContainer, resp.ID) + return nil +} diff --git a/HadesScheduler/docker/utils.go b/HadesScheduler/docker/utils.go new file mode 100644 index 0000000..b03df30 --- /dev/null +++ b/HadesScheduler/docker/utils.go @@ -0,0 +1,20 @@ +package docker + +import "io/ioutil" + +func writeBashScriptToFile(bashScriptContent string) (string, error) { + tmpFile, err := ioutil.TempFile("", "bash-script-*.sh") + if err != nil { + return "", err + } + + _, err = tmpFile.Write([]byte(bashScriptContent)) + if err != nil { + tmpFile.Close() + return "", err + } + + path := tmpFile.Name() + tmpFile.Close() + return path, nil +} diff --git a/shared/payload/payload.go b/shared/payload/payload.go index 942478b..aaa2008 100644 --- a/shared/payload/payload.go +++ b/shared/payload/payload.go @@ -10,6 +10,7 @@ type BuildJob struct { BuildConfig struct { Repositories []Repository `json:"repositories" binding:"required,dive"` ExecutionContainer string `json:"executionContainer" binding:"required"` + BuildScript string `json:"buildScript" binding:"required"` } `json:"buildConfig" binding:"required"` } From 721cd4e26eaef6182bdcdd2450af59ff7f994db5 Mon Sep 17 00:00:00 2001 From: Robert Jandow Date: Sun, 24 Sep 2023 11:54:22 +0200 Subject: [PATCH 2/6] Remove deprecated function call --- HadesScheduler/docker/utils.go | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/HadesScheduler/docker/utils.go b/HadesScheduler/docker/utils.go index b03df30..264032e 100644 --- a/HadesScheduler/docker/utils.go +++ b/HadesScheduler/docker/utils.go @@ -1,9 +1,11 @@ package docker -import "io/ioutil" +import ( + "os" +) func writeBashScriptToFile(bashScriptContent string) (string, error) { - tmpFile, err := ioutil.TempFile("", "bash-script-*.sh") + tmpFile, err := os.CreateTemp("", "bash-script-*.sh") if err != nil { return "", err } From 9bf526809e12db4aae6d9158d219c5bbaabb1c1c Mon Sep 17 00:00:00 2001 From: Robert Jandow Date: Sun, 24 Sep 2023 11:58:11 +0200 Subject: [PATCH 3/6] Add support for slice script --- HadesScheduler/docker/utils.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/HadesScheduler/docker/utils.go b/HadesScheduler/docker/utils.go index 264032e..4809120 100644 --- a/HadesScheduler/docker/utils.go +++ b/HadesScheduler/docker/utils.go @@ -2,9 +2,11 @@ package docker import ( "os" + "strings" ) -func writeBashScriptToFile(bashScriptContent string) (string, error) { +func writeBashScriptToFile(bashScriptLines ...string) (string, error) { + bashScriptContent := strings.Join(bashScriptLines, "\n") tmpFile, err := os.CreateTemp("", "bash-script-*.sh") if err != nil { return "", err From e3455e7a5ae402b4f81f6bb3ea7c8aa8e980648b Mon Sep 17 00:00:00 2001 From: Robert Jandow Date: Sun, 24 Sep 2023 13:41:57 +0200 Subject: [PATCH 4/6] Add support for Git authentication --- HadesScheduler/docker/docker.go | 17 ++++++++--------- shared/payload/payload.go | 22 +++++++++++++--------- shared/utils/git.go | 12 ++++++++---- 3 files changed, 29 insertions(+), 22 deletions(-) diff --git a/HadesScheduler/docker/docker.go b/HadesScheduler/docker/docker.go index 562a4ca..53f12f9 100644 --- a/HadesScheduler/docker/docker.go +++ b/HadesScheduler/docker/docker.go @@ -50,13 +50,13 @@ func (d *Scheduler) ScheduleJob(job payload.BuildJob) error { } // Clone the repository - err = cloneRepository(ctx, cli, job.BuildConfig.Repositories...) + err = cloneRepository(ctx, cli, job.Credentials, job.BuildConfig.Repositories...) if err != nil { log.WithError(err).Error("Failed to clone repository") return err } - err = executeRepository(ctx, cli, job) + err = executeRepository(ctx, cli, job.BuildConfig) if err != nil { log.WithError(err).Error("Failed to execute repository") return err @@ -83,12 +83,12 @@ func pullImages(ctx context.Context, client *client.Client, images ...string) er return nil } -func cloneRepository(ctx context.Context, client *client.Client, repositories ...payload.Repository) error { +func cloneRepository(ctx context.Context, client *client.Client, credentials payload.Credentials, repositories ...payload.Repository) error { // Use the index to modify the slice in place for i := range repositories { repositories[i].Path = "/shared" + repositories[i].Path } - commandStr := utils.BuildCloneCommands(repositories...) + commandStr := utils.BuildCloneCommands(credentials, repositories...) log.Debug(commandStr) // Create the container @@ -114,9 +114,9 @@ func cloneRepository(ctx context.Context, client *client.Client, repositories .. return nil } -func executeRepository(ctx context.Context, client *client.Client, buildConfig payload.BuildJob) error { +func executeRepository(ctx context.Context, client *client.Client, buildConfig payload.BuildConfig) error { // First, write the Bash script to a temporary file - scriptPath, err := writeBashScriptToFile(buildConfig.BuildConfig.BuildScript) + scriptPath, err := writeBashScriptToFile(buildConfig.BuildScript) if err != nil { log.WithError(err).Error("Failed to write bash script to a temporary file") return err @@ -129,10 +129,9 @@ func executeRepository(ctx context.Context, client *client.Client, buildConfig p Source: scriptPath, Target: "/tmp/script.sh", }) - hostConfigWithScript.AutoRemove = false // TODO change to remove the container after execution // Create the container resp, err := client.ContainerCreate(ctx, &container.Config{ - Image: buildConfig.BuildConfig.ExecutionContainer, + Image: buildConfig.ExecutionContainer, Entrypoint: []string{"/bin/sh", "/tmp/script.sh"}, Volumes: map[string]struct{}{ "/shared": {}, @@ -149,6 +148,6 @@ func executeRepository(ctx context.Context, client *client.Client, buildConfig p return err } - log.Infof("Container %s started with ID: %s\n", buildConfig.BuildConfig.ExecutionContainer, resp.ID) + log.Infof("Container %s started with ID: %s\n", buildConfig.ExecutionContainer, resp.ID) return nil } diff --git a/shared/payload/payload.go b/shared/payload/payload.go index aaa2008..49dbeb5 100644 --- a/shared/payload/payload.go +++ b/shared/payload/payload.go @@ -3,15 +3,19 @@ package payload type BuildJob struct { Name string `json:"name" binding:"required"` - Credentials struct { - Username string `json:"username" binding:"required"` - Password string `json:"password" binding:"required"` - } `json:"credentials" binding:"required"` - BuildConfig struct { - Repositories []Repository `json:"repositories" binding:"required,dive"` - ExecutionContainer string `json:"executionContainer" binding:"required"` - BuildScript string `json:"buildScript" binding:"required"` - } `json:"buildConfig" binding:"required"` + Credentials Credentials `json:"credentials" binding:"required"` + BuildConfig BuildConfig `json:"buildConfig" binding:"required"` +} + +type Credentials struct { + Username string `json:"username" binding:"required"` + Password string `json:"password" binding:"required"` +} + +type BuildConfig struct { + Repositories []Repository `json:"repositories" binding:"required,dive"` + ExecutionContainer string `json:"executionContainer" binding:"required"` + BuildScript string `json:"buildScript" binding:"required"` } type Repository struct { diff --git a/shared/utils/git.go b/shared/utils/git.go index 70eadc7..6660dc7 100644 --- a/shared/utils/git.go +++ b/shared/utils/git.go @@ -3,20 +3,24 @@ package utils import ( "fmt" "github.com/Mtze/HadesCI/shared/payload" + "net/url" "strings" ) -func BuildCloneCommand(repo payload.Repository) string { - return fmt.Sprintf("git clone %s %s", repo.URL, repo.Path) +func BuildCloneCommand(username, password string, repo payload.Repository) string { + username = url.PathEscape(username) + password = url.PathEscape(password) + cloneURL := strings.Replace(repo.URL, "https://", fmt.Sprintf("https://%s:%s@", username, password), 1) + return fmt.Sprintf("git clone %s %s", cloneURL, repo.Path) } -func BuildCloneCommands(repos ...payload.Repository) string { +func BuildCloneCommands(credentials payload.Credentials, repos ...payload.Repository) string { var builder strings.Builder for i, repo := range repos { if i > 0 { builder.WriteString(" && ") } - builder.WriteString(BuildCloneCommand(repo)) + builder.WriteString(BuildCloneCommand(credentials.Username, credentials.Password, repo)) } return builder.String() } From e62fc1f9d79e4c5663dba049f1a4b292c56b32e7 Mon Sep 17 00:00:00 2001 From: Robert Jandow Date: Sun, 24 Sep 2023 13:51:56 +0200 Subject: [PATCH 5/6] Outsource image tags --- HadesScheduler/config/images.go | 7 +++++++ HadesScheduler/docker/container.go | 3 ++- HadesScheduler/docker/docker.go | 15 +++++---------- 3 files changed, 14 insertions(+), 11 deletions(-) create mode 100644 HadesScheduler/config/images.go diff --git a/HadesScheduler/config/images.go b/HadesScheduler/config/images.go new file mode 100644 index 0000000..f9dbe83 --- /dev/null +++ b/HadesScheduler/config/images.go @@ -0,0 +1,7 @@ +package config + +const ( + CloneContainerImage = "alpine/git:latest" + ResultContainerImage = "alpine:latest" + SharedVolumeName = "shared" +) diff --git a/HadesScheduler/docker/container.go b/HadesScheduler/docker/container.go index ee3cf86..1802eba 100644 --- a/HadesScheduler/docker/container.go +++ b/HadesScheduler/docker/container.go @@ -1,6 +1,7 @@ package docker import ( + "github.com/Mtze/HadesCI/hadesScheduler/config" "github.com/docker/docker/api/types/container" "github.com/docker/docker/api/types/mount" ) @@ -9,7 +10,7 @@ var defaultHostConfig = container.HostConfig{ Mounts: []mount.Mount{ { Type: mount.TypeVolume, - Source: sharedVolumeName, + Source: config.SharedVolumeName, Target: "/shared", }, }, diff --git a/HadesScheduler/docker/docker.go b/HadesScheduler/docker/docker.go index 53f12f9..e8677e1 100644 --- a/HadesScheduler/docker/docker.go +++ b/HadesScheduler/docker/docker.go @@ -2,6 +2,7 @@ package docker import ( "context" + "github.com/Mtze/HadesCI/hadesScheduler/config" "github.com/Mtze/HadesCI/shared/payload" "github.com/Mtze/HadesCI/shared/utils" "github.com/docker/docker/api/types" @@ -13,12 +14,6 @@ import ( "os" ) -const ( - cloneContainerImage = "alpine/git:latest" - resultContainerImage = "alpine:latest" - sharedVolumeName = "shared" -) - var cli *client.Client type Scheduler struct{} @@ -36,14 +31,14 @@ func (d *Scheduler) ScheduleJob(job payload.BuildJob) error { ctx := context.Background() // Pull the images - err := pullImages(ctx, cli, job.BuildConfig.ExecutionContainer, cloneContainerImage, resultContainerImage) + err := pullImages(ctx, cli, job.BuildConfig.ExecutionContainer, config.CloneContainerImage, config.ResultContainerImage) if err != nil { log.WithError(err).Error("Failed to pull images") return err } // Create the shared volume - err = createSharedVolume(ctx, cli, sharedVolumeName) + err = createSharedVolume(ctx, cli, config.SharedVolumeName) if err != nil { log.WithError(err).Error("Failed to create shared volume") return err @@ -93,7 +88,7 @@ func cloneRepository(ctx context.Context, client *client.Client, credentials pay // Create the container resp, err := client.ContainerCreate(ctx, &container.Config{ - Image: cloneContainerImage, + Image: config.CloneContainerImage, Entrypoint: []string{"/bin/sh", "-c"}, Cmd: []string{commandStr}, Volumes: map[string]struct{}{ @@ -110,7 +105,7 @@ func cloneRepository(ctx context.Context, client *client.Client, credentials pay return err } - log.Infof("Container %s started with ID: %s\n", cloneContainerImage, resp.ID) + log.Infof("Container %s started with ID: %s\n", config.CloneContainerImage, resp.ID) return nil } From 90f7afe784b622c54d1b73e12fcdda3013aaf9b8 Mon Sep 17 00:00:00 2001 From: Robert Jandow Date: Sun, 24 Sep 2023 15:44:02 +0200 Subject: [PATCH 6/6] Add first MVP of Docker executor --- .idea/runConfigurations/HadesScheduler.xml | 1 + HadesScheduler/docker/container.go | 26 ++++++ HadesScheduler/docker/docker.go | 103 ++++++++++++++++++--- HadesScheduler/docker/volume.go | 1 - 4 files changed, 118 insertions(+), 13 deletions(-) diff --git a/.idea/runConfigurations/HadesScheduler.xml b/.idea/runConfigurations/HadesScheduler.xml index 6b2508f..8b19dc1 100644 --- a/.idea/runConfigurations/HadesScheduler.xml +++ b/.idea/runConfigurations/HadesScheduler.xml @@ -4,6 +4,7 @@ + diff --git a/HadesScheduler/docker/container.go b/HadesScheduler/docker/container.go index 1802eba..fafee43 100644 --- a/HadesScheduler/docker/container.go +++ b/HadesScheduler/docker/container.go @@ -1,9 +1,14 @@ package docker import ( + "context" "github.com/Mtze/HadesCI/hadesScheduler/config" + "github.com/docker/docker/api/types" "github.com/docker/docker/api/types/container" "github.com/docker/docker/api/types/mount" + "github.com/docker/docker/client" + "github.com/docker/docker/pkg/stdcopy" + "os" ) var defaultHostConfig = container.HostConfig{ @@ -16,3 +21,24 @@ var defaultHostConfig = container.HostConfig{ }, AutoRemove: true, } + +func writeContainerLogsToFile(ctx context.Context, client *client.Client, containerID string, logFilePath string) error { + out, err := os.Create(logFilePath) + if err != nil { + return err + } + defer out.Close() + + logReader, err := client.ContainerLogs(ctx, containerID, types.ContainerLogsOptions{ + ShowStdout: true, + ShowStderr: true, + Timestamps: true, + }) + if err != nil { + return err + } + defer logReader.Close() + + _, err = stdcopy.StdCopy(out, out, logReader) + return err +} diff --git a/HadesScheduler/docker/docker.go b/HadesScheduler/docker/docker.go index 428f067..1d29e0e 100644 --- a/HadesScheduler/docker/docker.go +++ b/HadesScheduler/docker/docker.go @@ -2,7 +2,11 @@ package docker import ( "context" + "fmt" "github.com/Mtze/HadesCI/hadesScheduler/config" + "io" + "sync" + "time" "github.com/Mtze/HadesCI/shared/payload" "github.com/Mtze/HadesCI/shared/utils" @@ -31,51 +35,89 @@ func init() { func (d Scheduler) ScheduleJob(job payload.BuildJob) error { ctx := context.Background() + startOfPull := time.Now() // Pull the images err := pullImages(ctx, cli, job.BuildConfig.ExecutionContainer, config.CloneContainerImage, config.ResultContainerImage) if err != nil { log.WithError(err).Error("Failed to pull images") return err } + log.Debugf("Pulled images in %s", time.Since(startOfPull)) + startOfVolume := time.Now() // Create the shared volume err = createSharedVolume(ctx, cli, config.SharedVolumeName) if err != nil { log.WithError(err).Error("Failed to create shared volume") return err } + log.Debugf("Create Shared Volume in %s", time.Since(startOfVolume)) + startOfClone := time.Now() // Clone the repository err = cloneRepository(ctx, cli, job.Credentials, job.BuildConfig.Repositories...) if err != nil { log.WithError(err).Error("Failed to clone repository") return err } + log.Debugf("Clone repo in %s", time.Since(startOfClone)) + startOfExecute := time.Now() err = executeRepository(ctx, cli, job.BuildConfig) if err != nil { log.WithError(err).Error("Failed to execute repository") return err } + log.Debugf("Execute repo in %s", time.Since(startOfExecute)) + log.Debugf("Total time: %s", time.Since(startOfPull)) // TODO enable deletion of shared volume - //time.Sleep(5 * time.Second) - //err = deleteSharedVolume(ctx, cli, sharedVolumeName) - //if err != nil { - // log.WithError(err).Error("Failed to delete shared volume") - // return err - //} + time.Sleep(1 * time.Second) + startOfDelete := time.Now() + err = deleteSharedVolume(ctx, cli, config.SharedVolumeName) + if err != nil { + log.WithError(err).Error("Failed to delete shared volume") + return err + } + log.Debugf("Delete Shared Volume in %s", time.Since(startOfDelete)) return nil } func pullImages(ctx context.Context, client *client.Client, images ...string) error { + var wg sync.WaitGroup + errorsCh := make(chan error, len(images)) + for _, image := range images { - _, err := client.ImagePull(ctx, image, types.ImagePullOptions{}) - if err != nil { - return err - } + wg.Add(1) + + go func(img string) { + defer wg.Done() + + response, err := client.ImagePull(ctx, img, types.ImagePullOptions{}) + if err != nil { + errorsCh <- fmt.Errorf("failed to pull image %s: %v", img, err) + return + } + defer response.Close() + io.Copy(io.Discard, response) // consume the response to prevent potential leaks + }(image) } + + // wait for all goroutines to complete + wg.Wait() + close(errorsCh) + + // Collect errors + var errors []error + for err := range errorsCh { + errors = append(errors, err) + } + + if len(errors) > 0 { + return fmt.Errorf("encountered %d errors while pulling images: %+v", len(errors), errors) + } + return nil } @@ -106,13 +148,27 @@ func cloneRepository(ctx context.Context, client *client.Client, credentials pay return err } + statusCh, errCh := client.ContainerWait(ctx, resp.ID, container.WaitConditionNotRunning) + select { + case err := <-errCh: + if err != nil { + log.WithError(err).Errorf("Error waiting for container with ID %s", resp.ID) + return err + } + case status := <-statusCh: + if status.StatusCode != 0 { + log.Errorf("Container with ID %s exited with status %d", resp.ID, status.StatusCode) + return fmt.Errorf("container exited with status %d", status.StatusCode) + } + } + log.Infof("Container %s started with ID: %s\n", config.CloneContainerImage, resp.ID) return nil } func executeRepository(ctx context.Context, client *client.Client, buildConfig payload.BuildConfig) error { // First, write the Bash script to a temporary file - scriptPath, err := writeBashScriptToFile(buildConfig.BuildScript) + scriptPath, err := writeBashScriptToFile("cd /shared", buildConfig.BuildScript) if err != nil { log.WithError(err).Error("Failed to write bash script to a temporary file") return err @@ -144,6 +200,29 @@ func executeRepository(ctx context.Context, client *client.Client, buildConfig p return err } - log.Infof("Container %s started with ID: %s\n", buildConfig.ExecutionContainer, resp.ID) + // Wait for the container to finish + statusCh, errCh := client.ContainerWait(ctx, resp.ID, container.WaitConditionNotRunning) + select { + case err := <-errCh: + if err != nil { + log.WithError(err).Errorf("Error waiting for container %s with ID %s", buildConfig.ExecutionContainer, resp.ID) + return err + } + case status := <-statusCh: + if status.StatusCode != 0 { + log.Errorf("Container %s with ID %s exited with status %d", buildConfig.ExecutionContainer, resp.ID, status.StatusCode) + return fmt.Errorf("container exited with status %d", status.StatusCode) + } + } + + // Fetch logs and write to a file + logFilePath := "./logfile.log" // TODO make this configurable + err = writeContainerLogsToFile(ctx, client, resp.ID, logFilePath) + if err != nil { + log.WithError(err).Errorf("Failed to write logs of container %s with ID %s", buildConfig.ExecutionContainer, resp.ID) + return err + } + + log.Infof("Container %s with ID: %s completed", buildConfig.ExecutionContainer, resp.ID) return nil } diff --git a/HadesScheduler/docker/volume.go b/HadesScheduler/docker/volume.go index d741b61..bcd3388 100644 --- a/HadesScheduler/docker/volume.go +++ b/HadesScheduler/docker/volume.go @@ -29,6 +29,5 @@ func deleteSharedVolume(ctx context.Context, client *client.Client, name string) return err } - log.Debugf("Volume %s deleted", name) return nil }