diff --git a/pom.xml b/pom.xml
index 02c779011d..0848b82acd 100644
--- a/pom.xml
+++ b/pom.xml
@@ -9,7 +9,7 @@
1.2.0
server
- 7.8.17
+ 7.9.0
pom
${project.groupId}.${project.artifactId}-${project.version}
@@ -620,7 +620,7 @@
2.7.3
- 1.7.12
+ 1.7.14
1.7.36
1.2.11
4.7.2
diff --git a/server-core/pom.xml b/server-core/pom.xml
index fb6c32804c..14daf4a0d5 100644
--- a/server-core/pom.xml
+++ b/server-core/pom.xml
@@ -7,7 +7,7 @@
io.onedev
server
- 7.8.17
+ 7.9.0
diff --git a/server-core/src/main/java/io/onedev/server/ServerConfig.java b/server-core/src/main/java/io/onedev/server/ServerConfig.java
index 3942b80033..b6552724e8 100644
--- a/server-core/src/main/java/io/onedev/server/ServerConfig.java
+++ b/server-core/src/main/java/io/onedev/server/ServerConfig.java
@@ -34,8 +34,4 @@ public interface ServerConfig {
int getClusterPort();
- int getServerCpu();
-
- int getServerMemory();
-
}
diff --git a/server-core/src/main/java/io/onedev/server/ServerSocket.java b/server-core/src/main/java/io/onedev/server/ServerSocket.java
index 0a437e4449..2841fa5f4d 100644
--- a/server-core/src/main/java/io/onedev/server/ServerSocket.java
+++ b/server-core/src/main/java/io/onedev/server/ServerSocket.java
@@ -19,7 +19,7 @@ import io.onedev.agent.AgentData;
import io.onedev.agent.CallData;
import io.onedev.agent.Message;
import io.onedev.agent.MessageTypes;
-import io.onedev.agent.WaitingForAgentResourceToBeReleased;
+import io.onedev.agent.WantToDisconnectAgent;
import io.onedev.agent.WebsocketUtils;
import io.onedev.commons.utils.ExplicitException;
import io.onedev.commons.utils.StringUtils;
@@ -188,9 +188,9 @@ public class ServerSocket {
private Serializable service(Serializable request) {
try {
- if (request instanceof WaitingForAgentResourceToBeReleased) {
+ if (request instanceof WantToDisconnectAgent) {
if (agentId != null)
- OneDev.getInstance(ResourceAllocator.class).waitingForAgentResourceToBeReleased(agentId);
+ OneDev.getInstance(ResourceAllocator.class).wantToDisconnectAgent(agentId);
return null;
} else {
throw new ExplicitException("Unknown request: " + request.getClass());
diff --git a/server-core/src/main/java/io/onedev/server/buildspec/BuildSpec.java b/server-core/src/main/java/io/onedev/server/buildspec/BuildSpec.java
index aff3d3a31b..9f35e2b665 100644
--- a/server-core/src/main/java/io/onedev/server/buildspec/BuildSpec.java
+++ b/server-core/src/main/java/io/onedev/server/buildspec/BuildSpec.java
@@ -1,1430 +1,1436 @@
-package io.onedev.server.buildspec;
-
-import java.io.Serializable;
-import java.nio.charset.StandardCharsets;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.LinkedHashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.Stack;
-import java.util.function.Function;
-
-import javax.annotation.Nullable;
-import javax.validation.ConstraintValidatorContext;
-import javax.validation.ConstraintViolation;
-import javax.validation.Valid;
-import javax.validation.ValidationException;
-import javax.validation.Validator;
-
-import org.apache.commons.lang3.SerializationUtils;
-import org.apache.wicket.Component;
-import org.eclipse.jgit.revwalk.RevCommit;
-import org.yaml.snakeyaml.DumperOptions.FlowStyle;
-import org.yaml.snakeyaml.nodes.MappingNode;
-import org.yaml.snakeyaml.nodes.Node;
-import org.yaml.snakeyaml.nodes.NodeTuple;
-import org.yaml.snakeyaml.nodes.ScalarNode;
-import org.yaml.snakeyaml.nodes.SequenceNode;
-import org.yaml.snakeyaml.nodes.Tag;
-
-import com.google.common.base.Preconditions;
-import com.google.common.cache.CacheBuilder;
-import com.google.common.cache.CacheLoader;
-import com.google.common.cache.LoadingCache;
-import com.google.common.collect.Lists;
-
-import io.onedev.commons.codeassist.InputCompletion;
-import io.onedev.commons.codeassist.InputStatus;
-import io.onedev.commons.codeassist.InputSuggestion;
-import io.onedev.commons.utils.ExceptionUtils;
-import io.onedev.commons.utils.LinearRange;
-import io.onedev.commons.utils.StringUtils;
-import io.onedev.commons.utils.WordUtils;
-import io.onedev.server.OneDev;
-import io.onedev.server.buildspec.job.Job;
-import io.onedev.server.buildspec.job.JobDependency;
-import io.onedev.server.buildspec.param.ParamUtils;
-import io.onedev.server.buildspec.param.spec.ParamSpec;
-import io.onedev.server.buildspec.step.Step;
-import io.onedev.server.buildspec.step.StepTemplate;
-import io.onedev.server.buildspec.step.UseTemplateStep;
-import io.onedev.server.migration.VersionedYamlDoc;
-import io.onedev.server.migration.XmlBuildSpecMigrator;
-import io.onedev.server.util.ComponentContext;
-import io.onedev.server.util.JobSecretAuthorizationContext;
-import io.onedev.server.util.validation.Validatable;
-import io.onedev.server.util.validation.annotation.ClassValidating;
-import io.onedev.server.web.editable.annotation.Editable;
-import io.onedev.server.web.page.project.blob.ProjectBlobPage;
-import io.onedev.server.web.util.SuggestionUtils;
-import io.onedev.server.web.util.WicketUtils;
-
-@Editable
-@ClassValidating
-public class BuildSpec implements Serializable, Validatable {
-
- private static final long serialVersionUID = 1L;
-
- private static final LoadingCache parseCache =
- CacheBuilder.newBuilder().softValues().build(new CacheLoader() {
-
- @Override
- public byte[] load(String key) {
- String buildSpecString = key;
- if (buildSpecString.trim().startsWith(" jobs = new ArrayList<>();
-
- private List stepTemplates = new ArrayList<>();
-
- private List services = new ArrayList<>();
-
- private List properties = new ArrayList<>();
-
- private List imports = new ArrayList<>();
-
- private transient List importedBuildSpecs;
-
- private transient Map jobMap;
-
- private transient Map stepTemplateMap;
-
- private transient Map serviceMap;
-
- private transient Map propertyMap;
-
- @Editable
- @Valid
- public List getJobs() {
- return jobs;
- }
-
- public void setJobs(List jobs) {
- this.jobs = jobs;
- jobMap = null;
- }
-
- @Editable
- @Valid
- public List getStepTemplates() {
- return stepTemplates;
- }
-
- public void setStepTemplates(List stepTemplates) {
- this.stepTemplates = stepTemplates;
- stepTemplateMap = null;
- }
-
- @Editable
- @Valid
- public List getServices() {
- return services;
- }
-
- public void setServices(List services) {
- this.services = services;
- serviceMap = null;
- }
-
- @Editable
- public List getProperties() {
- return properties;
- }
-
- public void setProperties(List properties) {
- this.properties = properties;
- propertyMap = null;
- }
-
- @Editable
- @Valid
- public List getImports() {
- return imports;
- }
-
- public void setImports(List imports) {
- this.imports = imports;
- importedBuildSpecs = null;
- }
-
- private List getImportedBuildSpecs(Collection projectChain) {
- if (importedBuildSpecs == null) {
- importedBuildSpecs = new ArrayList<>();
- for (Import aImport: getImports()) {
- if (!projectChain.contains(aImport.getProjectPath())) {
- Collection newProjectChain = new HashSet<>(projectChain);
- newProjectChain.add(aImport.getProjectPath());
- try {
- BuildSpec importedBuildSpec = aImport.getBuildSpec();
- RevCommit commit = aImport.getProject().getRevCommit(aImport.getTag(), true);
- JobSecretAuthorizationContext.push(new JobSecretAuthorizationContext(aImport.getProject(), commit, null));
- try {
- importedBuildSpecs.addAll(importedBuildSpec.getImportedBuildSpecs(newProjectChain));
- } finally {
- JobSecretAuthorizationContext.pop();
- }
- importedBuildSpecs.add(importedBuildSpec);
- } catch (Exception e) {
- // Ignore here as we rely on this method to show viewer/editor
- // Errors relating to this will be shown when validated
- }
- }
- }
- }
- return importedBuildSpecs;
- }
-
- public Map getJobMap() {
- if (jobMap == null) {
- jobMap = new LinkedHashMap<>();
- for (BuildSpec buildSpec: getImportedBuildSpecs(new HashSet<>())) {
- for (Job job: buildSpec.getJobs())
- jobMap.put(job.getName(), job);
- }
- for (Job job: getJobs())
- jobMap.put(job.getName(), job);
- }
- return jobMap;
- }
-
- public Map getPropertyMap() {
- if (propertyMap == null) {
- propertyMap = new LinkedHashMap<>();
- for (BuildSpec buildSpec: getImportedBuildSpecs(new HashSet<>())) {
- for (Property property: buildSpec.getProperties())
- propertyMap.put(property.getName(), property);
- }
- for (Property property: getProperties())
- propertyMap.put(property.getName(), property);
- }
- return propertyMap;
- }
-
- public Map getStepTemplateMap() {
- if (stepTemplateMap == null) {
- stepTemplateMap = new LinkedHashMap<>();
- for (BuildSpec buildSpec: getImportedBuildSpecs(new HashSet<>())) {
- for (StepTemplate template: buildSpec.getStepTemplates())
- stepTemplateMap.put(template.getName(), template);
- }
- for (StepTemplate template: getStepTemplates())
- stepTemplateMap.put(template.getName(), template);
- }
- return stepTemplateMap;
- }
-
- public Map getServiceMap() {
- if (serviceMap == null) {
- serviceMap = new LinkedHashMap<>();
- for (BuildSpec buildSpec: getImportedBuildSpecs(new HashSet<>())) {
- for (Service service: buildSpec.getServices())
- serviceMap.put(service.getName(), service);
- }
- for (Service service: services)
- serviceMap.put(service.getName(), service);
- }
- return serviceMap;
- }
-
- private int getImportIndex(String namedElementName, Function> namedElementMapProvider) {
- for (int i=imports.size()-1; i>=0; i--) {
- if (namedElementMapProvider.apply(imports.get(i).getBuildSpec()).containsKey(namedElementName))
- return i;
- }
- return -1;
- }
-
- private boolean validateImportedElements(ConstraintValidatorContext context,
- List namedElements, Function> namedElementMapProvider, String elementTypeName) {
- boolean isValid = true;
- Validator validator = OneDev.getInstance(Validator.class);
- for (T element: namedElementMapProvider.apply(this).values()) {
- int elementIndex = namedElements.indexOf(element);
- if (elementIndex == -1) {
- int importIndex = getImportIndex(element.getName(), namedElementMapProvider);
- for (ConstraintViolation violation: validator.validate(element)) {
- String location;
- if (violation.getPropertyPath().toString().length() != 0)
- location = "location: " + violation.getPropertyPath() + ", ";
- else
- location = "";
-
- String errorMessage = String.format("Error validating imported %s (%s: %s, %serror message: %s)",
- elementTypeName, elementTypeName, element.getName(), location, violation.getMessage());
- context.buildConstraintViolationWithTemplate(errorMessage)
- .addPropertyNode(PROP_IMPORTS)
- .addBeanNode()
- .inIterable().atIndex(importIndex)
- .addConstraintViolation();
- isValid = false;
- }
- }
- }
- return isValid;
- }
-
- @Override
- public boolean isValid(ConstraintValidatorContext context) {
- boolean isValid = true;
-
- if (!validateImportedElements(context, jobs, it->it.getJobMap(), "job"))
- isValid = false;
- if (!validateImportedElements(context, services, it->it.getServiceMap(), "service"))
- isValid = false;
- if (!validateImportedElements(context, stepTemplates, it->it.getStepTemplateMap(), "step template"))
- isValid = false;
- if (!validateImportedElements(context, properties, it->it.getPropertyMap(), "property"))
- isValid = false;
-
- Set jobNames = new HashSet<>();
- for (Job job: jobs) {
- if (!jobNames.add(job.getName())) {
- context.buildConstraintViolationWithTemplate("Duplicate job name (" + job.getName() + ")")
- .addPropertyNode(PROP_JOBS).addConstraintViolation();
- isValid = false;
- }
- }
- Set serviceNames = new HashSet<>();
- for (Service service: services) {
- if (!serviceNames.add(service.getName())) {
- context.buildConstraintViolationWithTemplate("Duplicate service name (" + service.getName() + ")")
- .addPropertyNode(PROP_SERVICES).addConstraintViolation();
- isValid = false;
- }
- }
- Set stepTemplateNames = new HashSet<>();
- for (StepTemplate template: stepTemplates) {
- if (!stepTemplateNames.add(template.getName())) {
- context.buildConstraintViolationWithTemplate("Duplicate template name (" + template.getName() + ")")
- .addPropertyNode(PROP_STEP_TEMPLATES).addConstraintViolation();
- isValid = false;
- }
- }
- Set propertyNames = new HashSet<>();
- for (Property property: properties) {
- if (!propertyNames.add(property.getName())) {
- context.buildConstraintViolationWithTemplate("Duplicate property name (" + property.getName() + ")")
- .addPropertyNode(PROP_PROPERTIES).addConstraintViolation();
- isValid = false;
- }
- }
- Set importProjectNames = new HashSet<>();
- for (Import aImport: imports) {
- if (!importProjectNames.add(aImport.getProjectPath())) {
- context.buildConstraintViolationWithTemplate("Duplicate import (" + aImport.getProjectPath() + ")")
- .addPropertyNode(PROP_IMPORTS).addConstraintViolation();
- isValid = false;
- }
- }
-
- if (isValid) {
- for (StepTemplate template: getStepTemplateMap().values()) {
- int templateIndex = stepTemplates.indexOf(template);
- for (int stepIndex=0; stepIndex());
- } catch (Exception e) {
- if (templateIndex != -1) {
- context.buildConstraintViolationWithTemplate(e.getMessage())
- .addPropertyNode(PROP_STEP_TEMPLATES)
- .addPropertyNode(StepTemplate.PROP_STEPS)
- .inIterable().atIndex(templateIndex)
- .addPropertyNode(UseTemplateStep.PROP_TEMPLATE_NAME)
- .inIterable().atIndex(stepIndex)
- .addConstraintViolation();
- } else {
- int importIndex = getImportIndex(template.getName(), it->it.getStepTemplateMap());
- String errorMessage = String.format("Error validating imported step template (step template: %s, error message: %s)",
- template.getName(), e.getMessage());
- context.buildConstraintViolationWithTemplate(errorMessage)
- .addPropertyNode(PROP_IMPORTS)
- .addBeanNode()
- .inIterable().atIndex(importIndex)
- .addConstraintViolation();
- }
- isValid = false;
- }
- }
- }
- }
-
- for (Job job: getJobMap().values()) {
- int jobIndex = jobs.indexOf(job);
- try {
- checkDependencies(job, new ArrayList<>());
- } catch (Exception e) {
- if (jobIndex != -1) {
- context.buildConstraintViolationWithTemplate(e.getMessage())
- .addPropertyNode(PROP_JOBS)
- .addPropertyNode(Job.PROP_JOB_DEPENDENCIES)
- .inIterable().atIndex(jobIndex)
- .addConstraintViolation();
- } else {
- int importIndex = getImportIndex(job.getName(), it->it.getJobMap());
- String errorMessage = String.format("Error validating imported job (job: %s, error message: %s)",
- job.getName(), e.getMessage());
- context.buildConstraintViolationWithTemplate(errorMessage)
- .addPropertyNode(PROP_IMPORTS)
- .addBeanNode()
- .inIterable().atIndex(importIndex)
- .addConstraintViolation();
- }
- isValid = false;
- }
-
- for (String serviceName: job.getRequiredServices()) {
- if (!getServiceMap().containsKey(serviceName)) {
- context.buildConstraintViolationWithTemplate("Undefined service (" + serviceName + ")")
- .addPropertyNode(PROP_JOBS)
- .addPropertyNode(Job.PROP_REQUIRED_SERVICES)
- .inIterable().atIndex(jobIndex)
- .addConstraintViolation();
- isValid = false;
- }
- }
-
- for (int stepIndex=0; stepIndex());
- } catch (Exception e) {
- if (jobIndex != -1) {
- context.buildConstraintViolationWithTemplate(e.getMessage())
- .addPropertyNode(PROP_JOBS)
- .addPropertyNode(Job.PROP_STEPS)
- .inIterable().atIndex(jobIndex)
- .addPropertyNode(UseTemplateStep.PROP_TEMPLATE_NAME)
- .inIterable().atIndex(stepIndex)
- .addConstraintViolation();
- } else {
- int importIndex = getImportIndex(job.getName(), it->it.getJobMap());
- String errorMessage = String.format("Error validating imported job (job: %s, location: steps[%d].templateName, error message: %s)",
- job.getName(), stepIndex, e.getMessage());
- context.buildConstraintViolationWithTemplate(errorMessage)
- .addPropertyNode(PROP_IMPORTS)
- .addBeanNode()
- .inIterable().atIndex(importIndex)
- .addConstraintViolation();
- }
- isValid = false;
- }
- }
- }
- }
- }
-
- if (isValid) {
- // Build spec and jobs are valid so far, we can do more validations with them safely
- for (Job job: getJobMap().values()) {
- int jobIndex = jobs.indexOf(job);
- for (int actionIndex=0; actionIndexit.getJobMap());
- String errorMessage = String.format("Error validating imported job (job: %s, error message: %s)",
- job.getName(), e.getMessage());
- context.buildConstraintViolationWithTemplate(errorMessage)
- .addPropertyNode(PROP_IMPORTS)
- .addBeanNode()
- .inIterable().atIndex(importIndex)
- .addConstraintViolation();
- }
- isValid = false;
- }
- }
- }
- }
-
- if (!isValid)
- context.disableDefaultConstraintViolation();
- return isValid;
- }
-
- private void checkTemplateUsages(UseTemplateStep step, List templateChain) {
- if(templateChain.contains(step.getTemplateName())) {
- templateChain.add(step.getTemplateName());
- throw new ValidationException("Circular template usages (" + templateChain + ")");
- } else {
- StepTemplate template = getStepTemplateMap().get(step.getTemplateName());
- if (template != null) {
- if (templateChain.isEmpty()) {
- try {
- ParamUtils.validateParams(template.getParamSpecs(), step.getParams());
- } catch (Exception e) {
- throw new ValidationException(String.format("Error validating step template parameters (%s)", e.getMessage()));
- }
- }
- templateChain.add(step.getTemplateName());
- for (Step templateStep: template.getSteps()) {
- if (templateStep instanceof UseTemplateStep)
- checkTemplateUsages((UseTemplateStep) templateStep, new ArrayList<>(templateChain));
- }
- } else if (templateChain.isEmpty()) {
- throw new ValidationException("Step template not found (" + step.getTemplateName() + ")");
- }
- }
- }
-
- private void checkDependencies(Job job, List dependencyChain) {
- for (JobDependency dependency: job.getJobDependencies()) {
- if (dependencyChain.contains(dependency.getJobName())) {
- dependencyChain.add(dependency.getJobName());
- throw new ValidationException("Circular dependencies (" + dependencyChain + ")");
- } else {
- Job dependencyJob = getJobMap().get(dependency.getJobName());
- if (dependencyJob != null) {
- if (dependencyChain.isEmpty()) {
- try {
- ParamUtils.validateParams(dependencyJob.getParamSpecs(), dependency.getJobParams());
- } catch (ValidationException e) {
- String message = String.format("Error validating dependency job parameters (dependency job: %s, error message: %s)",
- dependencyJob.getName(), e.getMessage());
- throw new ValidationException(message);
- }
- }
- List newDependencyChain = new ArrayList<>(dependencyChain);
- newDependencyChain.add(dependency.getJobName());
- checkDependencies(dependencyJob, newDependencyChain);
- } else if (dependencyChain.isEmpty()) {
- throw new ValidationException("Dependency job not found (" + dependency.getJobName() + ")");
- }
- }
- }
- }
-
- public static List suggestOverrides(List imported, InputStatus status) {
- List completions = new ArrayList<>();
- String matchWith = status.getContentBeforeCaret().toLowerCase();
- for (String each: imported) {
- LinearRange match = LinearRange.match(each, matchWith);
- if (match != null) {
- completions.add(new InputCompletion(each, each + status.getContentAfterCaret(),
- each.length(), "override imported", match));
- }
- }
-
- return completions;
- }
-
- @Nullable
- public static BuildSpec get() {
- Component component = ComponentContext.get().getComponent();
- BuildSpecAware buildSpecAware = WicketUtils.findInnermost(component, BuildSpecAware.class);
- if (buildSpecAware != null)
- return buildSpecAware.getBuildSpec();
- else
- return null;
- }
-
- public static List suggestVariables(String matchWith,
- boolean withBuildVersion, boolean withDynamicVariables, boolean withPauseCommand) {
- List suggestions = new ArrayList<>();
- BuildSpec buildSpec = get();
- if (buildSpec != null) {
- ProjectBlobPage page = (ProjectBlobPage) WicketUtils.getPage();
- suggestions.addAll(SuggestionUtils.suggestVariables(
- page.getProject(), buildSpec, ParamSpec.list(),
- matchWith, withBuildVersion, withDynamicVariables, withPauseCommand));
- }
- return suggestions;
- }
-
- @Nullable
- public static BuildSpec parse(byte[] bytes) {
- String buildSpecString = new String(bytes, StandardCharsets.UTF_8);
- if (StringUtils.isNotBlank(buildSpecString)) {
- try {
- return SerializationUtils.deserialize(parseCache.getUnchecked(buildSpecString));
- } catch (Exception e) {
- BuildSpecParseException parseException = ExceptionUtils.find(e, BuildSpecParseException.class);
- if (parseException != null)
- throw parseException;
- else
- throw e;
- }
- } else {
- return null;
- }
- }
-
- @SuppressWarnings("unused")
- private void migrate1(VersionedYamlDoc doc, Stack versions) {
- for (NodeTuple specTuple: doc.getValue()) {
- if (((ScalarNode)specTuple.getKeyNode()).getValue().equals("jobs")) {
- SequenceNode jobsNode = (SequenceNode) specTuple.getValueNode();
- for (Node jobsNodeItem: jobsNode.getValue()) {
- MappingNode jobNode = (MappingNode) jobsNodeItem;
- for (Iterator itJobTuple = jobNode.getValue().iterator(); itJobTuple.hasNext();) {
- NodeTuple jobTuple = itJobTuple.next();
- String jobTupleKey = ((ScalarNode)jobTuple.getKeyNode()).getValue();
- if (jobTupleKey.equals("submoduleCredentials")) {
- itJobTuple.remove();
- } else if (jobTupleKey.equals("projectDependencies")) {
- SequenceNode projectDependenciesNode = (SequenceNode) jobTuple.getValueNode();
- for (Node projectDependenciesItem: projectDependenciesNode.getValue()) {
- MappingNode projectDependencyNode = (MappingNode) projectDependenciesItem;
- for (Iterator itProjectDependencyTuple = projectDependencyNode.getValue().iterator();
- itProjectDependencyTuple.hasNext();) {
- NodeTuple projectDependencyTuple = itProjectDependencyTuple.next();
- if (((ScalarNode)projectDependencyTuple.getKeyNode()).getValue().equals("authentication"))
- itProjectDependencyTuple.remove();
- }
- }
- }
- }
- NodeTuple cloneCredentialTuple = new NodeTuple(
- new ScalarNode(Tag.STR, "cloneCredential"),
- new MappingNode(new Tag("!DefaultCredential"), Lists.newArrayList(), FlowStyle.BLOCK));
- jobNode.getValue().add(cloneCredentialTuple);
- }
- }
- }
- }
-
- @SuppressWarnings("unused")
- private void migrate2(VersionedYamlDoc doc, Stack versions) {
- for (NodeTuple specTuple: doc.getValue()) {
- if (((ScalarNode)specTuple.getKeyNode()).getValue().equals("jobs")) {
- SequenceNode jobsNode = (SequenceNode) specTuple.getValueNode();
- for (Node jobsNodeItem: jobsNode.getValue()) {
- MappingNode jobNode = (MappingNode) jobsNodeItem;
- for (Iterator itJobTuple = jobNode.getValue().iterator(); itJobTuple.hasNext();) {
- NodeTuple jobTuple = itJobTuple.next();
- String jobTupleKey = ((ScalarNode)jobTuple.getKeyNode()).getValue();
- if (jobTupleKey.equals("defaultFixedIssuesFilter")) {
- itJobTuple.remove();
- } else if (jobTupleKey.equals("reports")) {
- SequenceNode reportsNode = (SequenceNode) jobTuple.getValueNode();
- for (Iterator itReportsItem = reportsNode.getValue().iterator(); itReportsItem.hasNext();) {
- MappingNode reportNode = (MappingNode) itReportsItem.next();
- if (reportNode.getTag().getValue().equals("!JobHtmlReport"))
- itReportsItem.remove();
- }
- }
- }
- }
- }
- }
- }
-
- @SuppressWarnings("unused")
- private void migrate3(VersionedYamlDoc doc, Stack versions) {
- for (NodeTuple specTuple: doc.getValue()) {
- if (((ScalarNode)specTuple.getKeyNode()).getValue().equals("jobs")) {
- SequenceNode jobsNode = (SequenceNode) specTuple.getValueNode();
- for (Node jobsNodeItem: jobsNode.getValue()) {
- MappingNode jobNode = (MappingNode) jobsNodeItem;
- for (NodeTuple jobTuple: jobNode.getValue()) {
- String jobTupleKey = ((ScalarNode)jobTuple.getKeyNode()).getValue();
- if (jobTupleKey.equals("reports")) {
- SequenceNode reportsNode = (SequenceNode) jobTuple.getValueNode();
- for (Node reportNode: reportsNode.getValue()) {
- if (reportNode.getTag().getValue().equals("!JobJestReport"))
- reportNode.setTag(new Tag("!JobJestTestReport"));
- }
- }
- }
- }
- }
- }
- }
-
- @SuppressWarnings("unused")
- private void migrate4(VersionedYamlDoc doc, Stack versions) {
- for (NodeTuple specTuple: doc.getValue()) {
- if (((ScalarNode)specTuple.getKeyNode()).getValue().equals("jobs")) {
- SequenceNode jobsNode = (SequenceNode) specTuple.getValueNode();
- for (Node jobsNodeItem: jobsNode.getValue()) {
- MappingNode jobNode = (MappingNode) jobsNodeItem;
- for (NodeTuple jobTuple: jobNode.getValue()) {
- String jobTupleKey = ((ScalarNode)jobTuple.getKeyNode()).getValue();
- if (jobTupleKey.equals("triggers")) {
- SequenceNode triggersNode = (SequenceNode) jobTuple.getValueNode();
- for (Node triggerNode: triggersNode.getValue()) {
- if (triggerNode.getTag().getValue().equals("!PullRequestTrigger"))
- triggerNode.setTag(new Tag("!PullRequestUpdateTrigger"));
- }
- }
- }
- }
- }
- }
- }
-
- @SuppressWarnings("unused")
- private void migrate5(VersionedYamlDoc doc, Stack versions) {
- List newServiceNodes = new ArrayList<>();
- for (NodeTuple specTuple: doc.getValue()) {
- if (((ScalarNode)specTuple.getKeyNode()).getValue().equals("jobs")) {
- SequenceNode jobsNode = (SequenceNode) specTuple.getValueNode();
- for (Node jobsNodeItem: jobsNode.getValue()) {
- MappingNode jobNode = (MappingNode) jobsNodeItem;
- Node imageNode = null;
- Node commandsNode = null;
- Node servicesNode = null;
- String jobName = null;
- for (Iterator itJobTuple = jobNode.getValue().iterator(); itJobTuple.hasNext();) {
- NodeTuple jobTuple = itJobTuple.next();
- String jobTupleKey = ((ScalarNode)jobTuple.getKeyNode()).getValue();
- if (jobTupleKey.equals("name")) {
- jobName = ((ScalarNode)jobTuple.getValueNode()).getValue();
- } else if (jobTupleKey.equals("image")) {
- imageNode = jobTuple.getValueNode();
- itJobTuple.remove();
- } else if (jobTupleKey.equals("commands")) {
- commandsNode = jobTuple.getValueNode();
- itJobTuple.remove();
- } else if (jobTupleKey.equals("services")) {
- servicesNode = jobTuple.getValueNode();
- itJobTuple.remove();
- }
- }
-
- Preconditions.checkState(jobName != null && imageNode != null && commandsNode != null);
-
- List stepTuples = new ArrayList<>();
- stepTuples.add(new NodeTuple(new ScalarNode(Tag.STR, "image"), imageNode));
- stepTuples.add(new NodeTuple(new ScalarNode(Tag.STR, "commands"), commandsNode));
- stepTuples.add(new NodeTuple(
- new ScalarNode(Tag.STR, "condition"),
- new ScalarNode(Tag.STR, "ALL_PREVIOUS_STEPS_WERE_SUCCESSFUL")));
- Node stepNode = new MappingNode(new Tag("!CommandStep"), stepTuples, FlowStyle.BLOCK);
- Node stepsNode = new SequenceNode(Tag.SEQ, Lists.newArrayList(stepNode), FlowStyle.BLOCK);
- NodeTuple stepsTuple = new NodeTuple(new ScalarNode(Tag.STR, "steps"), stepsNode);
- jobNode.getValue().add(stepsTuple);
-
- if (servicesNode != null) {
- List serviceNameNodes = new ArrayList<>();
- for (Node serviceNodeItem: ((SequenceNode) servicesNode).getValue()) {
- MappingNode serviceNode = (MappingNode) serviceNodeItem;
- List newServiceTuples = new ArrayList<>();
- for (NodeTuple serviceTuple: serviceNode.getValue()) {
- if (((ScalarNode)serviceTuple.getKeyNode()).getValue().equals("name")) {
- String newServiceName = jobName + "-"
- + ((ScalarNode)serviceTuple.getValueNode()).getValue();
- serviceNameNodes.add(new ScalarNode(Tag.STR, newServiceName));
- newServiceTuples.add(new NodeTuple(
- new ScalarNode(Tag.STR, "name"),
- new ScalarNode(Tag.STR, newServiceName)));
- } else {
- newServiceTuples.add(serviceTuple);
- }
- }
- newServiceNodes.add(new MappingNode(Tag.MAP, newServiceTuples, FlowStyle.BLOCK));
- }
- jobNode.getValue().add(new NodeTuple(
- new ScalarNode(Tag.STR, "requiredServices"),
- new SequenceNode(Tag.SEQ, serviceNameNodes, FlowStyle.BLOCK)));
- }
- }
- }
- }
-
- if (!newServiceNodes.isEmpty()) {
- doc.getValue().add(new NodeTuple(
- new ScalarNode(Tag.STR, "services"),
- new SequenceNode(Tag.SEQ, newServiceNodes, FlowStyle.BLOCK)));
- }
- }
-
- @SuppressWarnings("unused")
- private void migrate6(VersionedYamlDoc doc, Stack versions) {
- for (NodeTuple specTuple: doc.getValue()) {
- if (((ScalarNode)specTuple.getKeyNode()).getValue().equals("jobs")) {
- SequenceNode jobsNode = (SequenceNode) specTuple.getValueNode();
- for (Node jobsNodeItem: jobsNode.getValue()) {
- MappingNode jobNode = (MappingNode) jobsNodeItem;
- boolean retrieveSource = false;
- Node cloneCredentialNode = null;
- Node cloneDepthNode = null;
- Node artifactsNode = null;
- SequenceNode reportsNode = null;
- SequenceNode stepsNode = null;
- List actionNodes = new ArrayList<>();
- for (Iterator itJobTuple = jobNode.getValue().iterator(); itJobTuple.hasNext();) {
- NodeTuple jobTuple = itJobTuple.next();
- String jobTupleKey = ((ScalarNode)jobTuple.getKeyNode()).getValue();
- if (jobTupleKey.equals("retrieveSource")) {
- retrieveSource = ((ScalarNode)jobTuple.getValueNode()).getValue().equals("true");
- itJobTuple.remove();
- } else if (jobTupleKey.equals("cloneCredential")) {
- cloneCredentialNode = jobTuple.getValueNode();
- itJobTuple.remove();
- } else if (jobTupleKey.equals("cloneDepth")) {
- cloneDepthNode = jobTuple.getValueNode();
- itJobTuple.remove();
- } else if (jobTupleKey.equals("artifacts")) {
- artifactsNode = jobTuple.getValueNode();
- itJobTuple.remove();
- } else if (jobTupleKey.equals("reports")) {
- reportsNode = (SequenceNode) jobTuple.getValueNode();
- itJobTuple.remove();
- } else if (jobTupleKey.equals("steps")) {
- stepsNode = (SequenceNode) jobTuple.getValueNode();
- } else if (jobTupleKey.equals("postBuildActions")) {
- SequenceNode actionsNode = (SequenceNode) jobTuple.getValueNode();
- for (Iterator itActionNode = actionsNode.getValue().iterator(); itActionNode.hasNext();) {
- MappingNode actionNode = (MappingNode) itActionNode.next();
- String tagName = actionNode.getTag().getValue();
- if (tagName.equals("!CreateTagAction") || tagName.equals("!CloseMilestoneAction")) {
- actionNodes.add(actionNode);
- itActionNode.remove();
- }
- }
- if (actionsNode.getValue().isEmpty())
- itJobTuple.remove();
- }
- }
- Preconditions.checkState(cloneCredentialNode != null && stepsNode != null);
- if (retrieveSource) {
- List stepTuples = new ArrayList<>();
- stepTuples.add(new NodeTuple(new ScalarNode(Tag.STR, "cloneCredential"), cloneCredentialNode));
- if (cloneDepthNode != null)
- stepTuples.add(new NodeTuple(new ScalarNode(Tag.STR, "cloneDepth"), cloneDepthNode));
- stepTuples.add(new NodeTuple(
- new ScalarNode(Tag.STR, "condition"),
- new ScalarNode(Tag.STR, "ALL_PREVIOUS_STEPS_WERE_SUCCESSFUL")));
- Node stepNode = new MappingNode(new Tag("!CheckoutStep"), stepTuples, FlowStyle.BLOCK);
- stepsNode.getValue().add(0, stepNode);
- }
- if (artifactsNode != null) {
- List stepTuples = new ArrayList<>();
- stepTuples.add(new NodeTuple(new ScalarNode(Tag.STR, "artifacts"), artifactsNode));
- stepTuples.add(new NodeTuple(
- new ScalarNode(Tag.STR, "condition"),
- new ScalarNode(Tag.STR, "ALL_PREVIOUS_STEPS_WERE_SUCCESSFUL")));
- Node stepNode = new MappingNode(new Tag("!PublishArtifactStep"), stepTuples, FlowStyle.BLOCK);
- stepsNode.getValue().add(stepNode);
- }
- if (reportsNode != null) {
- for (Node reportsNodeItem: reportsNode.getValue()) {
- MappingNode reportNode = (MappingNode) reportsNodeItem;
- List stepTuples = new ArrayList<>();
- stepTuples.addAll(reportNode.getValue());
- stepTuples.add(new NodeTuple(
- new ScalarNode(Tag.STR, "condition"),
- new ScalarNode(Tag.STR, "ALWAYS")));
- String tagName = reportNode.getTag().getValue();
- tagName = tagName.replaceFirst("Job", "Publish") + "Step";
- Node stepNode = new MappingNode(new Tag(tagName), stepTuples, FlowStyle.BLOCK);
- stepsNode.getValue().add(stepNode);
- }
- }
- for (MappingNode actionNode: actionNodes) {
- String tagName = actionNode.getTag().getValue().replace("Action", "Step");
- List stepTuples = new ArrayList<>();
- for (NodeTuple tuple: actionNode.getValue()) {
- String key = ((ScalarNode)tuple.getKeyNode()).getValue();
- if (!key.equals("condition"))
- stepTuples.add(tuple);
- }
- stepTuples.add(new NodeTuple(
- new ScalarNode(Tag.STR, "condition"),
- new ScalarNode(Tag.STR, "ALL_PREVIOUS_STEPS_WERE_SUCCESSFUL")));
- Node stepNode = new MappingNode(new Tag(tagName), stepTuples, FlowStyle.BLOCK);
- stepsNode.getValue().add(stepNode);
- }
- }
- }
- }
-
- for (NodeTuple specTuple: doc.getValue()) {
- String specObjectKey = ((ScalarNode)specTuple.getKeyNode()).getValue();
- if (specObjectKey.equals("jobs")) {
- SequenceNode jobsNode = (SequenceNode) specTuple.getValueNode();
- for (Node jobsNodeItem: jobsNode.getValue()) {
- MappingNode jobNode = (MappingNode) jobsNodeItem;
- for (NodeTuple jobTuple: jobNode.getValue()) {
- String jobTupleKey = ((ScalarNode)jobTuple.getKeyNode()).getValue();
- if (jobTupleKey.equals("steps")) {
- SequenceNode stepsNode = (SequenceNode) jobTuple.getValueNode();
- for (Node stepsNodeItem: stepsNode.getValue()) {
- MappingNode stepNode = (MappingNode) stepsNodeItem;
- String tagName = stepNode.getTag().getValue();
- String stepName = WordUtils.uncamel(tagName.substring(1).replace("Step", "")).toLowerCase();
- stepNode.getValue().add(new NodeTuple(new ScalarNode(Tag.STR, "name"),
- new ScalarNode(Tag.STR, stepName)));
- }
- }
- }
- }
- } else if (specObjectKey.equals("stepTemplates")) {
- SequenceNode stepTemplatesNode = (SequenceNode) specTuple.getValueNode();
- for (Node stepTemplatesNodeItem: stepTemplatesNode.getValue()) {
- MappingNode stepTemplateNode = (MappingNode) stepTemplatesNodeItem;
- for (NodeTuple stepTemplateTuple: stepTemplateNode.getValue()) {
- String stepTemplateTupleKey = ((ScalarNode)stepTemplateTuple.getKeyNode()).getValue();
- if (stepTemplateTupleKey.equals("steps")) {
- SequenceNode stepsNode = (SequenceNode) stepTemplateTuple.getValueNode();
- for (Node stepsNodeItem: stepsNode.getValue()) {
- MappingNode stepNode = (MappingNode) stepsNodeItem;
- String tagName = stepNode.getTag().getValue();
- String stepName = WordUtils.uncamel(tagName.substring(1).replace("Step", "")).toLowerCase();
- stepNode.getValue().add(new NodeTuple(new ScalarNode(Tag.STR, "name"),
- new ScalarNode(Tag.STR, stepName)));
- }
- }
- }
- }
- }
- }
- }
-
- @SuppressWarnings("unused")
- private void migrate7(VersionedYamlDoc doc, Stack versions) {
- for (NodeTuple specTuple: doc.getValue()) {
- String specKey = ((ScalarNode)specTuple.getKeyNode()).getValue();
- if (specKey.equals("jobs")) {
- SequenceNode jobsNode = (SequenceNode) specTuple.getValueNode();
- for (Node jobsNodeItem: jobsNode.getValue()) {
- MappingNode jobNode = (MappingNode) jobsNodeItem;
- for (NodeTuple jobTuple: jobNode.getValue()) {
- String jobTupleKey = ((ScalarNode)jobTuple.getKeyNode()).getValue();
- if (jobTupleKey.equals("paramSpecs")) {
- SequenceNode paramsNode = (SequenceNode) jobTuple.getValueNode();
- for (Node paramsNodeItem: paramsNode.getValue()) {
- MappingNode paramNode = (MappingNode) paramsNodeItem;
- String paramType = paramNode.getTag().getValue();
- if (paramType.equals("!NumberParam")) {
- paramNode.setTag(new Tag("!IntegerParam"));
- } else if (paramType.equals("!TextParam")) {
- NodeTuple multilineTuple = new NodeTuple(
- new ScalarNode(Tag.STR, "multiline"),
- new ScalarNode(Tag.STR, "false"));
- paramNode.getValue().add(multilineTuple);
- }
- }
- }
- }
- }
- } else if (specKey.equals("stepTemplates")) {
- SequenceNode stepTemplatesNode = (SequenceNode) specTuple.getValueNode();
- for (Node stepTemplatesNodeItem: stepTemplatesNode.getValue()) {
- MappingNode stepTemplateNode = (MappingNode) stepTemplatesNodeItem;
- for (NodeTuple stepTemplateTuple: stepTemplateNode.getValue()) {
- String stemTemplateTupleKey = ((ScalarNode)stepTemplateTuple.getKeyNode()).getValue();
- if (stemTemplateTupleKey.equals("paramSpecs")) {
- SequenceNode paramsNode = (SequenceNode) stepTemplateTuple.getValueNode();
- for (Node paramsNodeItem: paramsNode.getValue()) {
- MappingNode paramNode = (MappingNode) paramsNodeItem;
- String paramType = paramNode.getTag().getValue();
- if (paramType.equals("!NumberParam")) {
- paramNode.setTag(new Tag("!IntegerParam"));
- } else if (paramType.equals("!TextParam")) {
- NodeTuple multilineTuple = new NodeTuple(
- new ScalarNode(Tag.STR, "multiline"),
- new ScalarNode(Tag.STR, "false"));
- paramNode.getValue().add(multilineTuple);
- }
- }
- }
- }
- }
- }
- }
- }
-
- @SuppressWarnings("unused")
- private void migrate8(VersionedYamlDoc doc, Stack versions) {
- for (NodeTuple specTuple: doc.getValue()) {
- String specKey = ((ScalarNode)specTuple.getKeyNode()).getValue();
- if (specKey.equals("jobs")) {
- SequenceNode jobsNode = (SequenceNode) specTuple.getValueNode();
- for (Node jobsNodeItem: jobsNode.getValue()) {
- MappingNode jobNode = (MappingNode) jobsNodeItem;
- for (NodeTuple jobTuple: jobNode.getValue()) {
- String jobTupleKey = ((ScalarNode)jobTuple.getKeyNode()).getValue();
- if (jobTupleKey.equals("projectDependencies")) {
- SequenceNode projectDependenciesNode = (SequenceNode) jobTuple.getValueNode();
- for (Node projectDependenciesNodeItem: projectDependenciesNode.getValue()) {
- MappingNode projectDependencyNode = (MappingNode) projectDependenciesNodeItem;
- String buildNumber = null;
- for (Iterator itProjectDependencyTuple = projectDependencyNode.getValue().iterator(); itProjectDependencyTuple.hasNext();) {
- NodeTuple projectDependencyTuple = itProjectDependencyTuple.next();
- String projectDependencyTupleKey = ((ScalarNode)projectDependencyTuple.getKeyNode()).getValue();
- if (projectDependencyTupleKey.equals("buildNumber")) {
- buildNumber = ((ScalarNode)projectDependencyTuple.getValueNode()).getValue();
- itProjectDependencyTuple.remove();
- break;
- }
- }
- Preconditions.checkNotNull(buildNumber);
-
- List buildProviderTuples = new ArrayList<>();
- buildProviderTuples.add(new NodeTuple(
- new ScalarNode(Tag.STR, "buildNumber"),
- new ScalarNode(Tag.STR, buildNumber)));
- Node buildProviderNode = new MappingNode(new Tag("!SpecifiedBuild"), buildProviderTuples, FlowStyle.BLOCK);
- projectDependencyNode.getValue().add(new NodeTuple(new ScalarNode(Tag.STR, "buildProvider"), buildProviderNode));
- }
- }
- }
- }
- }
- }
- }
-
- @SuppressWarnings("unused")
- private void migrate9(VersionedYamlDoc doc, Stack versions) {
- for (NodeTuple specTuple: doc.getValue()) {
- String specObjectKey = ((ScalarNode)specTuple.getKeyNode()).getValue();
- if (specObjectKey.equals("jobs")) {
- SequenceNode jobsNode = (SequenceNode) specTuple.getValueNode();
- for (Node jobsNodeItem: jobsNode.getValue()) {
- MappingNode jobNode = (MappingNode) jobsNodeItem;
- for (NodeTuple jobTuple: jobNode.getValue()) {
- String jobTupleKey = ((ScalarNode)jobTuple.getKeyNode()).getValue();
- if (jobTupleKey.equals("steps")) {
- SequenceNode stepsNode = (SequenceNode) jobTuple.getValueNode();
- for (Node stepsNodeItem: stepsNode.getValue()) {
- MappingNode stepNode = (MappingNode) stepsNodeItem;
- if (stepNode.getTag().getValue().equals("!CommandStep")) {
- stepNode.getValue().add(new NodeTuple(new ScalarNode(Tag.STR, "useTTY"),
- new ScalarNode(Tag.BOOL, "false")));
- }
- }
- }
- }
- }
- } else if (specObjectKey.equals("stepTemplates")) {
- SequenceNode stepTemplatesNode = (SequenceNode) specTuple.getValueNode();
- for (Node stepTemplatesNodeItem: stepTemplatesNode.getValue()) {
- MappingNode stepTemplateNode = (MappingNode) stepTemplatesNodeItem;
- for (NodeTuple stepTemplateTuple: stepTemplateNode.getValue()) {
- String stepTemplateTupleKey = ((ScalarNode)stepTemplateTuple.getKeyNode()).getValue();
- if (stepTemplateTupleKey.equals("steps")) {
- SequenceNode stepsNode = (SequenceNode) stepTemplateTuple.getValueNode();
- for (Node stepsNodeItem: stepsNode.getValue()) {
- MappingNode stepNode = (MappingNode) stepsNodeItem;
- if (stepNode.getTag().getValue().equals("!CommandStep")) {
- stepNode.getValue().add(new NodeTuple(new ScalarNode(Tag.STR, "useTTY"),
- new ScalarNode(Tag.BOOL, "false")));
- }
- }
- }
- }
- }
- }
- }
- }
-
- @SuppressWarnings("unused")
- private void migrate10(VersionedYamlDoc doc, Stack versions) {
- for (NodeTuple specTuple: doc.getValue()) {
- String specObjectKey = ((ScalarNode)specTuple.getKeyNode()).getValue();
- if (specObjectKey.equals("jobs")) {
- SequenceNode jobsNode = (SequenceNode) specTuple.getValueNode();
- for (Node jobsNodeItem: jobsNode.getValue()) {
- MappingNode jobNode = (MappingNode) jobsNodeItem;
- for (NodeTuple jobTuple: jobNode.getValue()) {
- String jobTupleKey = ((ScalarNode)jobTuple.getKeyNode()).getValue();
- if (jobTupleKey.equals("cpuRequirement")) {
- ScalarNode cpuRequirementNode = (ScalarNode) jobTuple.getValueNode();
- String cpuRequirement = cpuRequirementNode.getValue();
- cpuRequirementNode.setValue(cpuRequirement.substring(0, cpuRequirement.length()-1));
- } else if (jobTupleKey.equals("memoryRequirement")) {
- ScalarNode memoryRequirementNode = (ScalarNode) jobTuple.getValueNode();
- String memoryRequirement = memoryRequirementNode.getValue();
- memoryRequirementNode.setValue(memoryRequirement.substring(0, memoryRequirement.length()-1));
- }
- }
- }
- } else if (specObjectKey.equals("services")) {
- SequenceNode servicesNode = (SequenceNode) specTuple.getValueNode();
- for (Node servicesNodeItem: servicesNode.getValue()) {
- MappingNode serviceNode = (MappingNode) servicesNodeItem;
- for (NodeTuple serviceTuple: serviceNode.getValue()) {
- String serviceTupleKey = ((ScalarNode)serviceTuple.getKeyNode()).getValue();
- if (serviceTupleKey.equals("cpuRequirement")) {
- ScalarNode cpuRequirementNode = (ScalarNode) serviceTuple.getValueNode();
- String cpuRequirement = cpuRequirementNode.getValue();
- cpuRequirementNode.setValue(cpuRequirement.substring(0, cpuRequirement.length()-1));
- } else if (serviceTupleKey.equals("memoryRequirement")) {
- ScalarNode memoryRequirementNode = (ScalarNode) serviceTuple.getValueNode();
- String memoryRequirement = memoryRequirementNode.getValue();
- memoryRequirementNode.setValue(memoryRequirement.substring(0, memoryRequirement.length()-1));
- }
- }
- }
- }
- }
- }
-
- @SuppressWarnings("unused")
- private void migrate11(VersionedYamlDoc doc, Stack versions) {
- for (NodeTuple specTuple: doc.getValue()) {
- String specObjectKey = ((ScalarNode)specTuple.getKeyNode()).getValue();
- if (specObjectKey.equals("jobs")) {
- SequenceNode jobsNode = (SequenceNode) specTuple.getValueNode();
- for (Node jobsNodeItem: jobsNode.getValue()) {
- MappingNode jobNode = (MappingNode) jobsNodeItem;
- for (NodeTuple jobTuple: jobNode.getValue()) {
- String jobTupleKey = ((ScalarNode)jobTuple.getKeyNode()).getValue();
- if (jobTupleKey.equals("steps")) {
- SequenceNode stepsNode = (SequenceNode) jobTuple.getValueNode();
- for (Node stepsNodeItem: stepsNode.getValue()) {
- MappingNode stepNode = (MappingNode) stepsNodeItem;
- if (stepNode.getTag().getValue().equals("!CheckoutStep")) {
- stepNode.getValue().add(new NodeTuple(new ScalarNode(Tag.STR, "withLfs"),
- new ScalarNode(Tag.BOOL, "false")));
- stepNode.getValue().add(new NodeTuple(new ScalarNode(Tag.STR, "withSubmodules"),
- new ScalarNode(Tag.BOOL, "true")));
- }
- }
- }
- }
- }
- } else if (specObjectKey.equals("stepTemplates")) {
- SequenceNode stepTemplatesNode = (SequenceNode) specTuple.getValueNode();
- for (Node stepTemplatesNodeItem: stepTemplatesNode.getValue()) {
- MappingNode stepTemplateNode = (MappingNode) stepTemplatesNodeItem;
- for (NodeTuple stepTemplateTuple: stepTemplateNode.getValue()) {
- String stepTemplateTupleKey = ((ScalarNode)stepTemplateTuple.getKeyNode()).getValue();
- if (stepTemplateTupleKey.equals("steps")) {
- SequenceNode stepsNode = (SequenceNode) stepTemplateTuple.getValueNode();
- for (Node stepsNodeItem: stepsNode.getValue()) {
- MappingNode stepNode = (MappingNode) stepsNodeItem;
- if (stepNode.getTag().getValue().equals("!CheckoutStep")) {
- stepNode.getValue().add(new NodeTuple(new ScalarNode(Tag.STR, "withLfs"),
- new ScalarNode(Tag.BOOL, "false")));
- stepNode.getValue().add(new NodeTuple(new ScalarNode(Tag.STR, "withSubmodules"),
- new ScalarNode(Tag.BOOL, "true")));
- }
- }
- }
- }
- }
- }
- }
- }
-
- @SuppressWarnings("unused")
- private void migrate12(VersionedYamlDoc doc, Stack versions) {
- for (NodeTuple specTuple: doc.getValue()) {
- String specObjectKey = ((ScalarNode)specTuple.getKeyNode()).getValue();
- if (specObjectKey.equals("jobs")) {
- SequenceNode jobsNode = (SequenceNode) specTuple.getValueNode();
- for (Node jobsNodeItem: jobsNode.getValue()) {
- MappingNode jobNode = (MappingNode) jobsNodeItem;
- for (NodeTuple jobTuple: jobNode.getValue()) {
- String jobTupleKey = ((ScalarNode)jobTuple.getKeyNode()).getValue();
- if (jobTupleKey.equals("steps")) {
- SequenceNode stepsNode = (SequenceNode) jobTuple.getValueNode();
- for (Node stepsNodeItem: stepsNode.getValue()) {
- MappingNode stepNode = (MappingNode) stepsNodeItem;
- if (stepNode.getTag().getValue().equals("!PublishJestTestReportStep"))
- stepNode.setTag(new Tag("!PublishJestReportStep"));
- }
- }
- }
- }
- } else if (specObjectKey.equals("stepTemplates")) {
- SequenceNode stepTemplatesNode = (SequenceNode) specTuple.getValueNode();
- for (Node stepTemplatesNodeItem: stepTemplatesNode.getValue()) {
- MappingNode stepTemplateNode = (MappingNode) stepTemplatesNodeItem;
- for (NodeTuple stepTemplateTuple: stepTemplateNode.getValue()) {
- String stepTemplateTupleKey = ((ScalarNode)stepTemplateTuple.getKeyNode()).getValue();
- if (stepTemplateTupleKey.equals("steps")) {
- SequenceNode stepsNode = (SequenceNode) stepTemplateTuple.getValueNode();
- for (Node stepsNodeItem: stepsNode.getValue()) {
- MappingNode stepNode = (MappingNode) stepsNodeItem;
- if (stepNode.getTag().getValue().equals("!PublishJestTestReportStep"))
- stepNode.setTag(new Tag("!PublishJestReportStep"));
- }
- }
- }
- }
- }
- }
- }
-
- @SuppressWarnings("unused")
- private void migrate13(VersionedYamlDoc doc, Stack versions) {
- for (NodeTuple specTuple: doc.getValue()) {
- String specTupleKey = ((ScalarNode)specTuple.getKeyNode()).getValue();
- if (specTupleKey.equals("jobs")) {
- SequenceNode jobsNode = (SequenceNode) specTuple.getValueNode();
- for (Node jobsNodeItem: jobsNode.getValue()) {
- MappingNode jobNode = (MappingNode) jobsNodeItem;
- for (Iterator itJobTuple = jobNode.getValue().iterator(); itJobTuple.hasNext();) {
- NodeTuple jobTuple = itJobTuple.next();
- String jobTupleKey = ((ScalarNode)jobTuple.getKeyNode()).getValue();
- if (jobTupleKey.equals("projectDependencies")) {
- SequenceNode projectDependenciesNode = (SequenceNode) jobTuple.getValueNode();
- for (Node projectDependenciesItem: projectDependenciesNode.getValue()) {
- MappingNode projectDependencyNode = (MappingNode) projectDependenciesItem;
- for (Iterator itProjectDependencyTuple = projectDependencyNode.getValue().iterator();
- itProjectDependencyTuple.hasNext();) {
- NodeTuple projectDependencyTuple = itProjectDependencyTuple.next();
- ScalarNode projectDependencyTupleKeyNode = ((ScalarNode)projectDependencyTuple.getKeyNode());
- if (projectDependencyTupleKeyNode.getValue().equals("projectName"))
- projectDependencyTupleKeyNode.setValue("projectPath");
- }
- }
- }
- }
- }
- } else if (specTupleKey.equals("imports")) {
- SequenceNode importsNode = (SequenceNode) specTuple.getValueNode();
- for (Node importsNodeItem: importsNode.getValue()) {
- MappingNode importNode = (MappingNode) importsNodeItem;
- for (Iterator itImportTuple = importNode.getValue().iterator(); itImportTuple.hasNext();) {
- NodeTuple importTuple = itImportTuple.next();
- ScalarNode importTupleKeyNode = (ScalarNode)importTuple.getKeyNode();
- if (importTupleKeyNode.getValue().equals("projectName"))
- importTupleKeyNode.setValue("projectPath");
- }
- }
- }
- }
- }
-
- private void migrate14_steps(SequenceNode stepsNode) {
- for (Node stepsNodeItem: stepsNode.getValue()) {
- MappingNode stepNode = (MappingNode) stepsNodeItem;
- if (stepNode.getTag().getValue().equals("!CommandStep")) {
- Node commandsNode = null;
- for (Iterator itStepNodeTuple = stepNode.getValue().iterator(); itStepNodeTuple.hasNext();) {
- NodeTuple stepNodeTuple = itStepNodeTuple.next();
- if (((ScalarNode)stepNodeTuple.getKeyNode()).getValue().equals("commands")) {
- commandsNode = stepNodeTuple.getValueNode();
- itStepNodeTuple.remove();
- break;
- }
- }
- if (commandsNode != null) {
- List interpreterTuples = new ArrayList<>();
- interpreterTuples.add(new NodeTuple(new ScalarNode(Tag.STR, "commands"), commandsNode));
- stepNode.getValue().add(new NodeTuple(
- new ScalarNode(Tag.STR, "interpreter"),
- new MappingNode(new Tag("!DefaultInterpreter"), interpreterTuples, FlowStyle.BLOCK)));
- }
- stepNode.getValue().add(new NodeTuple(
- new ScalarNode(Tag.STR, "runInContainer"),
- new ScalarNode(Tag.BOOL, "true")));
- }
- }
- }
-
- @SuppressWarnings("unused")
- private void migrate14(VersionedYamlDoc doc, Stack versions) {
- for (NodeTuple specTuple: doc.getValue()) {
- String specObjectKey = ((ScalarNode)specTuple.getKeyNode()).getValue();
- if (specObjectKey.equals("jobs")) {
- SequenceNode jobsNode = (SequenceNode) specTuple.getValueNode();
- for (Node jobsNodeItem: jobsNode.getValue()) {
- MappingNode jobNode = (MappingNode) jobsNodeItem;
- for (NodeTuple jobTuple: jobNode.getValue()) {
- String jobTupleKey = ((ScalarNode)jobTuple.getKeyNode()).getValue();
- if (jobTupleKey.equals("steps"))
- migrate14_steps((SequenceNode) jobTuple.getValueNode());
- }
- }
- } else if (specObjectKey.equals("stepTemplates")) {
- SequenceNode stepTemplatesNode = (SequenceNode) specTuple.getValueNode();
- for (Node stepTemplatesNodeItem: stepTemplatesNode.getValue()) {
- MappingNode stepTemplateNode = (MappingNode) stepTemplatesNodeItem;
- for (NodeTuple stepTemplateTuple: stepTemplateNode.getValue()) {
- String stepTemplateTupleKey = ((ScalarNode)stepTemplateTuple.getKeyNode()).getValue();
- if (stepTemplateTupleKey.equals("steps"))
- migrate14_steps((SequenceNode) stepTemplateTuple.getValueNode());
- }
- }
- }
- }
- }
-
- private void migrate15_steps(SequenceNode stepsNode) {
- for (Node stepsNodeItem: stepsNode.getValue()) {
- MappingNode stepNode = (MappingNode) stepsNodeItem;
- if (stepNode.getTag().getValue().equals("!BuildImageStep")) {
- for (Iterator itStepNodeTuple = stepNode.getValue().iterator(); itStepNodeTuple.hasNext();) {
- NodeTuple stepNodeTuple = itStepNodeTuple.next();
- String key = ((ScalarNode)stepNodeTuple.getKeyNode()).getValue();
- if (key.equals("useTTY") || key.equals("login"))
- itStepNodeTuple.remove();
- }
- }
- }
- }
-
- @SuppressWarnings("unused")
- private void migrate15(VersionedYamlDoc doc, Stack versions) {
- for (NodeTuple specTuple: doc.getValue()) {
- String specObjectKey = ((ScalarNode)specTuple.getKeyNode()).getValue();
- if (specObjectKey.equals("jobs")) {
- SequenceNode jobsNode = (SequenceNode) specTuple.getValueNode();
- for (Node jobsNodeItem: jobsNode.getValue()) {
- MappingNode jobNode = (MappingNode) jobsNodeItem;
- for (NodeTuple jobTuple: jobNode.getValue()) {
- String jobTupleKey = ((ScalarNode)jobTuple.getKeyNode()).getValue();
- if (jobTupleKey.equals("steps"))
- migrate15_steps((SequenceNode) jobTuple.getValueNode());
- }
- }
- } else if (specObjectKey.equals("stepTemplates")) {
- SequenceNode stepTemplatesNode = (SequenceNode) specTuple.getValueNode();
- for (Node stepTemplatesNodeItem: stepTemplatesNode.getValue()) {
- MappingNode stepTemplateNode = (MappingNode) stepTemplatesNodeItem;
- for (NodeTuple stepTemplateTuple: stepTemplateNode.getValue()) {
- String stepTemplateTupleKey = ((ScalarNode)stepTemplateTuple.getKeyNode()).getValue();
- if (stepTemplateTupleKey.equals("steps"))
- migrate15_steps((SequenceNode) stepTemplateTuple.getValueNode());
- }
- }
- }
- }
- }
-
- private void migrate16_steps(SequenceNode stepsNode) {
- for (Node stepsNodeItem: stepsNode.getValue()) {
- MappingNode stepNode = (MappingNode) stepsNodeItem;
- if (stepNode.getTag().getValue().equals("!CommandStep")) {
- for (Iterator itStepNodeTuple = stepNode.getValue().iterator(); itStepNodeTuple.hasNext();) {
- NodeTuple stepNodeTuple = itStepNodeTuple.next();
- String key = ((ScalarNode)stepNodeTuple.getKeyNode()).getValue();
- if (key.equals("interpreter")) {
- MappingNode interpreterNode = (MappingNode) stepNodeTuple.getValueNode();
- if (interpreterNode.getTag().getValue().equals("!BashInterpreter")) {
- interpreterNode.setTag(new Tag("!ShellInterpreter"));
- interpreterNode.getValue().add(new NodeTuple(
- new ScalarNode(Tag.STR, "shell"), new ScalarNode(Tag.STR, "bash")));
- }
- }
- }
- }
- }
- }
-
- @SuppressWarnings("unused")
- private void migrate16(VersionedYamlDoc doc, Stack versions) {
- for (NodeTuple specTuple: doc.getValue()) {
- String specObjectKey = ((ScalarNode)specTuple.getKeyNode()).getValue();
- if (specObjectKey.equals("jobs")) {
- SequenceNode jobsNode = (SequenceNode) specTuple.getValueNode();
- for (Node jobsNodeItem: jobsNode.getValue()) {
- MappingNode jobNode = (MappingNode) jobsNodeItem;
- for (NodeTuple jobTuple: jobNode.getValue()) {
- String jobTupleKey = ((ScalarNode)jobTuple.getKeyNode()).getValue();
- if (jobTupleKey.equals("steps"))
- migrate16_steps((SequenceNode) jobTuple.getValueNode());
- }
- }
- } else if (specObjectKey.equals("stepTemplates")) {
- SequenceNode stepTemplatesNode = (SequenceNode) specTuple.getValueNode();
- for (Node stepTemplatesNodeItem: stepTemplatesNode.getValue()) {
- MappingNode stepTemplateNode = (MappingNode) stepTemplatesNodeItem;
- for (NodeTuple stepTemplateTuple: stepTemplateNode.getValue()) {
- String stepTemplateTupleKey = ((ScalarNode)stepTemplateTuple.getKeyNode()).getValue();
- if (stepTemplateTupleKey.equals("steps"))
- migrate16_steps((SequenceNode) stepTemplateTuple.getValueNode());
- }
- }
- }
- }
- }
-
- @SuppressWarnings("unused")
- private void migrate17(VersionedYamlDoc doc, Stack versions) {
- for (NodeTuple specTuple: doc.getValue()) {
- if (((ScalarNode)specTuple.getKeyNode()).getValue().equals("jobs")) {
- SequenceNode jobsNode = (SequenceNode) specTuple.getValueNode();
- for (Node jobsNodeItem: jobsNode.getValue()) {
- MappingNode jobNode = (MappingNode) jobsNodeItem;
- List actionNodes = new ArrayList<>();
- for (Iterator itJobTuple = jobNode.getValue().iterator(); itJobTuple.hasNext();) {
- NodeTuple jobTuple = itJobTuple.next();
- String jobTupleKey = ((ScalarNode)jobTuple.getKeyNode()).getValue();
- if (jobTupleKey.equals("postBuildActions")) {
- SequenceNode actionsNode = (SequenceNode) jobTuple.getValueNode();
- for (Node actionNodeItem: actionsNode.getValue()) {
- MappingNode actionNode = (MappingNode) actionNodeItem;
- if (actionNode.getTag().getValue().equals("!CreateIssueAction")) {
- actionNode.getValue().add(new NodeTuple(
- new ScalarNode(Tag.STR, "issueConfidential"), new ScalarNode(Tag.STR, "false")));
- }
- }
- }
- }
- }
- }
- }
- }
-
- private void migrate18_steps(SequenceNode stepsNode) {
- for (Node stepsNodeItem: stepsNode.getValue()) {
- MappingNode stepNode = (MappingNode) stepsNodeItem;
- if (stepNode.getTag().getValue().equals("!PullRepository")) {
- stepNode.getValue().add(new NodeTuple(
- new ScalarNode(Tag.STR, "syncToChildProject"), new ScalarNode(Tag.STR, "false")));
- }
- }
- }
-
- @SuppressWarnings("unused")
- private void migrate18(VersionedYamlDoc doc, Stack versions) {
- for (NodeTuple specTuple: doc.getValue()) {
- String specObjectKey = ((ScalarNode)specTuple.getKeyNode()).getValue();
- if (specObjectKey.equals("jobs")) {
- SequenceNode jobsNode = (SequenceNode) specTuple.getValueNode();
- for (Node jobsNodeItem: jobsNode.getValue()) {
- MappingNode jobNode = (MappingNode) jobsNodeItem;
- for (NodeTuple jobTuple: jobNode.getValue()) {
- String jobTupleKey = ((ScalarNode)jobTuple.getKeyNode()).getValue();
- if (jobTupleKey.equals("steps"))
- migrate18_steps((SequenceNode) jobTuple.getValueNode());
- }
- }
- } else if (specObjectKey.equals("stepTemplates")) {
- SequenceNode stepTemplatesNode = (SequenceNode) specTuple.getValueNode();
- for (Node stepTemplatesNodeItem: stepTemplatesNode.getValue()) {
- MappingNode stepTemplateNode = (MappingNode) stepTemplatesNodeItem;
- for (NodeTuple stepTemplateTuple: stepTemplateNode.getValue()) {
- String stepTemplateTupleKey = ((ScalarNode)stepTemplateTuple.getKeyNode()).getValue();
- if (stepTemplateTupleKey.equals("steps"))
- migrate18_steps((SequenceNode) stepTemplateTuple.getValueNode());
- }
- }
- }
- }
- }
-
-}
+package io.onedev.server.buildspec;
+
+import com.google.common.base.Preconditions;
+import com.google.common.cache.CacheBuilder;
+import com.google.common.cache.CacheLoader;
+import com.google.common.cache.LoadingCache;
+import com.google.common.collect.Lists;
+import io.onedev.commons.codeassist.InputCompletion;
+import io.onedev.commons.codeassist.InputStatus;
+import io.onedev.commons.codeassist.InputSuggestion;
+import io.onedev.commons.utils.ExceptionUtils;
+import io.onedev.commons.utils.LinearRange;
+import io.onedev.commons.utils.StringUtils;
+import io.onedev.commons.utils.WordUtils;
+import io.onedev.server.OneDev;
+import io.onedev.server.buildspec.job.Job;
+import io.onedev.server.buildspec.job.JobDependency;
+import io.onedev.server.buildspec.param.ParamUtils;
+import io.onedev.server.buildspec.param.spec.ParamSpec;
+import io.onedev.server.buildspec.step.Step;
+import io.onedev.server.buildspec.step.StepTemplate;
+import io.onedev.server.buildspec.step.UseTemplateStep;
+import io.onedev.server.migration.VersionedYamlDoc;
+import io.onedev.server.migration.XmlBuildSpecMigrator;
+import io.onedev.server.util.ComponentContext;
+import io.onedev.server.util.JobSecretAuthorizationContext;
+import io.onedev.server.util.validation.Validatable;
+import io.onedev.server.util.validation.annotation.ClassValidating;
+import io.onedev.server.web.editable.annotation.Editable;
+import io.onedev.server.web.page.project.blob.ProjectBlobPage;
+import io.onedev.server.web.util.SuggestionUtils;
+import io.onedev.server.web.util.WicketUtils;
+import org.apache.commons.lang3.SerializationUtils;
+import org.apache.wicket.Component;
+import org.eclipse.jgit.revwalk.RevCommit;
+import org.yaml.snakeyaml.DumperOptions.FlowStyle;
+import org.yaml.snakeyaml.nodes.*;
+
+import javax.annotation.Nullable;
+import javax.validation.*;
+import java.io.Serializable;
+import java.nio.charset.StandardCharsets;
+import java.util.*;
+import java.util.function.Function;
+
+@Editable
+@ClassValidating
+public class BuildSpec implements Serializable, Validatable {
+
+ private static final long serialVersionUID = 1L;
+
+ private static final LoadingCache parseCache =
+ CacheBuilder.newBuilder().softValues().build(new CacheLoader() {
+
+ @Override
+ public byte[] load(String key) {
+ String buildSpecString = key;
+ if (buildSpecString.trim().startsWith(" jobs = new ArrayList<>();
+
+ private List stepTemplates = new ArrayList<>();
+
+ private List services = new ArrayList<>();
+
+ private List properties = new ArrayList<>();
+
+ private List imports = new ArrayList<>();
+
+ private transient List importedBuildSpecs;
+
+ private transient Map jobMap;
+
+ private transient Map stepTemplateMap;
+
+ private transient Map serviceMap;
+
+ private transient Map propertyMap;
+
+ @Editable
+ @Valid
+ public List getJobs() {
+ return jobs;
+ }
+
+ public void setJobs(List jobs) {
+ this.jobs = jobs;
+ jobMap = null;
+ }
+
+ @Editable
+ @Valid
+ public List getStepTemplates() {
+ return stepTemplates;
+ }
+
+ public void setStepTemplates(List stepTemplates) {
+ this.stepTemplates = stepTemplates;
+ stepTemplateMap = null;
+ }
+
+ @Editable
+ @Valid
+ public List getServices() {
+ return services;
+ }
+
+ public void setServices(List services) {
+ this.services = services;
+ serviceMap = null;
+ }
+
+ @Editable
+ public List getProperties() {
+ return properties;
+ }
+
+ public void setProperties(List properties) {
+ this.properties = properties;
+ propertyMap = null;
+ }
+
+ @Editable
+ @Valid
+ public List getImports() {
+ return imports;
+ }
+
+ public void setImports(List imports) {
+ this.imports = imports;
+ importedBuildSpecs = null;
+ }
+
+ private List getImportedBuildSpecs(Collection projectChain) {
+ if (importedBuildSpecs == null) {
+ importedBuildSpecs = new ArrayList<>();
+ for (Import aImport: getImports()) {
+ if (!projectChain.contains(aImport.getProjectPath())) {
+ Collection newProjectChain = new HashSet<>(projectChain);
+ newProjectChain.add(aImport.getProjectPath());
+ try {
+ BuildSpec importedBuildSpec = aImport.getBuildSpec();
+ RevCommit commit = aImport.getProject().getRevCommit(aImport.getTag(), true);
+ JobSecretAuthorizationContext.push(new JobSecretAuthorizationContext(aImport.getProject(), commit, null));
+ try {
+ importedBuildSpecs.addAll(importedBuildSpec.getImportedBuildSpecs(newProjectChain));
+ } finally {
+ JobSecretAuthorizationContext.pop();
+ }
+ importedBuildSpecs.add(importedBuildSpec);
+ } catch (Exception e) {
+ // Ignore here as we rely on this method to show viewer/editor
+ // Errors relating to this will be shown when validated
+ }
+ }
+ }
+ }
+ return importedBuildSpecs;
+ }
+
+ public Map getJobMap() {
+ if (jobMap == null) {
+ jobMap = new LinkedHashMap<>();
+ for (BuildSpec buildSpec: getImportedBuildSpecs(new HashSet<>())) {
+ for (Job job: buildSpec.getJobs())
+ jobMap.put(job.getName(), job);
+ }
+ for (Job job: getJobs())
+ jobMap.put(job.getName(), job);
+ }
+ return jobMap;
+ }
+
+ public Map getPropertyMap() {
+ if (propertyMap == null) {
+ propertyMap = new LinkedHashMap<>();
+ for (BuildSpec buildSpec: getImportedBuildSpecs(new HashSet<>())) {
+ for (Property property: buildSpec.getProperties())
+ propertyMap.put(property.getName(), property);
+ }
+ for (Property property: getProperties())
+ propertyMap.put(property.getName(), property);
+ }
+ return propertyMap;
+ }
+
+ public Map getStepTemplateMap() {
+ if (stepTemplateMap == null) {
+ stepTemplateMap = new LinkedHashMap<>();
+ for (BuildSpec buildSpec: getImportedBuildSpecs(new HashSet<>())) {
+ for (StepTemplate template: buildSpec.getStepTemplates())
+ stepTemplateMap.put(template.getName(), template);
+ }
+ for (StepTemplate template: getStepTemplates())
+ stepTemplateMap.put(template.getName(), template);
+ }
+ return stepTemplateMap;
+ }
+
+ public Map getServiceMap() {
+ if (serviceMap == null) {
+ serviceMap = new LinkedHashMap<>();
+ for (BuildSpec buildSpec: getImportedBuildSpecs(new HashSet<>())) {
+ for (Service service: buildSpec.getServices())
+ serviceMap.put(service.getName(), service);
+ }
+ for (Service service: services)
+ serviceMap.put(service.getName(), service);
+ }
+ return serviceMap;
+ }
+
+ private int getImportIndex(String namedElementName, Function> namedElementMapProvider) {
+ for (int i=imports.size()-1; i>=0; i--) {
+ if (namedElementMapProvider.apply(imports.get(i).getBuildSpec()).containsKey(namedElementName))
+ return i;
+ }
+ return -1;
+ }
+
+ private boolean validateImportedElements(ConstraintValidatorContext context,
+ List namedElements, Function> namedElementMapProvider, String elementTypeName) {
+ boolean isValid = true;
+ Validator validator = OneDev.getInstance(Validator.class);
+ for (T element: namedElementMapProvider.apply(this).values()) {
+ int elementIndex = namedElements.indexOf(element);
+ if (elementIndex == -1) {
+ int importIndex = getImportIndex(element.getName(), namedElementMapProvider);
+ for (ConstraintViolation violation: validator.validate(element)) {
+ String location;
+ if (violation.getPropertyPath().toString().length() != 0)
+ location = "location: " + violation.getPropertyPath() + ", ";
+ else
+ location = "";
+
+ String errorMessage = String.format("Error validating imported %s (%s: %s, %serror message: %s)",
+ elementTypeName, elementTypeName, element.getName(), location, violation.getMessage());
+ context.buildConstraintViolationWithTemplate(errorMessage)
+ .addPropertyNode(PROP_IMPORTS)
+ .addBeanNode()
+ .inIterable().atIndex(importIndex)
+ .addConstraintViolation();
+ isValid = false;
+ }
+ }
+ }
+ return isValid;
+ }
+
+ @Override
+ public boolean isValid(ConstraintValidatorContext context) {
+ boolean isValid = true;
+
+ if (!validateImportedElements(context, jobs, it->it.getJobMap(), "job"))
+ isValid = false;
+ if (!validateImportedElements(context, services, it->it.getServiceMap(), "service"))
+ isValid = false;
+ if (!validateImportedElements(context, stepTemplates, it->it.getStepTemplateMap(), "step template"))
+ isValid = false;
+ if (!validateImportedElements(context, properties, it->it.getPropertyMap(), "property"))
+ isValid = false;
+
+ Set jobNames = new HashSet<>();
+ for (Job job: jobs) {
+ if (!jobNames.add(job.getName())) {
+ context.buildConstraintViolationWithTemplate("Duplicate job name (" + job.getName() + ")")
+ .addPropertyNode(PROP_JOBS).addConstraintViolation();
+ isValid = false;
+ }
+ }
+ Set serviceNames = new HashSet<>();
+ for (Service service: services) {
+ if (!serviceNames.add(service.getName())) {
+ context.buildConstraintViolationWithTemplate("Duplicate service name (" + service.getName() + ")")
+ .addPropertyNode(PROP_SERVICES).addConstraintViolation();
+ isValid = false;
+ }
+ }
+ Set stepTemplateNames = new HashSet<>();
+ for (StepTemplate template: stepTemplates) {
+ if (!stepTemplateNames.add(template.getName())) {
+ context.buildConstraintViolationWithTemplate("Duplicate template name (" + template.getName() + ")")
+ .addPropertyNode(PROP_STEP_TEMPLATES).addConstraintViolation();
+ isValid = false;
+ }
+ }
+ Set propertyNames = new HashSet<>();
+ for (Property property: properties) {
+ if (!propertyNames.add(property.getName())) {
+ context.buildConstraintViolationWithTemplate("Duplicate property name (" + property.getName() + ")")
+ .addPropertyNode(PROP_PROPERTIES).addConstraintViolation();
+ isValid = false;
+ }
+ }
+ Set importProjectNames = new HashSet<>();
+ for (Import aImport: imports) {
+ if (!importProjectNames.add(aImport.getProjectPath())) {
+ context.buildConstraintViolationWithTemplate("Duplicate import (" + aImport.getProjectPath() + ")")
+ .addPropertyNode(PROP_IMPORTS).addConstraintViolation();
+ isValid = false;
+ }
+ }
+
+ if (isValid) {
+ for (StepTemplate template: getStepTemplateMap().values()) {
+ int templateIndex = stepTemplates.indexOf(template);
+ for (int stepIndex=0; stepIndex());
+ } catch (Exception e) {
+ if (templateIndex != -1) {
+ context.buildConstraintViolationWithTemplate(e.getMessage())
+ .addPropertyNode(PROP_STEP_TEMPLATES)
+ .addPropertyNode(StepTemplate.PROP_STEPS)
+ .inIterable().atIndex(templateIndex)
+ .addPropertyNode(UseTemplateStep.PROP_TEMPLATE_NAME)
+ .inIterable().atIndex(stepIndex)
+ .addConstraintViolation();
+ } else {
+ int importIndex = getImportIndex(template.getName(), it->it.getStepTemplateMap());
+ String errorMessage = String.format("Error validating imported step template (step template: %s, error message: %s)",
+ template.getName(), e.getMessage());
+ context.buildConstraintViolationWithTemplate(errorMessage)
+ .addPropertyNode(PROP_IMPORTS)
+ .addBeanNode()
+ .inIterable().atIndex(importIndex)
+ .addConstraintViolation();
+ }
+ isValid = false;
+ }
+ }
+ }
+ }
+
+ for (Job job: getJobMap().values()) {
+ int jobIndex = jobs.indexOf(job);
+ try {
+ checkDependencies(job, new ArrayList<>());
+ } catch (Exception e) {
+ if (jobIndex != -1) {
+ context.buildConstraintViolationWithTemplate(e.getMessage())
+ .addPropertyNode(PROP_JOBS)
+ .addPropertyNode(Job.PROP_JOB_DEPENDENCIES)
+ .inIterable().atIndex(jobIndex)
+ .addConstraintViolation();
+ } else {
+ int importIndex = getImportIndex(job.getName(), it->it.getJobMap());
+ String errorMessage = String.format("Error validating imported job (job: %s, error message: %s)",
+ job.getName(), e.getMessage());
+ context.buildConstraintViolationWithTemplate(errorMessage)
+ .addPropertyNode(PROP_IMPORTS)
+ .addBeanNode()
+ .inIterable().atIndex(importIndex)
+ .addConstraintViolation();
+ }
+ isValid = false;
+ }
+
+ for (String serviceName: job.getRequiredServices()) {
+ if (!getServiceMap().containsKey(serviceName)) {
+ context.buildConstraintViolationWithTemplate("Undefined service (" + serviceName + ")")
+ .addPropertyNode(PROP_JOBS)
+ .addPropertyNode(Job.PROP_REQUIRED_SERVICES)
+ .inIterable().atIndex(jobIndex)
+ .addConstraintViolation();
+ isValid = false;
+ }
+ }
+
+ for (int stepIndex=0; stepIndex());
+ } catch (Exception e) {
+ if (jobIndex != -1) {
+ context.buildConstraintViolationWithTemplate(e.getMessage())
+ .addPropertyNode(PROP_JOBS)
+ .addPropertyNode(Job.PROP_STEPS)
+ .inIterable().atIndex(jobIndex)
+ .addPropertyNode(UseTemplateStep.PROP_TEMPLATE_NAME)
+ .inIterable().atIndex(stepIndex)
+ .addConstraintViolation();
+ } else {
+ int importIndex = getImportIndex(job.getName(), it->it.getJobMap());
+ String errorMessage = String.format("Error validating imported job (job: %s, location: steps[%d].templateName, error message: %s)",
+ job.getName(), stepIndex, e.getMessage());
+ context.buildConstraintViolationWithTemplate(errorMessage)
+ .addPropertyNode(PROP_IMPORTS)
+ .addBeanNode()
+ .inIterable().atIndex(importIndex)
+ .addConstraintViolation();
+ }
+ isValid = false;
+ }
+ }
+ }
+ }
+ }
+
+ if (isValid) {
+ // Build spec and jobs are valid so far, we can do more validations with them safely
+ for (Job job: getJobMap().values()) {
+ int jobIndex = jobs.indexOf(job);
+ for (int actionIndex=0; actionIndexit.getJobMap());
+ String errorMessage = String.format("Error validating imported job (job: %s, error message: %s)",
+ job.getName(), e.getMessage());
+ context.buildConstraintViolationWithTemplate(errorMessage)
+ .addPropertyNode(PROP_IMPORTS)
+ .addBeanNode()
+ .inIterable().atIndex(importIndex)
+ .addConstraintViolation();
+ }
+ isValid = false;
+ }
+ }
+ }
+ }
+
+ if (!isValid)
+ context.disableDefaultConstraintViolation();
+ return isValid;
+ }
+
+ private void checkTemplateUsages(UseTemplateStep step, List templateChain) {
+ if(templateChain.contains(step.getTemplateName())) {
+ templateChain.add(step.getTemplateName());
+ throw new ValidationException("Circular template usages (" + templateChain + ")");
+ } else {
+ StepTemplate template = getStepTemplateMap().get(step.getTemplateName());
+ if (template != null) {
+ if (templateChain.isEmpty()) {
+ try {
+ ParamUtils.validateParams(template.getParamSpecs(), step.getParams());
+ } catch (Exception e) {
+ throw new ValidationException(String.format("Error validating step template parameters (%s)", e.getMessage()));
+ }
+ }
+ templateChain.add(step.getTemplateName());
+ for (Step templateStep: template.getSteps()) {
+ if (templateStep instanceof UseTemplateStep)
+ checkTemplateUsages((UseTemplateStep) templateStep, new ArrayList<>(templateChain));
+ }
+ } else if (templateChain.isEmpty()) {
+ throw new ValidationException("Step template not found (" + step.getTemplateName() + ")");
+ }
+ }
+ }
+
+ private void checkDependencies(Job job, List dependencyChain) {
+ for (JobDependency dependency: job.getJobDependencies()) {
+ if (dependencyChain.contains(dependency.getJobName())) {
+ dependencyChain.add(dependency.getJobName());
+ throw new ValidationException("Circular dependencies (" + dependencyChain + ")");
+ } else {
+ Job dependencyJob = getJobMap().get(dependency.getJobName());
+ if (dependencyJob != null) {
+ if (dependencyChain.isEmpty()) {
+ try {
+ ParamUtils.validateParams(dependencyJob.getParamSpecs(), dependency.getJobParams());
+ } catch (ValidationException e) {
+ String message = String.format("Error validating dependency job parameters (dependency job: %s, error message: %s)",
+ dependencyJob.getName(), e.getMessage());
+ throw new ValidationException(message);
+ }
+ }
+ List newDependencyChain = new ArrayList<>(dependencyChain);
+ newDependencyChain.add(dependency.getJobName());
+ checkDependencies(dependencyJob, newDependencyChain);
+ } else if (dependencyChain.isEmpty()) {
+ throw new ValidationException("Dependency job not found (" + dependency.getJobName() + ")");
+ }
+ }
+ }
+ }
+
+ public static List suggestOverrides(List imported, InputStatus status) {
+ List completions = new ArrayList<>();
+ String matchWith = status.getContentBeforeCaret().toLowerCase();
+ for (String each: imported) {
+ LinearRange match = LinearRange.match(each, matchWith);
+ if (match != null) {
+ completions.add(new InputCompletion(each, each + status.getContentAfterCaret(),
+ each.length(), "override imported", match));
+ }
+ }
+
+ return completions;
+ }
+
+ @Nullable
+ public static BuildSpec get() {
+ Component component = ComponentContext.get().getComponent();
+ BuildSpecAware buildSpecAware = WicketUtils.findInnermost(component, BuildSpecAware.class);
+ if (buildSpecAware != null)
+ return buildSpecAware.getBuildSpec();
+ else
+ return null;
+ }
+
+ public static List suggestVariables(String matchWith,
+ boolean withBuildVersion, boolean withDynamicVariables, boolean withPauseCommand) {
+ List suggestions = new ArrayList<>();
+ BuildSpec buildSpec = get();
+ if (buildSpec != null) {
+ ProjectBlobPage page = (ProjectBlobPage) WicketUtils.getPage();
+ suggestions.addAll(SuggestionUtils.suggestVariables(
+ page.getProject(), buildSpec, ParamSpec.list(),
+ matchWith, withBuildVersion, withDynamicVariables, withPauseCommand));
+ }
+ return suggestions;
+ }
+
+ @Nullable
+ public static BuildSpec parse(byte[] bytes) {
+ String buildSpecString = new String(bytes, StandardCharsets.UTF_8);
+ if (StringUtils.isNotBlank(buildSpecString)) {
+ try {
+ return SerializationUtils.deserialize(parseCache.getUnchecked(buildSpecString));
+ } catch (Exception e) {
+ BuildSpecParseException parseException = ExceptionUtils.find(e, BuildSpecParseException.class);
+ if (parseException != null)
+ throw parseException;
+ else
+ throw e;
+ }
+ } else {
+ return null;
+ }
+ }
+
+ @SuppressWarnings("unused")
+ private void migrate1(VersionedYamlDoc doc, Stack versions) {
+ for (NodeTuple specTuple: doc.getValue()) {
+ if (((ScalarNode)specTuple.getKeyNode()).getValue().equals("jobs")) {
+ SequenceNode jobsNode = (SequenceNode) specTuple.getValueNode();
+ for (Node jobsNodeItem: jobsNode.getValue()) {
+ MappingNode jobNode = (MappingNode) jobsNodeItem;
+ for (Iterator itJobTuple = jobNode.getValue().iterator(); itJobTuple.hasNext();) {
+ NodeTuple jobTuple = itJobTuple.next();
+ String jobTupleKey = ((ScalarNode)jobTuple.getKeyNode()).getValue();
+ if (jobTupleKey.equals("submoduleCredentials")) {
+ itJobTuple.remove();
+ } else if (jobTupleKey.equals("projectDependencies")) {
+ SequenceNode projectDependenciesNode = (SequenceNode) jobTuple.getValueNode();
+ for (Node projectDependenciesItem: projectDependenciesNode.getValue()) {
+ MappingNode projectDependencyNode = (MappingNode) projectDependenciesItem;
+ for (Iterator itProjectDependencyTuple = projectDependencyNode.getValue().iterator();
+ itProjectDependencyTuple.hasNext();) {
+ NodeTuple projectDependencyTuple = itProjectDependencyTuple.next();
+ if (((ScalarNode)projectDependencyTuple.getKeyNode()).getValue().equals("authentication"))
+ itProjectDependencyTuple.remove();
+ }
+ }
+ }
+ }
+ NodeTuple cloneCredentialTuple = new NodeTuple(
+ new ScalarNode(Tag.STR, "cloneCredential"),
+ new MappingNode(new Tag("!DefaultCredential"), Lists.newArrayList(), FlowStyle.BLOCK));
+ jobNode.getValue().add(cloneCredentialTuple);
+ }
+ }
+ }
+ }
+
+ @SuppressWarnings("unused")
+ private void migrate2(VersionedYamlDoc doc, Stack versions) {
+ for (NodeTuple specTuple: doc.getValue()) {
+ if (((ScalarNode)specTuple.getKeyNode()).getValue().equals("jobs")) {
+ SequenceNode jobsNode = (SequenceNode) specTuple.getValueNode();
+ for (Node jobsNodeItem: jobsNode.getValue()) {
+ MappingNode jobNode = (MappingNode) jobsNodeItem;
+ for (Iterator itJobTuple = jobNode.getValue().iterator(); itJobTuple.hasNext();) {
+ NodeTuple jobTuple = itJobTuple.next();
+ String jobTupleKey = ((ScalarNode)jobTuple.getKeyNode()).getValue();
+ if (jobTupleKey.equals("defaultFixedIssuesFilter")) {
+ itJobTuple.remove();
+ } else if (jobTupleKey.equals("reports")) {
+ SequenceNode reportsNode = (SequenceNode) jobTuple.getValueNode();
+ for (Iterator itReportsItem = reportsNode.getValue().iterator(); itReportsItem.hasNext();) {
+ MappingNode reportNode = (MappingNode) itReportsItem.next();
+ if (reportNode.getTag().getValue().equals("!JobHtmlReport"))
+ itReportsItem.remove();
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+
+ @SuppressWarnings("unused")
+ private void migrate3(VersionedYamlDoc doc, Stack versions) {
+ for (NodeTuple specTuple: doc.getValue()) {
+ if (((ScalarNode)specTuple.getKeyNode()).getValue().equals("jobs")) {
+ SequenceNode jobsNode = (SequenceNode) specTuple.getValueNode();
+ for (Node jobsNodeItem: jobsNode.getValue()) {
+ MappingNode jobNode = (MappingNode) jobsNodeItem;
+ for (NodeTuple jobTuple: jobNode.getValue()) {
+ String jobTupleKey = ((ScalarNode)jobTuple.getKeyNode()).getValue();
+ if (jobTupleKey.equals("reports")) {
+ SequenceNode reportsNode = (SequenceNode) jobTuple.getValueNode();
+ for (Node reportNode: reportsNode.getValue()) {
+ if (reportNode.getTag().getValue().equals("!JobJestReport"))
+ reportNode.setTag(new Tag("!JobJestTestReport"));
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+
+ @SuppressWarnings("unused")
+ private void migrate4(VersionedYamlDoc doc, Stack versions) {
+ for (NodeTuple specTuple: doc.getValue()) {
+ if (((ScalarNode)specTuple.getKeyNode()).getValue().equals("jobs")) {
+ SequenceNode jobsNode = (SequenceNode) specTuple.getValueNode();
+ for (Node jobsNodeItem: jobsNode.getValue()) {
+ MappingNode jobNode = (MappingNode) jobsNodeItem;
+ for (NodeTuple jobTuple: jobNode.getValue()) {
+ String jobTupleKey = ((ScalarNode)jobTuple.getKeyNode()).getValue();
+ if (jobTupleKey.equals("triggers")) {
+ SequenceNode triggersNode = (SequenceNode) jobTuple.getValueNode();
+ for (Node triggerNode: triggersNode.getValue()) {
+ if (triggerNode.getTag().getValue().equals("!PullRequestTrigger"))
+ triggerNode.setTag(new Tag("!PullRequestUpdateTrigger"));
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+
+ @SuppressWarnings("unused")
+ private void migrate5(VersionedYamlDoc doc, Stack versions) {
+ List newServiceNodes = new ArrayList<>();
+ for (NodeTuple specTuple: doc.getValue()) {
+ if (((ScalarNode)specTuple.getKeyNode()).getValue().equals("jobs")) {
+ SequenceNode jobsNode = (SequenceNode) specTuple.getValueNode();
+ for (Node jobsNodeItem: jobsNode.getValue()) {
+ MappingNode jobNode = (MappingNode) jobsNodeItem;
+ Node imageNode = null;
+ Node commandsNode = null;
+ Node servicesNode = null;
+ String jobName = null;
+ for (Iterator itJobTuple = jobNode.getValue().iterator(); itJobTuple.hasNext();) {
+ NodeTuple jobTuple = itJobTuple.next();
+ String jobTupleKey = ((ScalarNode)jobTuple.getKeyNode()).getValue();
+ if (jobTupleKey.equals("name")) {
+ jobName = ((ScalarNode)jobTuple.getValueNode()).getValue();
+ } else if (jobTupleKey.equals("image")) {
+ imageNode = jobTuple.getValueNode();
+ itJobTuple.remove();
+ } else if (jobTupleKey.equals("commands")) {
+ commandsNode = jobTuple.getValueNode();
+ itJobTuple.remove();
+ } else if (jobTupleKey.equals("services")) {
+ servicesNode = jobTuple.getValueNode();
+ itJobTuple.remove();
+ }
+ }
+
+ Preconditions.checkState(jobName != null && imageNode != null && commandsNode != null);
+
+ List stepTuples = new ArrayList<>();
+ stepTuples.add(new NodeTuple(new ScalarNode(Tag.STR, "image"), imageNode));
+ stepTuples.add(new NodeTuple(new ScalarNode(Tag.STR, "commands"), commandsNode));
+ stepTuples.add(new NodeTuple(
+ new ScalarNode(Tag.STR, "condition"),
+ new ScalarNode(Tag.STR, "ALL_PREVIOUS_STEPS_WERE_SUCCESSFUL")));
+ Node stepNode = new MappingNode(new Tag("!CommandStep"), stepTuples, FlowStyle.BLOCK);
+ Node stepsNode = new SequenceNode(Tag.SEQ, Lists.newArrayList(stepNode), FlowStyle.BLOCK);
+ NodeTuple stepsTuple = new NodeTuple(new ScalarNode(Tag.STR, "steps"), stepsNode);
+ jobNode.getValue().add(stepsTuple);
+
+ if (servicesNode != null) {
+ List serviceNameNodes = new ArrayList<>();
+ for (Node serviceNodeItem: ((SequenceNode) servicesNode).getValue()) {
+ MappingNode serviceNode = (MappingNode) serviceNodeItem;
+ List newServiceTuples = new ArrayList<>();
+ for (NodeTuple serviceTuple: serviceNode.getValue()) {
+ if (((ScalarNode)serviceTuple.getKeyNode()).getValue().equals("name")) {
+ String newServiceName = jobName + "-"
+ + ((ScalarNode)serviceTuple.getValueNode()).getValue();
+ serviceNameNodes.add(new ScalarNode(Tag.STR, newServiceName));
+ newServiceTuples.add(new NodeTuple(
+ new ScalarNode(Tag.STR, "name"),
+ new ScalarNode(Tag.STR, newServiceName)));
+ } else {
+ newServiceTuples.add(serviceTuple);
+ }
+ }
+ newServiceNodes.add(new MappingNode(Tag.MAP, newServiceTuples, FlowStyle.BLOCK));
+ }
+ jobNode.getValue().add(new NodeTuple(
+ new ScalarNode(Tag.STR, "requiredServices"),
+ new SequenceNode(Tag.SEQ, serviceNameNodes, FlowStyle.BLOCK)));
+ }
+ }
+ }
+ }
+
+ if (!newServiceNodes.isEmpty()) {
+ doc.getValue().add(new NodeTuple(
+ new ScalarNode(Tag.STR, "services"),
+ new SequenceNode(Tag.SEQ, newServiceNodes, FlowStyle.BLOCK)));
+ }
+ }
+
+ @SuppressWarnings("unused")
+ private void migrate6(VersionedYamlDoc doc, Stack versions) {
+ for (NodeTuple specTuple: doc.getValue()) {
+ if (((ScalarNode)specTuple.getKeyNode()).getValue().equals("jobs")) {
+ SequenceNode jobsNode = (SequenceNode) specTuple.getValueNode();
+ for (Node jobsNodeItem: jobsNode.getValue()) {
+ MappingNode jobNode = (MappingNode) jobsNodeItem;
+ boolean retrieveSource = false;
+ Node cloneCredentialNode = null;
+ Node cloneDepthNode = null;
+ Node artifactsNode = null;
+ SequenceNode reportsNode = null;
+ SequenceNode stepsNode = null;
+ List actionNodes = new ArrayList<>();
+ for (Iterator itJobTuple = jobNode.getValue().iterator(); itJobTuple.hasNext();) {
+ NodeTuple jobTuple = itJobTuple.next();
+ String jobTupleKey = ((ScalarNode)jobTuple.getKeyNode()).getValue();
+ if (jobTupleKey.equals("retrieveSource")) {
+ retrieveSource = ((ScalarNode)jobTuple.getValueNode()).getValue().equals("true");
+ itJobTuple.remove();
+ } else if (jobTupleKey.equals("cloneCredential")) {
+ cloneCredentialNode = jobTuple.getValueNode();
+ itJobTuple.remove();
+ } else if (jobTupleKey.equals("cloneDepth")) {
+ cloneDepthNode = jobTuple.getValueNode();
+ itJobTuple.remove();
+ } else if (jobTupleKey.equals("artifacts")) {
+ artifactsNode = jobTuple.getValueNode();
+ itJobTuple.remove();
+ } else if (jobTupleKey.equals("reports")) {
+ reportsNode = (SequenceNode) jobTuple.getValueNode();
+ itJobTuple.remove();
+ } else if (jobTupleKey.equals("steps")) {
+ stepsNode = (SequenceNode) jobTuple.getValueNode();
+ } else if (jobTupleKey.equals("postBuildActions")) {
+ SequenceNode actionsNode = (SequenceNode) jobTuple.getValueNode();
+ for (Iterator itActionNode = actionsNode.getValue().iterator(); itActionNode.hasNext();) {
+ MappingNode actionNode = (MappingNode) itActionNode.next();
+ String tagName = actionNode.getTag().getValue();
+ if (tagName.equals("!CreateTagAction") || tagName.equals("!CloseMilestoneAction")) {
+ actionNodes.add(actionNode);
+ itActionNode.remove();
+ }
+ }
+ if (actionsNode.getValue().isEmpty())
+ itJobTuple.remove();
+ }
+ }
+ Preconditions.checkState(cloneCredentialNode != null && stepsNode != null);
+ if (retrieveSource) {
+ List stepTuples = new ArrayList<>();
+ stepTuples.add(new NodeTuple(new ScalarNode(Tag.STR, "cloneCredential"), cloneCredentialNode));
+ if (cloneDepthNode != null)
+ stepTuples.add(new NodeTuple(new ScalarNode(Tag.STR, "cloneDepth"), cloneDepthNode));
+ stepTuples.add(new NodeTuple(
+ new ScalarNode(Tag.STR, "condition"),
+ new ScalarNode(Tag.STR, "ALL_PREVIOUS_STEPS_WERE_SUCCESSFUL")));
+ Node stepNode = new MappingNode(new Tag("!CheckoutStep"), stepTuples, FlowStyle.BLOCK);
+ stepsNode.getValue().add(0, stepNode);
+ }
+ if (artifactsNode != null) {
+ List stepTuples = new ArrayList<>();
+ stepTuples.add(new NodeTuple(new ScalarNode(Tag.STR, "artifacts"), artifactsNode));
+ stepTuples.add(new NodeTuple(
+ new ScalarNode(Tag.STR, "condition"),
+ new ScalarNode(Tag.STR, "ALL_PREVIOUS_STEPS_WERE_SUCCESSFUL")));
+ Node stepNode = new MappingNode(new Tag("!PublishArtifactStep"), stepTuples, FlowStyle.BLOCK);
+ stepsNode.getValue().add(stepNode);
+ }
+ if (reportsNode != null) {
+ for (Node reportsNodeItem: reportsNode.getValue()) {
+ MappingNode reportNode = (MappingNode) reportsNodeItem;
+ List stepTuples = new ArrayList<>();
+ stepTuples.addAll(reportNode.getValue());
+ stepTuples.add(new NodeTuple(
+ new ScalarNode(Tag.STR, "condition"),
+ new ScalarNode(Tag.STR, "ALWAYS")));
+ String tagName = reportNode.getTag().getValue();
+ tagName = tagName.replaceFirst("Job", "Publish") + "Step";
+ Node stepNode = new MappingNode(new Tag(tagName), stepTuples, FlowStyle.BLOCK);
+ stepsNode.getValue().add(stepNode);
+ }
+ }
+ for (MappingNode actionNode: actionNodes) {
+ String tagName = actionNode.getTag().getValue().replace("Action", "Step");
+ List stepTuples = new ArrayList<>();
+ for (NodeTuple tuple: actionNode.getValue()) {
+ String key = ((ScalarNode)tuple.getKeyNode()).getValue();
+ if (!key.equals("condition"))
+ stepTuples.add(tuple);
+ }
+ stepTuples.add(new NodeTuple(
+ new ScalarNode(Tag.STR, "condition"),
+ new ScalarNode(Tag.STR, "ALL_PREVIOUS_STEPS_WERE_SUCCESSFUL")));
+ Node stepNode = new MappingNode(new Tag(tagName), stepTuples, FlowStyle.BLOCK);
+ stepsNode.getValue().add(stepNode);
+ }
+ }
+ }
+ }
+
+ for (NodeTuple specTuple: doc.getValue()) {
+ String specObjectKey = ((ScalarNode)specTuple.getKeyNode()).getValue();
+ if (specObjectKey.equals("jobs")) {
+ SequenceNode jobsNode = (SequenceNode) specTuple.getValueNode();
+ for (Node jobsNodeItem: jobsNode.getValue()) {
+ MappingNode jobNode = (MappingNode) jobsNodeItem;
+ for (NodeTuple jobTuple: jobNode.getValue()) {
+ String jobTupleKey = ((ScalarNode)jobTuple.getKeyNode()).getValue();
+ if (jobTupleKey.equals("steps")) {
+ SequenceNode stepsNode = (SequenceNode) jobTuple.getValueNode();
+ for (Node stepsNodeItem: stepsNode.getValue()) {
+ MappingNode stepNode = (MappingNode) stepsNodeItem;
+ String tagName = stepNode.getTag().getValue();
+ String stepName = WordUtils.uncamel(tagName.substring(1).replace("Step", "")).toLowerCase();
+ stepNode.getValue().add(new NodeTuple(new ScalarNode(Tag.STR, "name"),
+ new ScalarNode(Tag.STR, stepName)));
+ }
+ }
+ }
+ }
+ } else if (specObjectKey.equals("stepTemplates")) {
+ SequenceNode stepTemplatesNode = (SequenceNode) specTuple.getValueNode();
+ for (Node stepTemplatesNodeItem: stepTemplatesNode.getValue()) {
+ MappingNode stepTemplateNode = (MappingNode) stepTemplatesNodeItem;
+ for (NodeTuple stepTemplateTuple: stepTemplateNode.getValue()) {
+ String stepTemplateTupleKey = ((ScalarNode)stepTemplateTuple.getKeyNode()).getValue();
+ if (stepTemplateTupleKey.equals("steps")) {
+ SequenceNode stepsNode = (SequenceNode) stepTemplateTuple.getValueNode();
+ for (Node stepsNodeItem: stepsNode.getValue()) {
+ MappingNode stepNode = (MappingNode) stepsNodeItem;
+ String tagName = stepNode.getTag().getValue();
+ String stepName = WordUtils.uncamel(tagName.substring(1).replace("Step", "")).toLowerCase();
+ stepNode.getValue().add(new NodeTuple(new ScalarNode(Tag.STR, "name"),
+ new ScalarNode(Tag.STR, stepName)));
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+
+ @SuppressWarnings("unused")
+ private void migrate7(VersionedYamlDoc doc, Stack versions) {
+ for (NodeTuple specTuple: doc.getValue()) {
+ String specKey = ((ScalarNode)specTuple.getKeyNode()).getValue();
+ if (specKey.equals("jobs")) {
+ SequenceNode jobsNode = (SequenceNode) specTuple.getValueNode();
+ for (Node jobsNodeItem: jobsNode.getValue()) {
+ MappingNode jobNode = (MappingNode) jobsNodeItem;
+ for (NodeTuple jobTuple: jobNode.getValue()) {
+ String jobTupleKey = ((ScalarNode)jobTuple.getKeyNode()).getValue();
+ if (jobTupleKey.equals("paramSpecs")) {
+ SequenceNode paramsNode = (SequenceNode) jobTuple.getValueNode();
+ for (Node paramsNodeItem: paramsNode.getValue()) {
+ MappingNode paramNode = (MappingNode) paramsNodeItem;
+ String paramType = paramNode.getTag().getValue();
+ if (paramType.equals("!NumberParam")) {
+ paramNode.setTag(new Tag("!IntegerParam"));
+ } else if (paramType.equals("!TextParam")) {
+ NodeTuple multilineTuple = new NodeTuple(
+ new ScalarNode(Tag.STR, "multiline"),
+ new ScalarNode(Tag.STR, "false"));
+ paramNode.getValue().add(multilineTuple);
+ }
+ }
+ }
+ }
+ }
+ } else if (specKey.equals("stepTemplates")) {
+ SequenceNode stepTemplatesNode = (SequenceNode) specTuple.getValueNode();
+ for (Node stepTemplatesNodeItem: stepTemplatesNode.getValue()) {
+ MappingNode stepTemplateNode = (MappingNode) stepTemplatesNodeItem;
+ for (NodeTuple stepTemplateTuple: stepTemplateNode.getValue()) {
+ String stemTemplateTupleKey = ((ScalarNode)stepTemplateTuple.getKeyNode()).getValue();
+ if (stemTemplateTupleKey.equals("paramSpecs")) {
+ SequenceNode paramsNode = (SequenceNode) stepTemplateTuple.getValueNode();
+ for (Node paramsNodeItem: paramsNode.getValue()) {
+ MappingNode paramNode = (MappingNode) paramsNodeItem;
+ String paramType = paramNode.getTag().getValue();
+ if (paramType.equals("!NumberParam")) {
+ paramNode.setTag(new Tag("!IntegerParam"));
+ } else if (paramType.equals("!TextParam")) {
+ NodeTuple multilineTuple = new NodeTuple(
+ new ScalarNode(Tag.STR, "multiline"),
+ new ScalarNode(Tag.STR, "false"));
+ paramNode.getValue().add(multilineTuple);
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+
+ @SuppressWarnings("unused")
+ private void migrate8(VersionedYamlDoc doc, Stack versions) {
+ for (NodeTuple specTuple: doc.getValue()) {
+ String specKey = ((ScalarNode)specTuple.getKeyNode()).getValue();
+ if (specKey.equals("jobs")) {
+ SequenceNode jobsNode = (SequenceNode) specTuple.getValueNode();
+ for (Node jobsNodeItem: jobsNode.getValue()) {
+ MappingNode jobNode = (MappingNode) jobsNodeItem;
+ for (NodeTuple jobTuple: jobNode.getValue()) {
+ String jobTupleKey = ((ScalarNode)jobTuple.getKeyNode()).getValue();
+ if (jobTupleKey.equals("projectDependencies")) {
+ SequenceNode projectDependenciesNode = (SequenceNode) jobTuple.getValueNode();
+ for (Node projectDependenciesNodeItem: projectDependenciesNode.getValue()) {
+ MappingNode projectDependencyNode = (MappingNode) projectDependenciesNodeItem;
+ String buildNumber = null;
+ for (Iterator itProjectDependencyTuple = projectDependencyNode.getValue().iterator(); itProjectDependencyTuple.hasNext();) {
+ NodeTuple projectDependencyTuple = itProjectDependencyTuple.next();
+ String projectDependencyTupleKey = ((ScalarNode)projectDependencyTuple.getKeyNode()).getValue();
+ if (projectDependencyTupleKey.equals("buildNumber")) {
+ buildNumber = ((ScalarNode)projectDependencyTuple.getValueNode()).getValue();
+ itProjectDependencyTuple.remove();
+ break;
+ }
+ }
+ Preconditions.checkNotNull(buildNumber);
+
+ List buildProviderTuples = new ArrayList<>();
+ buildProviderTuples.add(new NodeTuple(
+ new ScalarNode(Tag.STR, "buildNumber"),
+ new ScalarNode(Tag.STR, buildNumber)));
+ Node buildProviderNode = new MappingNode(new Tag("!SpecifiedBuild"), buildProviderTuples, FlowStyle.BLOCK);
+ projectDependencyNode.getValue().add(new NodeTuple(new ScalarNode(Tag.STR, "buildProvider"), buildProviderNode));
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+
+ @SuppressWarnings("unused")
+ private void migrate9(VersionedYamlDoc doc, Stack versions) {
+ for (NodeTuple specTuple: doc.getValue()) {
+ String specObjectKey = ((ScalarNode)specTuple.getKeyNode()).getValue();
+ if (specObjectKey.equals("jobs")) {
+ SequenceNode jobsNode = (SequenceNode) specTuple.getValueNode();
+ for (Node jobsNodeItem: jobsNode.getValue()) {
+ MappingNode jobNode = (MappingNode) jobsNodeItem;
+ for (NodeTuple jobTuple: jobNode.getValue()) {
+ String jobTupleKey = ((ScalarNode)jobTuple.getKeyNode()).getValue();
+ if (jobTupleKey.equals("steps")) {
+ SequenceNode stepsNode = (SequenceNode) jobTuple.getValueNode();
+ for (Node stepsNodeItem: stepsNode.getValue()) {
+ MappingNode stepNode = (MappingNode) stepsNodeItem;
+ if (stepNode.getTag().getValue().equals("!CommandStep")) {
+ stepNode.getValue().add(new NodeTuple(new ScalarNode(Tag.STR, "useTTY"),
+ new ScalarNode(Tag.BOOL, "false")));
+ }
+ }
+ }
+ }
+ }
+ } else if (specObjectKey.equals("stepTemplates")) {
+ SequenceNode stepTemplatesNode = (SequenceNode) specTuple.getValueNode();
+ for (Node stepTemplatesNodeItem: stepTemplatesNode.getValue()) {
+ MappingNode stepTemplateNode = (MappingNode) stepTemplatesNodeItem;
+ for (NodeTuple stepTemplateTuple: stepTemplateNode.getValue()) {
+ String stepTemplateTupleKey = ((ScalarNode)stepTemplateTuple.getKeyNode()).getValue();
+ if (stepTemplateTupleKey.equals("steps")) {
+ SequenceNode stepsNode = (SequenceNode) stepTemplateTuple.getValueNode();
+ for (Node stepsNodeItem: stepsNode.getValue()) {
+ MappingNode stepNode = (MappingNode) stepsNodeItem;
+ if (stepNode.getTag().getValue().equals("!CommandStep")) {
+ stepNode.getValue().add(new NodeTuple(new ScalarNode(Tag.STR, "useTTY"),
+ new ScalarNode(Tag.BOOL, "false")));
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+
+ @SuppressWarnings("unused")
+ private void migrate10(VersionedYamlDoc doc, Stack versions) {
+ for (NodeTuple specTuple: doc.getValue()) {
+ String specObjectKey = ((ScalarNode)specTuple.getKeyNode()).getValue();
+ if (specObjectKey.equals("jobs")) {
+ SequenceNode jobsNode = (SequenceNode) specTuple.getValueNode();
+ for (Node jobsNodeItem: jobsNode.getValue()) {
+ MappingNode jobNode = (MappingNode) jobsNodeItem;
+ for (NodeTuple jobTuple: jobNode.getValue()) {
+ String jobTupleKey = ((ScalarNode)jobTuple.getKeyNode()).getValue();
+ if (jobTupleKey.equals("cpuRequirement")) {
+ ScalarNode cpuRequirementNode = (ScalarNode) jobTuple.getValueNode();
+ String cpuRequirement = cpuRequirementNode.getValue();
+ cpuRequirementNode.setValue(cpuRequirement.substring(0, cpuRequirement.length()-1));
+ } else if (jobTupleKey.equals("memoryRequirement")) {
+ ScalarNode memoryRequirementNode = (ScalarNode) jobTuple.getValueNode();
+ String memoryRequirement = memoryRequirementNode.getValue();
+ memoryRequirementNode.setValue(memoryRequirement.substring(0, memoryRequirement.length()-1));
+ }
+ }
+ }
+ } else if (specObjectKey.equals("services")) {
+ SequenceNode servicesNode = (SequenceNode) specTuple.getValueNode();
+ for (Node servicesNodeItem: servicesNode.getValue()) {
+ MappingNode serviceNode = (MappingNode) servicesNodeItem;
+ for (NodeTuple serviceTuple: serviceNode.getValue()) {
+ String serviceTupleKey = ((ScalarNode)serviceTuple.getKeyNode()).getValue();
+ if (serviceTupleKey.equals("cpuRequirement")) {
+ ScalarNode cpuRequirementNode = (ScalarNode) serviceTuple.getValueNode();
+ String cpuRequirement = cpuRequirementNode.getValue();
+ cpuRequirementNode.setValue(cpuRequirement.substring(0, cpuRequirement.length()-1));
+ } else if (serviceTupleKey.equals("memoryRequirement")) {
+ ScalarNode memoryRequirementNode = (ScalarNode) serviceTuple.getValueNode();
+ String memoryRequirement = memoryRequirementNode.getValue();
+ memoryRequirementNode.setValue(memoryRequirement.substring(0, memoryRequirement.length()-1));
+ }
+ }
+ }
+ }
+ }
+ }
+
+ @SuppressWarnings("unused")
+ private void migrate11(VersionedYamlDoc doc, Stack versions) {
+ for (NodeTuple specTuple: doc.getValue()) {
+ String specObjectKey = ((ScalarNode)specTuple.getKeyNode()).getValue();
+ if (specObjectKey.equals("jobs")) {
+ SequenceNode jobsNode = (SequenceNode) specTuple.getValueNode();
+ for (Node jobsNodeItem: jobsNode.getValue()) {
+ MappingNode jobNode = (MappingNode) jobsNodeItem;
+ for (NodeTuple jobTuple: jobNode.getValue()) {
+ String jobTupleKey = ((ScalarNode)jobTuple.getKeyNode()).getValue();
+ if (jobTupleKey.equals("steps")) {
+ SequenceNode stepsNode = (SequenceNode) jobTuple.getValueNode();
+ for (Node stepsNodeItem: stepsNode.getValue()) {
+ MappingNode stepNode = (MappingNode) stepsNodeItem;
+ if (stepNode.getTag().getValue().equals("!CheckoutStep")) {
+ stepNode.getValue().add(new NodeTuple(new ScalarNode(Tag.STR, "withLfs"),
+ new ScalarNode(Tag.BOOL, "false")));
+ stepNode.getValue().add(new NodeTuple(new ScalarNode(Tag.STR, "withSubmodules"),
+ new ScalarNode(Tag.BOOL, "true")));
+ }
+ }
+ }
+ }
+ }
+ } else if (specObjectKey.equals("stepTemplates")) {
+ SequenceNode stepTemplatesNode = (SequenceNode) specTuple.getValueNode();
+ for (Node stepTemplatesNodeItem: stepTemplatesNode.getValue()) {
+ MappingNode stepTemplateNode = (MappingNode) stepTemplatesNodeItem;
+ for (NodeTuple stepTemplateTuple: stepTemplateNode.getValue()) {
+ String stepTemplateTupleKey = ((ScalarNode)stepTemplateTuple.getKeyNode()).getValue();
+ if (stepTemplateTupleKey.equals("steps")) {
+ SequenceNode stepsNode = (SequenceNode) stepTemplateTuple.getValueNode();
+ for (Node stepsNodeItem: stepsNode.getValue()) {
+ MappingNode stepNode = (MappingNode) stepsNodeItem;
+ if (stepNode.getTag().getValue().equals("!CheckoutStep")) {
+ stepNode.getValue().add(new NodeTuple(new ScalarNode(Tag.STR, "withLfs"),
+ new ScalarNode(Tag.BOOL, "false")));
+ stepNode.getValue().add(new NodeTuple(new ScalarNode(Tag.STR, "withSubmodules"),
+ new ScalarNode(Tag.BOOL, "true")));
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+
+ @SuppressWarnings("unused")
+ private void migrate12(VersionedYamlDoc doc, Stack versions) {
+ for (NodeTuple specTuple: doc.getValue()) {
+ String specObjectKey = ((ScalarNode)specTuple.getKeyNode()).getValue();
+ if (specObjectKey.equals("jobs")) {
+ SequenceNode jobsNode = (SequenceNode) specTuple.getValueNode();
+ for (Node jobsNodeItem: jobsNode.getValue()) {
+ MappingNode jobNode = (MappingNode) jobsNodeItem;
+ for (NodeTuple jobTuple: jobNode.getValue()) {
+ String jobTupleKey = ((ScalarNode)jobTuple.getKeyNode()).getValue();
+ if (jobTupleKey.equals("steps")) {
+ SequenceNode stepsNode = (SequenceNode) jobTuple.getValueNode();
+ for (Node stepsNodeItem: stepsNode.getValue()) {
+ MappingNode stepNode = (MappingNode) stepsNodeItem;
+ if (stepNode.getTag().getValue().equals("!PublishJestTestReportStep"))
+ stepNode.setTag(new Tag("!PublishJestReportStep"));
+ }
+ }
+ }
+ }
+ } else if (specObjectKey.equals("stepTemplates")) {
+ SequenceNode stepTemplatesNode = (SequenceNode) specTuple.getValueNode();
+ for (Node stepTemplatesNodeItem: stepTemplatesNode.getValue()) {
+ MappingNode stepTemplateNode = (MappingNode) stepTemplatesNodeItem;
+ for (NodeTuple stepTemplateTuple: stepTemplateNode.getValue()) {
+ String stepTemplateTupleKey = ((ScalarNode)stepTemplateTuple.getKeyNode()).getValue();
+ if (stepTemplateTupleKey.equals("steps")) {
+ SequenceNode stepsNode = (SequenceNode) stepTemplateTuple.getValueNode();
+ for (Node stepsNodeItem: stepsNode.getValue()) {
+ MappingNode stepNode = (MappingNode) stepsNodeItem;
+ if (stepNode.getTag().getValue().equals("!PublishJestTestReportStep"))
+ stepNode.setTag(new Tag("!PublishJestReportStep"));
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+
+ @SuppressWarnings("unused")
+ private void migrate13(VersionedYamlDoc doc, Stack versions) {
+ for (NodeTuple specTuple: doc.getValue()) {
+ String specTupleKey = ((ScalarNode)specTuple.getKeyNode()).getValue();
+ if (specTupleKey.equals("jobs")) {
+ SequenceNode jobsNode = (SequenceNode) specTuple.getValueNode();
+ for (Node jobsNodeItem: jobsNode.getValue()) {
+ MappingNode jobNode = (MappingNode) jobsNodeItem;
+ for (Iterator itJobTuple = jobNode.getValue().iterator(); itJobTuple.hasNext();) {
+ NodeTuple jobTuple = itJobTuple.next();
+ String jobTupleKey = ((ScalarNode)jobTuple.getKeyNode()).getValue();
+ if (jobTupleKey.equals("projectDependencies")) {
+ SequenceNode projectDependenciesNode = (SequenceNode) jobTuple.getValueNode();
+ for (Node projectDependenciesItem: projectDependenciesNode.getValue()) {
+ MappingNode projectDependencyNode = (MappingNode) projectDependenciesItem;
+ for (Iterator itProjectDependencyTuple = projectDependencyNode.getValue().iterator();
+ itProjectDependencyTuple.hasNext();) {
+ NodeTuple projectDependencyTuple = itProjectDependencyTuple.next();
+ ScalarNode projectDependencyTupleKeyNode = ((ScalarNode)projectDependencyTuple.getKeyNode());
+ if (projectDependencyTupleKeyNode.getValue().equals("projectName"))
+ projectDependencyTupleKeyNode.setValue("projectPath");
+ }
+ }
+ }
+ }
+ }
+ } else if (specTupleKey.equals("imports")) {
+ SequenceNode importsNode = (SequenceNode) specTuple.getValueNode();
+ for (Node importsNodeItem: importsNode.getValue()) {
+ MappingNode importNode = (MappingNode) importsNodeItem;
+ for (Iterator itImportTuple = importNode.getValue().iterator(); itImportTuple.hasNext();) {
+ NodeTuple importTuple = itImportTuple.next();
+ ScalarNode importTupleKeyNode = (ScalarNode)importTuple.getKeyNode();
+ if (importTupleKeyNode.getValue().equals("projectName"))
+ importTupleKeyNode.setValue("projectPath");
+ }
+ }
+ }
+ }
+ }
+
+ private void migrate14_steps(SequenceNode stepsNode) {
+ for (Node stepsNodeItem: stepsNode.getValue()) {
+ MappingNode stepNode = (MappingNode) stepsNodeItem;
+ if (stepNode.getTag().getValue().equals("!CommandStep")) {
+ Node commandsNode = null;
+ for (Iterator itStepNodeTuple = stepNode.getValue().iterator(); itStepNodeTuple.hasNext();) {
+ NodeTuple stepNodeTuple = itStepNodeTuple.next();
+ if (((ScalarNode)stepNodeTuple.getKeyNode()).getValue().equals("commands")) {
+ commandsNode = stepNodeTuple.getValueNode();
+ itStepNodeTuple.remove();
+ break;
+ }
+ }
+ if (commandsNode != null) {
+ List interpreterTuples = new ArrayList<>();
+ interpreterTuples.add(new NodeTuple(new ScalarNode(Tag.STR, "commands"), commandsNode));
+ stepNode.getValue().add(new NodeTuple(
+ new ScalarNode(Tag.STR, "interpreter"),
+ new MappingNode(new Tag("!DefaultInterpreter"), interpreterTuples, FlowStyle.BLOCK)));
+ }
+ stepNode.getValue().add(new NodeTuple(
+ new ScalarNode(Tag.STR, "runInContainer"),
+ new ScalarNode(Tag.BOOL, "true")));
+ }
+ }
+ }
+
+ @SuppressWarnings("unused")
+ private void migrate14(VersionedYamlDoc doc, Stack versions) {
+ for (NodeTuple specTuple: doc.getValue()) {
+ String specObjectKey = ((ScalarNode)specTuple.getKeyNode()).getValue();
+ if (specObjectKey.equals("jobs")) {
+ SequenceNode jobsNode = (SequenceNode) specTuple.getValueNode();
+ for (Node jobsNodeItem: jobsNode.getValue()) {
+ MappingNode jobNode = (MappingNode) jobsNodeItem;
+ for (NodeTuple jobTuple: jobNode.getValue()) {
+ String jobTupleKey = ((ScalarNode)jobTuple.getKeyNode()).getValue();
+ if (jobTupleKey.equals("steps"))
+ migrate14_steps((SequenceNode) jobTuple.getValueNode());
+ }
+ }
+ } else if (specObjectKey.equals("stepTemplates")) {
+ SequenceNode stepTemplatesNode = (SequenceNode) specTuple.getValueNode();
+ for (Node stepTemplatesNodeItem: stepTemplatesNode.getValue()) {
+ MappingNode stepTemplateNode = (MappingNode) stepTemplatesNodeItem;
+ for (NodeTuple stepTemplateTuple: stepTemplateNode.getValue()) {
+ String stepTemplateTupleKey = ((ScalarNode)stepTemplateTuple.getKeyNode()).getValue();
+ if (stepTemplateTupleKey.equals("steps"))
+ migrate14_steps((SequenceNode) stepTemplateTuple.getValueNode());
+ }
+ }
+ }
+ }
+ }
+
+ private void migrate15_steps(SequenceNode stepsNode) {
+ for (Node stepsNodeItem: stepsNode.getValue()) {
+ MappingNode stepNode = (MappingNode) stepsNodeItem;
+ if (stepNode.getTag().getValue().equals("!BuildImageStep")) {
+ for (Iterator itStepNodeTuple = stepNode.getValue().iterator(); itStepNodeTuple.hasNext();) {
+ NodeTuple stepNodeTuple = itStepNodeTuple.next();
+ String key = ((ScalarNode)stepNodeTuple.getKeyNode()).getValue();
+ if (key.equals("useTTY") || key.equals("login"))
+ itStepNodeTuple.remove();
+ }
+ }
+ }
+ }
+
+ @SuppressWarnings("unused")
+ private void migrate15(VersionedYamlDoc doc, Stack versions) {
+ for (NodeTuple specTuple: doc.getValue()) {
+ String specObjectKey = ((ScalarNode)specTuple.getKeyNode()).getValue();
+ if (specObjectKey.equals("jobs")) {
+ SequenceNode jobsNode = (SequenceNode) specTuple.getValueNode();
+ for (Node jobsNodeItem: jobsNode.getValue()) {
+ MappingNode jobNode = (MappingNode) jobsNodeItem;
+ for (NodeTuple jobTuple: jobNode.getValue()) {
+ String jobTupleKey = ((ScalarNode)jobTuple.getKeyNode()).getValue();
+ if (jobTupleKey.equals("steps"))
+ migrate15_steps((SequenceNode) jobTuple.getValueNode());
+ }
+ }
+ } else if (specObjectKey.equals("stepTemplates")) {
+ SequenceNode stepTemplatesNode = (SequenceNode) specTuple.getValueNode();
+ for (Node stepTemplatesNodeItem: stepTemplatesNode.getValue()) {
+ MappingNode stepTemplateNode = (MappingNode) stepTemplatesNodeItem;
+ for (NodeTuple stepTemplateTuple: stepTemplateNode.getValue()) {
+ String stepTemplateTupleKey = ((ScalarNode)stepTemplateTuple.getKeyNode()).getValue();
+ if (stepTemplateTupleKey.equals("steps"))
+ migrate15_steps((SequenceNode) stepTemplateTuple.getValueNode());
+ }
+ }
+ }
+ }
+ }
+
+ private void migrate16_steps(SequenceNode stepsNode) {
+ for (Node stepsNodeItem: stepsNode.getValue()) {
+ MappingNode stepNode = (MappingNode) stepsNodeItem;
+ if (stepNode.getTag().getValue().equals("!CommandStep")) {
+ for (Iterator itStepNodeTuple = stepNode.getValue().iterator(); itStepNodeTuple.hasNext();) {
+ NodeTuple stepNodeTuple = itStepNodeTuple.next();
+ String key = ((ScalarNode)stepNodeTuple.getKeyNode()).getValue();
+ if (key.equals("interpreter")) {
+ MappingNode interpreterNode = (MappingNode) stepNodeTuple.getValueNode();
+ if (interpreterNode.getTag().getValue().equals("!BashInterpreter")) {
+ interpreterNode.setTag(new Tag("!ShellInterpreter"));
+ interpreterNode.getValue().add(new NodeTuple(
+ new ScalarNode(Tag.STR, "shell"), new ScalarNode(Tag.STR, "bash")));
+ }
+ }
+ }
+ }
+ }
+ }
+
+ @SuppressWarnings("unused")
+ private void migrate16(VersionedYamlDoc doc, Stack versions) {
+ for (NodeTuple specTuple: doc.getValue()) {
+ String specObjectKey = ((ScalarNode)specTuple.getKeyNode()).getValue();
+ if (specObjectKey.equals("jobs")) {
+ SequenceNode jobsNode = (SequenceNode) specTuple.getValueNode();
+ for (Node jobsNodeItem: jobsNode.getValue()) {
+ MappingNode jobNode = (MappingNode) jobsNodeItem;
+ for (NodeTuple jobTuple: jobNode.getValue()) {
+ String jobTupleKey = ((ScalarNode)jobTuple.getKeyNode()).getValue();
+ if (jobTupleKey.equals("steps"))
+ migrate16_steps((SequenceNode) jobTuple.getValueNode());
+ }
+ }
+ } else if (specObjectKey.equals("stepTemplates")) {
+ SequenceNode stepTemplatesNode = (SequenceNode) specTuple.getValueNode();
+ for (Node stepTemplatesNodeItem: stepTemplatesNode.getValue()) {
+ MappingNode stepTemplateNode = (MappingNode) stepTemplatesNodeItem;
+ for (NodeTuple stepTemplateTuple: stepTemplateNode.getValue()) {
+ String stepTemplateTupleKey = ((ScalarNode)stepTemplateTuple.getKeyNode()).getValue();
+ if (stepTemplateTupleKey.equals("steps"))
+ migrate16_steps((SequenceNode) stepTemplateTuple.getValueNode());
+ }
+ }
+ }
+ }
+ }
+
+ @SuppressWarnings("unused")
+ private void migrate17(VersionedYamlDoc doc, Stack versions) {
+ for (NodeTuple specTuple: doc.getValue()) {
+ if (((ScalarNode)specTuple.getKeyNode()).getValue().equals("jobs")) {
+ SequenceNode jobsNode = (SequenceNode) specTuple.getValueNode();
+ for (Node jobsNodeItem: jobsNode.getValue()) {
+ MappingNode jobNode = (MappingNode) jobsNodeItem;
+ List actionNodes = new ArrayList<>();
+ for (Iterator itJobTuple = jobNode.getValue().iterator(); itJobTuple.hasNext();) {
+ NodeTuple jobTuple = itJobTuple.next();
+ String jobTupleKey = ((ScalarNode)jobTuple.getKeyNode()).getValue();
+ if (jobTupleKey.equals("postBuildActions")) {
+ SequenceNode actionsNode = (SequenceNode) jobTuple.getValueNode();
+ for (Node actionNodeItem: actionsNode.getValue()) {
+ MappingNode actionNode = (MappingNode) actionNodeItem;
+ if (actionNode.getTag().getValue().equals("!CreateIssueAction")) {
+ actionNode.getValue().add(new NodeTuple(
+ new ScalarNode(Tag.STR, "issueConfidential"), new ScalarNode(Tag.STR, "false")));
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+
+ private void migrate18_steps(SequenceNode stepsNode) {
+ for (Node stepsNodeItem: stepsNode.getValue()) {
+ MappingNode stepNode = (MappingNode) stepsNodeItem;
+ if (stepNode.getTag().getValue().equals("!PullRepository")) {
+ stepNode.getValue().add(new NodeTuple(
+ new ScalarNode(Tag.STR, "syncToChildProject"), new ScalarNode(Tag.STR, "false")));
+ }
+ }
+ }
+
+ @SuppressWarnings("unused")
+ private void migrate18(VersionedYamlDoc doc, Stack versions) {
+ for (NodeTuple specTuple: doc.getValue()) {
+ String specObjectKey = ((ScalarNode)specTuple.getKeyNode()).getValue();
+ if (specObjectKey.equals("jobs")) {
+ SequenceNode jobsNode = (SequenceNode) specTuple.getValueNode();
+ for (Node jobsNodeItem: jobsNode.getValue()) {
+ MappingNode jobNode = (MappingNode) jobsNodeItem;
+ for (NodeTuple jobTuple: jobNode.getValue()) {
+ String jobTupleKey = ((ScalarNode)jobTuple.getKeyNode()).getValue();
+ if (jobTupleKey.equals("steps"))
+ migrate18_steps((SequenceNode) jobTuple.getValueNode());
+ }
+ }
+ } else if (specObjectKey.equals("stepTemplates")) {
+ SequenceNode stepTemplatesNode = (SequenceNode) specTuple.getValueNode();
+ for (Node stepTemplatesNodeItem: stepTemplatesNode.getValue()) {
+ MappingNode stepTemplateNode = (MappingNode) stepTemplatesNodeItem;
+ for (NodeTuple stepTemplateTuple: stepTemplateNode.getValue()) {
+ String stepTemplateTupleKey = ((ScalarNode)stepTemplateTuple.getKeyNode()).getValue();
+ if (stepTemplateTupleKey.equals("steps"))
+ migrate18_steps((SequenceNode) stepTemplateTuple.getValueNode());
+ }
+ }
+ }
+ }
+ }
+
+ private void migrate19(VersionedYamlDoc doc, Stack versions) {
+ for (NodeTuple specTuple: doc.getValue()) {
+ String specObjectKey = ((ScalarNode)specTuple.getKeyNode()).getValue();
+ if (specObjectKey.equals("jobs")) {
+ SequenceNode jobsNode = (SequenceNode) specTuple.getValueNode();
+ for (Node jobsNodeItem: jobsNode.getValue()) {
+ MappingNode jobNode = (MappingNode) jobsNodeItem;
+ for (var it = jobNode.getValue().iterator(); it.hasNext();) {
+ String jobTupleKey = ((ScalarNode)it.next().getKeyNode()).getValue();
+ if (jobTupleKey.equals("cpuRequirement") || jobTupleKey.equals("memoryRequirement"))
+ it.remove();
+ }
+ }
+ } else if (specObjectKey.equals("services")) {
+ SequenceNode servicesNode = (SequenceNode) specTuple.getValueNode();
+ for (Node servicesNodeItem: servicesNode.getValue()) {
+ MappingNode serviceNode = (MappingNode) servicesNodeItem;
+ for (var it = serviceNode.getValue().iterator(); it.hasNext();) {
+ String serviceTupleKey = ((ScalarNode)it.next().getKeyNode()).getValue();
+ if (serviceTupleKey.equals("cpuRequirement") || serviceTupleKey.equals("memoryRequirement"))
+ it.remove();
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/server-core/src/main/java/io/onedev/server/buildspec/Service.java b/server-core/src/main/java/io/onedev/server/buildspec/Service.java
index e1f220674b..42f7219154 100644
--- a/server-core/src/main/java/io/onedev/server/buildspec/Service.java
+++ b/server-core/src/main/java/io/onedev/server/buildspec/Service.java
@@ -1,148 +1,123 @@
-package io.onedev.server.buildspec;
-
-import java.io.Serializable;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import javax.validation.constraints.NotEmpty;
-
-import io.onedev.commons.codeassist.InputCompletion;
-import io.onedev.commons.codeassist.InputStatus;
-import io.onedev.commons.codeassist.InputSuggestion;
-import io.onedev.server.buildspec.job.EnvVar;
-import io.onedev.server.util.validation.annotation.DnsName;
-import io.onedev.server.web.editable.annotation.Editable;
-import io.onedev.server.web.editable.annotation.Interpolative;
-import io.onedev.server.web.editable.annotation.SuggestionProvider;
-
-@Editable
-public class Service implements NamedElement, Serializable {
-
- private static final long serialVersionUID = 1L;
-
- private String name;
-
- private String image;
-
- private String arguments;
-
- private List envVars = new ArrayList<>();
-
- private String readinessCheckCommand;
-
- private int cpuRequirement = 250;
-
- private int memoryRequirement = 256;
-
- @Editable(order=100, description="Specify name of the service, which will be used as host name to access the service")
- @SuggestionProvider("getNameSuggestions")
- @DnsName
- @NotEmpty
- @Override
- public String getName() {
- return name;
- }
-
- public void setName(String name) {
- this.name = name;
- }
-
- @SuppressWarnings("unused")
- private static List getNameSuggestions(InputStatus status) {
- BuildSpec buildSpec = BuildSpec.get();
- if (buildSpec != null) {
- List candidates = new ArrayList<>(buildSpec.getServiceMap().keySet());
- buildSpec.getServices().forEach(it->candidates.remove(it.getName()));
- return BuildSpec.suggestOverrides(candidates, status);
- }
- return new ArrayList<>();
- }
-
- @Editable(order=200, description="Specify docker image of the service")
- @Interpolative(variableSuggester="suggestVariables")
- @NotEmpty
- public String getImage() {
- return image;
- }
-
- public void setImage(String image) {
- this.image = image;
- }
-
- @Editable(order=220, description="Optionally specify arguments to run above image")
- @Interpolative(variableSuggester="suggestVariables")
- public String getArguments() {
- return arguments;
- }
-
- public void setArguments(String arguments) {
- this.arguments = arguments;
- }
-
- @Editable(order=300, name="Environment Variables", description="Optionally specify environment variables of "
- + "the service")
- public List getEnvVars() {
- return envVars;
- }
-
- public void setEnvVars(List envVars) {
- this.envVars = envVars;
- }
-
- @Editable(order=400, description="Specify command to check readiness of the service. This command will "
- + "be interpretated by cmd.exe on Windows images, and by shell on Linux images. It will be "
- + "executed repeatedly until a zero code is returned to indicate service ready")
- @Interpolative(variableSuggester="suggestVariables")
- @NotEmpty
- public String getReadinessCheckCommand() {
- return readinessCheckCommand;
- }
-
- public void setReadinessCheckCommand(String readinessCheckCommand) {
- this.readinessCheckCommand = readinessCheckCommand;
- }
-
- @Editable(order=10000, name="CPU Requirement", group="More Settings", description="Specify CPU requirement of the service in millis. "
- + "1000 millis means a single CPU core")
- public int getCpuRequirement() {
- return cpuRequirement;
- }
-
- public void setCpuRequirement(int cpuRequirement) {
- this.cpuRequirement = cpuRequirement;
- }
-
- @Editable(order=10100, group="More Settings", description="Specify memory requirement of the service in mega bytes")
- public int getMemoryRequirement() {
- return memoryRequirement;
- }
-
- public void setMemoryRequirement(int memoryRequirement) {
- this.memoryRequirement = memoryRequirement;
- }
-
- @SuppressWarnings("unused")
- private static List suggestVariables(String matchWith) {
- return BuildSpec.suggestVariables(matchWith, false, false, false);
- }
-
- public Map toMap() {
- Map serviceMap = new HashMap<>();
-
- serviceMap.put("name", getName());
- serviceMap.put("image", getImage());
- serviceMap.put("readinessCheckCommand", getReadinessCheckCommand());
- serviceMap.put("cpuRequirement", getCpuRequirement());
- serviceMap.put("memoryRequirement", getMemoryRequirement());
- serviceMap.put("arguments", getArguments());
- Map envVars = new HashMap<>();
- for (EnvVar var: getEnvVars())
- envVars.put(var.getName(), var.getValue());
- serviceMap.put("envVars", (Serializable) envVars);
-
- return serviceMap;
- }
-
-}
+package io.onedev.server.buildspec;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import javax.validation.constraints.NotEmpty;
+
+import io.onedev.commons.codeassist.InputCompletion;
+import io.onedev.commons.codeassist.InputStatus;
+import io.onedev.commons.codeassist.InputSuggestion;
+import io.onedev.server.buildspec.job.EnvVar;
+import io.onedev.server.util.validation.annotation.DnsName;
+import io.onedev.server.web.editable.annotation.Editable;
+import io.onedev.server.web.editable.annotation.Interpolative;
+import io.onedev.server.web.editable.annotation.SuggestionProvider;
+
+@Editable
+public class Service implements NamedElement, Serializable {
+
+ private static final long serialVersionUID = 1L;
+
+ private String name;
+
+ private String image;
+
+ private String arguments;
+
+ private List envVars = new ArrayList<>();
+
+ private String readinessCheckCommand;
+
+ @Editable(order=100, description="Specify name of the service, which will be used as host name to access the service")
+ @SuggestionProvider("getNameSuggestions")
+ @DnsName
+ @NotEmpty
+ @Override
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ @SuppressWarnings("unused")
+ private static List getNameSuggestions(InputStatus status) {
+ BuildSpec buildSpec = BuildSpec.get();
+ if (buildSpec != null) {
+ List candidates = new ArrayList<>(buildSpec.getServiceMap().keySet());
+ buildSpec.getServices().forEach(it->candidates.remove(it.getName()));
+ return BuildSpec.suggestOverrides(candidates, status);
+ }
+ return new ArrayList<>();
+ }
+
+ @Editable(order=200, description="Specify docker image of the service")
+ @Interpolative(variableSuggester="suggestVariables")
+ @NotEmpty
+ public String getImage() {
+ return image;
+ }
+
+ public void setImage(String image) {
+ this.image = image;
+ }
+
+ @Editable(order=220, description="Optionally specify arguments to run above image")
+ @Interpolative(variableSuggester="suggestVariables")
+ public String getArguments() {
+ return arguments;
+ }
+
+ public void setArguments(String arguments) {
+ this.arguments = arguments;
+ }
+
+ @Editable(order=300, name="Environment Variables", description="Optionally specify environment variables of "
+ + "the service")
+ public List getEnvVars() {
+ return envVars;
+ }
+
+ public void setEnvVars(List envVars) {
+ this.envVars = envVars;
+ }
+
+ @Editable(order=400, description="Specify command to check readiness of the service. This command will "
+ + "be interpretated by cmd.exe on Windows images, and by shell on Linux images. It will be "
+ + "executed repeatedly until a zero code is returned to indicate service ready")
+ @Interpolative(variableSuggester="suggestVariables")
+ @NotEmpty
+ public String getReadinessCheckCommand() {
+ return readinessCheckCommand;
+ }
+
+ public void setReadinessCheckCommand(String readinessCheckCommand) {
+ this.readinessCheckCommand = readinessCheckCommand;
+ }
+
+ @SuppressWarnings("unused")
+ private static List suggestVariables(String matchWith) {
+ return BuildSpec.suggestVariables(matchWith, false, false, false);
+ }
+
+ public Map toMap() {
+ Map serviceMap = new HashMap<>();
+
+ serviceMap.put("name", getName());
+ serviceMap.put("image", getImage());
+ serviceMap.put("readinessCheckCommand", getReadinessCheckCommand());
+ serviceMap.put("arguments", getArguments());
+ Map envVars = new HashMap<>();
+ for (EnvVar var: getEnvVars())
+ envVars.put(var.getName(), var.getValue());
+ serviceMap.put("envVars", (Serializable) envVars);
+
+ return serviceMap;
+ }
+
+}
diff --git a/server-core/src/main/java/io/onedev/server/buildspec/job/Job.java b/server-core/src/main/java/io/onedev/server/buildspec/job/Job.java
index 5e8609d1a9..edb804fa5b 100644
--- a/server-core/src/main/java/io/onedev/server/buildspec/job/Job.java
+++ b/server-core/src/main/java/io/onedev/server/buildspec/job/Job.java
@@ -1,496 +1,473 @@
-package io.onedev.server.buildspec.job;
-
-import static io.onedev.server.model.Build.NAME_BRANCH;
-import static io.onedev.server.model.Build.NAME_COMMIT;
-import static io.onedev.server.model.Build.NAME_JOB;
-import static io.onedev.server.model.Build.NAME_PULL_REQUEST;
-import static io.onedev.server.model.Build.NAME_TAG;
-import static io.onedev.server.search.entity.build.BuildQuery.getRuleName;
-import static io.onedev.server.search.entity.build.BuildQueryLexer.And;
-import static io.onedev.server.search.entity.build.BuildQueryLexer.InPipelineOf;
-import static io.onedev.server.search.entity.build.BuildQueryLexer.Is;
-
-import java.io.Serializable;
-import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.stream.Collectors;
-
-import javax.annotation.Nullable;
-import javax.validation.ConstraintValidatorContext;
-import javax.validation.Valid;
-import javax.validation.constraints.Min;
-import javax.validation.constraints.NotEmpty;
-
-import org.apache.wicket.Component;
-import org.eclipse.jgit.lib.ObjectId;
-
-import io.onedev.commons.codeassist.InputCompletion;
-import io.onedev.commons.codeassist.InputStatus;
-import io.onedev.commons.codeassist.InputSuggestion;
-import io.onedev.server.OneDev;
-import io.onedev.server.buildspec.BuildSpec;
-import io.onedev.server.buildspec.BuildSpecAware;
-import io.onedev.server.buildspec.NamedElement;
-import io.onedev.server.buildspec.job.action.PostBuildAction;
-import io.onedev.server.buildspec.job.projectdependency.ProjectDependency;
-import io.onedev.server.buildspec.job.trigger.JobTrigger;
-import io.onedev.server.buildspec.param.ParamUtils;
-import io.onedev.server.buildspec.param.spec.ParamSpec;
-import io.onedev.server.buildspec.step.Step;
-import io.onedev.server.entitymanager.SettingManager;
-import io.onedev.server.event.project.ProjectEvent;
-import io.onedev.server.git.GitUtils;
-import io.onedev.server.job.authorization.JobAuthorization;
-import io.onedev.server.job.authorization.JobAuthorization.Context;
-import io.onedev.server.model.Build;
-import io.onedev.server.model.PullRequest;
-import io.onedev.server.model.support.administration.jobexecutor.JobExecutor;
-import io.onedev.server.util.ComponentContext;
-import io.onedev.server.util.EditContext;
-import io.onedev.server.util.criteria.Criteria;
-import io.onedev.server.util.validation.Validatable;
-import io.onedev.server.util.validation.annotation.ClassValidating;
-import io.onedev.server.web.editable.annotation.ChoiceProvider;
-import io.onedev.server.web.editable.annotation.Editable;
-import io.onedev.server.web.editable.annotation.Interpolative;
-import io.onedev.server.web.editable.annotation.RetryCondition;
-import io.onedev.server.web.editable.annotation.SuggestionProvider;
-import io.onedev.server.web.page.project.blob.ProjectBlobPage;
-import io.onedev.server.web.util.SuggestionUtils;
-import io.onedev.server.web.util.WicketUtils;
-
-@Editable
-@ClassValidating
-public class Job implements NamedElement, Serializable, Validatable {
-
- private static final long serialVersionUID = 1L;
-
- public static final String SELECTION_PREFIX = "jobs/";
-
- public static final String PROP_NAME = "name";
-
- public static final String PROP_JOB_DEPENDENCIES = "jobDependencies";
-
- public static final String PROP_REQUIRED_SERVICES = "requiredServices";
-
- public static final String PROP_TRIGGERS = "triggers";
-
- public static final String PROP_STEPS = "steps";
-
- public static final String PROP_RETRY_CONDITION = "retryCondition";
-
- public static final String PROP_POST_BUILD_ACTIONS = "postBuildActions";
-
- private String name;
-
- private String jobExecutor;
-
- private List steps = new ArrayList<>();
-
- private List paramSpecs = new ArrayList<>();
-
- private List jobDependencies = new ArrayList<>();
-
- private List projectDependencies = new ArrayList<>();
-
- private List requiredServices = new ArrayList<>();
-
- private List triggers = new ArrayList<>();
-
- private List caches = new ArrayList<>();
-
- private int cpuRequirement = 250;
-
- private int memoryRequirement = 256;
-
- private long timeout = 3600;
-
- private List postBuildActions = new ArrayList<>();
-
- private String retryCondition = "never";
-
- private int maxRetries = 3;
-
- private int retryDelay = 30;
-
- private transient Map paramSpecMap;
-
- @Editable(order=100, description="Specify name of the job")
- @SuggestionProvider("getNameSuggestions")
- @NotEmpty
- @Override
- public String getName() {
- return name;
- }
-
- public void setName(String name) {
- this.name = name;
- }
-
- @SuppressWarnings("unused")
- private static List getNameSuggestions(InputStatus status) {
- BuildSpec buildSpec = BuildSpec.get();
- if (buildSpec != null) {
- List candidates = new ArrayList<>(buildSpec.getJobMap().keySet());
- buildSpec.getJobs().forEach(it->candidates.remove(it.getName()));
- return BuildSpec.suggestOverrides(candidates, status);
- }
- return new ArrayList<>();
- }
-
- @Editable(order=200, placeholder="Use Any Applicable Executor", description="Optionally specify authorized executor "
- + "for this job. Leave empty to use first authorized executor")
- @Interpolative(literalSuggester="suggestJobExecutors", variableSuggester="suggestVariables")
- public String getJobExecutor() {
- return jobExecutor;
- }
-
- public void setJobExecutor(String jobExecutor) {
- this.jobExecutor = jobExecutor;
- }
-
- @SuppressWarnings("unused")
- private static List suggestJobExecutors(String matchWith) {
- List applicableJobExecutors = new ArrayList<>();
- ProjectBlobPage page = (ProjectBlobPage) WicketUtils.getPage();
- String jobName = (String) EditContext.get().getInputValue(PROP_NAME);
- if (jobName != null) {
- Context context = new Context(page.getProject(), page.getBlobIdent().revision, jobName);
- for (JobExecutor executor: OneDev.getInstance(SettingManager.class).getJobExecutors()) {
- if (executor.isEnabled()) {
- if (executor.getJobAuthorization() == null) {
- applicableJobExecutors.add(executor.getName());
- } else {
- if (JobAuthorization.parse(executor.getJobAuthorization()).matches(context))
- applicableJobExecutors.add(executor.getName());
- }
- }
- }
- }
-
- return SuggestionUtils.suggest(applicableJobExecutors, matchWith);
- }
-
- @Editable(order=200, description="Steps will be executed serially on same node, sharing the same job workspace")
- public List getSteps() {
- return steps;
- }
-
- public void setSteps(List steps) {
- this.steps = steps;
- }
-
- @Editable(order=400, name="Parameter Specs", group="Params & Triggers", description="Optionally define parameter specifications of the job")
- @Valid
- public List getParamSpecs() {
- return paramSpecs;
- }
-
- public void setParamSpecs(List paramSpecs) {
- this.paramSpecs = paramSpecs;
- }
-
- @Editable(order=500, group="Params & Triggers", description="Use triggers to run the job automatically under certain conditions")
- @Valid
- public List getTriggers() {
- return triggers;
- }
-
- public void setTriggers(List triggers) {
- this.triggers = triggers;
- }
-
- @Editable(name="Job Dependencies", order=9110, group="Dependencies & Services", description="Job dependencies determines the order and "
- + "concurrency when run different jobs. You may also specify artifacts to retrieve from upstream jobs")
- @Valid
- public List getJobDependencies() {
- return jobDependencies;
- }
-
- public void setJobDependencies(List jobDependencies) {
- this.jobDependencies = jobDependencies;
- }
-
- @Editable(name="Project Dependencies", order=9112, group="Dependencies & Services", description="Use project dependency to retrieve "
- + "artifacts from other projects")
- @Valid
- public List getProjectDependencies() {
- return projectDependencies;
- }
-
- public void setProjectDependencies(List projectDependencies) {
- this.projectDependencies = projectDependencies;
- }
-
- @Editable(order=9114, group="Dependencies & Services", placeholder="No required services",
- description="Optionally specify services required by this job. "
- + "NOTE: Services are only supported by docker aware executors "
- + "(server docker executor, remote docker executor, or kubernetes executor)")
- @ChoiceProvider("getServiceChoices")
- public List getRequiredServices() {
- return requiredServices;
- }
-
- public void setRequiredServices(List requiredServices) {
- this.requiredServices = requiredServices;
- }
-
- @SuppressWarnings("unused")
- private static List getServiceChoices() {
- List choices = new ArrayList<>();
- Component component = ComponentContext.get().getComponent();
- BuildSpecAware buildSpecAware = WicketUtils.findInnermost(component, BuildSpecAware.class);
- if (buildSpecAware != null) {
- BuildSpec buildSpec = buildSpecAware.getBuildSpec();
- if (buildSpec != null) {
- choices.addAll(buildSpec.getServiceMap().values().stream()
- .map(it->it.getName()).collect(Collectors.toList()));
- }
- }
- return choices;
- }
-
- @Editable(order=9400, group="More Settings", description="Specify condition to retry build upon failure")
- @NotEmpty
- @RetryCondition
- public String getRetryCondition() {
- return retryCondition;
- }
-
- public void setRetryCondition(String retryCondition) {
- this.retryCondition = retryCondition;
- }
-
- @Editable(order=9410, group="More Settings", description="Maximum of retries before giving up")
- @Min(value=1, message="This value should not be less than 1")
- public int getMaxRetries() {
- return maxRetries;
- }
-
- public void setMaxRetries(int maxRetries) {
- this.maxRetries = maxRetries;
- }
-
- @Editable(order=9420, group="More Settings", description="Delay for the first retry in seconds. "
- + "Delay of subsequent retries will be calculated using an exponential back-off "
- + "based on this delay")
- @Min(value=1, message="This value should not be less than 1")
- public int getRetryDelay() {
- return retryDelay;
- }
-
- public void setRetryDelay(int retryDelay) {
- this.retryDelay = retryDelay;
- }
-
- @Editable(order=10050, name="CPU Requirement", group="More Settings", description="Specify CPU requirement of the job in millis. "
- + "1000 millis means a single CPU core")
- public int getCpuRequirement() {
- return cpuRequirement;
- }
-
- public void setCpuRequirement(int cpuRequirement) {
- this.cpuRequirement = cpuRequirement;
- }
-
- @Editable(order=10060, group="More Settings", description="Specify memory requirement of the job in mega bytes")
- public int getMemoryRequirement() {
- return memoryRequirement;
- }
-
- public void setMemoryRequirement(int memoryRequirement) {
- this.memoryRequirement = memoryRequirement;
- }
-
- @Editable(order=10100, group="More Settings", description="Cache specific paths to speed up job execution. "
- + "For instance for Java Maven projects executed by various docker executors, you may cache folder "
- + "/root/.m2/repository to avoid downloading dependencies for subsequent executions.
"
- + "WARNING: When using cache, malicious jobs running with same job executor "
- + "can read or even pollute the cache intentionally using same cache key as yours. To avoid this "
- + "issue, make sure job executor executing your job can only be used by trusted jobs via job "
- + "authorization setting")
- @Valid
- public List getCaches() {
- return caches;
- }
-
- public void setCaches(List caches) {
- this.caches = caches;
- }
-
- @Editable(order=10500, group="More Settings", description="Specify timeout in seconds")
- public long getTimeout() {
- return timeout;
- }
-
- public void setTimeout(long timeout) {
- this.timeout = timeout;
- }
-
- @Editable(order=10600, name="Post Build Actions", group="More Settings")
- @Valid
- public List getPostBuildActions() {
- return postBuildActions;
- }
-
- public void setPostBuildActions(List postBuildActions) {
- this.postBuildActions = postBuildActions;
- }
-
- @Nullable
- public JobTriggerMatch getTriggerMatch(ProjectEvent event) {
- for (JobTrigger trigger: getTriggers()) {
- SubmitReason reason = trigger.matches(event, this);
- if (reason != null)
- return new JobTriggerMatch(trigger, reason);
- }
- return null;
- }
-
- @Override
- public boolean isValid(ConstraintValidatorContext context) {
- boolean isValid = true;
-
- Set keys = new HashSet<>();
- Set paths = new HashSet<>();
- for (CacheSpec cache: caches) {
- if (!keys.add(cache.getKey())) {
- isValid = false;
- context.buildConstraintViolationWithTemplate("Duplicate key (" + cache.getKey() + ")")
- .addPropertyNode("caches").addConstraintViolation();
- }
- if (!paths.add(cache.getPath())) {
- isValid = false;
- context.buildConstraintViolationWithTemplate("Duplicate path (" + cache.getPath() + ")")
- .addPropertyNode("caches").addConstraintViolation();
- }
- }
-
- Set dependencyJobNames = new HashSet<>();
- for (JobDependency dependency: jobDependencies) {
- if (!dependencyJobNames.add(dependency.getJobName())) {
- isValid = false;
- context.buildConstraintViolationWithTemplate("Duplicate dependency (" + dependency.getJobName() + ")")
- .addPropertyNode("jobDependencies").addConstraintViolation();
- }
- }
-
- Set dependencyProjectPaths = new HashSet<>();
- for (ProjectDependency dependency: projectDependencies) {
- if (!dependencyProjectPaths.add(dependency.getProjectPath())) {
- isValid = false;
- context.buildConstraintViolationWithTemplate("Duplicate dependency (" + dependency.getProjectPath() + ")")
- .addPropertyNode("projectDependencies").addConstraintViolation();
- }
- }
-
- Set paramSpecNames = new HashSet<>();
- for (ParamSpec paramSpec: paramSpecs) {
- if (!paramSpecNames.add(paramSpec.getName())) {
- isValid = false;
- context.buildConstraintViolationWithTemplate("Duplicate parameter spec (" + paramSpec.getName() + ")")
- .addPropertyNode("paramSpecs").addConstraintViolation();
- }
- }
-
- if (getRetryCondition() != null) {
- try {
- io.onedev.server.buildspec.job.retrycondition.RetryCondition.parse(this, getRetryCondition());
- } catch (Exception e) {
- String message = e.getMessage();
- if (message == null)
- message = "Malformed retry condition";
- context.buildConstraintViolationWithTemplate(message)
- .addPropertyNode(PROP_RETRY_CONDITION)
- .addConstraintViolation();
- isValid = false;
- }
- }
-
- if (isValid) {
- for (int triggerIndex=0; triggerIndex getParamSpecMap() {
- if (paramSpecMap == null)
- paramSpecMap = ParamUtils.getParamSpecMap(paramSpecs);
- return paramSpecMap;
- }
-
- public static String getBuildQuery(ObjectId commitId, String jobName,
- @Nullable Build pipelineOf, @Nullable String refName, @Nullable PullRequest request) {
- String query = ""
- + Criteria.quote(NAME_COMMIT) + " " + getRuleName(Is) + " " + Criteria.quote(commitId.name())
- + " " + getRuleName(And) + " "
- + Criteria.quote(NAME_JOB) + " " + getRuleName(Is) + " " + Criteria.quote(jobName);
- if (pipelineOf != null)
- query = query + " " + getRuleName(And) + " " + getRuleName(InPipelineOf) + " " + Criteria.quote("#" + pipelineOf.getNumber());
- if (request != null) {
- query = query
- + " " + getRuleName(And) + " "
- + Criteria.quote(NAME_PULL_REQUEST) + " " + getRuleName(Is) + " " + Criteria.quote("#" + request.getNumber());
- }
- if (refName != null) {
- String branch = GitUtils.ref2branch(refName);
- if (branch != null) {
- query = query
- + " " + getRuleName(And) + " "
- + Criteria.quote(NAME_BRANCH) + " " + getRuleName(Is) + " " + Criteria.quote(branch);
- }
- String tag = GitUtils.ref2tag(refName);
- if (tag != null) {
- query = query
- + " " + getRuleName(And) + " "
- + Criteria.quote(NAME_TAG) + " " + getRuleName(Is) + " " + Criteria.quote(tag);
- }
- }
- return query;
- }
-
- public static List getChoices() {
- List choices = new ArrayList<>();
- Component component = ComponentContext.get().getComponent();
- BuildSpecAware buildSpecAware = WicketUtils.findInnermost(component, BuildSpecAware.class);
- if (buildSpecAware != null) {
- BuildSpec buildSpec = buildSpecAware.getBuildSpec();
- if (buildSpec != null) {
- choices.addAll(buildSpec.getJobMap().values().stream()
- .map(it->it.getName()).collect(Collectors.toList()));
- }
- JobAware jobAware = WicketUtils.findInnermost(component, JobAware.class);
- if (jobAware != null) {
- Job job = jobAware.getJob();
- if (job != null)
- choices.remove(job.getName());
- }
- }
- return choices;
- }
-
- @SuppressWarnings("unused")
- private static List suggestVariables(String matchWith) {
- return BuildSpec.suggestVariables(matchWith, false, false, false);
- }
-
-}
+package io.onedev.server.buildspec.job;
+
+import static io.onedev.server.model.Build.NAME_BRANCH;
+import static io.onedev.server.model.Build.NAME_COMMIT;
+import static io.onedev.server.model.Build.NAME_JOB;
+import static io.onedev.server.model.Build.NAME_PULL_REQUEST;
+import static io.onedev.server.model.Build.NAME_TAG;
+import static io.onedev.server.search.entity.build.BuildQuery.getRuleName;
+import static io.onedev.server.search.entity.build.BuildQueryLexer.And;
+import static io.onedev.server.search.entity.build.BuildQueryLexer.InPipelineOf;
+import static io.onedev.server.search.entity.build.BuildQueryLexer.Is;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+import javax.annotation.Nullable;
+import javax.validation.ConstraintValidatorContext;
+import javax.validation.Valid;
+import javax.validation.constraints.Min;
+import javax.validation.constraints.NotEmpty;
+
+import org.apache.wicket.Component;
+import org.eclipse.jgit.lib.ObjectId;
+
+import io.onedev.commons.codeassist.InputCompletion;
+import io.onedev.commons.codeassist.InputStatus;
+import io.onedev.commons.codeassist.InputSuggestion;
+import io.onedev.server.OneDev;
+import io.onedev.server.buildspec.BuildSpec;
+import io.onedev.server.buildspec.BuildSpecAware;
+import io.onedev.server.buildspec.NamedElement;
+import io.onedev.server.buildspec.job.action.PostBuildAction;
+import io.onedev.server.buildspec.job.projectdependency.ProjectDependency;
+import io.onedev.server.buildspec.job.trigger.JobTrigger;
+import io.onedev.server.buildspec.param.ParamUtils;
+import io.onedev.server.buildspec.param.spec.ParamSpec;
+import io.onedev.server.buildspec.step.Step;
+import io.onedev.server.entitymanager.SettingManager;
+import io.onedev.server.event.project.ProjectEvent;
+import io.onedev.server.git.GitUtils;
+import io.onedev.server.job.authorization.JobAuthorization;
+import io.onedev.server.job.authorization.JobAuthorization.Context;
+import io.onedev.server.model.Build;
+import io.onedev.server.model.PullRequest;
+import io.onedev.server.model.support.administration.jobexecutor.JobExecutor;
+import io.onedev.server.util.ComponentContext;
+import io.onedev.server.util.EditContext;
+import io.onedev.server.util.criteria.Criteria;
+import io.onedev.server.util.validation.Validatable;
+import io.onedev.server.util.validation.annotation.ClassValidating;
+import io.onedev.server.web.editable.annotation.ChoiceProvider;
+import io.onedev.server.web.editable.annotation.Editable;
+import io.onedev.server.web.editable.annotation.Interpolative;
+import io.onedev.server.web.editable.annotation.RetryCondition;
+import io.onedev.server.web.editable.annotation.SuggestionProvider;
+import io.onedev.server.web.page.project.blob.ProjectBlobPage;
+import io.onedev.server.web.util.SuggestionUtils;
+import io.onedev.server.web.util.WicketUtils;
+
+@Editable
+@ClassValidating
+public class Job implements NamedElement, Serializable, Validatable {
+
+ private static final long serialVersionUID = 1L;
+
+ public static final String SELECTION_PREFIX = "jobs/";
+
+ public static final String PROP_NAME = "name";
+
+ public static final String PROP_JOB_DEPENDENCIES = "jobDependencies";
+
+ public static final String PROP_REQUIRED_SERVICES = "requiredServices";
+
+ public static final String PROP_TRIGGERS = "triggers";
+
+ public static final String PROP_STEPS = "steps";
+
+ public static final String PROP_RETRY_CONDITION = "retryCondition";
+
+ public static final String PROP_POST_BUILD_ACTIONS = "postBuildActions";
+
+ private String name;
+
+ private String jobExecutor;
+
+ private List steps = new ArrayList<>();
+
+ private List