Skip to content

Commit 47c7dd8

Browse files
committed
Add test case for multiple image tags in build-docker-create
1 parent 0855911 commit 47c7dd8

File tree

1 file changed

+81
-110
lines changed

1 file changed

+81
-110
lines changed

docker_test.go

Lines changed: 81 additions & 110 deletions
Original file line numberDiff line numberDiff line change
@@ -179,104 +179,113 @@ func runPushTest(containerManager container.ContainerManagerType, imageName, mod
179179
validateContainerBuild(tests.DockerBuildName, buildNumber, imagePath, module, 7, 5, 7, t)
180180
}
181181

182-
// This test validate the collect build-info flow for fat-manifest images.
183-
// The way we build the fat manifest and push it to Artifactory is not important.
184-
// Therefore, this test runs only with docker.
185-
func TestPushFatManifestImage(t *testing.T) {
186-
if !*tests.TestDocker {
187-
t.Skip("Skipping test. To run it, add the '-test.docker=true' option.")
188-
}
189-
buildName := "push-fat-manifest" + tests.DockerBuildName
182+
// Common Methods
190183

191-
// Create temp test dir.
184+
func setupWorkspace(t *testing.T) (string, error) {
192185
workspace, err := filepath.Abs(tests.Out)
193-
assert.NoError(t, err)
194-
assert.NoError(t, fileutils.CreateDirIfNotExist(workspace))
186+
if err != nil {
187+
return "", err
188+
}
189+
err = fileutils.CreateDirIfNotExist(workspace)
190+
if err != nil {
191+
return "", err
192+
}
195193
testDataDir := filepath.Join(filepath.FromSlash(tests.GetTestResourcesPath()), "docker")
196194
files, err := os.ReadDir(testDataDir)
197-
198-
assert.NoError(t, err)
195+
if err != nil {
196+
return "", err
197+
}
199198
for _, file := range files {
200199
if !file.IsDir() {
201200
_, err := tests.ReplaceTemplateVariables(filepath.Join(testDataDir, file.Name()), tests.Out)
202-
assert.NoError(t, err)
201+
if err != nil {
202+
return "", err
203+
}
203204
}
204205
}
205-
// Build the builder image locally.
206+
return workspace, nil
207+
}
208+
209+
func setupContainer(workspace, containerName string) (*tests.ContainerRequest, error) {
206210
ctx := context.Background()
207-
testContainer, err := tests.NewContainerRequest().
211+
testContainerRequest, _ := tests.NewContainerRequest().
208212
SetDockerfile(workspace, "Dockerfile.Buildx.Fatmanifest", nil).
209213
Privileged().
210214
Networks(rtNetwork).
211-
Name("buildx_container").
215+
Name(containerName).
212216
Mount(mount.Mount{Type: mount.TypeBind, Source: workspace, Target: "/workspace", ReadOnly: false}).
213217
Cmd("--insecure-registry", tests.RtContainerHostName).
214-
// Docker daemon take times to load. In order to check if it's available we wait for a log message to indications that the Docker daemon has finished initializing.
215218
WaitFor(wait.ForLog("API listen on /var/run/docker.sock").WithStartupTimeout(5*time.Minute)).
216219
Remove().
217220
Build(ctx, true)
218-
assert.NoError(t, err, "Couldn't run create buildx image.")
219-
defer func() { assert.NoError(t, testContainer.Terminate(ctx)) }()
220-
221-
// Enable the builder util in the container.
222-
err = testContainer.Exec(ctx, "sh", "script.sh")
223-
assert.NoError(t, err)
221+
_, err := testContainerRequest.Start(ctx)
222+
if err != nil {
223+
log.Error(err)
224+
return nil, err
225+
}
226+
return testContainerRequest, nil
227+
}
224228

225-
// login from the builder container toward the Artifactory.
229+
func loginToArtifactory(container *tests.ContainerRequest) error {
226230
password := *tests.JfrogPassword
227231
user := *tests.JfrogUser
228232
if *tests.JfrogAccessToken != "" {
229233
user = auth.ExtractUsernameFromAccessToken(*tests.JfrogAccessToken)
230234
password = *tests.JfrogAccessToken
231235
}
232-
assert.NoError(t, testContainer.Exec(
233-
ctx,
234-
"docker",
235-
"login",
236+
return container.Exec(
237+
context.Background(),
238+
"docker", "login",
236239
tests.RtContainerHostName,
237240
"--username="+user,
238-
"--password="+password))
241+
"--password="+password,
242+
)
243+
}
244+
245+
// This test validate the collect build-info flow for fat-manifest images.
246+
// The way we build the fat manifest and push it to Artifactory is not important.
247+
// Therefore, this test runs only with docker.
248+
func TestPushFatManifestImage(t *testing.T) {
249+
if !*tests.TestDocker {
250+
t.Skip("Skipping test. To run it, add the '-test.docker=true' option.")
251+
}
252+
253+
buildName := "push-fat-manifest" + tests.DockerBuildName
254+
buildNumber := "1"
255+
256+
workspace, err := setupWorkspace(t)
257+
assert.NoError(t, err)
258+
259+
testContainer, err := setupContainer(workspace, "buildx_container")
260+
assert.NoError(t, err, "Couldn't create buildx image.")
261+
defer func() { assert.NoError(t, testContainer.Terminate(context.Background())) }()
262+
263+
err = testContainer.Exec(context.Background(), "sh", "script.sh")
264+
assert.NoError(t, err)
265+
266+
err = loginToArtifactory(testContainer)
267+
assert.NoError(t, err)
268+
239269
buildxOutputFile := "buildmetadata"
270+
err = testContainer.Exec(context.Background(),
271+
"docker", "buildx", "build",
272+
"--platform", "linux/amd64,linux/arm64,linux/arm/v7",
273+
"--tag", path.Join(tests.RtContainerHostName, tests.DockerLocalRepo, tests.DockerImageName+"-multiarch-image"),
274+
"-f", "Dockerfile.Fatmanifest",
275+
"--metadata-file", "/workspace/"+buildxOutputFile,
276+
"--push", ".",
277+
)
278+
assert.NoError(t, err)
240279

241-
// Run the builder in the container and push the fat-manifest image to artifactory
242-
assert.NoError(t, testContainer.Exec(
243-
ctx,
244-
"docker",
245-
"buildx",
246-
"build",
247-
"--platform",
248-
"linux/amd64,linux/arm64,linux/arm/v7",
249-
"--tag", path.Join(tests.RtContainerHostName,
250-
tests.DockerLocalRepo,
251-
tests.DockerImageName+"-multiarch-image"),
252-
"-f",
253-
"Dockerfile.Fatmanifest",
254-
"--metadata-file",
255-
"/workspace/"+buildxOutputFile,
256-
"--push",
257-
".",
258-
))
259-
260-
// Run 'build-docker-create' & publish the results to Artifactory.
261280
buildxOutput := filepath.Join(workspace, buildxOutputFile)
262-
buildNumber := "1"
263281
assert.NoError(t, artifactoryCli.Exec("build-docker-create", tests.DockerLocalRepo, "--image-file="+buildxOutput, "--build-name="+buildName, "--build-number="+buildNumber))
264282
assert.NoError(t, artifactoryCli.Exec("build-publish", buildName, buildNumber))
265283

266-
// Validate the published build-info exits
267284
publishedBuildInfo, found, err := tests.GetBuildInfo(serverDetails, buildName, buildNumber)
268-
if err != nil {
269-
assert.NoError(t, err)
270-
return
271-
}
272-
if !found {
273-
assert.True(t, found, "build info was expected to be found")
274-
return
275-
}
276-
285+
assert.NoError(t, err)
286+
assert.True(t, found, "build info was expected to be found")
277287
assert.True(t, len(publishedBuildInfo.BuildInfo.Modules) > 1)
278288

279-
// Validate build-name & build-number properties in all image layers
280289
searchSpec := spec.NewBuilder().Pattern(tests.DockerLocalRepo + "/*").Build(buildName).Recursive(true).BuildSpec()
281290
searchCmd := generic.NewSearchCommand()
282291
searchCmd.SetServerDetails(serverDetails).SetSpec(searchSpec)
@@ -295,80 +304,42 @@ func TestPushMultiTaggedImage(t *testing.T) {
295304
buildName := "push-multi-tagged" + tests.DockerBuildName
296305
buildNumber := "1"
297306

298-
// Setup workspace
299-
workspace, err := filepath.Abs(tests.Out)
300-
assert.NoError(t, err)
301-
assert.NoError(t, fileutils.CreateDirIfNotExist(workspace))
302-
testDataDir := filepath.Join(filepath.FromSlash(tests.GetTestResourcesPath()), "docker")
303-
files, err := os.ReadDir(testDataDir)
307+
workspace, err := setupWorkspace(t)
304308
assert.NoError(t, err)
305-
for _, file := range files {
306-
if !file.IsDir() {
307-
_, err := tests.ReplaceTemplateVariables(filepath.Join(testDataDir, file.Name()), tests.Out)
308-
assert.NoError(t, err)
309-
}
310-
}
311309

312-
// Build the builder image locally
313-
ctx := context.Background()
314-
testContainer, err := tests.NewContainerRequest().
315-
SetDockerfile(workspace, "Dockerfile.Buildx.Fatmanifest", nil).
316-
Privileged().
317-
Networks(rtNetwork).
318-
Name("buildx_multi_tag_container").
319-
Mount(mount.Mount{Type: mount.TypeBind, Source: workspace, Target: "/workspace", ReadOnly: false}).
320-
Cmd("--insecure-registry", tests.RtContainerHostName).
321-
WaitFor(wait.ForLog("API listen on /var/run/docker.sock").WithStartupTimeout(5*time.Minute)).
322-
Remove().
323-
Build(ctx, true)
310+
testContainer, err := setupContainer(workspace, "buildx_multi_tag_container")
324311
assert.NoError(t, err, "Couldn't create buildx container.")
325-
defer func() { assert.NoError(t, testContainer.Terminate(ctx)) }()
312+
defer func() { assert.NoError(t, testContainer.Terminate(context.Background())) }()
326313

327-
// Enable builder
328-
assert.NoError(t, testContainer.Exec(ctx, "sh", "script.sh"))
314+
err = testContainer.Exec(context.Background(), "sh", "script.sh")
315+
assert.NoError(t, err)
329316

330-
// Login to Artifactory
331-
password := *tests.JfrogPassword
332-
user := *tests.JfrogUser
333-
if *tests.JfrogAccessToken != "" {
334-
user = auth.ExtractUsernameFromAccessToken(*tests.JfrogAccessToken)
335-
password = *tests.JfrogAccessToken
336-
}
337-
assert.NoError(t, testContainer.Exec(
338-
ctx,
339-
"docker", "login",
340-
tests.RtContainerHostName,
341-
"--username="+user,
342-
"--password="+password))
317+
err = loginToArtifactory(testContainer)
318+
assert.NoError(t, err)
343319

344-
// Build & push image with multiple tags
345320
imageName1 := path.Join(tests.RtContainerHostName, tests.DockerLocalRepo, tests.DockerImageName+"-multi:v1")
346321
imageName2 := path.Join(tests.RtContainerHostName, tests.DockerLocalRepo, tests.DockerImageName+"-multi:latest")
347322
buildxOutputFile := "multi-build-metadata"
348-
349-
assert.NoError(t, testContainer.Exec(
350-
ctx,
323+
err = testContainer.Exec(context.Background(),
351324
"docker", "buildx", "build",
352325
"--platform", "linux/amd64,linux/arm64",
353326
"-t", imageName1,
354327
"-t", imageName2,
355328
"-f", "Dockerfile.Fatmanifest",
356329
"--metadata-file", "/workspace/"+buildxOutputFile,
357330
"--push", ".",
358-
))
331+
)
332+
assert.NoError(t, err)
359333

360-
// Run build-docker-create & publish
361334
buildxOutput := filepath.Join(workspace, buildxOutputFile)
362335
assert.NoError(t, artifactoryCli.Exec("build-docker-create", tests.DockerLocalRepo, "--image-file="+buildxOutput, "--build-name="+buildName, "--build-number="+buildNumber))
363336
assert.NoError(t, artifactoryCli.Exec("build-publish", buildName, buildNumber))
364337

365-
// Validate build-info is published
366338
publishedBuildInfo, found, err := tests.GetBuildInfo(serverDetails, buildName, buildNumber)
367339
assert.NoError(t, err)
368340
assert.True(t, found, "build info was expected to be found")
369341
assert.True(t, len(publishedBuildInfo.BuildInfo.Modules) >= 1)
370342

371-
// Validate build-name & build-number properties in all layers
372343
searchSpec := spec.NewBuilder().Pattern(tests.DockerLocalRepo + "/*").Build(buildName).Recursive(true).BuildSpec()
373344
searchCmd := generic.NewSearchCommand()
374345
searchCmd.SetServerDetails(serverDetails).SetSpec(searchSpec)

0 commit comments

Comments
 (0)