Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add and enable new plugin extension configuration in Gradle #2431

Merged
merged 27 commits into from
May 4, 2020
Merged
Show file tree
Hide file tree
Changes from 22 commits
Commits
Show all changes
27 commits
Select commit Hold shift + click to select a range
705d5cc
Add extension configuration option for Maven
chanseokoh Apr 16, 2020
f505261
Move plugin extension tests to a new class
chanseokoh Apr 16, 2020
f1dc362
Merge branch 'refactor-tests' into plugin-extension-java-src-new-config
chanseokoh Apr 16, 2020
bb65ebd
Iterator over configs instead of extension list
chanseokoh Apr 16, 2020
e6f4532
Update and add tests
chanseokoh Apr 17, 2020
ca9e84e
Update test
chanseokoh Apr 17, 2020
8032a6a
Update tests
chanseokoh Apr 17, 2020
94c6340
Add test
chanseokoh Apr 20, 2020
38fc005
Merge remote-tracking branch 'origin/master' into plugin-extension-ja…
chanseokoh Apr 20, 2020
0084c2c
Merge branch 'master' into plugin-extension-java-src-new-config
chanseokoh Apr 22, 2020
088fd95
Process extension configuration
chanseokoh Apr 22, 2020
31366fc
Wire Gradle extension configuration
chanseokoh Apr 23, 2020
6a99a25
javadoc
chanseokoh Apr 23, 2020
91d9cad
Rename config name to `jibExtensions`
chanseokoh Apr 24, 2020
b485fed
Change extension class
chanseokoh Apr 24, 2020
b73133e
Nullable
chanseokoh Apr 24, 2020
1131bbb
Nullable
chanseokoh Apr 24, 2020
e4fc278
List<? extends ExtensionConfiguration>
chanseokoh Apr 27, 2020
09f9af4
Merge branch 'plugin-extension-java-src-new-config' into gradle-plugi…
chanseokoh Apr 27, 2020
35e662f
Merge branch 'master' into gradle-plugin-extension-config
chanseokoh Apr 27, 2020
d92bfe0
Rename extension list parameter
chanseokoh Apr 30, 2020
e52c8b2
missed this one
chanseokoh Apr 30, 2020
4d6e2f0
Merge branch 'master' into gradle-plugin-extension-config
chanseokoh May 1, 2020
fbb7549
Merge branch 'master' into gradle-plugin-extension-config
chanseokoh May 1, 2020
9d1d26e
Enable different config syntax
chanseokoh May 1, 2020
c4ad8b7
Clean up
chanseokoh May 1, 2020
8c5a815
Update comment
chanseokoh May 4, 2020
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
import com.google.cloud.tools.jib.plugins.extension.ExtensionLogger;
import com.google.cloud.tools.jib.plugins.extension.JibPluginExtension;
import com.google.cloud.tools.jib.plugins.extension.JibPluginExtensionException;
import java.util.Map;

