diff --git a/src/main/java/com/cloudbees/jenkins/plugins/docker_build_env/Docker.java b/src/main/java/com/cloudbees/jenkins/plugins/docker_build_env/Docker.java index dd842c3..ab0c71c 100644 --- a/src/main/java/com/cloudbees/jenkins/plugins/docker_build_env/Docker.java +++ b/src/main/java/com/cloudbees/jenkins/plugins/docker_build_env/Docker.java @@ -7,6 +7,7 @@ import hudson.model.Computer; import hudson.model.TaskListener; import hudson.util.ArgumentListBuilder; +import jenkins.model.Jenkins; import org.apache.commons.io.LineIterator; import org.apache.commons.io.output.TeeOutputStream; import org.apache.commons.lang.StringUtils; @@ -255,11 +256,16 @@ private String getDocker0Ip(Launcher launcher, String image) throws IOException, // On some distributions, docker doesn't start docker0 bridge until a container do require it // So let's run the container once, running /bin/true so it terminates immediately + DockerBuildWrapper.DescriptorImpl descriptor = (DockerBuildWrapper.DescriptorImpl) + Jenkins.getInstance().getDescriptor(DockerBuildWrapper.class); + + final String initImage = descriptor.getInitImage(); + ArgumentListBuilder args = dockerCommand() .add("run", "--rm") .add("--entrypoint") .add("/bin/true") - .add("alpine:3.6"); + .add(initImage); int status = launcher.launch() .envs(getEnvVars()) @@ -290,7 +296,7 @@ private String getDocker0Ip(Launcher launcher, String image) throws IOException, .add("run", "--tty", "--rm") .add("--entrypoint") .add("/sbin/ip") - .add("alpine:3.6") + .add(initImage) .add("route"); ByteArrayOutputStream out = new ByteArrayOutputStream(); diff --git a/src/main/java/com/cloudbees/jenkins/plugins/docker_build_env/DockerBuildWrapper.java b/src/main/java/com/cloudbees/jenkins/plugins/docker_build_env/DockerBuildWrapper.java index fec43d3..fce20e4 100644 --- a/src/main/java/com/cloudbees/jenkins/plugins/docker_build_env/DockerBuildWrapper.java +++ b/src/main/java/com/cloudbees/jenkins/plugins/docker_build_env/DockerBuildWrapper.java @@ -7,6 +7,7 @@ import hudson.EnvVars; import hudson.Extension; import hudson.Launcher; +import hudson.Util; import hudson.model.AbstractBuild; import hudson.model.AbstractProject; import hudson.model.BuildListener; @@ -18,16 +19,20 @@ import hudson.remoting.Callable; import hudson.tasks.BuildWrapper; import hudson.tasks.BuildWrapperDescriptor; +import hudson.util.FormValidation; import hudson.util.ListBoxModel; import jenkins.authentication.tokens.api.AuthenticationTokens; import jenkins.model.Jenkins; import jenkins.security.MasterToSlaveCallable; +import net.sf.json.JSONObject; import org.jenkinsci.plugins.docker.commons.credentials.DockerRegistryToken; import org.jenkinsci.plugins.docker.commons.credentials.DockerServerEndpoint; import org.kohsuke.stapler.AncestorInPath; import org.kohsuke.stapler.DataBoundConstructor; import org.kohsuke.stapler.QueryParameter; +import org.kohsuke.stapler.StaplerRequest; +import javax.servlet.ServletException; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.util.ArrayList; @@ -259,6 +264,36 @@ private String whoAmI(Launcher launcher) throws IOException, InterruptedExceptio @Extension public static class DescriptorImpl extends BuildWrapperDescriptor { + private String initImage; + + public DescriptorImpl(){ + super(DockerBuildWrapper.class); + load(); + } + + @Override + public boolean configure(StaplerRequest req, JSONObject json) throws FormException { + req.bindParameters(this); + String paramValue = json.getString("initImage"); + this.initImage = !paramValue.trim().isEmpty() ? paramValue : "alpine:3.6"; + save(); + return super.configure(req,json); + } + + public String getInitImage() { + return initImage; + } + + public void setInitImage(String initImage) { + this.initImage = initImage; + } + + public FormValidation doCheckInitImage(@QueryParameter String initImage) throws IOException, ServletException { + if (Util.fixEmptyAndTrim(initImage) == null) + return FormValidation.error("Please set a Init Image name. Default: alpine:3.6"); + return FormValidation.ok(); + } + @Override public String getDisplayName() { return "Build inside a Docker container"; diff --git a/src/main/resources/com/cloudbees/jenkins/plugins/docker_build_env/DockerBuildWrapper/global.jelly b/src/main/resources/com/cloudbees/jenkins/plugins/docker_build_env/DockerBuildWrapper/global.jelly new file mode 100644 index 0000000..0144887 --- /dev/null +++ b/src/main/resources/com/cloudbees/jenkins/plugins/docker_build_env/DockerBuildWrapper/global.jelly @@ -0,0 +1,32 @@ + + + + + + + + + + diff --git a/src/main/resources/com/cloudbees/jenkins/plugins/docker_build_env/DockerBuildWrapper/help-initImage.html b/src/main/resources/com/cloudbees/jenkins/plugins/docker_build_env/DockerBuildWrapper/help-initImage.html new file mode 100644 index 0000000..ffb5981 --- /dev/null +++ b/src/main/resources/com/cloudbees/jenkins/plugins/docker_build_env/DockerBuildWrapper/help-initImage.html @@ -0,0 +1,4 @@ +
+ This image is used to create two temporary containers to start docker0 bridge and to discover gateway IP from the container. +

DEFAULT: `alpine:3.6` (since it has a size of 2MB). +

\ No newline at end of file