diff --git a/server-core/src/main/java/io/onedev/server/model/support/jobexecutor/ServerDockerExecutor.java b/server-core/src/main/java/io/onedev/server/model/support/jobexecutor/ServerDockerExecutor.java index 1a1d9f24d3..a86719f1c3 100644 --- a/server-core/src/main/java/io/onedev/server/model/support/jobexecutor/ServerDockerExecutor.java +++ b/server-core/src/main/java/io/onedev/server/model/support/jobexecutor/ServerDockerExecutor.java @@ -5,9 +5,12 @@ import java.io.File; import java.io.IOException; import java.io.Serializable; import java.io.UnsupportedEncodingException; +import java.util.ArrayList; import java.util.Collection; +import java.util.HashSet; import java.util.List; import java.util.Map; +import java.util.Set; import java.util.UUID; import java.util.concurrent.Callable; @@ -43,7 +46,6 @@ import io.onedev.server.web.editable.annotation.Editable; import io.onedev.server.web.editable.annotation.NameOfEmptyValue; import io.onedev.server.web.editable.annotation.OmitName; import io.onedev.server.web.editable.annotation.Password; -import io.onedev.server.web.editable.annotation.ShowCondition; import io.onedev.server.web.util.Testable; @Editable(order=100, description="This executor interpretates job environments as docker images, " @@ -58,64 +60,16 @@ public class ServerDockerExecutor extends JobExecutor implements Testable registryLogins = new ArrayList<>(); + private transient ConstrainedRunner constrainedRunner; - @Editable(order=1100, description="Optionally specify a docker registry to use. Leave empty to use the default registry") - @NameOfEmptyValue("Use default") - public String getDockerRegistry() { - return dockerRegistry; - } - - public void setDockerRegistry(String dockerRegistry) { - this.dockerRegistry = dockerRegistry; - } - - @Editable(order=1150) - public boolean isAuthenticateToRegistry() { - return authenticateToRegistry; - } - - public void setAuthenticateToRegistry(boolean authenticateToRegistry) { - this.authenticateToRegistry = authenticateToRegistry; - } - - @Editable(order=1200, description="Specify user name to access docker registry") - @NotEmpty - @ShowCondition("isRegistryAuthenticationRequired") - public String getUserName() { - return userName; - } - - public void setUserName(String userName) { - this.userName = userName; - } - - @Editable(order=1300, description="Specify password to access docker registry") - @Password - @NotEmpty - @ShowCondition("isRegistryAuthenticationRequired") - public String getPassword() { - return password; - } - - public void setPassword(String password) { - this.password = password; - } - @Editable(order=20000, group="More Settings", description="Optionally specify docker executable, for instance /usr/local/bin/docker. " + "Leave empty to use docker executable in PATH") public String getDockerExecutable() { @@ -150,6 +104,15 @@ public class ServerDockerExecutor extends JobExecutor implements Testable getRegistryLogins() { + return registryLogins; + } + + public void setRegistryLogins(List registryLogins) { + this.registryLogins = registryLogins; + } + private Commandline getDockerCmd() { if (getDockerExecutable() != null) return new Commandline(getDockerExecutable()); @@ -157,17 +120,6 @@ public class ServerDockerExecutor extends JobExecutor implements Testable registryUrls = new HashSet<>(); + for (RegistryLogin login: getRegistryLogins()) { + if (!registryUrls.add(login.getRegistryUrl())) { + isValid = false; + String message; + if (login.getRegistryUrl() != null) + message = "Duplicate login entry for registry '" + login.getRegistryUrl() + "'"; + else + message = "Duplicate login entry for official registry"; + context.buildConstraintViolationWithTemplate(message) + .addPropertyNode("registryLogins").addConstraintViolation(); + break; + } + } if (getRunOptions() != null) { String[] arguments = StringUtils.parseQuoteTokens(getRunOptions()); String invalidOptions[] = new String[] {"-w", "--workdir", "-d", "--detach", "-a", "--attach", "-t", "--tty", "-i", "--interactive", "--rm", "--restart", "--name"}; if (hasOptions(arguments, invalidOptions)) { - context.disableDefaultConstraintViolation(); StringBuilder errorMessage = new StringBuilder("Can not use options: " + Joiner.on(", ").join(invalidOptions)); context.buildConstraintViolationWithTemplate(errorMessage.toString()) .addPropertyNode("runOptions").addConstraintViolation(); - return false; + isValid = false; } } - return true; + if (!isValid) + context.disableDefaultConstraintViolation(); + return isValid; } @Override @@ -447,7 +418,7 @@ public class ServerDockerExecutor extends JobExecutor implements Testable