use of org.eclipse.jkube.kit.common.Assembly in project jkube by eclipse.
the class AssemblyManager method createDockerTarArchive.
/**
* Create a docker tar archive from the given configuration which can be sent to the Docker host for
* creating the image.
*
* @param imageName Name of the image to create (used for creating build directories)
* @param configuration Mojos parameters (used for finding the directories)
* @param buildConfig configuration for how to build the image
* @param log KitLogger used to display warning if permissions are to be normalized
* @param finalCustomizer finalCustomizer to be applied to the tar archive
* @return file holding the path to the created assembly tar file
* @throws IOException IO exception
*/
public File createDockerTarArchive(String imageName, final JKubeConfiguration configuration, final BuildConfiguration buildConfig, KitLogger log, ArchiverCustomizer finalCustomizer) throws IOException {
final BuildDirs buildDirs = createBuildDirs(imageName, configuration);
final List<ArchiverCustomizer> archiveCustomizers = new ArrayList<>();
final AssemblyConfiguration assemblyConfig = getAssemblyConfiguration(buildConfig, configuration);
final Map<Assembly, List<AssemblyFileEntry>> layers = copyFilesToFinalTarballDirectory(configuration, buildDirs, assemblyConfig);
try {
if (buildConfig.isDockerFileMode()) {
createDockerTarArchiveForDockerFile(buildConfig, assemblyConfig, configuration, buildDirs, log, archiveCustomizers);
} else {
createAssemblyArchive(assemblyConfig, configuration, buildDirs, buildConfig.getCompression(), layers);
createDockerTarArchiveForGeneratorMode(buildConfig, buildDirs, archiveCustomizers, assemblyConfig, layers);
}
archiveCustomizers.addAll(getDefaultCustomizers(configuration, assemblyConfig, finalCustomizer, layers));
return createBuildTarBall(configuration, buildDirs, archiveCustomizers, assemblyConfig, buildConfig.getCompression());
} catch (IOException e) {
throw new IOException(String.format("Cannot create %s in %s", DOCKERFILE_NAME, buildDirs.getOutputDirectory()), e);
}
}
use of org.eclipse.jkube.kit.common.Assembly in project jkube by eclipse.
the class AssemblyManager method createAssemblyArchive.
private void createAssemblyArchive(AssemblyConfiguration assemblyConfig, JKubeConfiguration params, BuildDirs buildDirs, ArchiveCompression compression, Map<Assembly, List<AssemblyFileEntry>> layers) throws IOException {
if (layers.isEmpty()) {
return;
}
AssemblyConfigurationSource source = new AssemblyConfigurationSource(params, buildDirs, assemblyConfig);
JKubeBuildTarArchiver jkubeTarArchiver = new JKubeBuildTarArchiver();
AssemblyMode buildMode = assemblyConfig.getMode();
try {
layers.values().stream().flatMap(List::stream).filter(afe -> StringUtils.isNotBlank(afe.getFileMode())).forEach(jkubeTarArchiver::setFileMode);
jkubeTarArchiver.createArchive(source.getOutputDirectory(), buildDirs, compression);
} catch (IOException e) {
String error = "Failed to create assembly for docker image " + " (with mode '" + buildMode + "'): " + e.getMessage() + ".";
if (params.getProject().getArtifact() == null) {
error += " If you include the build artifact please ensure that you have " + "built the artifact before with 'mvn package' (should be available in the target/ dir). " + "Please see the documentation (section \"Assembly\") for more information.";
}
throw new IOException(error, e);
}
}
use of org.eclipse.jkube.kit.common.Assembly in project jkube by eclipse.
the class AssemblyManager method copyFilesToFinalTarballDirectory.
public Map<Assembly, List<AssemblyFileEntry>> copyFilesToFinalTarballDirectory(JKubeConfiguration configuration, BuildDirs buildDirs, AssemblyConfiguration assemblyConfiguration) throws IOException {
final Map<Assembly, List<AssemblyFileEntry>> entries = new LinkedHashMap<>();
FileUtil.createDirectory(new File(buildDirs.getOutputDirectory(), assemblyConfiguration.getTargetDir()));
final List<Assembly> layers = assemblyConfiguration.getProcessedLayers(configuration);
if (layers.size() > 1 && layers.stream().anyMatch(l -> StringUtils.isBlank(l.getId()))) {
throw new IllegalStateException("Assemblies with more than one layer require a proper id for each layer");
}
for (Assembly layer : layers) {
entries.put(layer, copyLayerFilesToFinalTarballDirectory(configuration.getProject(), buildDirs, assemblyConfiguration, layer));
}
return entries;
}
use of org.eclipse.jkube.kit.common.Assembly in project jkube by eclipse.
the class AssemblyConfigurationUtilsTest method getJKubeAssemblyFileSetsNullFileSetsShouldReturnEmptyList.
@Test
public void getJKubeAssemblyFileSetsNullFileSetsShouldReturnEmptyList() {
// Given
final Assembly assembly = new Assembly();
// When
final List<AssemblyFileSet> result = getJKubeAssemblyFileSets(assembly);
// Then
assertThat(result).isNotNull().isEmpty();
}
use of org.eclipse.jkube.kit.common.Assembly in project jkube by eclipse.
the class JibBuildService method buildSingleImage.
@Override
public void buildSingleImage(ImageConfiguration imageConfig) throws JKubeServiceException {
try {
log.info("[[B]]JIB[[B]] image build started");
if (imageConfig.getBuildConfiguration().isDockerFileMode()) {
throw new JKubeServiceException("Dockerfile mode is not supported with JIB build strategy");
}
prependRegistry(imageConfig, configuration.getProperties().getProperty(PUSH_REGISTRY));
BuildDirs buildDirs = new BuildDirs(imageConfig.getName(), configuration);
final Credential pullRegistryCredential = getRegistryCredentials(configuration.getRegistryConfig(), false, imageConfig, log);
final JibContainerBuilder containerBuilder = containerFromImageConfiguration(imageConfig, pullRegistryCredential);
final Map<Assembly, List<AssemblyFileEntry>> layers = AssemblyManager.getInstance().copyFilesToFinalTarballDirectory(configuration, buildDirs, AssemblyManager.getAssemblyConfiguration(imageConfig.getBuildConfiguration(), configuration));
JibServiceUtil.layers(buildDirs, layers).forEach(containerBuilder::addFileEntriesLayer);
// TODO: Improve Assembly Manager so that the effective assemblyFileEntries computed can be properly shared
// the call to AssemblyManager.getInstance().createDockerTarArchive should not be necessary,
// files should be added using the AssemblyFileEntry list. AssemblyManager, should provide
// a common way to achieve this so that both the tar builder and any other builder could get a hold of
// archive customizers, file entries, etc.
File dockerTarArchive = getAssemblyTarArchive(imageConfig, configuration, log);
JibServiceUtil.buildContainer(containerBuilder, TarImage.at(dockerTarArchive.toPath()).named(imageConfig.getName()), log);
log.info(" %s successfully built", dockerTarArchive.getAbsolutePath());
} catch (InterruptedException ex) {
Thread.currentThread().interrupt();
} catch (Exception ex) {
throw new JKubeServiceException("Error when building JIB image", ex);
}
}
Aggregations