Skip to content

Commit

Permalink
Support for JIB(Java Image Builder) mode in dmp
Browse files Browse the repository at this point in the history
This ports Jib support added in FMP in fabric8io/fabric8-maven-plugin#1675
with better logging.
  • Loading branch information
rohanKanojia committed Oct 12, 2019
1 parent e2763a9 commit 0ce5eac
Show file tree
Hide file tree
Showing 6 changed files with 551 additions and 5 deletions.
1 change: 1 addition & 0 deletions doc/changelog.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
- Allow merging of image configurations using <imagesMap> ([#360](https://github.com/fabric8io/docker-maven-plugin/issues/360))
- Treat bridged and default network mode the same #1234
- Fix NPE when cacheFrom is missing from config #1274
- Support for JIB mode

* **0.31.0** (2019-08-10)
- Fix test cases on Windows ([#1220](https://github.com/fabric8io/docker-maven-plugin/issues/1220))
Expand Down
15 changes: 14 additions & 1 deletion pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@
<maven.version>3.3.9</maven.version>
<jmockit.version>1.43</jmockit.version>
<surefire.version>3.0.0-M2</surefire.version>
<jib.version>0.10.0</jib.version>
</properties>

<dependencies>
Expand Down Expand Up @@ -172,7 +173,7 @@
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>23.0-android</version>
<version>27.0.1-jre</version>
</dependency>

<dependency>
Expand All @@ -181,6 +182,18 @@
<version>1.24</version>
</dependency>

<dependency>
<groupId>com.google.cloud.tools</groupId>
<artifactId>jib-core</artifactId>
<version>${jib.version}</version>
</dependency>

<dependency>
<groupId>com.google.cloud.tools</groupId>
<artifactId>jib-maven-plugin</artifactId>
<version>1.6.1</version>
</dependency>


<!-- =============================================================================== -->

Expand Down
17 changes: 13 additions & 4 deletions src/main/java/io/fabric8/maven/docker/BuildMojo.java
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
import io.fabric8.maven.docker.config.ImageConfiguration;
import io.fabric8.maven.docker.service.BuildService;
import io.fabric8.maven.docker.service.ImagePullManager;
import io.fabric8.maven.docker.service.JibBuildService;
import io.fabric8.maven.docker.service.ServiceHub;
import io.fabric8.maven.docker.util.Logger;
import io.fabric8.maven.docker.util.EnvUtil;
Expand All @@ -41,6 +42,9 @@ public class BuildMojo extends AbstractBuildSupportMojo {
@Parameter(property = "docker.name", defaultValue = "")
protected String name;

@Parameter(property = "docker.build.jib", defaultValue = "false")
protected boolean jib;

/**
* Skip building tags
*/
Expand Down Expand Up @@ -69,11 +73,16 @@ protected void buildAndTag(ServiceHub hub, ImageConfiguration imageConfig)

BuildService.BuildContext buildContext = getBuildContext();
ImagePullManager pullManager = getImagePullManager(determinePullPolicy(imageConfig.getBuildConfiguration()), autoPull);
BuildService buildService = hub.getBuildService();

buildService.buildImage(imageConfig, pullManager, buildContext);
if (!skipTag) {
buildService.tagImage(imageConfig.getName(), imageConfig);
if (Boolean.TRUE.equals(jib)) {
log.info("Building Container image with [[B]]JIB(Java Image Builder)[[B]] mode");
new JibBuildService(buildContext, createMojoParameters(), log).buildImage(imageConfig, pullManager, buildContext);
} else {
BuildService buildService = hub.getBuildService();
buildService.buildImage(imageConfig, pullManager, buildContext);
if (!skipTag) {
buildService.tagImage(imageConfig.getName(), imageConfig);
}
}
}

Expand Down
185 changes: 185 additions & 0 deletions src/main/java/io/fabric8/maven/docker/service/JibBuildService.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,185 @@
package io.fabric8.maven.docker.service;

import io.fabric8.maven.docker.access.DockerAccess;
import io.fabric8.maven.docker.config.BuildImageConfiguration;
import io.fabric8.maven.docker.config.ImageConfiguration;
import io.fabric8.maven.docker.util.ImageName;
import io.fabric8.maven.docker.util.JibBuildServiceUtil;
import io.fabric8.maven.docker.util.Logger;

import java.util.List;
import com.google.cloud.tools.jib.api.Credential;
import io.fabric8.maven.docker.config.Arguments;
import io.fabric8.maven.docker.util.DeepCopy;
import io.fabric8.maven.docker.util.MojoParameters;
import org.apache.maven.plugin.Mojo;

import java.nio.file.Path;
import java.util.Map;
import java.util.Objects;

public class JibBuildService {

private Logger log;
private BuildService.BuildContext dockerBuildContext;
private MojoParameters mojoParameters;

private JibBuildService() { }

public JibBuildService (BuildService.BuildContext dockerBuildContext, MojoParameters mojoParameters, Logger log) {
Objects.requireNonNull(dockerBuildContext, "dockerBuildContext");
this.dockerBuildContext = dockerBuildContext;
this.mojoParameters = mojoParameters;
this.log = log;
}

public void buildImage(ImageConfiguration imageConfiguration, ImagePullManager imagePullManager, BuildService.BuildContext buildContext) {
try {
BuildImageConfiguration buildImageConfiguration = imageConfiguration.getBuildConfiguration();
List<String> tags = buildImageConfiguration.getTags();

JibBuildService.JibBuildConfiguration jibBuildConfiguration;
String fullName = "";
if (tags.size() > 0) {
for (String tag : tags) {
if (tag != null) {
fullName = new ImageName(imageConfiguration.getName(), tag).getFullName();
}
}
} else {
fullName = new ImageName(imageConfiguration.getName(), null).getFullName();
}
log.info("Image tagging successful!");
jibBuildConfiguration = JibBuildServiceUtil.getJibBuildConfiguration(dockerBuildContext, mojoParameters, buildImageConfiguration, fullName, log);
JibBuildServiceUtil.buildImage(jibBuildConfiguration, log);
} catch (Exception ex) {
throw new UnsupportedOperationException();
}
}

public static class JibBuildConfiguration {

private Map<String, String> envMap;

private Credential credential;

private List<String> ports;

private String from;

private String target;

private Path fatJarPath;

private Arguments entrypoint;

private String targetDir;

private String outputDir;

private JibBuildConfiguration() {}

public Arguments getEntryPoint() {
return entrypoint;
}

public String getTargetDir() {
return targetDir;
}

public String getOutputDir() {
return outputDir;
}

public Map<String, String> getEnvMap() {
return envMap;
}

public Credential getCredential() {
return credential;
}

public List<String> getPorts() {
return ports;
}

public String getFrom() {
return from;
}

public String getTargetImage() {
return target;
}

public Path getFatJar() {
return fatJarPath;
}

public static class Builder {
private final JibBuildConfiguration configutil;
private final Logger logger;

public Builder(Logger logger) {
this(null, logger);
}

public Builder(JibBuildConfiguration that, Logger logger) {
this.logger = logger;
if (that == null) {
this.configutil = new JibBuildConfiguration();
} else {
this.configutil = DeepCopy.copy(that);
}
}

public Builder envMap(Map<String, String> envMap) {
configutil.envMap = envMap;
return this;
}

public Builder credential(Credential credential) {
configutil.credential = credential;
return this;
}

public Builder ports(List<String> ports) {
configutil.ports = ports;
return this;
}

public Builder from(String from) {
configutil.from = from;
return this;
}

public Builder targetImage(String imageName) {
configutil.target = imageName;
return this;
}

public Builder entrypoint(Arguments entrypoint) {
configutil.entrypoint = entrypoint;
return this;
}

public Builder buildDirectory(String buildDir) {
configutil.fatJarPath = JibBuildServiceUtil.getFatJar(buildDir, logger);
return this;
}

public Builder targetDir(String targetDir) {
configutil.targetDir = targetDir;
return this;
}

public Builder outputDir(String outputDir) {
configutil.outputDir = outputDir;
return this;
}

public JibBuildConfiguration build() {
return configutil;
}
}
}
}
84 changes: 84 additions & 0 deletions src/main/java/io/fabric8/maven/docker/util/FatJarDetector.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
package io.fabric8.maven.docker.util;

import org.apache.maven.plugin.MojoExecutionException;

import java.io.File;
import java.io.IOException;
import java.util.jar.Attributes;
import java.util.jar.JarFile;
import java.util.jar.Manifest;

/**
* Class for finding out the fat jar of a directory and provide
* some insights into the fat jar
* @author roland
* @since 10/11/16
*/
public class FatJarDetector {

private File directory;
private Result result;

public FatJarDetector(String dir) {
this.directory = new File(dir);
}

public Result scan() throws MojoExecutionException {
// Scanning is lazy ...
if (result == null) {
if (!directory.exists()) {
// No directory to check found so we return null here ...
return null;
}
String[] jarOrWars = directory.list((dir, name) -> name.endsWith(".war") || name.endsWith(".jar"));
if (jarOrWars == null || jarOrWars.length == 0) {
return null;
}
long maxSize = 0;
for (String jarOrWar : jarOrWars) {
File archiveFile = new File(directory, jarOrWar);
try (JarFile archive = new JarFile(archiveFile)){
Manifest mf = archive.getManifest();
Attributes mainAttributes = mf.getMainAttributes();
if (mainAttributes != null) {
String mainClass = mainAttributes.getValue("Main-Class");
long size = archiveFile.length();
// Take the largest jar / war file found
if (size > maxSize) {
maxSize = size;
result = new Result(archiveFile, mainClass, mainAttributes);
}
}
} catch (IOException e) {
throw new MojoExecutionException("Cannot examine file " + archiveFile + " for the manifest");
}
}
}
return result;
}

public class Result {

private final File archiveFile;
private final String mainClass;
private final Attributes attributes;

public Result(File archiveFile, String mainClass, Attributes attributes) {
this.archiveFile = archiveFile;
this.mainClass = mainClass;
this.attributes = attributes;
}

public File getArchiveFile() {
return archiveFile;
}

public String getMainClass() {
return mainClass;
}

public String getManifestEntry(String key) {
return attributes.getValue(key);
}
}
}
Loading

0 comments on commit 0ce5eac

Please sign in to comment.