Skip to content

Commit

Permalink
Fix eclipse-jkube#73: Ported JIB Support into Eclipse JKube from FMP
Browse files Browse the repository at this point in the history
+ Added a new module `jkube-kit/build/service/jib`
+ Introduced a new `BuildService` for jib : `JibBuildService`
+ Added documentation related to JIB integration
+ Added a simple Spring Boot Quickstart for JIB support demonstration.
  • Loading branch information
rohanKanojia authored and TueDissingWork committed Jul 28, 2020
1 parent 87eb611 commit 30a3751
Show file tree
Hide file tree
Showing 77 changed files with 1,921 additions and 187 deletions.
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ Usage:
* Fix #192: Removed `@Deprecated` fields from ClusterAccess
* Fix #190: Removed `@Deprecated` fields from AssemblyConfiguration
* Fix #189: Removed `@Deprecated` fields from BuildConfiguration
* Fix #73: Jib Support, Port of fabric8io/fabric8-maven-plugin#1766
* Fix #195: Added MigrateMojo for migrating projects from FMP to JKube
* Fix #238: Watch uses same logic as build to monitor changed assembly files
* Fix #245: Debug goals work on webapp (Tomcat & Jetty) > See https://github.com/jkubeio/jkube-images/releases/tag/v0.0.7
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@
import java.util.Properties;

import org.apache.commons.lang3.StringUtils;
import org.eclipse.jkube.kit.build.api.helper.DockerFileUtil;
import org.eclipse.jkube.kit.common.Assembly;
import org.eclipse.jkube.kit.common.AssemblyConfiguration;
import org.eclipse.jkube.kit.common.AssemblyFile;
Expand All @@ -38,11 +39,17 @@
import org.eclipse.jkube.kit.common.archive.JKubeTarArchiver;
import org.eclipse.jkube.kit.common.util.FileUtil;
import org.eclipse.jkube.kit.common.util.JKubeProjectUtil;
import org.eclipse.jkube.kit.config.image.ImageConfiguration;
import org.eclipse.jkube.kit.config.image.build.BuildConfiguration;
import org.eclipse.jkube.kit.config.image.build.DockerFileBuilder;
import org.eclipse.jkube.kit.config.image.build.JKubeConfiguration;

import javax.annotation.Nonnull;

