@@ -0,0 +1,57 | |||||
|
1 | package org.implab.gradle.containers; | |||
|
2 | ||||
|
3 | import java.io.File; | |||
|
4 | import java.util.ArrayList; | |||
|
5 | import java.util.List; | |||
|
6 | import java.util.Optional; | |||
|
7 | ||||
|
8 | import org.gradle.api.logging.Logger; | |||
|
9 | ||||
|
10 | public interface ExecuteMixin { | |||
|
11 | ||||
|
12 | Logger getLogger(); | |||
|
13 | ||||
|
14 | Optional<File> getWorkingDir(); | |||
|
15 | ||||
|
16 | default void Execute() throws Exception { | |||
|
17 | final Logger log = getLogger(); | |||
|
18 | ||||
|
19 | List<String> command = new ArrayList<>(); | |||
|
20 | ||||
|
21 | preparingCommand(command); | |||
|
22 | ||||
|
23 | ProcessBuilder builder = new ProcessBuilder(command); | |||
|
24 | getWorkingDir().ifPresent(workingDir -> builder.directory(workingDir)); | |||
|
25 | ||||
|
26 | log.info("Starting: {}", builder.command()); | |||
|
27 | ||||
|
28 | Process p = builder.start(); | |||
|
29 | ||||
|
30 | processStarted(p); | |||
|
31 | ||||
|
32 | if (log.isErrorEnabled()) { | |||
|
33 | Utils.redirectIO(p.getErrorStream(), log::error); | |||
|
34 | } | |||
|
35 | ||||
|
36 | int code = p.waitFor(); | |||
|
37 | if (code != 0) | |||
|
38 | throw new Exception("Process exited with the error: " + code); | |||
|
39 | } | |||
|
40 | ||||
|
41 | void preparingCommand(List<String> command); | |||
|
42 | ||||
|
43 | ||||
|
44 | /** | |||
|
45 | * Invoked after the process is started, can be used to handle the process | |||
|
46 | * output. | |||
|
47 | * | |||
|
48 | * Default implementation redirects output to the logger as INFO messages. | |||
|
49 | * | |||
|
50 | * @param p The current process. | |||
|
51 | */ | |||
|
52 | ||||
|
53 | default void processStarted(Process p) { | |||
|
54 | final Logger log = getLogger(); | |||
|
55 | Utils.redirectIO(p.getInputStream(), log::info); | |||
|
56 | } | |||
|
57 | } |
@@ -0,0 +1,45 | |||||
|
1 | package org.implab.gradle.containers; | |||
|
2 | ||||
|
3 | import java.util.concurrent.Callable; | |||
|
4 | ||||
|
5 | import javax.inject.Inject; | |||
|
6 | ||||
|
7 | import org.gradle.api.file.DirectoryProperty; | |||
|
8 | import org.gradle.api.file.RegularFileProperty; | |||
|
9 | import org.gradle.api.model.ObjectFactory; | |||
|
10 | import org.gradle.api.provider.ListProperty; | |||
|
11 | import org.gradle.api.provider.Property; | |||
|
12 | import org.gradle.api.provider.Provider; | |||
|
13 | import org.gradle.api.provider.ProviderFactory; | |||
|
14 | ||||
|
15 | public interface PropertiesMixin { | |||
|
16 | @Inject | |||
|
17 | ObjectFactory getObjectFactory(); | |||
|
18 | ||||
|
19 | @Inject | |||
|
20 | ProviderFactory getProviders(); | |||
|
21 | ||||
|
22 | default <T> Provider<T> provider(Callable<? extends T> callable) { | |||
|
23 | return getProviders().provider(callable); | |||
|
24 | } | |||
|
25 | ||||
|
26 | default <T> Property<T> property(Class<T> clazz) { | |||
|
27 | return getObjectFactory().property(clazz); | |||
|
28 | } | |||
|
29 | ||||
|
30 | default <T> ListProperty<T> listProperty(Class<T> clazz) { | |||
|
31 | return getObjectFactory().listProperty(clazz); | |||
|
32 | } | |||
|
33 | ||||
|
34 | default RegularFileProperty fileProperty() { | |||
|
35 | return getObjectFactory().fileProperty(); | |||
|
36 | } | |||
|
37 | ||||
|
38 | default DirectoryProperty directoryProperty() { | |||
|
39 | return getObjectFactory().directoryProperty(); | |||
|
40 | } | |||
|
41 | ||||
|
42 | ||||
|
43 | ||||
|
44 | ||||
|
45 | } |
@@ -0,0 +1,91 | |||||
|
1 | package org.implab.gradle.containers; | |||
|
2 | ||||
|
3 | import java.io.ByteArrayOutputStream; | |||
|
4 | import java.io.Closeable; | |||
|
5 | import java.io.File; | |||
|
6 | import java.io.FileOutputStream; | |||
|
7 | import java.io.IOException; | |||
|
8 | import java.io.InputStream; | |||
|
9 | import java.io.OutputStream; | |||
|
10 | import java.util.Scanner; | |||
|
11 | ||||
|
12 | import org.gradle.api.Action; | |||
|
13 | ||||
|
14 | import groovy.json.JsonGenerator; | |||
|
15 | import groovy.json.JsonOutput; | |||
|
16 | import groovy.json.JsonGenerator.Converter; | |||
|
17 | import groovy.lang.Closure; | |||
|
18 | ||||
|
19 | public final class Utils { | |||
|
20 | public static void redirectIO(final InputStream src, final Action<String> consumer) { | |||
|
21 | new Thread(() -> { | |||
|
22 | try (Scanner sc = new Scanner(src)) { | |||
|
23 | while (sc.hasNextLine()) { | |||
|
24 | consumer.execute(sc.nextLine()); | |||
|
25 | } | |||
|
26 | } | |||
|
27 | }).start(); | |||
|
28 | } | |||
|
29 | ||||
|
30 | public static void redirectIO(final InputStream src, final File file) { | |||
|
31 | new Thread(() -> { | |||
|
32 | try (OutputStream out = new FileOutputStream(file)) { | |||
|
33 | src.transferTo(out); | |||
|
34 | } catch (Exception e) { | |||
|
35 | // silence! | |||
|
36 | } | |||
|
37 | }).start(); | |||
|
38 | } | |||
|
39 | ||||
|
40 | public static void closeSilent(Closeable handle) { | |||
|
41 | try { | |||
|
42 | handle.close(); | |||
|
43 | } catch (Exception e) { | |||
|
44 | // silence! | |||
|
45 | } | |||
|
46 | } | |||
|
47 | ||||
|
48 | public static String readAll(final InputStream src) throws IOException { | |||
|
49 | ByteArrayOutputStream out = new ByteArrayOutputStream(); | |||
|
50 | src.transferTo(out); | |||
|
51 | return out.toString(); | |||
|
52 | } | |||
|
53 | ||||
|
54 | public static String readAll(final InputStream src, String charset) throws IOException { | |||
|
55 | ByteArrayOutputStream out = new ByteArrayOutputStream(); | |||
|
56 | src.transferTo(out); | |||
|
57 | return out.toString(charset); | |||
|
58 | } | |||
|
59 | ||||
|
60 | public static JsonGenerator createDefaultJsonGenerator() { | |||
|
61 | return new JsonGenerator.Options() | |||
|
62 | .excludeNulls() | |||
|
63 | .addConverter(new Converter() { | |||
|
64 | public boolean handles(Class<?> type) { | |||
|
65 | return (File.class == type); | |||
|
66 | } | |||
|
67 | ||||
|
68 | public Object convert(Object value, String key) { | |||
|
69 | return ((File) value).getPath(); | |||
|
70 | } | |||
|
71 | }) | |||
|
72 | .build(); | |||
|
73 | } | |||
|
74 | ||||
|
75 | public static String toJsonPretty(Object value) { | |||
|
76 | return JsonOutput.prettyPrint(createDefaultJsonGenerator().toJson(value)); | |||
|
77 | } | |||
|
78 | ||||
|
79 | public static boolean isNullOrEmptyString(String value) { | |||
|
80 | return (value == null || value.length() == 0); | |||
|
81 | } | |||
|
82 | ||||
|
83 | public static <T> Action<T> wrapClosure(Closure<?> closure) { | |||
|
84 | return x -> { | |||
|
85 | closure.setDelegate(x); | |||
|
86 | closure.setResolveStrategy(Closure.DELEGATE_FIRST); | |||
|
87 | closure.call(x); | |||
|
88 | }; | |||
|
89 | } | |||
|
90 | ||||
|
91 | } No newline at end of file |
@@ -0,0 +1,10 | |||||
|
1 | package org.implab.gradle.containers.tasks; | |||
|
2 | ||||
|
3 | public class MountSpec { | |||
|
4 | ||||
|
5 | String destination; | |||
|
6 | ||||
|
7 | String source; | |||
|
8 | ||||
|
9 | boolean readOnly; | |||
|
10 | } |
@@ -0,0 +1,54 | |||||
|
1 | package org.implab.gradle.containers.tasks; | |||
|
2 | ||||
|
3 | import java.util.ArrayList; | |||
|
4 | import java.util.Collection; | |||
|
5 | import java.util.List; | |||
|
6 | ||||
|
7 | import org.gradle.api.Action; | |||
|
8 | import org.gradle.api.provider.ListProperty; | |||
|
9 | import org.gradle.api.provider.Property; | |||
|
10 | import org.gradle.api.tasks.Input; | |||
|
11 | import org.gradle.api.tasks.Optional; | |||
|
12 | import org.implab.gradle.containers.ImageName; | |||
|
13 | ||||
|
14 | public abstract class RunImage extends DockerCliTask { | |||
|
15 | ||||
|
16 | public final String RUN_COMMAND = "run"; | |||
|
17 | ||||
|
18 | @Input | |||
|
19 | @Optional | |||
|
20 | public abstract ListProperty<String> getOptions(); | |||
|
21 | ||||
|
22 | @Input | |||
|
23 | public abstract Property<ImageName> getImageName(); | |||
|
24 | ||||
|
25 | @Input | |||
|
26 | @Optional | |||
|
27 | public abstract ListProperty<String> getCommandLine(); | |||
|
28 | ||||
|
29 | @Override | |||
|
30 | protected java.util.Optional<String> getSubCommand() { | |||
|
31 | return java.util.Optional.of(RUN_COMMAND); | |||
|
32 | } | |||
|
33 | ||||
|
34 | @Override | |||
|
35 | protected Collection<String> getSubCommandArguments() { | |||
|
36 | List<String> args = new ArrayList<String>(); | |||
|
37 | ||||
|
38 | args.addAll(getOptions().get()); | |||
|
39 | args.add(getImageName().get().toString()); | |||
|
40 | args.addAll(getCommandLine().get()); | |||
|
41 | ||||
|
42 | return args; | |||
|
43 | } | |||
|
44 | ||||
|
45 | public void volume(Action<VolumeSpec> configure) { | |||
|
46 | getOptions().add("-v"); | |||
|
47 | getOptions().add(provider(() -> { | |||
|
48 | var volumeSpec = getObjectFactory().newInstance(VolumeSpec.class); | |||
|
49 | configure.execute(volumeSpec); | |||
|
50 | return volumeSpec.resolveSpec(); | |||
|
51 | })); | |||
|
52 | } | |||
|
53 | ||||
|
54 | } |
@@ -0,0 +1,34 | |||||
|
1 | package org.implab.gradle.containers.tasks; | |||
|
2 | ||||
|
3 | import java.util.ArrayList; | |||
|
4 | ||||
|
5 | import org.gradle.api.provider.ListProperty; | |||
|
6 | import org.gradle.api.provider.Property; | |||
|
7 | ||||
|
8 | public abstract class VolumeSpec { | |||
|
9 | ||||
|
10 | public abstract Property<String> getSource(); | |||
|
11 | ||||
|
12 | public abstract Property<String> getTarget(); | |||
|
13 | ||||
|
14 | public abstract ListProperty<String> getOptions(); | |||
|
15 | ||||
|
16 | public void ro() { | |||
|
17 | getOptions().add("ro"); | |||
|
18 | } | |||
|
19 | ||||
|
20 | public String resolveSpec() { | |||
|
21 | var parts = new ArrayList<String>(); | |||
|
22 | ||||
|
23 | if (getSource().isPresent()) | |||
|
24 | parts.add(getSource().get()); | |||
|
25 | ||||
|
26 | parts.add(getTarget().get()); | |||
|
27 | ||||
|
28 | if (getOptions().isPresent()) | |||
|
29 | parts.add(String.join(",", getOptions().get())); | |||
|
30 | ||||
|
31 | return String.join(":", parts); | |||
|
32 | } | |||
|
33 | ||||
|
34 | } |
@@ -0,0 +1,7 | |||||
|
1 | subprojects { p -> | |||
|
2 | plugins.withId('java') { | |||
|
3 | p.base { | |||
|
4 | archivesBaseName = "$rootProject.name-$p.name"; | |||
|
5 | } | |||
|
6 | } | |||
|
7 | } No newline at end of file |
@@ -1,6 +1,8 | |||||
1 | plugins { |
|
1 | plugins { | |
2 | id "java-gradle-plugin" |
|
2 | id "java-gradle-plugin" | |
3 |
id "com.gradle.plugin-publish" version " |
|
3 | id "com.gradle.plugin-publish" version "1.2.1" | |
|
4 | // Maven Publish Plugin applied by com.gradle.plugin-publish > 1.0 | |||
|
5 | id "ivy-publish" | |||
4 | } |
|
6 | } | |
5 |
|
7 | |||
6 |
|
8 | |||
@@ -9,19 +11,30 repositories { | |||||
9 | } |
|
11 | } | |
10 |
|
12 | |||
11 | gradlePlugin { |
|
13 | gradlePlugin { | |
|
14 | website = 'https://code.implab.org/implab/gradle-container-plugin' | |||
|
15 | vcsUrl = 'https://code.implab.org/implab/gradle-container-plugin' | |||
12 | plugins { |
|
16 | plugins { | |
13 | containerPlugin { |
|
17 | containerPlugin { | |
14 | id = 'org.implab.gradle-container' |
|
18 | id = 'org.implab.gradle-container' | |
15 | displayName = "Container building plugin" |
|
19 | displayName = "Container building plugin" | |
16 | description = 'Build and publish container images with docker or podman. Simple wrapper around cli.' |
|
20 | description = 'Build and publish container images with docker or podman. Simple wrapper around cli.' | |
17 | implementationClass = 'org.implab.gradle.containers.ContainerPlugin' |
|
21 | implementationClass = 'org.implab.gradle.containers.ContainerPlugin' | |
|
22 | tags.set(['containers', 'image', 'docker', 'podman']) | |||
18 | } |
|
23 | } | |
19 | } |
|
24 | } | |
20 | } |
|
25 | } | |
21 |
|
26 | |||
22 | pluginBundle { |
|
27 | ||
23 | website = 'https://code.implab.org/implab/gradle-container-plugin' |
|
28 | task printVersion { | |
24 | vcsUrl = 'https://code.implab.org/implab/gradle-container-plugin' |
|
29 | doLast { | |
|
30 | println "${->jar.archiveFileName.get()}" | |||
|
31 | } | |||
|
32 | } | |||
25 |
|
33 | |||
26 | tags = ['containers', 'image', 'docker', 'podman'] |
|
34 | publishing { | |
|
35 | repositories { | |||
|
36 | ivy { | |||
|
37 | url "${System.properties["user.home"]}/ivy-repo" | |||
27 | } |
|
38 | } | |
|
39 | } | |||
|
40 | } |
@@ -1,2 +1,2 | |||||
1 | group=org.implab.gradle |
|
1 | group=org.implab.gradle | |
2 |
version=1.1. |
|
2 | version=1.1.2 No newline at end of file |
@@ -11,6 +11,7 import org.gradle.api.tasks.Delete; | |||||
11 | import org.gradle.api.tasks.TaskProvider; |
|
11 | import org.gradle.api.tasks.TaskProvider; | |
12 | import org.implab.gradle.containers.tasks.BuildImage; |
|
12 | import org.implab.gradle.containers.tasks.BuildImage; | |
13 | import org.implab.gradle.containers.tasks.PushImage; |
|
13 | import org.implab.gradle.containers.tasks.PushImage; | |
|
14 | import org.implab.gradle.containers.tasks.RunImage; | |||
14 | import org.implab.gradle.containers.tasks.SaveImage; |
|
15 | import org.implab.gradle.containers.tasks.SaveImage; | |
15 | import org.implab.gradle.containers.tasks.TagImage; |
|
16 | import org.implab.gradle.containers.tasks.TagImage; | |
16 |
|
17 | |||
@@ -24,6 +25,12 public class ContainerPlugin implements | |||||
24 |
|
25 | |||
25 | private ContainerExtension containerExtension; |
|
26 | private ContainerExtension containerExtension; | |
26 |
|
27 | |||
|
28 | void exportClasses(Project project, Class<?>... classes) { | |||
|
29 | ExtraPropertiesExtension extras = project.getExtensions().getExtraProperties(); | |||
|
30 | for (var clazz : classes) | |||
|
31 | extras.set(clazz.getSimpleName(), clazz); | |||
|
32 | } | |||
|
33 | ||||
27 | public void apply(Project project) { |
|
34 | public void apply(Project project) { | |
28 | ObjectFactory factory = project.getObjects(); |
|
35 | ObjectFactory factory = project.getObjects(); | |
29 | ProjectLayout layout = project.getLayout(); |
|
36 | ProjectLayout layout = project.getLayout(); | |
@@ -37,11 +44,9 public class ContainerPlugin implements | |||||
37 |
|
44 | |||
38 | project.getExtensions().add(CONTAINER_EXTENSION_NAME, containerExtension); |
|
45 | project.getExtensions().add(CONTAINER_EXTENSION_NAME, containerExtension); | |
39 |
|
46 | |||
40 | ExtraPropertiesExtension extras = project.getExtensions().getExtraProperties(); |
|
47 | exportClasses( | |
41 | extras.set(BuildImage.class.getSimpleName(), BuildImage.class); |
|
48 | project, | |
42 | extras.set(PushImage.class.getSimpleName(), PushImage.class); |
|
49 | BuildImage.class, PushImage.class, SaveImage.class, TagImage.class, RunImage.class); | |
43 | extras.set(SaveImage.class.getSimpleName(), SaveImage.class); |
|
|||
44 | extras.set(TagImage.class.getSimpleName(), TagImage.class); |
|
|||
45 |
|
50 | |||
46 | project.getConfigurations().create(Dependency.DEFAULT_CONFIGURATION, c -> { |
|
51 | project.getConfigurations().create(Dependency.DEFAULT_CONFIGURATION, c -> { | |
47 | c.setCanBeConsumed(true); |
|
52 | c.setCanBeConsumed(true); | |
@@ -88,7 +93,8 public class ContainerPlugin implements | |||||
88 | t.getImage().set(buildImageTask.flatMap(b -> b.getImageName())); |
|
93 | t.getImage().set(buildImageTask.flatMap(b -> b.getImageName())); | |
89 | }); |
|
94 | }); | |
90 |
|
95 | |||
91 |
project.getArtifacts().add(Dependency.DEFAULT_CONFIGURATION, buildImageTask.flatMap(x -> x.getImageIdFile()), |
|
96 | project.getArtifacts().add(Dependency.DEFAULT_CONFIGURATION, buildImageTask.flatMap(x -> x.getImageIdFile()), | |
|
97 | t -> { | |||
92 | t.builtBy(buildImageTask); |
|
98 | t.builtBy(buildImageTask); | |
93 | }); |
|
99 | }); | |
94 | } |
|
100 | } |
@@ -1,43 +1,96 | |||||
1 | package org.implab.gradle.containers.tasks; |
|
1 | package org.implab.gradle.containers.tasks; | |
2 |
|
2 | |||
|
3 | import java.util.ArrayList; | |||
|
4 | import java.util.Collection; | |||
|
5 | import java.util.Collections; | |||
|
6 | import java.util.HashMap; | |||
3 | import java.util.List; |
|
7 | import java.util.List; | |
|
8 | import java.util.Map; | |||
|
9 | import java.util.Optional; | |||
4 |
|
10 | |||
|
11 | import org.gradle.api.Action; | |||
5 | import org.gradle.api.file.DirectoryProperty; |
|
12 | import org.gradle.api.file.DirectoryProperty; | |
6 | import org.gradle.api.file.RegularFileProperty; |
|
13 | import org.gradle.api.file.RegularFileProperty; | |
|
14 | import org.gradle.api.provider.ListProperty; | |||
|
15 | import org.gradle.api.provider.MapProperty; | |||
7 | import org.gradle.api.provider.Property; |
|
16 | import org.gradle.api.provider.Property; | |
|
17 | import org.gradle.api.provider.Provider; | |||
8 | import org.gradle.api.tasks.Input; |
|
18 | import org.gradle.api.tasks.Input; | |
9 | import org.gradle.api.tasks.InputDirectory; |
|
19 | import org.gradle.api.tasks.InputDirectory; | |
10 | import org.gradle.api.tasks.OutputFile; |
|
20 | import org.gradle.api.tasks.OutputFile; | |
11 | import org.gradle.api.tasks.SkipWhenEmpty; |
|
21 | import org.gradle.api.tasks.SkipWhenEmpty; | |
12 | import org.implab.gradle.Utils; |
|
|||
13 | import org.implab.gradle.containers.ImageName; |
|
22 | import org.implab.gradle.containers.ImageName; | |
|
23 | import org.implab.gradle.containers.Utils; | |||
14 |
|
24 | |||
15 | public abstract class BuildImage extends CliTask { |
|
25 | import groovy.lang.Closure; | |
|
26 | ||||
|
27 | public abstract class BuildImage extends DockerCliTask { | |||
|
28 | ||||
|
29 | public final String BUILD_COMMAND = "build"; | |||
|
30 | ||||
16 | @InputDirectory |
|
31 | @InputDirectory | |
17 | @SkipWhenEmpty |
|
32 | @SkipWhenEmpty | |
18 | public abstract DirectoryProperty getContextDirectory(); |
|
33 | public abstract DirectoryProperty getContextDirectory(); | |
19 |
|
34 | |||
20 | @Input |
|
35 | @Input | |
|
36 | public abstract MapProperty<String, String> getBuildArgs(); | |||
|
37 | ||||
|
38 | @Input | |||
|
39 | public abstract ListProperty<String> getExtraCommandArgs(); | |||
|
40 | ||||
|
41 | @Input | |||
|
42 | public abstract Property<String> getBuildTarget(); | |||
|
43 | ||||
|
44 | @Input | |||
21 | public abstract Property<ImageName> getImageName(); |
|
45 | public abstract Property<ImageName> getImageName(); | |
22 |
|
46 | |||
23 | @OutputFile |
|
47 | @OutputFile | |
24 | public abstract RegularFileProperty getImageIdFile(); |
|
48 | public abstract RegularFileProperty getImageIdFile(); | |
25 |
|
49 | |||
26 | public BuildImage() { |
|
50 | public void buildArgs(Action<Map<String, String>> spec) { | |
|
51 | getBuildArgs().putAll(provider(() -> { | |||
|
52 | Map<String, String> args = new HashMap<>(); | |||
|
53 | spec.execute(args); | |||
|
54 | return args; | |||
|
55 | })); | |||
|
56 | } | |||
27 |
|
57 | |||
28 | setWorkingDir(getContextDirectory().getAsFile()); |
|
58 | public void buildArgs(Closure<Map<String, String>> spec) { | |
|
59 | buildArgs(Utils.wrapClosure(spec)); | |||
|
60 | } | |||
|
61 | ||||
|
62 | @Override | |||
|
63 | protected Optional<String> getSubCommand() { | |||
|
64 | return Optional.of(BUILD_COMMAND); | |||
29 | } |
|
65 | } | |
30 |
|
66 | |||
31 | @Override |
|
67 | @Override | |
32 | protected void preparingCommand(List<String> commandLine) { |
|
68 | protected Collection<String> getSubCommandArguments() { | |
33 | super.preparingCommand(commandLine); |
|
69 | List<String> args = new ArrayList<>(); | |
34 |
|
70 | |||
35 | commandLine.addAll(List.of("build", ".", "-q", "-t")); |
|
71 | args.addAll(List.of( | |
36 |
|
|
72 | "-t", getImageName().get().toString(), | |
|
73 | "--iidfile", getImageIdFile().getAsFile().get().toString())); | |||
|
74 | ||||
|
75 | if (imageBuildArgs.isPresent()) { | |||
|
76 | imageBuildArgs.get().forEach((k, v) -> { | |||
|
77 | args.add("--build-arg"); | |||
|
78 | args.add(String.format("%s=%s", k, v)); | |||
|
79 | }); | |||
37 | } |
|
80 | } | |
38 |
|
81 | |||
39 | @Override |
|
82 | // add --target if specified for multi-stage build | |
40 | protected void processStarted(Process p) { |
|
83 | if (getBuildTarget().isPresent()) { | |
41 | Utils.redirectIO(p.getInputStream(), getImageIdFile().get().getAsFile()); |
|
84 | args.add("--target"); | |
|
85 | args.add(getBuildTarget().get()); | |||
|
86 | } | |||
|
87 | ||||
|
88 | // add extra parameters | |||
|
89 | getExtraCommandArgs().getOrElse(Collections.emptyList()) | |||
|
90 | .forEach(args::add); | |||
|
91 | ||||
|
92 | args.add(getContextDirectory().getAsFile().get().toString()); | |||
|
93 | ||||
|
94 | return args; | |||
42 | } |
|
95 | } | |
43 | } |
|
96 | } |
@@ -1,30 +1,43 | |||||
1 | package org.implab.gradle.containers.tasks; |
|
1 | package org.implab.gradle.containers.tasks; | |
2 |
|
2 | |||
3 | import java.io.File; |
|
3 | import java.io.File; | |
4 |
import java.util. |
|
4 | import java.util.Collection; | |
|
5 | import java.util.Collections; | |||
5 | import java.util.List; |
|
6 | import java.util.List; | |
|
7 | import java.util.Optional; | |||
6 |
|
8 | |||
7 | import org.gradle.api.DefaultTask; |
|
9 | import org.gradle.api.DefaultTask; | |
8 |
import org.gradle.api. |
|
10 | import org.gradle.api.file.DirectoryProperty; | |
9 | import org.gradle.api.provider.Property; |
|
11 | import org.gradle.api.provider.Property; | |
10 | import org.gradle.api.provider.Provider; |
|
12 | import org.gradle.api.provider.Provider; | |
11 | import org.gradle.api.tasks.Input; |
|
13 | import org.gradle.api.tasks.Input; | |
12 | import org.gradle.api.tasks.Internal; |
|
14 | import org.gradle.api.tasks.Internal; | |
13 | import org.gradle.api.tasks.TaskAction; |
|
15 | import org.gradle.api.tasks.TaskAction; | |
14 | import org.implab.gradle.Utils; |
|
|||
15 | import org.implab.gradle.containers.ContainerExtension; |
|
16 | import org.implab.gradle.containers.ContainerExtension; | |
|
17 | import org.implab.gradle.containers.ExecuteMixin; | |||
|
18 | import org.implab.gradle.containers.PropertiesMixin; | |||
16 |
|
19 | |||
17 | public abstract class CliTask extends DefaultTask { |
|
20 | public abstract class DockerCliTask extends DefaultTask implements PropertiesMixin, ExecuteMixin { | |
18 |
|
21 | |||
19 | private final Property<String> cliCmd; |
|
22 | private final Property<String> cliCmd; | |
20 |
|
23 | |||
21 |
private final Property |
|
24 | private final DirectoryProperty workingDir; | |
|
25 | ||||
|
26 | public DockerCliTask() { | |||
|
27 | cliCmd = property(String.class) | |||
|
28 | .convention(getContainerExtension().getCliCmd()); | |||
|
29 | ||||
|
30 | workingDir = directoryProperty(); | |||
|
31 | } | |||
22 |
|
32 | |||
23 | public CliTask() { |
|
33 | @Internal | |
24 | cliCmd = getProject().getObjects().property(String.class); |
|
34 | protected Optional<String> getSubCommand() { | |
25 | cliCmd.convention(getContainerExtension().getCliCmd()); |
|
35 | return Optional.empty(); | |
|
36 | } | |||
26 |
|
37 | |||
27 | workingDir = getProject().getObjects().property(File.class); |
|
38 | @Internal | |
|
39 | protected Collection<String> getSubCommandArguments() { | |||
|
40 | return Collections.emptyList(); | |||
28 | } |
|
41 | } | |
29 |
|
42 | |||
30 | @Input |
|
43 | @Input | |
@@ -43,51 +56,26 public abstract class CliTask extends De | |||||
43 |
|
56 | |||
44 | @TaskAction |
|
57 | @TaskAction | |
45 | public void Run() throws Exception { |
|
58 | public void Run() throws Exception { | |
46 | final Logger log = getLogger(); |
|
59 | Execute(); | |
47 |
|
||||
48 | List<String> args = new ArrayList<>(); |
|
|||
49 | preparingCommand(args); |
|
|||
50 |
|
||||
51 | ProcessBuilder builder = new ProcessBuilder(args); |
|
|||
52 | if (workingDir.isPresent()) |
|
|||
53 | builder.directory(workingDir.get()); |
|
|||
54 |
|
||||
55 | log.info("Starting: {}", builder.command()); |
|
|||
56 |
|
||||
57 | Process p = builder.start(); |
|
|||
58 |
|
||||
59 | processStarted(p); |
|
|||
60 |
|
||||
61 | if (log.isErrorEnabled()) { |
|
|||
62 | Utils.redirectIO(p.getErrorStream(), log::error); |
|
|||
63 |
|
|
60 | } | |
64 |
|
61 | |||
65 | int code = p.waitFor(); |
|
62 | public void preparingCommand(List<String> commandLine) { | |
66 | if (code != 0) |
|
63 | commandLine.add(cliCmd.get()); | |
67 | throw new Exception("Process exited with the error: " + code); |
|
64 | getSubCommand().ifPresent(commandLine::add); | |
|
65 | getSubCommandArguments().forEach(commandLine::add); | |||
68 | } |
|
66 | } | |
69 |
|
67 | |||
70 | protected void preparingCommand(List<String> commandLine) { |
|
68 | @Override | |
71 | commandLine.add(cliCmd.get()); |
|
69 | @Internal | |
|
70 | public Optional<File> getWorkingDir() { | |||
|
71 | return Optional.ofNullable(workingDir.get().getAsFile()); | |||
72 | } |
|
72 | } | |
73 |
|
73 | |||
74 | protected void setWorkingDir(Provider<File> workingDir) { |
|
74 | protected void setWorkingDir(Provider<File> workingDir) { | |
75 |
this.workingDir. |
|
75 | this.workingDir.fileProvider(workingDir); | |
76 | } |
|
76 | } | |
77 |
|
77 | |||
78 | protected void setWorkingDir(File workingDir) { |
|
78 | protected void setWorkingDir(File workingDir) { | |
79 | this.workingDir.set(workingDir); |
|
79 | this.workingDir.set(workingDir); | |
80 | } |
|
80 | } | |
81 |
|
||||
82 |
|
||||
83 | /** Invoked after the process is started, can be used to handle the process output. |
|
|||
84 | * |
|
|||
85 | * Default implemetation redirects output to the logger as INFO messages. |
|
|||
86 | * |
|
|||
87 | * @param p The current process. |
|
|||
88 | */ |
|
|||
89 | protected void processStarted(Process p) { |
|
|||
90 | final Logger log = getLogger(); |
|
|||
91 | Utils.redirectIO(p.getInputStream(), log::info); |
|
|||
92 | } |
|
81 | } | |
93 | } |
|
@@ -1,5 +1,7 | |||||
1 | package org.implab.gradle.containers.tasks; |
|
1 | package org.implab.gradle.containers.tasks; | |
2 |
|
2 | |||
|
3 | import java.util.ArrayList; | |||
|
4 | import java.util.Collection; | |||
3 | import java.util.List; |
|
5 | import java.util.List; | |
4 | import java.util.concurrent.Callable; |
|
6 | import java.util.concurrent.Callable; | |
5 |
|
7 | |||
@@ -9,7 +11,9 import org.gradle.api.tasks.Input; | |||||
9 | import org.gradle.api.tasks.Optional; |
|
11 | import org.gradle.api.tasks.Optional; | |
10 | import org.implab.gradle.containers.ImageName; |
|
12 | import org.implab.gradle.containers.ImageName; | |
11 |
|
13 | |||
12 | public abstract class PushImage extends CliTask { |
|
14 | public abstract class PushImage extends DockerCliTask { | |
|
15 | ||||
|
16 | public final String PUSH_COMMAND = "push"; | |||
13 |
|
17 | |||
14 | @Input |
|
18 | @Input | |
15 | public abstract Property<ImageName> getImageName(); |
|
19 | public abstract Property<ImageName> getImageName(); | |
@@ -28,11 +32,17 public abstract class PushImage extends | |||||
28 | } |
|
32 | } | |
29 |
|
33 | |||
30 | @Override |
|
34 | @Override | |
31 | protected void preparingCommand(List<String> commandLine) { |
|
35 | protected java.util.Optional<String> getSubCommand() { | |
32 | super.preparingCommand(commandLine); |
|
36 | return java.util.Optional.of(PUSH_COMMAND); | |
|
37 | } | |||
33 |
|
38 | |||
34 | commandLine.add("push"); |
|
39 | @Override | |
35 | commandLine.addAll(getOptions().get()); |
|
40 | protected Collection<String> getSubCommandArguments() { | |
36 | commandLine.add(getImageName().get().toString()); |
|
41 | List<String> args = new ArrayList<>(); | |
|
42 | ||||
|
43 | args.addAll(getOptions().get()); | |||
|
44 | args.add(getImageName().get().toString()); | |||
|
45 | ||||
|
46 | return args; | |||
37 | } |
|
47 | } | |
38 | } |
|
48 | } |
@@ -1,6 +1,7 | |||||
1 | package org.implab.gradle.containers.tasks; |
|
1 | package org.implab.gradle.containers.tasks; | |
2 |
|
2 | |||
3 | import java.util.ArrayList; |
|
3 | import java.util.ArrayList; | |
|
4 | import java.util.Collection; | |||
4 | import java.util.List; |
|
5 | import java.util.List; | |
5 | import java.util.Optional; |
|
6 | import java.util.Optional; | |
6 |
|
7 | |||
@@ -12,10 +13,10 import org.gradle.api.tasks.Input; | |||||
12 | import org.gradle.api.tasks.Internal; |
|
13 | import org.gradle.api.tasks.Internal; | |
13 | import org.gradle.api.tasks.OutputFile; |
|
14 | import org.gradle.api.tasks.OutputFile; | |
14 | import org.gradle.api.tasks.TaskExecutionException; |
|
15 | import org.gradle.api.tasks.TaskExecutionException; | |
15 | import org.implab.gradle.Utils; |
|
|||
16 | import org.implab.gradle.containers.ImageName; |
|
16 | import org.implab.gradle.containers.ImageName; | |
17 |
|
17 | |||
18 | public abstract class SaveImage extends CliTask { |
|
18 | public abstract class SaveImage extends DockerCliTask { | |
|
19 | public final String SAVE_COMMAND = "save"; | |||
19 |
|
20 | |||
20 | @Input |
|
21 | @Input | |
21 | public abstract Property<ImageName> getImage(); |
|
22 | public abstract Property<ImageName> getImage(); | |
@@ -44,9 +45,9 public abstract class SaveImage extends | |||||
44 | public abstract Property<String> getArchiveExtension(); |
|
45 | public abstract Property<String> getArchiveExtension(); | |
45 |
|
46 | |||
46 | public SaveImage() { |
|
47 | public SaveImage() { | |
47 |
getArchiveFileName().convention( |
|
48 | getArchiveFileName().convention(provider(this::conventionalArchiveFileName)); | |
48 |
getArchiveBaseName().convention( |
|
49 | getArchiveBaseName().convention(provider(this::conventionalArchiveBaseName)); | |
49 |
getArchiveVersion().convention( |
|
50 | getArchiveVersion().convention(provider(() -> getProject().getVersion()).map(x -> x.toString())); | |
50 | getDestinationDirectory().convention(getProject().getLayout().getBuildDirectory()); |
|
51 | getDestinationDirectory().convention(getProject().getLayout().getBuildDirectory()); | |
51 | getArchiveExtension().convention("tar"); |
|
52 | getArchiveExtension().convention("tar"); | |
52 | } |
|
53 | } | |
@@ -77,15 +78,15 public abstract class SaveImage extends | |||||
77 | } |
|
78 | } | |
78 |
|
79 | |||
79 | @Override |
|
80 | @Override | |
80 |
protected |
|
81 | protected Optional<String> getSubCommand() { | |
81 | super.preparingCommand(commandLine); |
|
82 | return Optional.of(SAVE_COMMAND); | |
82 |
|
||||
83 | commandLine.add("save"); |
|
|||
84 | commandLine.add(getImage().get().toString()); |
|
|||
85 | } |
|
83 | } | |
86 |
|
84 | |||
87 | @Override |
|
85 | @Override | |
88 | protected void processStarted(Process p) { |
|
86 | protected Collection<String> getSubCommandArguments() { | |
89 | Utils.redirectIO(p.getInputStream(), getArchiveFile().get().getAsFile()); |
|
87 | return List.of( | |
|
88 | getImage().get().toString(), | |||
|
89 | getArchiveFile().get().getAsFile().toString() | |||
|
90 | ); | |||
90 | } |
|
91 | } | |
91 | } |
|
92 | } |
@@ -1,5 +1,7 | |||||
1 | package org.implab.gradle.containers.tasks; |
|
1 | package org.implab.gradle.containers.tasks; | |
2 |
|
2 | |||
|
3 | import java.util.ArrayList; | |||
|
4 | import java.util.Collection; | |||
3 | import java.util.List; |
|
5 | import java.util.List; | |
4 | import java.util.concurrent.Callable; |
|
6 | import java.util.concurrent.Callable; | |
5 |
|
7 | |||
@@ -9,7 +11,8 import org.gradle.api.tasks.Input; | |||||
9 | import org.gradle.api.tasks.Optional; |
|
11 | import org.gradle.api.tasks.Optional; | |
10 | import org.implab.gradle.containers.ImageName; |
|
12 | import org.implab.gradle.containers.ImageName; | |
11 |
|
13 | |||
12 | public abstract class TagImage extends CliTask { |
|
14 | public abstract class TagImage extends DockerCliTask { | |
|
15 | public final String TAG_COMMAND = "tag"; | |||
13 |
|
16 | |||
14 | @Input |
|
17 | @Input | |
15 | public abstract Property<ImageName> getSrcImage(); |
|
18 | public abstract Property<ImageName> getSrcImage(); | |
@@ -31,12 +34,18 public abstract class TagImage extends C | |||||
31 | } |
|
34 | } | |
32 |
|
35 | |||
33 | @Override |
|
36 | @Override | |
34 | protected void preparingCommand(List<String> commandLine) { |
|
37 | protected java.util.Optional<String> getSubCommand() { | |
35 | super.preparingCommand(commandLine); |
|
38 | return java.util.Optional.of(TAG_COMMAND); | |
|
39 | } | |||
36 |
|
40 | |||
37 | commandLine.add("tag"); |
|
41 | @Override | |
38 | commandLine.addAll(getOptions().get()); |
|
42 | protected Collection<String> getSubCommandArguments() { | |
39 | commandLine.add(getSrcImage().get().toString()); |
|
43 | List<String> args = new ArrayList<>(); | |
40 | commandLine.add(getDestImage().get().toString()); |
|
44 | ||
|
45 | args.addAll(getOptions().get()); | |||
|
46 | args.add(getSrcImage().get().toString()); | |||
|
47 | args.add(getDestImage().get().toString()); | |||
|
48 | ||||
|
49 | return args; | |||
41 | } |
|
50 | } | |
42 | } |
|
51 | } |
1 | NO CONTENT: modified file, binary diff hidden |
|
NO CONTENT: modified file, binary diff hidden |
@@ -1,5 +1,7 | |||||
1 | distributionBase=GRADLE_USER_HOME |
|
1 | distributionBase=GRADLE_USER_HOME | |
2 | distributionPath=wrapper/dists |
|
2 | distributionPath=wrapper/dists | |
3 |
distributionUrl=https\://services.gradle.org/distributions/gradle- |
|
3 | distributionUrl=https\://services.gradle.org/distributions/gradle-8.4-bin.zip | |
|
4 | networkTimeout=10000 | |||
|
5 | validateDistributionUrl=true | |||
4 | zipStoreBase=GRADLE_USER_HOME |
|
6 | zipStoreBase=GRADLE_USER_HOME | |
5 | zipStorePath=wrapper/dists |
|
7 | zipStorePath=wrapper/dists |
@@ -1,7 +1,7 | |||||
1 |
#!/ |
|
1 | #!/bin/sh | |
2 |
|
2 | |||
3 | # |
|
3 | # | |
4 |
# Copyright 2015 the original |
|
4 | # Copyright © 2015-2021 the original authors. | |
5 | # |
|
5 | # | |
6 | # Licensed under the Apache License, Version 2.0 (the "License"); |
|
6 | # Licensed under the Apache License, Version 2.0 (the "License"); | |
7 | # you may not use this file except in compliance with the License. |
|
7 | # you may not use this file except in compliance with the License. | |
@@ -17,78 +17,111 | |||||
17 | # |
|
17 | # | |
18 |
|
18 | |||
19 | ############################################################################## |
|
19 | ############################################################################## | |
20 |
# |
|
20 | # | |
21 |
# |
|
21 | # Gradle start up script for POSIX generated by Gradle. | |
22 |
# |
|
22 | # | |
|
23 | # Important for running: | |||
|
24 | # | |||
|
25 | # (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is | |||
|
26 | # noncompliant, but you have some other compliant shell such as ksh or | |||
|
27 | # bash, then to run this script, type that shell name before the whole | |||
|
28 | # command line, like: | |||
|
29 | # | |||
|
30 | # ksh Gradle | |||
|
31 | # | |||
|
32 | # Busybox and similar reduced shells will NOT work, because this script | |||
|
33 | # requires all of these POSIX shell features: | |||
|
34 | # * functions; | |||
|
35 | # * expansions «$var», «${var}», «${var:-default}», «${var+SET}», | |||
|
36 | # «${var#prefix}», «${var%suffix}», and «$( cmd )»; | |||
|
37 | # * compound commands having a testable exit status, especially «case»; | |||
|
38 | # * various built-in commands including «command», «set», and «ulimit». | |||
|
39 | # | |||
|
40 | # Important for patching: | |||
|
41 | # | |||
|
42 | # (2) This script targets any POSIX shell, so it avoids extensions provided | |||
|
43 | # by Bash, Ksh, etc; in particular arrays are avoided. | |||
|
44 | # | |||
|
45 | # The "traditional" practice of packing multiple parameters into a | |||
|
46 | # space-separated string is a well documented source of bugs and security | |||
|
47 | # problems, so this is (mostly) avoided, by progressively accumulating | |||
|
48 | # options in "$@", and eventually passing that to Java. | |||
|
49 | # | |||
|
50 | # Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, | |||
|
51 | # and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; | |||
|
52 | # see the in-line comments for details. | |||
|
53 | # | |||
|
54 | # There are tweaks for specific operating systems such as AIX, CygWin, | |||
|
55 | # Darwin, MinGW, and NonStop. | |||
|
56 | # | |||
|
57 | # (3) This script is generated from the Groovy template | |||
|
58 | # https://github.com/gradle/gradle/blob/HEAD/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt | |||
|
59 | # within the Gradle project. | |||
|
60 | # | |||
|
61 | # You can find Gradle at https://github.com/gradle/gradle/. | |||
|
62 | # | |||
23 | ############################################################################## |
|
63 | ############################################################################## | |
24 |
|
64 | |||
25 | # Attempt to set APP_HOME |
|
65 | # Attempt to set APP_HOME | |
|
66 | ||||
26 | # Resolve links: $0 may be a link |
|
67 | # Resolve links: $0 may be a link | |
27 | PRG="$0" |
|
68 | app_path=$0 | |
28 | # Need this for relative symlinks. |
|
69 | ||
29 | while [ -h "$PRG" ] ; do |
|
70 | # Need this for daisy-chained symlinks. | |
30 | ls=`ls -ld "$PRG"` |
|
71 | while | |
31 | link=`expr "$ls" : '.*-> \(.*\)$'` |
|
72 | APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path | |
32 | if expr "$link" : '/.*' > /dev/null; then |
|
73 | [ -h "$app_path" ] | |
33 | PRG="$link" |
|
74 | do | |
34 | else |
|
75 | ls=$( ls -ld "$app_path" ) | |
35 | PRG=`dirname "$PRG"`"/$link" |
|
76 | link=${ls#*' -> '} | |
36 | fi |
|
77 | case $link in #( | |
|
78 | /*) app_path=$link ;; #( | |||
|
79 | *) app_path=$APP_HOME$link ;; | |||
|
80 | esac | |||
37 | done |
|
81 | done | |
38 | SAVED="`pwd`" |
|
|||
39 | cd "`dirname \"$PRG\"`/" >/dev/null |
|
|||
40 | APP_HOME="`pwd -P`" |
|
|||
41 | cd "$SAVED" >/dev/null |
|
|||
42 |
|
82 | |||
43 | APP_NAME="Gradle" |
|
83 | # This is normally unused | |
44 | APP_BASE_NAME=`basename "$0"` |
|
84 | # shellcheck disable=SC2034 | |
45 |
|
85 | APP_BASE_NAME=${0##*/} | ||
46 | # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. |
|
86 | # Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) | |
47 | DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' |
|
87 | APP_HOME=$( cd "${APP_HOME:-./}" > /dev/null && pwd -P ) || exit | |
48 |
|
88 | |||
49 | # Use the maximum available, or set MAX_FD != -1 to use that value. |
|
89 | # Use the maximum available, or set MAX_FD != -1 to use that value. | |
50 |
MAX_FD= |
|
90 | MAX_FD=maximum | |
51 |
|
91 | |||
52 | warn () { |
|
92 | warn () { | |
53 | echo "$*" |
|
93 | echo "$*" | |
54 | } |
|
94 | } >&2 | |
55 |
|
95 | |||
56 | die () { |
|
96 | die () { | |
57 | echo |
|
97 | echo | |
58 | echo "$*" |
|
98 | echo "$*" | |
59 | echo |
|
99 | echo | |
60 | exit 1 |
|
100 | exit 1 | |
61 | } |
|
101 | } >&2 | |
62 |
|
102 | |||
63 | # OS specific support (must be 'true' or 'false'). |
|
103 | # OS specific support (must be 'true' or 'false'). | |
64 | cygwin=false |
|
104 | cygwin=false | |
65 | msys=false |
|
105 | msys=false | |
66 | darwin=false |
|
106 | darwin=false | |
67 | nonstop=false |
|
107 | nonstop=false | |
68 | case "`uname`" in |
|
108 | case "$( uname )" in #( | |
69 | CYGWIN* ) |
|
109 | CYGWIN* ) cygwin=true ;; #( | |
70 | cygwin=true |
|
110 | Darwin* ) darwin=true ;; #( | |
71 | ;; |
|
111 | MSYS* | MINGW* ) msys=true ;; #( | |
72 | Darwin* ) |
|
112 | NONSTOP* ) nonstop=true ;; | |
73 | darwin=true |
|
|||
74 | ;; |
|
|||
75 | MINGW* ) |
|
|||
76 | msys=true |
|
|||
77 | ;; |
|
|||
78 | NONSTOP* ) |
|
|||
79 | nonstop=true |
|
|||
80 | ;; |
|
|||
81 | esac |
|
113 | esac | |
82 |
|
114 | |||
83 | CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar |
|
115 | CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar | |
84 |
|
116 | |||
|
117 | ||||
85 | # Determine the Java command to use to start the JVM. |
|
118 | # Determine the Java command to use to start the JVM. | |
86 | if [ -n "$JAVA_HOME" ] ; then |
|
119 | if [ -n "$JAVA_HOME" ] ; then | |
87 | if [ -x "$JAVA_HOME/jre/sh/java" ] ; then |
|
120 | if [ -x "$JAVA_HOME/jre/sh/java" ] ; then | |
88 | # IBM's JDK on AIX uses strange locations for the executables |
|
121 | # IBM's JDK on AIX uses strange locations for the executables | |
89 |
JAVACMD= |
|
122 | JAVACMD=$JAVA_HOME/jre/sh/java | |
90 | else |
|
123 | else | |
91 |
JAVACMD= |
|
124 | JAVACMD=$JAVA_HOME/bin/java | |
92 | fi |
|
125 | fi | |
93 | if [ ! -x "$JAVACMD" ] ; then |
|
126 | if [ ! -x "$JAVACMD" ] ; then | |
94 | die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME |
|
127 | die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME | |
@@ -97,87 +130,120 Please set the JAVA_HOME variable in you | |||||
97 | location of your Java installation." |
|
130 | location of your Java installation." | |
98 | fi |
|
131 | fi | |
99 | else |
|
132 | else | |
100 |
JAVACMD= |
|
133 | JAVACMD=java | |
101 | which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. |
|
134 | if ! command -v java >/dev/null 2>&1 | |
|
135 | then | |||
|
136 | die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. | |||
102 |
|
137 | |||
103 | Please set the JAVA_HOME variable in your environment to match the |
|
138 | Please set the JAVA_HOME variable in your environment to match the | |
104 | location of your Java installation." |
|
139 | location of your Java installation." | |
105 | fi |
|
140 | fi | |
106 |
|
||||
107 | # Increase the maximum file descriptors if we can. |
|
|||
108 | if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then |
|
|||
109 | MAX_FD_LIMIT=`ulimit -H -n` |
|
|||
110 | if [ $? -eq 0 ] ; then |
|
|||
111 | if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then |
|
|||
112 | MAX_FD="$MAX_FD_LIMIT" |
|
|||
113 | fi |
|
|||
114 | ulimit -n $MAX_FD |
|
|||
115 | if [ $? -ne 0 ] ; then |
|
|||
116 | warn "Could not set maximum file descriptor limit: $MAX_FD" |
|
|||
117 | fi |
|
|||
118 | else |
|
|||
119 | warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" |
|
|||
120 | fi |
|
|||
121 | fi |
|
|||
122 |
|
||||
123 | # For Darwin, add options to specify how the application appears in the dock |
|
|||
124 | if $darwin; then |
|
|||
125 | GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" |
|
|||
126 | fi |
|
141 | fi | |
127 |
|
142 | |||
128 | # For Cygwin or MSYS, switch paths to Windows format before running java |
|
143 | # Increase the maximum file descriptors if we can. | |
129 | if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then |
|
144 | if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then | |
130 | APP_HOME=`cygpath --path --mixed "$APP_HOME"` |
|
145 | case $MAX_FD in #( | |
131 | CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` |
|
146 | max*) | |
132 | JAVACMD=`cygpath --unix "$JAVACMD"` |
|
147 | # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. | |
133 |
|
148 | # shellcheck disable=SC2039,SC3045 | ||
134 | # We build the pattern for arguments to be converted via cygpath |
|
149 | MAX_FD=$( ulimit -H -n ) || | |
135 | ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` |
|
150 | warn "Could not query maximum file descriptor limit" | |
136 | SEP="" |
|
151 | esac | |
137 | for dir in $ROOTDIRSRAW ; do |
|
152 | case $MAX_FD in #( | |
138 | ROOTDIRS="$ROOTDIRS$SEP$dir" |
|
153 | '' | soft) :;; #( | |
139 | SEP="|" |
|
154 | *) | |
140 | done |
|
155 | # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. | |
141 | OURCYGPATTERN="(^($ROOTDIRS))" |
|
156 | # shellcheck disable=SC2039,SC3045 | |
142 | # Add a user-defined pattern to the cygpath arguments |
|
157 | ulimit -n "$MAX_FD" || | |
143 | if [ "$GRADLE_CYGPATTERN" != "" ] ; then |
|
158 | warn "Could not set maximum file descriptor limit to $MAX_FD" | |
144 | OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" |
|
|||
145 | fi |
|
|||
146 | # Now convert the arguments - kludge to limit ourselves to /bin/sh |
|
|||
147 | i=0 |
|
|||
148 | for arg in "$@" ; do |
|
|||
149 | CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` |
|
|||
150 | CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option |
|
|||
151 |
|
||||
152 | if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition |
|
|||
153 | eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` |
|
|||
154 | else |
|
|||
155 | eval `echo args$i`="\"$arg\"" |
|
|||
156 | fi |
|
|||
157 | i=`expr $i + 1` |
|
|||
158 | done |
|
|||
159 | case $i in |
|
|||
160 | 0) set -- ;; |
|
|||
161 | 1) set -- "$args0" ;; |
|
|||
162 | 2) set -- "$args0" "$args1" ;; |
|
|||
163 | 3) set -- "$args0" "$args1" "$args2" ;; |
|
|||
164 | 4) set -- "$args0" "$args1" "$args2" "$args3" ;; |
|
|||
165 | 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; |
|
|||
166 | 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; |
|
|||
167 | 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; |
|
|||
168 | 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; |
|
|||
169 | 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; |
|
|||
170 | esac |
|
159 | esac | |
171 | fi |
|
160 | fi | |
172 |
|
161 | |||
173 | # Escape application args |
|
162 | # Collect all arguments for the java command, stacking in reverse order: | |
174 | save () { |
|
163 | # * args from the command line | |
175 | for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done |
|
164 | # * the main class name | |
176 | echo " " |
|
165 | # * -classpath | |
177 | } |
|
166 | # * -D...appname settings | |
178 | APP_ARGS=`save "$@"` |
|
167 | # * --module-path (only if needed) | |
|
168 | # * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. | |||
|
169 | ||||
|
170 | # For Cygwin or MSYS, switch paths to Windows format before running java | |||
|
171 | if "$cygwin" || "$msys" ; then | |||
|
172 | APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) | |||
|
173 | CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) | |||
|
174 | ||||
|
175 | JAVACMD=$( cygpath --unix "$JAVACMD" ) | |||
|
176 | ||||
|
177 | # Now convert the arguments - kludge to limit ourselves to /bin/sh | |||
|
178 | for arg do | |||
|
179 | if | |||
|
180 | case $arg in #( | |||
|
181 | -*) false ;; # don't mess with options #( | |||
|
182 | /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath | |||
|
183 | [ -e "$t" ] ;; #( | |||
|
184 | *) false ;; | |||
|
185 | esac | |||
|
186 | then | |||
|
187 | arg=$( cygpath --path --ignore --mixed "$arg" ) | |||
|
188 | fi | |||
|
189 | # Roll the args list around exactly as many times as the number of | |||
|
190 | # args, so each arg winds up back in the position where it started, but | |||
|
191 | # possibly modified. | |||
|
192 | # | |||
|
193 | # NB: a `for` loop captures its iteration list before it begins, so | |||
|
194 | # changing the positional parameters here affects neither the number of | |||
|
195 | # iterations, nor the values presented in `arg`. | |||
|
196 | shift # remove old arg | |||
|
197 | set -- "$@" "$arg" # push replacement arg | |||
|
198 | done | |||
|
199 | fi | |||
|
200 | ||||
|
201 | ||||
|
202 | # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. | |||
|
203 | DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' | |||
179 |
|
204 | |||
180 |
# Collect all arguments for the java command |
|
205 | # Collect all arguments for the java command: | |
181 | eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" |
|
206 | # * DEFAULT_JVM_OPTS, JAVA_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, | |
|
207 | # and any embedded shellness will be escaped. | |||
|
208 | # * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be | |||
|
209 | # treated as '${Hostname}' itself on the command line. | |||
|
210 | ||||
|
211 | set -- \ | |||
|
212 | "-Dorg.gradle.appname=$APP_BASE_NAME" \ | |||
|
213 | -classpath "$CLASSPATH" \ | |||
|
214 | org.gradle.wrapper.GradleWrapperMain \ | |||
|
215 | "$@" | |||
|
216 | ||||
|
217 | # Stop when "xargs" is not available. | |||
|
218 | if ! command -v xargs >/dev/null 2>&1 | |||
|
219 | then | |||
|
220 | die "xargs is not available" | |||
|
221 | fi | |||
|
222 | ||||
|
223 | # Use "xargs" to parse quoted args. | |||
|
224 | # | |||
|
225 | # With -n1 it outputs one arg per line, with the quotes and backslashes removed. | |||
|
226 | # | |||
|
227 | # In Bash we could simply go: | |||
|
228 | # | |||
|
229 | # readarray ARGS < <( xargs -n1 <<<"$var" ) && | |||
|
230 | # set -- "${ARGS[@]}" "$@" | |||
|
231 | # | |||
|
232 | # but POSIX shell has neither arrays nor command substitution, so instead we | |||
|
233 | # post-process each arg (as a line of input to sed) to backslash-escape any | |||
|
234 | # character that might be a shell metacharacter, then use eval to reverse | |||
|
235 | # that process (while maintaining the separation between arguments), and wrap | |||
|
236 | # the whole thing up as a single "set" statement. | |||
|
237 | # | |||
|
238 | # This will of course break if any of these variables contains a newline or | |||
|
239 | # an unmatched quote. | |||
|
240 | # | |||
|
241 | ||||
|
242 | eval "set -- $( | |||
|
243 | printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | | |||
|
244 | xargs -n1 | | |||
|
245 | sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | | |||
|
246 | tr '\n' ' ' | |||
|
247 | )" '"$@"' | |||
182 |
|
248 | |||
183 | exec "$JAVACMD" "$@" |
|
249 | exec "$JAVACMD" "$@" |
@@ -26,9 +26,13 if "%OS%"=="Windows_NT" setlocal | |||||
26 |
|
26 | |||
27 | set DIRNAME=%~dp0 |
|
27 | set DIRNAME=%~dp0 | |
28 |
if "%DIRNAME%" |
|
28 | if "%DIRNAME%"=="" set DIRNAME=. | |
|
29 | @rem This is normally unused | |||
29 | set APP_BASE_NAME=%~n0 |
|
30 | set APP_BASE_NAME=%~n0 | |
30 | set APP_HOME=%DIRNAME% |
|
31 | set APP_HOME=%DIRNAME% | |
31 |
|
32 | |||
|
33 | @rem Resolve any "." and ".." in APP_HOME to make it shorter. | |||
|
34 | for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi | |||
|
35 | ||||
32 | @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. |
|
36 | @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. | |
33 | set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" |
|
37 | set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" | |
34 |
|
38 | |||
@@ -37,7 +41,7 if defined JAVA_HOME goto findJavaFromJa | |||||
37 |
|
41 | |||
38 | set JAVA_EXE=java.exe |
|
42 | set JAVA_EXE=java.exe | |
39 | %JAVA_EXE% -version >NUL 2>&1 |
|
43 | %JAVA_EXE% -version >NUL 2>&1 | |
40 |
if |
|
44 | if %ERRORLEVEL% equ 0 goto execute | |
41 |
|
45 | |||
42 | echo. |
|
46 | echo. | |
43 | echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. |
|
47 | echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. | |
@@ -51,7 +55,7 goto fail | |||||
51 | set JAVA_HOME=%JAVA_HOME:"=% |
|
55 | set JAVA_HOME=%JAVA_HOME:"=% | |
52 | set JAVA_EXE=%JAVA_HOME%/bin/java.exe |
|
56 | set JAVA_EXE=%JAVA_HOME%/bin/java.exe | |
53 |
|
57 | |||
54 |
if exist "%JAVA_EXE%" goto |
|
58 | if exist "%JAVA_EXE%" goto execute | |
55 |
|
59 | |||
56 | echo. |
|
60 | echo. | |
57 | echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% |
|
61 | echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% | |
@@ -61,38 +65,26 echo location of your Java installation. | |||||
61 |
|
65 | |||
62 | goto fail |
|
66 | goto fail | |
63 |
|
67 | |||
64 | :init |
|
|||
65 | @rem Get command-line arguments, handling Windows variants |
|
|||
66 |
|
||||
67 | if not "%OS%" == "Windows_NT" goto win9xME_args |
|
|||
68 |
|
||||
69 | :win9xME_args |
|
|||
70 | @rem Slurp the command line arguments. |
|
|||
71 | set CMD_LINE_ARGS= |
|
|||
72 | set _SKIP=2 |
|
|||
73 |
|
||||
74 | :win9xME_args_slurp |
|
|||
75 | if "x%~1" == "x" goto execute |
|
|||
76 |
|
||||
77 | set CMD_LINE_ARGS=%* |
|
|||
78 |
|
||||
79 | :execute |
|
68 | :execute | |
80 | @rem Setup the command line |
|
69 | @rem Setup the command line | |
81 |
|
70 | |||
82 | set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar |
|
71 | set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar | |
83 |
|
72 | |||
|
73 | ||||
84 | @rem Execute Gradle |
|
74 | @rem Execute Gradle | |
85 |
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain % |
|
75 | "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* | |
86 |
|
76 | |||
87 | :end |
|
77 | :end | |
88 | @rem End local scope for the variables with windows NT shell |
|
78 | @rem End local scope for the variables with windows NT shell | |
89 |
if |
|
79 | if %ERRORLEVEL% equ 0 goto mainEnd | |
90 |
|
80 | |||
91 | :fail |
|
81 | :fail | |
92 | rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of |
|
82 | rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of | |
93 | rem the _cmd.exe /c_ return code! |
|
83 | rem the _cmd.exe /c_ return code! | |
94 | if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 |
|
84 | set EXIT_CODE=%ERRORLEVEL% | |
95 | exit /b 1 |
|
85 | if %EXIT_CODE% equ 0 set EXIT_CODE=1 | |
|
86 | if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% | |||
|
87 | exit /b %EXIT_CODE% | |||
96 |
|
88 | |||
97 | :mainEnd |
|
89 | :mainEnd | |
98 | if "%OS%"=="Windows_NT" endlocal |
|
90 | if "%OS%"=="Windows_NT" endlocal |
@@ -8,6 +8,6 | |||||
8 | * in the user guide at https://docs.gradle.org/3.5/userguide/multi_project_builds.html |
|
8 | * in the user guide at https://docs.gradle.org/3.5/userguide/multi_project_builds.html | |
9 | */ |
|
9 | */ | |
10 |
|
10 | |||
11 |
rootProject.name = ' |
|
11 | rootProject.name = 'implab-gradle' | |
12 |
|
12 | |||
13 | include 'container' |
|
13 | include 'container' |
1 | NO CONTENT: file was removed |
|
NO CONTENT: file was removed |
General Comments 0
You need to be logged in to leave comments.
Login now