-
Notifications
You must be signed in to change notification settings - Fork 640
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Support for JIB(Java Image Builder) mode in dmp
This ports Jib support added in FMP in fabric8io/fabric8-maven-plugin#1675 with better logging.
- Loading branch information
1 parent
e2763a9
commit 0ce5eac
Showing
6 changed files
with
551 additions
and
5 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
185 changes: 185 additions & 0 deletions
185
src/main/java/io/fabric8/maven/docker/service/JibBuildService.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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
84
src/main/java/io/fabric8/maven/docker/util/FatJarDetector.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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); | ||
} | ||
} | ||
} |
Oops, something went wrong.