import static org.eclipse.jkube.kit.build.api.assembly.AssemblyConfigurationUtils.getAssemblyConfigurationOrCreateDefault;
import static org.eclipse.jkube.kit.build.api.assembly.AssemblyConfigurationUtils.getJKubeAssemblyFileSets;
import static org.eclipse.jkube.kit.build.api.assembly.AssemblyConfigurationUtils.getJKubeAssemblyFileSetsExcludes;
import static org.eclipse.jkube.kit.build.api.assembly.AssemblyConfigurationUtils.getJKubeAssemblyFiles;
import static org.eclipse.jkube.kit.common.archive.AssemblyFileSetUtils.processAssemblyFileSet;
import static org.eclipse.jkube.kit.common.archive.AssemblyFileUtils.getAssemblyFileOutputDirectory;
import static org.eclipse.jkube.kit.common.archive.AssemblyFileUtils.resolveSourceFile;
Expand Down Expand Up @@ -198,7 +205,7 @@ private File prepareChangedFilesArchivePath(File archiveDir, File destFile, File
// Create final tar-ball to be used for building the archive to send to the Docker daemon
private File createBuildTarBall(JKubeConfiguration params, BuildDirs buildDirs, List<ArchiverCustomizer> archiverCustomizers,
AssemblyConfiguration assemblyConfig, ArchiveCompression compression) throws IOException {
DockerAssemblyConfigurationSource source = new DockerAssemblyConfigurationSource(params, buildDirs, assemblyConfig);
AssemblyConfigurationSource source = new AssemblyConfigurationSource(params, buildDirs, assemblyConfig);

JKubeBuildTarArchiver jkubeTarArchiver = new JKubeBuildTarArchiver();
for (ArchiverCustomizer customizer : archiverCustomizers) {
Expand Down Expand Up @@ -276,7 +283,7 @@ private void createAssemblyArchive(
if (!hasAssemblyConfiguration(assemblyConfig)) {
return;
}
DockerAssemblyConfigurationSource source = new DockerAssemblyConfigurationSource(params, buildDirs, assemblyConfig);
AssemblyConfigurationSource source = new AssemblyConfigurationSource(params, buildDirs, assemblyConfig);
JKubeBuildTarArchiver jkubeTarArchiver = new JKubeBuildTarArchiver();

AssemblyMode buildMode = assemblyConfig.getMode();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@

public class JKubeBuildTarArchiver {

public static final String ARCHIVE_FILE_NAME = "docker-build.";
private Map<File, String> filesToIncludeNameMap = new HashMap<>();
private Map<File, String> fileToPermissionsMap = new HashMap<>();
private List<String> filesNamesToExclude = new ArrayList<>();
Expand All @@ -46,7 +47,7 @@ public void excludeFile(String inputFilePath) {
}

public File createArchive(File inputDirectory, BuildDirs buildDirs, ArchiveCompression compression) throws IOException {
File outputFile = new File(buildDirs.getTemporaryRootDirectory(), "docker-build." + (compression.equals(ArchiveCompression.none) ? "tar" : compression.getFileSuffix()));
File outputFile = new File(buildDirs.getTemporaryRootDirectory(), ARCHIVE_FILE_NAME + (compression.equals(ArchiveCompression.none) ? "tar" : compression.getFileSuffix()));
List<File> files = FileUtil.listFilesAndDirsRecursivelyInDirectory(inputDirectory);

if (!filesToIncludeNameMap.isEmpty()) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@

import org.eclipse.jkube.kit.common.AssemblyFileEntry;
import org.eclipse.jkube.kit.common.AssemblyConfiguration;
import org.eclipse.jkube.kit.config.image.ImageConfiguration;
import org.eclipse.jkube.kit.config.image.build.BuildConfiguration;
import org.eclipse.jkube.kit.common.JavaProject;
import org.eclipse.jkube.kit.common.KitLogger;
Expand All @@ -35,6 +36,7 @@
import mockit.Mocked;
import mockit.Tested;
import mockit.Verifications;
import org.eclipse.jkube.kit.config.image.build.JKubeConfiguration;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.TemporaryFolder;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,10 +14,9 @@
package org.eclipse.jkube.kit.build.api.helper;

import org.apache.commons.io.FileUtils;
import org.eclipse.jkube.kit.build.api.helper.DockerFileUtil;
import org.eclipse.jkube.kit.config.image.ImageConfiguration;
import org.eclipse.jkube.kit.config.image.build.BuildConfiguration;
import org.junit.Test;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
Expand Down Expand Up @@ -95,7 +94,7 @@ public void interpolate() throws Exception {
projectProperties.put("user.name", "somebody"); // Java system property: -Duser.name=somebody
File dockerFile = getDockerfilePath("interpolate");
File expectedDockerFile = new File(dockerFile.getParent(), dockerFile.getName() + ".expected");
File actualDockerFile = createTmpFile(dockerFile.getName());
File actualDockerFile = PathTestUtil.createTmpFile(dockerFile.getName());
FileUtils.write(actualDockerFile, DockerFileUtil.interpolate(dockerFile, projectProperties, BuildConfiguration.DEFAULT_FILTER), "UTF-8");
// Compare text lines without regard to EOL delimiters
assertEquals(FileUtils.readLines(expectedDockerFile, StandardCharsets.UTF_8), FileUtils.readLines(actualDockerFile, StandardCharsets.UTF_8));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
* Contributors:
* Red Hat, Inc. - initial API and implementation
*/
package org.eclipse.jkube.kit.build.service.docker.helper;
package org.eclipse.jkube.kit.build.api.helper;

import org.junit.Test;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
* Contributors:
* Red Hat, Inc. - initial API and implementation
*/
package org.eclipse.jkube.kit.build.service.docker.helper;
package org.eclipse.jkube.kit.build.api.helper;

import java.io.File;
import java.io.IOException;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
*/
package org.eclipse.jkube.kit.build.service.docker;

import org.eclipse.jkube.kit.common.AssemblyFileEntry;
import org.eclipse.jkube.kit.config.image.build.JKubeConfiguration;
import org.eclipse.jkube.kit.build.api.assembly.ArchiverCustomizer;
import org.eclipse.jkube.kit.build.api.assembly.AssemblyFiles;
Expand All @@ -23,6 +24,7 @@

import java.io.File;
import java.io.IOException;
import java.util.List;

/**
* @author roland
Expand Down Expand Up @@ -100,7 +102,7 @@ public AssemblyFiles getAssemblyFiles(ImageConfiguration imageConfig, JKubeConfi
* @throws IOException in case of any I/O exception
*/
public File createChangedFilesArchive(
List<AssemblyFileEntry> entries, File assemblyDir,String imageName,
List<AssemblyFileEntry> entries, File assemblyDir, String imageName,
JKubeConfiguration jKubeConfiguration) throws IOException {

return assemblyManager.createChangedFilesArchive(entries, assemblyDir, imageName, jKubeConfiguration);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -171,7 +171,7 @@ private WaitChecker getTcpWaitChecker(Container container,
String host = getTcpHost(tcpConfig, projectProperties);
WaitConfiguration.TcpConfigMode mode = getTcpMode(tcpConfig, host);

if (mode == WaitConfiguration.TcpConfigMode.MAPPED) {
if (mode == WaitConfiguration.TcpConfigMode.mapped) {
for (int port : portsConfigured) {
Container.PortBinding binding = container.getPortBindings().get(port + "/tcp");
if (binding == null) {
Expand Down Expand Up @@ -209,7 +209,7 @@ private List<Integer> getTcpPorts(WaitConfiguration.TcpConfiguration tcpConfig)
private WaitConfiguration.TcpConfigMode getTcpMode(WaitConfiguration.TcpConfiguration tcpConfig, String host) {
WaitConfiguration.TcpConfigMode mode = tcpConfig.getMode();
if (mode == null) {
return "localhost".equals(host) ? WaitConfiguration.TcpConfigMode.DIRECT : WaitConfiguration.TcpConfigMode.MAPPED;
return "localhost".equals(host) ? WaitConfiguration.TcpConfigMode.direct : WaitConfiguration.TcpConfigMode.mapped;
} else {
return mode;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@
import lombok.Getter;
import lombok.NoArgsConstructor;
import org.eclipse.jkube.kit.build.core.GavLabel;
import org.eclipse.jkube.kit.common.AssemblyFileEntry;
import org.eclipse.jkube.kit.config.image.RunImageConfiguration;
import org.eclipse.jkube.kit.config.image.WaitConfiguration;
import org.eclipse.jkube.kit.config.image.build.JKubeConfiguration;
Expand Down Expand Up @@ -99,7 +100,7 @@ public synchronized void watch(WatchContext context, JKubeConfiguration buildCon
}

if (watcher.isBuild()) {
schedule(executor, createBuildWatchTask(watcher, context.getBuildContext(), watchMode == WatchMode.BOTH, buildContext), interval);
schedule(executor, createBuildWatchTask(watcher, context.getBuildContext(), watchMode == WatchMode.both, buildContext), interval);
tasks.add("rebuilding");
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -102,6 +102,7 @@ public AuthConfigFactory(KitLogger log) {
* @param settings the global Maven settings object
* @param user user to check for
* @param registry registry to use, might be null in which case a default registry is checked,
* @param passwordDecryptionMethod a functional interface to customize how password should be decoded
* @return the authentication configuration or <code>null</code> if none could be found
*
* @throws IOException mojo failure exception
Expand Down Expand Up @@ -177,11 +178,13 @@ private AuthConfig extendedAuthentication(AuthConfig standardAuthConfig, String
* @param settings the global Maven settings object
* @param user user to check for
* @param registry registry to use, might be null in which case a default registry is checked,
* @param passwordDecryptionMethod a function to customize how password should be decoded
* @param log Kit logger
* @return the authentication configuration or <code>null</code> if none could be found
*
* @throws Exception any exception in case of fetching authConfig
* @throws IOException any exception in case of fetching authConfig
*/
public static AuthConfig createStandardAuthConfig(boolean isPush, Map authConfigMap, List<RegistryServerConfiguration> settings, String user, String registry, UnaryOperator<String> passwordDecryptionMethod, KitLogger log)
private static AuthConfig createStandardAuthConfig(boolean isPush, Map authConfigMap, List<RegistryServerConfiguration> settings, String user, String registry, UnaryOperator<String> passwordDecryptionMethod, KitLogger log)
throws IOException {
AuthConfig ret;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,10 +18,8 @@
import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.NoArgsConstructor;
import org.eclipse.jkube.kit.build.service.docker.helper.DeepCopy;

import java.io.Serializable;
import java.lang.String;
import java.util.Map;

/**
Expand All @@ -30,6 +28,7 @@
* @author Tom Burton
* @version Dec 15, 2016
*/
@SuppressWarnings("JavaDoc")
@Builder
@AllArgsConstructor
@NoArgsConstructor
Expand All @@ -41,21 +40,29 @@ public class VolumeConfiguration implements Serializable {

/**
* Volume Name
* @param name name of volume configuration
* @return name of specified volume configuration
*/
private String name;

/**
* Volume driver for mounting the volume
* @param driver volume driver
* @return string indicating volume driver
*/
private String driver;

/**
* Driver specific options
* @param opts driver specific options
* @return map containing driver specific options
*/
private Map<String, String> opts;

/**
* Volume labels
* @param labels volume labels
* @return map containing volume labels
*/
private Map<String, String> labels;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -196,14 +196,14 @@ NetworkConfig getNetworkConfig() {
if (toJoin.size() > 1) {
throwIllegalArgumentException("'networks:' Only one custom network to join is supported currently");
}
return NetworkConfig.builder().mode(NetworkConfig.Mode.CUSTOM).name(toJoin.get(0)).build();
return NetworkConfig.builder().mode(NetworkConfig.Mode.custom).name(toJoin.get(0)).build();
} else if (networks instanceof Map) {
Map<String,Object> toJoin = (Map<String, Object>) networks;
if (toJoin.size() > 1) {
throwIllegalArgumentException("'networks:' Only one custom network to join is supported currently");
}
String custom = toJoin.keySet().iterator().next();
NetworkConfig ret = NetworkConfig.builder().mode(NetworkConfig.Mode.CUSTOM).name(custom).build();
NetworkConfig ret = NetworkConfig.builder().mode(NetworkConfig.Mode.custom).name(custom).build();
Object aliases = toJoin.get(custom);
if (aliases != null) {
if (aliases instanceof List) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -178,7 +178,8 @@ public void testGetStandardAuthConfigFromProperties(@Mocked KitLogger logger) th
System.setProperty(lookupMode.asSysProperty(AuthConfigFactory.AUTH_PASSWORD), "testpass");

// When
AuthConfig authConfig = AuthConfigFactory.createStandardAuthConfig(true, Collections.emptyMap(), Collections.emptyList(), "testuser", "testregistry.io", s -> s, logger);
AuthConfigFactory authConfigFactory = new AuthConfigFactory(logger);
AuthConfig authConfig = authConfigFactory.createAuthConfig(true, true, Collections.emptyMap(), Collections.emptyList(), "testuser", "testregistry.io", s -> s);

// Then
assertAuthConfig(authConfig, "testuser", "testpass");
Expand All @@ -195,7 +196,8 @@ public void testGetStandardAuthConfigFromMavenSettings(@Mocked KitLogger logger)
.build());

// When
AuthConfig authConfig = AuthConfigFactory.createStandardAuthConfig(true, Collections.emptyMap(), settings, "testuser", "testregistry.io", s -> s, logger);
AuthConfigFactory authConfigFactory = new AuthConfigFactory(logger);
AuthConfig authConfig = authConfigFactory.createAuthConfig(true, true, Collections.emptyMap(), settings, "testuser", "testregistry.io", s -> s);

// Then
assertAuthConfig(authConfig, "testuser", "testpass");
Expand Down
60 changes: 60 additions & 0 deletions jkube-kit/build/service/jib/pom.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
Copyright (c) 2019 Red Hat, Inc.
This program and the accompanying materials are made
available under the terms of the Eclipse Public License 2.0
which is available at:
https://www.eclipse.org/legal/epl-2.0/
SPDX-License-Identifier: EPL-2.0
Contributors:
Red Hat, Inc. - initial API and implementation
-->
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>

<parent>
<groupId>org.eclipse.jkube</groupId>
<artifactId>jkube-kit-parent</artifactId>
<version>1.0.0-SNAPSHOT</version>
<relativePath>../../../parent/pom.xml</relativePath>
</parent>

<artifactId>jkube-kit-build-service-jib</artifactId>

<name>JKube Kit :: Build :: Service :: JIB</name>

<dependencies>
<dependency>
<groupId>org.eclipse.jkube</groupId>
<artifactId>jkube-kit-build-api</artifactId>
</dependency>

<dependency>
<groupId>com.google.cloud.tools</groupId>
<artifactId>jib-core</artifactId>
</dependency>

<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-text</artifactId>
</dependency>
<dependency>
<groupId>org.jmockit</groupId>
<artifactId>jmockit</artifactId>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
</dependency>
<dependency>
<groupId>org.hamcrest</groupId>
<artifactId>hamcrest-all</artifactId>
</dependency>

</dependencies>
</project>
Loading

0 comments on commit 30a3751

Please sign in to comment.