|
| 1 | +package main |
| 2 | + |
| 3 | +import ( |
| 4 | + "fmt" |
| 5 | + "github.com/rs/zerolog" |
| 6 | + "github.com/smartcontractkit/chainlink-testing-framework/framework" |
| 7 | + "os" |
| 8 | + "os/exec" |
| 9 | + "strings" |
| 10 | +) |
| 11 | + |
| 12 | +func cleanDockerResources() error { |
| 13 | + framework.L.Info().Str("label", "framework=ctf").Msg("Cleaning up docker containers") |
| 14 | + // Bash command for removing Docker containers and networks with "framework=ctf" label |
| 15 | + cmd := exec.Command("bash", "-c", ` |
| 16 | + docker ps -aq --filter "label=framework=ctf" | xargs -r docker rm -f && \ |
| 17 | + docker network ls --filter "label=framework=ctf" -q | xargs -r docker network rm |
| 18 | + `) |
| 19 | + framework.L.Debug().Msg("Running command") |
| 20 | + if framework.L.GetLevel() == zerolog.DebugLevel { |
| 21 | + fmt.Println(cmd.String()) |
| 22 | + } |
| 23 | + output, err := cmd.CombinedOutput() |
| 24 | + if err != nil { |
| 25 | + return fmt.Errorf("error running clean command: %s", string(output)) |
| 26 | + } |
| 27 | + framework.L.Info().Msgf("Done") |
| 28 | + return nil |
| 29 | +} |
| 30 | + |
| 31 | +// BuildDocker runs Docker commands to set up a local registry, build an image, and push it. |
| 32 | +func BuildDocker(dockerfile string, buildContext string, imageName string) error { |
| 33 | + registryRunning := isContainerRunning("local-registry") |
| 34 | + if registryRunning { |
| 35 | + fmt.Println("Local registry container is already running.") |
| 36 | + } else { |
| 37 | + framework.L.Info().Msg("Starting local registry container...") |
| 38 | + err := runCommand("docker", "run", "-d", "-p", "5050:5000", "--name", "local-registry", "registry:2") |
| 39 | + if err != nil { |
| 40 | + return fmt.Errorf("failed to start local registry: %w", err) |
| 41 | + } |
| 42 | + framework.L.Info().Msg("Local registry started") |
| 43 | + } |
| 44 | + |
| 45 | + img := fmt.Sprintf("localhost:5050/%s:latest", imageName) |
| 46 | + framework.L.Info().Str("DockerFile", dockerfile).Str("Context", buildContext).Msg("Building Docker image") |
| 47 | + err := runCommand("docker", "build", "-t", fmt.Sprintf("localhost:5050/%s:latest", imageName), "-f", dockerfile, buildContext) |
| 48 | + if err != nil { |
| 49 | + return fmt.Errorf("failed to build Docker image: %w", err) |
| 50 | + } |
| 51 | + framework.L.Info().Msg("Docker image built successfully") |
| 52 | + |
| 53 | + framework.L.Info().Str("Image", img).Msg("Pushing Docker image to local registry") |
| 54 | + fmt.Println("Pushing Docker image to local registry...") |
| 55 | + err = runCommand("docker", "push", img) |
| 56 | + if err != nil { |
| 57 | + return fmt.Errorf("failed to push Docker image: %w", err) |
| 58 | + } |
| 59 | + framework.L.Info().Msg("Docker image pushed successfully") |
| 60 | + return nil |
| 61 | +} |
| 62 | + |
| 63 | +// isContainerRunning checks if a Docker container with the given name is running. |
| 64 | +func isContainerRunning(containerName string) bool { |
| 65 | + cmd := exec.Command("docker", "ps", "--filter", fmt.Sprintf("name=%s", containerName), "--format", "{{.Names}}") |
| 66 | + output, err := cmd.Output() |
| 67 | + if err != nil { |
| 68 | + return false |
| 69 | + } |
| 70 | + return strings.Contains(string(output), containerName) |
| 71 | +} |
| 72 | + |
| 73 | +// runCommand executes a command and prints the output. |
| 74 | +func runCommand(name string, args ...string) error { |
| 75 | + cmd := exec.Command(name, args...) |
| 76 | + cmd.Stdout = os.Stdout |
| 77 | + cmd.Stderr = os.Stderr |
| 78 | + return cmd.Run() |
| 79 | +} |
0 commit comments