diff --git a/docker_test.go b/docker_test.go index d417717d4..ee6723d5b 100644 --- a/docker_test.go +++ b/docker_test.go @@ -8,6 +8,7 @@ import ( "path/filepath" "strings" "testing" + "time" "github.com/jfrog/jfrog-cli-core/v2/xray/commands/scan" @@ -16,7 +17,6 @@ import ( "github.com/jfrog/jfrog-cli-core/v2/artifactory/utils" "github.com/jfrog/jfrog-cli-core/v2/common/spec" - clientutils "github.com/jfrog/jfrog-client-go/utils" gofrogcmd "github.com/jfrog/gofrog/io" corecontainer "github.com/jfrog/jfrog-cli-core/v2/artifactory/commands/container" @@ -25,6 +25,7 @@ import ( "github.com/jfrog/jfrog-cli-core/v2/utils/coreutils" "github.com/jfrog/jfrog-cli/inttestutils" "github.com/jfrog/jfrog-cli/utils/tests" + clientutils "github.com/jfrog/jfrog-client-go/utils" "github.com/jfrog/jfrog-client-go/utils/io/fileutils" clientTestUtils "github.com/jfrog/jfrog-client-go/utils/tests" "github.com/stretchr/testify/assert" @@ -164,6 +165,8 @@ func TestRunPushFatManifestImage(t *testing.T) { // Setup test env. workspace, err := filepath.Abs(tests.Out) assert.NoError(t, err) + assert.NoError(t, fileutils.CreateDirIfNotExist(workspace)) + // Build the builder image locally. builderImageName, err = inttestutils.BuildTestImage(builderImageName, "Dockerfile.Buildx.Fatmanifest", container.DockerClient) assert.NoError(t, err) @@ -174,24 +177,25 @@ func TestRunPushFatManifestImage(t *testing.T) { assert.NoError(t, gofrogcmd.RunCmd(runCmd)) defer inttestutils.DeleteTestcontainer(t, builderContainerName, container.DockerClient) + // Docker daemon may be lost for the first few seconds, perform 3 retries before failure. + require.True(t, isDaemonRunning(builderContainerName), "docker daemon is not responding in remote container") + + // Configure buildx in remote container + execCmd := inttestutils.NewExecDockerImage(container.DockerClient, builderContainerName, "sh", "script.sh") + require.NoError(t, gofrogcmd.RunCmd(execCmd)) + // login to the Artifactory within the container password := *tests.JfrogPassword if *tests.JfrogAccessToken != "" { password = *tests.JfrogAccessToken } - execCmd := inttestutils.NewExecDockerImage(container.DockerClient, builderContainerName, "docker", "login", *tests.DockerRepoDomain, "--username", *tests.JfrogUser, "--password", password) + execCmd = inttestutils.NewExecDockerImage(container.DockerClient, builderContainerName, "docker", "login", *tests.DockerRepoDomain, "--username", *tests.JfrogUser, "--password", password) err = gofrogcmd.RunCmd(execCmd) require.NoError(t, err, "fail to login to container registry") // Build & push the multi platform image to Artifactory execCmd = inttestutils.NewExecDockerImage(container.DockerClient, builderContainerName, "/buildx", "build", "--platform", "linux/amd64,linux/arm64,linux/arm/v7", "--tag", path.Join(*tests.DockerRepoDomain, multiArchImageName+multiArchImageTag), "-f", "Dockerfile.Fatmanifest", "--metadata-file", "/workspace/"+buildxOutputFile, "--push", ".") - // Docker daemon may be lost for a few seconds, perform 3 retries before failure. - for i := 0; i < 3; i++ { - if err = gofrogcmd.RunCmd(execCmd); err == nil { - break - } - } - require.NoError(t, err, "failed creating and pushing multi platforms image") + require.NoError(t, gofrogcmd.RunCmd(execCmd)) // Run 'build-docker-create' & publish the results to Artifactory. buildxOutput := filepath.Join(workspace, buildxOutputFile) @@ -223,6 +227,19 @@ func TestRunPushFatManifestImage(t *testing.T) { inttestutils.ContainerTestCleanup(t, serverDetails, artHttpDetails, multiArchImageName, buildName, *tests.DockerLocalRepo) } +// Check if Docker daemon is running on a given container +func isDaemonRunning(containerName string) bool { + execCmd := inttestutils.NewExecDockerImage(container.DockerClient, containerName, "docker", "ps") + for i := 0; i < 3; i++ { + if execCmd.GetCmd().Run() != nil { + time.Sleep(8 * time.Second) + } else { + return true + } + } + return false +} + func TestContainerPushBuildNameNumberFromEnv(t *testing.T) { containerManagers := initContainerTest(t) for _, containerManager := range containerManagers { diff --git a/inttestutils/docker.go b/inttestutils/docker.go index a5163a87d..f4ebdff73 100644 --- a/inttestutils/docker.go +++ b/inttestutils/docker.go @@ -212,7 +212,7 @@ func DeleteTestcontainer(t *testing.T, containerName string, containerManagerTyp func ContainerTestCleanup(t *testing.T, serverDetails *config.ServerDetails, artHttpDetails httputils.HttpClientDetails, imageName, buildName, repo string) { // Remove build from Artifactory DeleteBuild(serverDetails.ArtifactoryUrl, buildName, artHttpDetails) - + tests.CleanFileSystem() // Remove image from Artifactory deleteSpec := spec.NewBuilder().Pattern(path.Join(repo, imageName)).BuildSpec() successCount, failCount, err := tests.DeleteFiles(deleteSpec, serverDetails) diff --git a/testdata/docker/Dockerfile.Buildx.Fatmanifest b/testdata/docker/Dockerfile.Buildx.Fatmanifest index c0c373145..40cc5feaf 100644 --- a/testdata/docker/Dockerfile.Buildx.Fatmanifest +++ b/testdata/docker/Dockerfile.Buildx.Fatmanifest @@ -3,7 +3,4 @@ COPY --from=docker/buildx-bin /buildx /buildx FROM docker:dind COPY --from=builder /buildx /buildx -RUN /buildx create --name mybuilder -RUN /buildx use mybuilder -RUN /buildx inspect --bootstrap -COPY Dockerfile.Fatmanifest . +COPY Dockerfile.Fatmanifest script.sh / diff --git a/testdata/docker/script.sh b/testdata/docker/script.sh new file mode 100644 index 000000000..a86c908fb --- /dev/null +++ b/testdata/docker/script.sh @@ -0,0 +1,4 @@ +#!/bin/bash +./buildx create --name mybuilder +./buildx use mybuilder +./buildx inspect --bootstrap \ No newline at end of file