Skip to content

Commit

Permalink
[docker] push packaged Dockerfiles to a git repository. Fixes #169
Browse files Browse the repository at this point in the history
  • Loading branch information
aalmiray committed Jul 22, 2021
1 parent b036ddf commit efa4748
Show file tree
Hide file tree
Showing 13 changed files with 239 additions and 27 deletions.
36 changes: 33 additions & 3 deletions core/jreleaser-model/src/main/java/org/jreleaser/model/Docker.java
Original file line number Diff line number Diff line change
Expand Up @@ -33,16 +33,21 @@
* @author Andres Almiray
* @since 0.1.0
*/
public class Docker extends AbstractDockerConfiguration implements Tool {
public class Docker extends AbstractDockerConfiguration implements RepositoryTool {
private final Map<String, DockerSpec> specs = new LinkedHashMap<>();
protected Boolean continueOnError;
protected boolean failed;
private final CommitAuthor commitAuthor = new CommitAuthor();
private final DockerRepository repository = new DockerRepository();

private Boolean continueOnError;
private boolean failed;

void setAll(Docker docker) {
super.setAll(docker);
this.continueOnError = docker.continueOnError;
this.failed = docker.failed;
setSpecs(docker.specs);
setCommitAuthor(docker.commitAuthor);
setRepository(docker.repository);
}

@Override
Expand Down Expand Up @@ -85,6 +90,16 @@ public String getName() {
return NAME;
}

@Override
public CommitAuthor getCommitAuthor() {
return commitAuthor;
}

@Override
public void setCommitAuthor(CommitAuthor commitAuthor) {
this.commitAuthor.setAll(commitAuthor);
}

@Override
public Set<String> getSupportedExtensions() {
Set<String> extensions = new LinkedHashSet<>();
Expand Down Expand Up @@ -127,6 +142,8 @@ public Map<String, Object> asMap(boolean full) {

@Override
protected void asMap(boolean full, Map<String, Object> props) {
props.put("commitAuthor", commitAuthor.asMap(full));
props.put("repository", repository.asMap(full));
props.put("continueOnError", isContinueOnError());
List<Map<String, Object>> specs = this.specs.values()
.stream()
Expand All @@ -135,4 +152,17 @@ protected void asMap(boolean full, Map<String, Object> props) {
.collect(Collectors.toList());
if (!specs.isEmpty()) props.put("specs", specs);
}

public DockerRepository getRepository() {
return repository;
}

public void setRepository(DockerRepository repository) {
this.repository.setAll(repository);
}

@Override
public RepositoryTap getRepositoryTap() {
return repository;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
/*
* SPDX-License-Identifier: Apache-2.0
*
* Copyright 2020-2021 The JReleaser authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jreleaser.model;

/**
* @author Andres Almiray
* @since 0.6.0
*/
public class DockerRepository extends AbstractRepositoryTap {
public DockerRepository() {
super("docker");
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -21,10 +21,12 @@
import org.jreleaser.model.Distribution;
import org.jreleaser.model.Docker;
import org.jreleaser.model.DockerConfiguration;
import org.jreleaser.model.DockerRepository;
import org.jreleaser.model.DockerSpec;
import org.jreleaser.model.GitService;
import org.jreleaser.model.JReleaserContext;
import org.jreleaser.model.JReleaserModel;
import org.jreleaser.model.Project;
import org.jreleaser.model.Registry;
import org.jreleaser.util.Env;
import org.jreleaser.util.Errors;
Expand Down Expand Up @@ -57,6 +59,7 @@
public abstract class DockerValidator extends Validator {
public static void validateDocker(JReleaserContext context, Distribution distribution, Docker tool, Errors errors) {
JReleaserModel model = context.getModel();
Project project = model.getProject();
Docker parentTool = model.getPackagers().getDocker();

if (!tool.isActiveSet() && parentTool.isActiveSet()) {
Expand All @@ -78,9 +81,24 @@ public static void validateDocker(JReleaserContext context, Distribution distrib
if (tool.getActiveSpecs().isEmpty()) {
validateTemplate(context, distribution, tool, parentTool, errors);
}

validateCommitAuthor(tool, parentTool);
DockerRepository repository = tool.getRepository();
validateOwner(repository, parentTool.getRepository());
mergeExtraProperties(tool, parentTool);
validateContinueOnError(tool, parentTool);

if (isBlank(repository.getName())) {
repository.setName(project.getName() + "-docker");
}
repository.setBasename(project.getName() + "-docker");
if (isBlank(repository.getUsername())) {
repository.setUsername(parentTool.getRepository().getUsername());
}
if (isBlank(repository.getToken())) {
repository.setToken(parentTool.getRepository().getToken());
}

if (isBlank(tool.getBaseImage())) {
tool.setBaseImage(parentTool.getBaseImage());
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,9 @@
import org.jreleaser.model.JReleaserContext;
import org.jreleaser.model.JReleaserModel;
import org.jreleaser.model.Packagers;
import org.jreleaser.model.Project;
import org.jreleaser.model.RepositoryTap;
import org.jreleaser.model.RepositoryTool;
import org.jreleaser.util.Env;
import org.jreleaser.util.Errors;

Expand All @@ -42,27 +44,37 @@ public static void validatePackagers(JReleaserContext context, JReleaserContext.

JReleaserModel model = context.getModel();
Packagers packagers = model.getPackagers();
Project project = model.getProject();

packagers.getBrew().resolveEnabled(project);
validatePackager(context,
packagers.getBrew(),
packagers.getBrew().getTap(),
errors);

packagers.getChocolatey().resolveEnabled(project);
validatePackager(context,
packagers.getChocolatey(),
packagers.getChocolatey().getBucket(),
errors);

packagers.getDocker().resolveEnabled(context.getModel().getProject());
packagers.getDocker().resolveEnabled(project);
validatePackager(context,
packagers.getDocker(),
packagers.getDocker().getRepository(),
errors);

if (!packagers.getDocker().getSpecs().isEmpty()) {
errors.configuration("docker.specs can only be defined inside distributions.");
}

packagers.getDocker().resolveEnabled(project);
validatePackager(context,
packagers.getJbang(),
packagers.getJbang().getCatalog(),
errors);

packagers.getScoop().resolveEnabled(project);
validatePackager(context,
packagers.getScoop(),
packagers.getScoop().getBucket(),
Expand All @@ -73,17 +85,17 @@ public static void validatePackagers(JReleaserContext context, JReleaserContext.
}
packagers.getScoop().getBucket().setBasename("scoop-" + model.getRelease().getGitService().getOwner());

packagers.getSnap().resolveEnabled(project);
validatePackager(context,
packagers.getSnap(),
packagers.getSnap().getSnap(),
errors);
}

private static void validatePackager(JReleaserContext context,
AbstractRepositoryTool tool,
RepositoryTool tool,
RepositoryTap tap,
Errors errors) {
tool.resolveEnabled(context.getModel().getProject());
GitService service = context.getModel().getRelease().getGitService();
validateCommitAuthor(tool, service);
validateOwner(tap, service);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Map;

import static org.jreleaser.util.StringUtils.isNotBlank;
Expand Down Expand Up @@ -113,14 +114,17 @@ protected boolean doPublishDistribution(Distribution distribution, Releaser rele
return true;
}

protected void prepareWorkingCopy(Map<String, Object> props, Path directory, Distribution distribution) throws IOException {
// copy files over
protected void prepareWorkingCopy(Map<String, Object> props, Path directory, Distribution distribution) throws ToolProcessingException, IOException {
Path packageDirectory = (Path) props.get(Constants.KEY_DISTRIBUTION_PACKAGE_DIRECTORY);
context.getLogger().debug("copying files from {}", context.relativizeToBasedir(packageDirectory));
prepareWorkingCopy(packageDirectory, directory);
}

protected void prepareWorkingCopy(Path source, Path destination) throws IOException {
context.getLogger().debug("copying files from {}", context.relativizeToBasedir(source));

if (!FileUtils.copyFilesRecursive(context.getLogger(), packageDirectory, directory)) {
if (!FileUtils.copyFilesRecursive(context.getLogger(), source, destination)) {
throw new IOException("Could not copy files from " +
context.relativizeToBasedir(packageDirectory));
context.relativizeToBasedir(source));
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@ protected boolean doPackageDistribution(Distribution distribution, Map<String, O
}

@Override
protected void prepareWorkingCopy(Map<String, Object> props, Path directory, Distribution distribution) throws IOException {
protected void prepareWorkingCopy(Map<String, Object> props, Path directory, Distribution distribution) throws ToolProcessingException, IOException {
super.prepareWorkingCopy(props, directory.resolve(distribution.getName()), distribution);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@
* @author Andres Almiray
* @since 0.1.0
*/
public class DockerToolProcessor extends AbstractToolProcessor<Docker> {
public class DockerToolProcessor extends AbstractRepositoryToolProcessor<Docker> {
public DockerToolProcessor(JReleaserContext context) {
super(context);
}
Expand Down Expand Up @@ -145,9 +145,8 @@ protected void packageDocker(Distribution distribution,
// copy files
Path workingDirectory = prepareAssembly(distribution, props, packageDirectory, artifacts);

int i = 0;
for (String imageName : docker.getImageNames()) {
imageName = applyTemplate(imageName, props, "image" + (i++));
imageName = applyTemplate(imageName, props);

// command line
List<String> cmd = createBuildCommand(props, docker);
Expand Down Expand Up @@ -222,20 +221,28 @@ public boolean publishDistribution(Distribution distribution, Releaser releaser,
if (tool.getActiveSpecs().isEmpty()) {
if (tool.getRegistries().isEmpty()) {
context.getLogger().info("no configured registries. Skipping");
publishToRepository(distribution, releaser, props);
return false;
}
return super.publishDistribution(distribution, releaser, props);
super.publishDistribution(distribution, releaser, props);
publishToRepository(distribution, releaser, props);
return true;
}

for (DockerSpec spec : tool.getActiveSpecs()) {
context.getLogger().debug("publishing {} spec", spec.getName());
Map<String, Object> newProps = fillSpecProps(distribution, props, spec);
publishDocker(distribution, releaser, newProps, spec);
}
publishToRepository(distribution, releaser, props);

return true;
}

private void publishToRepository(Distribution distribution, Releaser releaser, Map<String, Object> props) throws ToolProcessingException {
super.doPublishDistribution(distribution, releaser, props);
}

@Override
protected boolean doPublishDistribution(Distribution distribution, Releaser releaser, Map<String, Object> props) throws ToolProcessingException {
return publishDocker(distribution, releaser, props, getTool());
Expand All @@ -247,9 +254,8 @@ protected boolean publishDocker(Distribution distribution,
DockerConfiguration docker) throws ToolProcessingException {
for (Registry registry : docker.getRegistries()) {
login(registry);
int i = 0;
for (String imageName : docker.getImageNames()) {
publish(registry, imageName, props, i++);
publish(registry, imageName, props);
}
logout(registry);
}
Expand All @@ -275,8 +281,8 @@ private void login(Registry registry) throws ToolProcessingException {
if (!context.isDryrun()) executeCommandWithInput(cmd, in);
}

private void publish(Registry registry, String imageName, Map<String, Object> props, int index) throws ToolProcessingException {
imageName = applyTemplate(imageName, props, "image" + index);
private void publish(Registry registry, String imageName, Map<String, Object> props) throws ToolProcessingException {
imageName = applyTemplate(imageName, props);

String tag = imageName;
String serverName = registry.getServerName();
Expand Down Expand Up @@ -380,4 +386,31 @@ protected void writeFile(Project project,

writeFile(content, outputFile);
}

@Override
protected void prepareWorkingCopy(Map<String, Object> props, Path directory, Distribution distribution) throws ToolProcessingException, IOException {
Path packageDirectory = (Path) props.get(Constants.KEY_DISTRIBUTION_PACKAGE_DIRECTORY);

if (tool.getActiveSpecs().isEmpty()) {
for (String imageName : tool.getImageNames()) {
copyDockerfiles(packageDirectory, applyTemplate(imageName, props), directory);
}
} else {
for (DockerSpec spec : tool.getActiveSpecs()) {
Map<String, Object> newProps = fillSpecProps(distribution, props, spec);
for (String imageName : spec.getImageNames()) {
copyDockerfiles(packageDirectory.resolve(spec.getName()), applyTemplate(imageName, newProps), directory);
}
}
}
}

private void copyDockerfiles(Path source, String imageName, Path directory) throws IOException {
String[] parts = imageName.split("/");
parts = parts[parts.length - 1].split(":");

Path destination = directory.resolve(parts[0]).resolve(parts[1]);
Files.createDirectories(destination);
prepareWorkingCopy(source, destination);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -162,7 +162,7 @@ protected void writeFile(Project project,
}

@Override
protected void prepareWorkingCopy(Map<String, Object> props, Path directory, Distribution distribution) throws IOException {
protected void prepareWorkingCopy(Map<String, Object> props, Path directory, Distribution distribution) throws ToolProcessingException, IOException {
Path catalog = directory.resolve("jbang-catalog.json");

if (catalog.toFile().exists()) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
package org.jreleaser.gradle.plugin.dsl

import groovy.transform.CompileStatic
import org.gradle.api.Action
import org.gradle.api.NamedDomainObjectContainer

/**
Expand All @@ -26,6 +27,12 @@ import org.gradle.api.NamedDomainObjectContainer
* @since 0.1.0
*/
@CompileStatic
interface Docker extends DockerConfiguration, Tool {
interface Docker extends DockerConfiguration, RepositoryTool {
NamedDomainObjectContainer<DockerSpec> getSpecs()

Tap getRepository()

void repository(Action<? super Tap> repository)

void repository(@DelegatesTo(strategy = Closure.DELEGATE_FIRST, value = Tap) Closure<Void> action)
}

0 comments on commit efa4748

Please sign in to comment.