/**
* Jib Gradle plugin extension API.
Expand All @@ -34,12 +35,16 @@ public interface JibGradlePluginExtension extends JibPluginExtension {
* Extends the build plan prepared by the Jib Gradle plugin.
*
* @param buildPlan original build plan prepared by the Jib Gradle plugin
* @param properties custom properties configured for the plugin extension
* @param gradleData {@link GradleData} providing Gradle-specific data and properties
* @param logger logger for writing log messages
* @return updated build plan
* @throws JibPluginExtensionException if an error occurs while running the plugin extension
*/
ContainerBuildPlan extendContainerBuildPlan(
ContainerBuildPlan buildPlan, GradleData gradleData, ExtensionLogger logger)
ContainerBuildPlan buildPlan,
Map<String, String> properties,
GradleData gradleData,
ExtensionLogger logger)
throws JibPluginExtensionException;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
/*
* Copyright 2020 Google LLC.
*
* 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
*
* http://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 com.google.cloud.tools.jib.gradle;

import com.google.cloud.tools.jib.plugins.common.RawConfiguration.ExtensionConfiguration;
import java.util.Collections;
import java.util.Map;
import org.gradle.api.tasks.Input;
import org.gradle.api.tasks.Internal;

/** Configuration of a plugin extension. */
public class ExtensionParameters implements ExtensionConfiguration {

private String implementation = "<extension implementation not configured>";
private Map<String, String> properties = Collections.emptyMap();

@Input
public String getImplementation() {
return getExtensionClass();
}

@Internal
@Override
public String getExtensionClass() {
return implementation;
}

public void setImplementation(String implementation) {
this.implementation = implementation;
}

@Input
@Override
public Map<String, String> getProperties() {
return properties;
}

public void setProperties(Map<String, String> properties) {
this.properties = properties;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@

package com.google.cloud.tools.jib.gradle;

import com.google.api.client.util.Lists;
import com.google.cloud.tools.jib.api.Containerizer;
import com.google.cloud.tools.jib.api.ImageReference;
import com.google.cloud.tools.jib.api.InvalidImageReferenceException;
Expand Down Expand Up @@ -50,9 +51,9 @@
import java.nio.file.Paths;
import java.time.Duration;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.ServiceLoader;
import java.util.function.Predicate;
import java.util.stream.Collectors;
import javax.annotation.Nullable;
import org.apache.tools.ant.taskdefs.condition.Os;
Expand Down Expand Up @@ -401,27 +402,40 @@ public JibContainerBuilder runPluginExtensions(
List<? extends ExtensionConfiguration> extensionConfigs,
JibContainerBuilder jibContainerBuilder)
throws JibPluginExtensionException {
return runPluginExtensions(
ServiceLoader.load(JibGradlePluginExtension.class).iterator(), jibContainerBuilder);
List<JibGradlePluginExtension> services =
Lists.newArrayList(ServiceLoader.load(JibGradlePluginExtension.class).iterator());
return runPluginExtensions(services, extensionConfigs, jibContainerBuilder);
}

@VisibleForTesting
JibContainerBuilder runPluginExtensions(
Iterator<JibGradlePluginExtension> services, JibContainerBuilder jibContainerBuilder)
List<JibGradlePluginExtension> services,
List<? extends ExtensionConfiguration> extensionConfigs,
JibContainerBuilder jibContainerBuilder)
throws JibPluginExtensionException {
if (!services.hasNext()) {
log(LogEvent.debug("No Jib plugin extensions discovered"));
if (extensionConfigs.isEmpty()) {
log(LogEvent.debug("No Jib plugin extensions configured to load"));
return jibContainerBuilder;
}

JibGradlePluginExtension extension = null;
ContainerBuildPlan buildPlan = jibContainerBuilder.toContainerBuildPlan();
GradleExtensionLogger extensionLogger = new GradleExtensionLogger(this::log);
try {
while (services.hasNext()) {
extension = services.next();
log(LogEvent.lifecycle("Running extension: " + extension.getClass().getName()));
buildPlan = extension.extendContainerBuildPlan(buildPlan, () -> project, extensionLogger);
for (ExtensionConfiguration config : extensionConfigs) {
String extensionClass = config.getExtensionClass();
extension = findConfiguredExtension(services, extensionClass);
if (extension == null) {
throw new JibPluginExtensionException(
JibGradlePluginExtension.class,
"extension configured but not discovered on Jib runtime classpath: "
+ extensionClass);
}

log(LogEvent.lifecycle("Running extension: " + extensionClass));
buildPlan =
extension.extendContainerBuildPlan(
buildPlan, config.getProperties(), () -> project, extensionLogger);
ImageReference.parse(buildPlan.getBaseImage()); // to validate image reference
}
return jibContainerBuilder.applyContainerBuildPlan(buildPlan);
Expand All @@ -433,4 +447,12 @@ JibContainerBuilder runPluginExtensions(
ex);
}
}

@Nullable
private JibGradlePluginExtension findConfiguredExtension(
List<JibGradlePluginExtension> extensions, String extensionClass) {
Predicate<JibGradlePluginExtension> matchesClassName =
extension -> extension.getClass().getName().equals(extensionClass);
return extensions.stream().filter(matchesClassName).findFirst().orElse(null);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,6 @@
import com.google.cloud.tools.jib.plugins.common.AuthProperty;
import com.google.cloud.tools.jib.plugins.common.RawConfiguration;
import java.nio.file.Path;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.Optional;
Expand Down Expand Up @@ -203,6 +202,6 @@ public Path getImageJsonOutputPath() {

@Override
public List<? extends ExtensionConfiguration> getPluginExtensions() {
return Collections.emptyList();
return jibExtension.getPluginExtensions().get();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
import org.gradle.api.Action;
import org.gradle.api.Project;
import org.gradle.api.model.ObjectFactory;
import org.gradle.api.provider.ListProperty;
import org.gradle.api.provider.Property;
import org.gradle.api.tasks.Input;
import org.gradle.api.tasks.Nested;
Expand Down Expand Up @@ -63,6 +64,10 @@
* }
* allowInsecureRegistries = false
* containerizingMode = 'exploded'
* pluginExtensions {
* implementation = 'com.example.ThirdPartyJibGradleExtension'
* properties = [customKey: 'value]
* }
* }
* }</pre>
*/
Expand All @@ -72,6 +77,8 @@ public class JibExtension {
private static final boolean DEFAULT_ALLOW_INSECURE_REGISTIRIES = false;
private static final String DEFAULT_CONTAINERIZING_MODE = "exploded";

private final Project project;

private final BaseImageParameters from;
private final TargetImageParameters to;
private final ContainerParameters container;
Expand All @@ -81,13 +88,15 @@ public class JibExtension {
private final SkaffoldParameters skaffold;
private final Property<Boolean> allowInsecureRegistries;
private final Property<String> containerizingMode;
private final ListProperty<ExtensionParameters> pluginExtensions;
chanseokoh marked this conversation as resolved.
Show resolved Hide resolved

/**
* Should be called using {@link org.gradle.api.plugins.ExtensionContainer#create}.
*
* @param project the injected gradle project
*/
public JibExtension(Project project) {
this.project = project;
ObjectFactory objectFactory = project.getObjects();

from = objectFactory.newInstance(BaseImageParameters.class);
Expand All @@ -98,6 +107,7 @@ public JibExtension(Project project) {
outputPaths = objectFactory.newInstance(OutputPathsParameters.class, project);
skaffold = objectFactory.newInstance(SkaffoldParameters.class, project);

pluginExtensions = objectFactory.listProperty(ExtensionParameters.class).empty();
allowInsecureRegistries = objectFactory.property(Boolean.class);
containerizingMode = objectFactory.property(String.class);

Expand Down Expand Up @@ -134,6 +144,17 @@ public void skaffold(Action<? super SkaffoldParameters> action) {
action.execute(skaffold);
}

/**
* Adds a new plugin extension configuration to the extensions list.
*
* @param action closure representing an extension configuration
*/
public void pluginExtensions(Action<? super ExtensionParameters> action) {
ExtensionParameters extension = project.getObjects().newInstance(ExtensionParameters.class);
action.execute(extension);
pluginExtensions.add(extension);
}

public void setAllowInsecureRegistries(boolean allowInsecureRegistries) {
this.allowInsecureRegistries.set(allowInsecureRegistries);
}
Expand Down Expand Up @@ -198,4 +219,10 @@ public String getContainerizingMode() {
String property = System.getProperty(PropertyNames.CONTAINERIZING_MODE);
return property != null ? property : containerizingMode.get();
}

@Nested
@Optional
public ListProperty<ExtensionParameters> getPluginExtensions() {
return pluginExtensions;
}
}
Loading