Skip to content

Commit d984d4a

Browse files
authored
Support Docker module ID with slash (#666)
1 parent 559b5a5 commit d984d4a

File tree

4 files changed

+77
-27
lines changed

4 files changed

+77
-27
lines changed

Diff for: build-info-extractor-docker/src/main/java/org/jfrog/build/extractor/docker/DockerUtils.java

+16
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
import java.util.ArrayList;
1313
import java.util.List;
1414

15+
import static org.apache.commons.lang3.StringUtils.*;
1516
import static org.jfrog.build.extractor.BuildInfoExtractorUtils.createMapper;
1617

1718
public class DockerUtils {
@@ -285,6 +286,21 @@ public static List<String> getArtManifestPath(String imagePath, String repo, Com
285286
return paths;
286287
}
287288

289+
/**
290+
* Calculate the module ID from the image tag and the target repository.
291+
*
292+
* @param imageTag - The image tag
293+
* @param targetRepo - The target repository
294+
* @return the module ID.
295+
*/
296+
public static String calculateModuleId(String imageTag, String targetRepo) {
297+
String targetRepoWrap = String.format("/%s/", targetRepo);
298+
if (contains(imageTag, targetRepoWrap)) {
299+
return substringAfterLast(imageTag, targetRepoWrap);
300+
}
301+
return substringAfter(imageTag, "/");
302+
}
303+
288304
public enum CommandType {
289305
Push,
290306
Pull

Diff for: build-info-extractor-docker/src/main/java/org/jfrog/build/extractor/docker/types/DockerImage.java

+2-1
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525

2626
import static org.apache.commons.lang3.StringUtils.*;
2727
import static org.jfrog.build.client.DownloadResponse.SHA256_HEADER_NAME;
28+
import static org.jfrog.build.extractor.docker.DockerUtils.calculateModuleId;
2829

2930
public class DockerImage implements Serializable {
3031
private String imageId;
@@ -228,7 +229,7 @@ public Module generateBuildInfoModule(Log logger, DockerUtils.CommandType cmdTyp
228229
try (ArtifactoryManager artifactoryManager = artifactoryManagerBuilder.build()) {
229230
ModuleBuilder moduleBuilder = new ModuleBuilder()
230231
.type(ModuleType.DOCKER)
231-
.id(substringAfterLast(imageTag, "/"))
232+
.id(calculateModuleId(imageTag, targetRepo))
232233
.repository(targetRepo);
233234
try {
234235
findAndSetManifestFromArtifactory(artifactoryManager, logger, cmdType);
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
package org.jfrog.build.extractor.docker;
2+
3+
import org.testng.annotations.DataProvider;
4+
import org.testng.annotations.Test;
5+
6+
import java.util.List;
7+
import java.util.stream.Stream;
8+
9+
import static org.jfrog.build.extractor.docker.DockerUtils.calculateModuleId;
10+
import static org.jfrog.build.extractor.docker.DockerUtils.getArtManifestPath;
11+
import static org.testng.Assert.assertEquals;
12+
import static org.testng.Assert.assertEqualsNoOrder;
13+
14+
@Test
15+
public class DockerUtilsTest {
16+
@Test
17+
public void getArtManifestPathTest() {
18+
String imagePath = "hello-world:latest";
19+
String repository = "docker-local";
20+
DockerUtils.CommandType cmdType = DockerUtils.CommandType.Push;
21+
List<String> results = getArtManifestPath(imagePath, repository, cmdType);
22+
assertEqualsNoOrder(results.toArray(), Stream.of("docker-local/hello-world:latest", "hello-world:latest").toArray());
23+
24+
cmdType = DockerUtils.CommandType.Pull;
25+
imagePath = "docker-local/hello-world:latest";
26+
results = getArtManifestPath(imagePath, repository, cmdType);
27+
assertEqualsNoOrder(results.toArray(), Stream.of("docker-local/docker-local/hello-world:latest", "docker-local/hello-world:latest", "docker-local/library/docker-local/hello-world:latest", "docker-local/library/hello-world:latest").toArray());
28+
}
29+
30+
@DataProvider
31+
private Object[][] moduleIdsProvider() {
32+
return new String[][]{
33+
// imageTag, targetRepo, expectedModuleId
34+
{"acme-docker-local.jfrog.io/image-tag", "docker-repo", "image-tag"},
35+
{"acme-docker-local.jfrog.io/image-tag:1", "docker-repo", "image-tag:1"},
36+
{"acme-docker-local.jfrog.io/image/tag", "docker-repo", "image/tag"},
37+
{"acme-docker-local.jfrog.io/image/tag:1", "docker-repo", "image/tag:1"},
38+
{"acme-docker-local.jfrog.io/image-tag", "other-docker-repo", "image-tag"},
39+
{"acme-docker-local.jfrog.io/image-tag:1", "other-docker-repo", "image-tag:1"},
40+
{"acme-docker-local.jfrog.io/image/tag", "other-docker-repo", "image/tag"},
41+
{"acme-docker-local.jfrog.io/image/tag:1", "other-docker-repo", "image/tag:1"},
42+
43+
{"acme.jfrog.io/docker-repo/image-tag", "docker-repo", "image-tag"},
44+
{"acme.jfrog.io/docker-repo/image-tag:1", "docker-repo", "image-tag:1"},
45+
{"acme.jfrog.io/docker-repo/image/tag", "docker-repo", "image/tag"},
46+
{"acme.jfrog.io/docker-repo/image/tag:1", "docker-repo", "image/tag:1"},
47+
// Edge cases - we have no choice but to add the docker-repo to the module id
48+
{"acme.jfrog.io/docker-repo/image-tag", "other-docker-repo", "docker-repo/image-tag"},
49+
{"acme.jfrog.io/docker-repo/image-tag:1", "other-docker-repo", "docker-repo/image-tag:1"},
50+
{"acme.jfrog.io/docker-repo/image/tag", "other-docker-repo", "docker-repo/image/tag"},
51+
{"acme.jfrog.io/docker-repo/image/tag:1", "other-docker-repo", "docker-repo/image/tag:1"},
52+
};
53+
}
54+
55+
@Test(dataProvider = "moduleIdsProvider")
56+
public void calculateModuleIdTest(String imageTag, String targetRepo, String expectedModuleId) {
57+
assertEquals(calculateModuleId(imageTag, targetRepo), expectedModuleId);
58+
}
59+
}

Diff for: build-info-extractor-docker/src/test/java/org/jfrog/build/extractor/docker/extractor/DockerUtilsTest.java

-26
This file was deleted.

0 commit comments

Comments
 (0)