From 3112fd89888d6f1375946d4a87575caa4ec6b758 Mon Sep 17 00:00:00 2001 From: SanjayThomas Date: Sun, 25 Feb 2018 02:07:24 +0530 Subject: [PATCH 1/2] Adding else and if-else support --- .../ConditionalBuilder.java | 78 ++++++++++++++++++- .../elsecondition/ConditionalBlock.java | 24 ++++++ .../elsecondition/IfElseBlock.java | 75 ++++++++++++++++++ .../elsecondition/SingleIfElseBlock.java | 72 +++++++++++++++++ .../singlestep/JobUpdater.java | 2 +- .../singlestep/SingleConditionalBuilder.java | 74 +++++++++++++++++- .../ConditionalBuilder/config.jelly | 43 ++++++++-- .../ConditionalBuilder/config.properties | 6 +- .../ConditionalBuilder/help-useElse.html | 26 +++++++ .../conditionalbuildstep/Messages.properties | 2 + .../elsecondition/IfElseBlock/config.jelly | 21 +++++ .../IfElseBlock/config.properties | 28 +++++++ .../IfElseBlock/help-runCondition.jelly | 34 ++++++++ .../SingleIfElseBlock/config.jelly | 10 +++ .../SingleIfElseBlock/config.properties | 26 +++++++ .../SingleIfElseBlock/help-runCondition.jelly | 34 ++++++++ .../SingleConditionalBuilder/config.jelly | 33 ++++++-- .../config.properties | 6 +- .../help-useElse.html | 26 +++++++ .../ConfigFileBuildWrapperTest.java | 59 ++++++++++++++ 20 files changed, 655 insertions(+), 24 deletions(-) create mode 100644 src/main/java/org/jenkinsci/plugins/conditionalbuildstep/elsecondition/ConditionalBlock.java create mode 100644 src/main/java/org/jenkinsci/plugins/conditionalbuildstep/elsecondition/IfElseBlock.java create mode 100644 src/main/java/org/jenkinsci/plugins/conditionalbuildstep/elsecondition/SingleIfElseBlock.java create mode 100644 src/main/resources/org/jenkinsci/plugins/conditionalbuildstep/ConditionalBuilder/help-useElse.html create mode 100644 src/main/resources/org/jenkinsci/plugins/conditionalbuildstep/elsecondition/IfElseBlock/config.jelly create mode 100644 src/main/resources/org/jenkinsci/plugins/conditionalbuildstep/elsecondition/IfElseBlock/config.properties create mode 100644 src/main/resources/org/jenkinsci/plugins/conditionalbuildstep/elsecondition/IfElseBlock/help-runCondition.jelly create mode 100644 src/main/resources/org/jenkinsci/plugins/conditionalbuildstep/elsecondition/SingleIfElseBlock/config.jelly create mode 100644 src/main/resources/org/jenkinsci/plugins/conditionalbuildstep/elsecondition/SingleIfElseBlock/config.properties create mode 100644 src/main/resources/org/jenkinsci/plugins/conditionalbuildstep/elsecondition/SingleIfElseBlock/help-runCondition.jelly create mode 100644 src/main/resources/org/jenkinsci/plugins/conditionalbuildstep/singlestep/SingleConditionalBuilder/help-useElse.html diff --git a/src/main/java/org/jenkinsci/plugins/conditionalbuildstep/ConditionalBuilder.java b/src/main/java/org/jenkinsci/plugins/conditionalbuildstep/ConditionalBuilder.java index 57de270..5331ac9 100644 --- a/src/main/java/org/jenkinsci/plugins/conditionalbuildstep/ConditionalBuilder.java +++ b/src/main/java/org/jenkinsci/plugins/conditionalbuildstep/ConditionalBuilder.java @@ -49,6 +49,8 @@ import org.jenkins_ci.plugins.run_condition.RunCondition; import org.jenkins_ci.plugins.run_condition.BuildStepRunner; import org.jenkinsci.plugins.conditionalbuildstep.dependency.ConditionalDependencyGraphWrapper; +import org.jenkinsci.plugins.conditionalbuildstep.elsecondition.IfElseBlock; +import org.jenkinsci.plugins.conditionalbuildstep.elsecondition.IfElseBlock.IfElseBlockDescriptor; import org.jenkinsci.plugins.conditionalbuildstep.singlestep.SingleConditionalBuilder; import org.jenkinsci.plugins.conditionalbuildstep.singlestep.SingleConditionalBuilder.SingleConditionalBuilderDescriptor; import org.kohsuke.stapler.DataBoundConstructor; @@ -70,6 +72,9 @@ public class ConditionalBuilder extends Builder implements DependencyDeclarer { private final BuildStepRunner runner; private RunCondition runCondition; private List conditionalbuilders; + private List conditionalBlocks; + private boolean useElse; + private List elseBuildSteps; /** * @deprecated No longer needed as part of the Constructor @@ -78,14 +83,17 @@ public class ConditionalBuilder extends Builder implements DependencyDeclarer { @Deprecated public ConditionalBuilder(RunCondition runCondition, final BuildStepRunner runner) { //List builders = new ArrayList(); - this(runCondition, runner, new ArrayList()); + this(runCondition, runner, new ArrayList(),null,false,null); } @DataBoundConstructor - public ConditionalBuilder(RunCondition runCondition, final BuildStepRunner runner, List conditionalbuilders) { + public ConditionalBuilder(RunCondition runCondition, final BuildStepRunner runner, List conditionalbuilders,List conditionalBlocks, boolean useElse, List elseBuildSteps) { this.runner = runner; this.runCondition = runCondition; this.conditionalbuilders = conditionalbuilders; + this.conditionalBlocks = conditionalBlocks; + this.useElse = useElse; + this.elseBuildSteps = elseBuildSteps; } public BuildStepRunner getRunner() { return runner; @@ -95,6 +103,20 @@ public RunCondition getRunCondition() { return runCondition; } + public List getConditionalBlocks(){ + if(conditionalBlocks == null) conditionalBlocks = new ArrayList(); + return conditionalBlocks; + } + + public boolean getUseElse(){ + return useElse; + } + + public List getElseBuildSteps(){ + if(elseBuildSteps == null) elseBuildSteps = new ArrayList(); + return elseBuildSteps; + } + @Override public Collection getProjectActions(AbstractProject project) { final Collection projectActions = new ArrayList(); @@ -126,12 +148,56 @@ public void setConditionalbuilders(List conditionalbuilders) { @Override public boolean prebuild(final AbstractBuild build, final BuildListener listener) { - return runner.prebuild(runCondition, new BuilderChain(getConditionalbuilders()), build, listener); + try{ + if(runCondition.runPerform(build, listener)){ + return new BuilderChain(getConditionalbuilders()).prebuild(build, listener); + } + if(conditionalBlocks!=null){ + for(IfElseBlock block: conditionalBlocks){ + RunCondition runCondition = block.getRunCondition(); + if(runCondition!=null && runCondition.runPerform(build, listener)){ + List buildSteps = block.getBuildSteps(); + if(buildSteps!=null){ + return new BuilderChain(buildSteps).prebuild(build, listener); + } + } + } + } + if(useElse && elseBuildSteps!=null){ + return new BuilderChain(getElseBuildSteps()).prebuild(build, listener); + } + } + catch(Exception e){ + e.printStackTrace(); + } + return false; } @Override public boolean perform(final AbstractBuild build, final Launcher launcher, final BuildListener listener) throws InterruptedException, IOException { - return runner.perform(runCondition, new BuilderChain(getConditionalbuilders()), build, launcher, listener); + try{ + if(runCondition.runPerform(build, listener)){ + return new BuilderChain(getConditionalbuilders()).perform(build, launcher, listener); + } + if(conditionalBlocks!=null){ + for(IfElseBlock block: conditionalBlocks){ + RunCondition runCondition = block.getRunCondition(); + if(runCondition!=null && runCondition.runPerform(build, listener)){ + List buildSteps = block.getBuildSteps(); + if(buildSteps!=null){ + return new BuilderChain(buildSteps).perform(build, launcher, listener); + } + } + } + } + if(useElse && elseBuildSteps!=null){ + return new BuilderChain(getElseBuildSteps()).perform(build, launcher, listener); + } + } + catch(Exception e){ + e.printStackTrace(); + } + return false; } public Object readResolve() { @@ -182,6 +248,10 @@ public DescriptorExtensionList> getRunConditions() { return RunCondition.all(); } + + public IfElseBlockDescriptor getIfElseBlockDescriptor() { + return Hudson.getInstance().getDescriptorByType(IfElseBlockDescriptor.class); + } } diff --git a/src/main/java/org/jenkinsci/plugins/conditionalbuildstep/elsecondition/ConditionalBlock.java b/src/main/java/org/jenkinsci/plugins/conditionalbuildstep/elsecondition/ConditionalBlock.java new file mode 100644 index 0000000..df368c5 --- /dev/null +++ b/src/main/java/org/jenkinsci/plugins/conditionalbuildstep/elsecondition/ConditionalBlock.java @@ -0,0 +1,24 @@ +package org.jenkinsci.plugins.conditionalbuildstep.elsecondition; + +import hudson.DescriptorExtensionList; +import hudson.ExtensionPoint; +import hudson.model.Describable; +import hudson.model.Descriptor; +import hudson.model.Hudson; + +public abstract class ConditionalBlock implements Describable,ExtensionPoint{ + public static DescriptorExtensionList all() { + return Hudson.getInstance().getDescriptorList(ConditionalBlock.class); + } + + public abstract Descriptor getDescriptor(); + + public static abstract class ConditionalBlockDescriptor extends Descriptor{ + + protected ConditionalBlockDescriptor() { } + + protected ConditionalBlockDescriptor(Class clazz) { + super(clazz); + } + } +} diff --git a/src/main/java/org/jenkinsci/plugins/conditionalbuildstep/elsecondition/IfElseBlock.java b/src/main/java/org/jenkinsci/plugins/conditionalbuildstep/elsecondition/IfElseBlock.java new file mode 100644 index 0000000..e8aba5e --- /dev/null +++ b/src/main/java/org/jenkinsci/plugins/conditionalbuildstep/elsecondition/IfElseBlock.java @@ -0,0 +1,75 @@ +package org.jenkinsci.plugins.conditionalbuildstep.elsecondition; + +import java.util.ArrayList; +import java.util.List; + +import org.jenkins_ci.plugins.run_condition.RunCondition; +import org.jenkins_ci.plugins.run_condition.core.AlwaysRun; +import org.jenkinsci.plugins.conditionalbuildstep.Messages; +import org.jenkinsci.plugins.conditionalbuildstep.singlestep.SingleConditionalBuilder.SingleConditionalBuilderDescriptor; +import org.kohsuke.stapler.DataBoundConstructor; +import org.kohsuke.stapler.StaplerRequest; + +import hudson.Extension; +import hudson.model.AbstractProject; +import hudson.model.Descriptor; +import hudson.model.Hudson; +import hudson.tasks.BuildStep; +import net.sf.json.JSONObject; + +public class IfElseBlock extends ConditionalBlock { + private List buildSteps; + private RunCondition runCondition; + + @DataBoundConstructor + public IfElseBlock(List buildSteps,RunCondition runCondition) { + this.buildSteps = buildSteps; + this.runCondition = runCondition; + } + + public List getBuildSteps() { + if(buildSteps == null) buildSteps = new ArrayList(); + return buildSteps; + } + + public RunCondition getRunCondition() { + return runCondition; + } + + @Override + public ConditionalBlockDescriptor getDescriptor() { + return (IfElseBlockDescriptor)Hudson.getInstance().getDescriptor(getClass()); + } + + @Extension + public static final class IfElseBlockDescriptor extends ConditionalBlockDescriptor{ + + @Override + public boolean configure(StaplerRequest req, JSONObject json) throws FormException { + req.bindJSON(this, json); + save(); + return true; + } + + public List> getAllowedBuilders(AbstractProject project){ + final SingleConditionalBuilderDescriptor singleConditionalStepDescriptor = Hudson.getInstance().getDescriptorByType( + SingleConditionalBuilderDescriptor.class); + return singleConditionalStepDescriptor.getAllowedBuilders(project); + } + + @Override + public String getDisplayName() { + return Messages.conditionalblock_ifelseblock(); + } + + public List> getRunConditions() { + return RunCondition.all(); + } + + public RunCondition.RunConditionDescriptor getDefaultRunCondition() { + return Hudson.getInstance().getDescriptorByType(AlwaysRun.AlwaysRunDescriptor.class); + } + + } + +} diff --git a/src/main/java/org/jenkinsci/plugins/conditionalbuildstep/elsecondition/SingleIfElseBlock.java b/src/main/java/org/jenkinsci/plugins/conditionalbuildstep/elsecondition/SingleIfElseBlock.java new file mode 100644 index 0000000..abd78de --- /dev/null +++ b/src/main/java/org/jenkinsci/plugins/conditionalbuildstep/elsecondition/SingleIfElseBlock.java @@ -0,0 +1,72 @@ +package org.jenkinsci.plugins.conditionalbuildstep.elsecondition; + +import java.util.List; + +import org.jenkins_ci.plugins.run_condition.RunCondition; +import org.jenkins_ci.plugins.run_condition.core.AlwaysRun; +import org.jenkinsci.plugins.conditionalbuildstep.Messages; +import org.jenkinsci.plugins.conditionalbuildstep.singlestep.SingleConditionalBuilder.SingleConditionalBuilderDescriptor; +import org.kohsuke.stapler.DataBoundConstructor; +import org.kohsuke.stapler.StaplerRequest; + +import hudson.Extension; +import hudson.model.AbstractProject; +import hudson.model.Descriptor; +import hudson.model.Hudson; +import hudson.tasks.BuildStep; +import net.sf.json.JSONObject; + +public class SingleIfElseBlock extends ConditionalBlock{ + private BuildStep buildStep; + private RunCondition runCondition; + + @DataBoundConstructor + public SingleIfElseBlock(BuildStep buildStep,RunCondition runCondition) { + this.buildStep = buildStep; + this.runCondition = runCondition; + } + + public BuildStep getBuildStep() { + return buildStep; + } + + public RunCondition getRunCondition() { + return runCondition; + } + + @Override + public ConditionalBlockDescriptor getDescriptor() { + return (SingleIfElseBlockDescriptor)Hudson.getInstance().getDescriptor(getClass()); + } + + @Extension + public static final class SingleIfElseBlockDescriptor extends ConditionalBlockDescriptor{ + + @Override + public boolean configure(StaplerRequest req, JSONObject json) throws FormException { + req.bindJSON(this, json); + save(); + return true; + } + + public List> getAllowedBuilders(AbstractProject project){ + final SingleConditionalBuilderDescriptor singleConditionalStepDescriptor = Hudson.getInstance().getDescriptorByType( + SingleConditionalBuilderDescriptor.class); + return singleConditionalStepDescriptor.getAllowedBuilders(project); + } + + @Override + public String getDisplayName() { + return Messages.conditionalblock_ifelseblock(); + } + + public List> getRunConditions() { + return RunCondition.all(); + } + + public RunCondition.RunConditionDescriptor getDefaultRunCondition() { + return Hudson.getInstance().getDescriptorByType(AlwaysRun.AlwaysRunDescriptor.class); + } + + } +} diff --git a/src/main/java/org/jenkinsci/plugins/conditionalbuildstep/singlestep/JobUpdater.java b/src/main/java/org/jenkinsci/plugins/conditionalbuildstep/singlestep/JobUpdater.java index 3002b94..589f063 100644 --- a/src/main/java/org/jenkinsci/plugins/conditionalbuildstep/singlestep/JobUpdater.java +++ b/src/main/java/org/jenkinsci/plugins/conditionalbuildstep/singlestep/JobUpdater.java @@ -65,7 +65,7 @@ public static boolean updateBuilders(final FreeStyleProject project) throws IOEx final List replace = new ArrayList(); for (Builder builder : builders) { if (allowed.contains(builder.getDescriptor())) - replace.add(new SingleConditionalBuilder((BuildStep) builder, new AlwaysRun(), new BuildStepRunner.Fail())); + replace.add(new SingleConditionalBuilder((BuildStep) builder, new AlwaysRun(), new BuildStepRunner.Fail(),null,false,null)); else replace.add(builder); } diff --git a/src/main/java/org/jenkinsci/plugins/conditionalbuildstep/singlestep/SingleConditionalBuilder.java b/src/main/java/org/jenkinsci/plugins/conditionalbuildstep/singlestep/SingleConditionalBuilder.java index d7c24c5..451247c 100644 --- a/src/main/java/org/jenkinsci/plugins/conditionalbuildstep/singlestep/SingleConditionalBuilder.java +++ b/src/main/java/org/jenkinsci/plugins/conditionalbuildstep/singlestep/SingleConditionalBuilder.java @@ -39,6 +39,7 @@ import hudson.tasks.Builder; import java.io.IOException; +import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.List; @@ -51,6 +52,8 @@ import org.jenkins_ci.plugins.run_condition.core.AlwaysRun; import org.jenkinsci.plugins.conditionalbuildstep.Messages; import org.jenkinsci.plugins.conditionalbuildstep.dependency.ConditionalDependencyGraphWrapper; +import org.jenkinsci.plugins.conditionalbuildstep.elsecondition.SingleIfElseBlock; +import org.jenkinsci.plugins.conditionalbuildstep.elsecondition.SingleIfElseBlock.SingleIfElseBlockDescriptor; import org.jenkinsci.plugins.conditionalbuildstep.lister.BuilderDescriptorLister; import org.jenkinsci.plugins.conditionalbuildstep.lister.DefaultBuilderDescriptorLister; import org.kohsuke.stapler.DataBoundConstructor; @@ -69,12 +72,18 @@ public class SingleConditionalBuilder extends Builder implements DependencyDecla private final RunCondition condition; private final BuildStep buildStep; private final BuildStepRunner runner; + private List conditionalBlocks; + private boolean useElse; + private BuildStep elseBuildStep; @DataBoundConstructor - public SingleConditionalBuilder(final BuildStep buildStep, final RunCondition condition, final BuildStepRunner runner) { + public SingleConditionalBuilder(final BuildStep buildStep, final RunCondition condition, final BuildStepRunner runner,final List conditionalBlocks,final boolean useElse,final BuildStep elseBuildStep) { this.buildStep = buildStep; this.condition = condition; this.runner = runner; + this.conditionalBlocks = conditionalBlocks; + this.useElse = useElse; + this.elseBuildStep = elseBuildStep; } public BuildStep getBuildStep() { @@ -88,6 +97,19 @@ public RunCondition getCondition() { public BuildStepRunner getRunner() { return runner; } + + public List getConditionalBlocks(){ + if(conditionalBlocks==null) this.conditionalBlocks = new ArrayList(); + return conditionalBlocks; + } + + public boolean getUseElse() { + return useElse; + } + + public BuildStep getElseBuildStep() { + return elseBuildStep; + } public BuildStepMonitor getRequiredMonitorService() { return buildStep == null ? BuildStepMonitor.NONE : buildStep.getRequiredMonitorService(); @@ -100,12 +122,54 @@ public Collection getProjectActions(final AbstractProject project) { @Override public boolean prebuild(final AbstractBuild build, final BuildListener listener) { - return runner.prebuild(condition, buildStep, build, listener); + try { + if(condition.runPerform(build, listener)){ + return buildStep.prebuild(build, listener); + } + if(conditionalBlocks!=null){ + for(SingleIfElseBlock block: conditionalBlocks){ + RunCondition runCondition = block.getRunCondition(); + if(runCondition!=null && runCondition.runPerform(build, listener)){ + BuildStep ifElseBuildStep = block.getBuildStep(); + if(ifElseBuildStep!=null){ + return ifElseBuildStep.prebuild(build, listener); + } + } + } + } + if(useElse && elseBuildStep!=null){ + return elseBuildStep.prebuild(build, listener); + } + } catch (Exception e) { + e.printStackTrace(); + } + return false; } @Override public boolean perform(final AbstractBuild build, final Launcher launcher, final BuildListener listener) throws InterruptedException, IOException { - return runner.perform(condition, buildStep, build, launcher, listener); + try { + if(condition.runPerform(build, listener)){ + return buildStep.perform(build, launcher, listener); + } + if(conditionalBlocks!=null){ + for(SingleIfElseBlock block: conditionalBlocks){ + RunCondition runCondition = block.getRunCondition(); + if(runCondition!=null && runCondition.runPerform(build, listener)){ + BuildStep ifElseBuildStep = block.getBuildStep(); + if(ifElseBuildStep!=null){ + return ifElseBuildStep.perform(build, launcher, listener); + } + } + } + } + if(useElse&&elseBuildStep!=null){ + return elseBuildStep.perform(build, launcher, listener); + } + } catch (Exception e) { + e.printStackTrace(); + } + return false; } public void buildDependencyGraph(AbstractProject project, DependencyGraph graph) { @@ -168,6 +232,10 @@ public DescriptorExtensionList> getRunConditions() { return RunCondition.all(); diff --git a/src/main/resources/org/jenkinsci/plugins/conditionalbuildstep/ConditionalBuilder/config.jelly b/src/main/resources/org/jenkinsci/plugins/conditionalbuildstep/ConditionalBuilder/config.jelly index d44f6d6..00fd30e 100644 --- a/src/main/resources/org/jenkinsci/plugins/conditionalbuildstep/ConditionalBuilder/config.jelly +++ b/src/main/resources/org/jenkinsci/plugins/conditionalbuildstep/ConditionalBuilder/config.jelly @@ -4,11 +4,6 @@ - - - - -
@@ -24,6 +19,40 @@
- - + + + + + + + +
+ +
+
+
+
+
+
+ + +
+
+ + + + + + +
+
+
+
+
+ + + + + diff --git a/src/main/resources/org/jenkinsci/plugins/conditionalbuildstep/ConditionalBuilder/config.properties b/src/main/resources/org/jenkinsci/plugins/conditionalbuildstep/ConditionalBuilder/config.properties index 94f1c39..1b706cc 100644 --- a/src/main/resources/org/jenkinsci/plugins/conditionalbuildstep/ConditionalBuilder/config.properties +++ b/src/main/resources/org/jenkinsci/plugins/conditionalbuildstep/ConditionalBuilder/config.properties @@ -22,6 +22,10 @@ # THE SOFTWARE. # -condition=Run? +condition=Run if +addIfElseBlock=Add If Else Block +ifBlock=If Block +ifElseBlock=If Else Block +elseBlock=Else Block runner=On evaluation failure stepssection=Steps to run if condition is met \ No newline at end of file diff --git a/src/main/resources/org/jenkinsci/plugins/conditionalbuildstep/ConditionalBuilder/help-useElse.html b/src/main/resources/org/jenkinsci/plugins/conditionalbuildstep/ConditionalBuilder/help-useElse.html new file mode 100644 index 0000000..95c42fe --- /dev/null +++ b/src/main/resources/org/jenkinsci/plugins/conditionalbuildstep/ConditionalBuilder/help-useElse.html @@ -0,0 +1,26 @@ + + +
Introduces an else block. The build step specified here would be executed when the run condition for all above + ifblocks and if-else blocks fails.
diff --git a/src/main/resources/org/jenkinsci/plugins/conditionalbuildstep/Messages.properties b/src/main/resources/org/jenkinsci/plugins/conditionalbuildstep/Messages.properties index 45dbfcf..ea87b01 100644 --- a/src/main/resources/org/jenkinsci/plugins/conditionalbuildstep/Messages.properties +++ b/src/main/resources/org/jenkinsci/plugins/conditionalbuildstep/Messages.properties @@ -26,5 +26,7 @@ multistepbuilder.displayName=Conditional steps (multiple) singlestepbuilder.displayName=Conditional step (single) defaultBuilderDescriptor.displayName=Default builder lister legacycondition.displayName=Legacy boolean condition (deprecated) +conditionalblock.elseblock=Else Block +conditionalblock.ifelseblock=If Else Block diff --git a/src/main/resources/org/jenkinsci/plugins/conditionalbuildstep/elsecondition/IfElseBlock/config.jelly b/src/main/resources/org/jenkinsci/plugins/conditionalbuildstep/elsecondition/IfElseBlock/config.jelly new file mode 100644 index 0000000..c89de5a --- /dev/null +++ b/src/main/resources/org/jenkinsci/plugins/conditionalbuildstep/elsecondition/IfElseBlock/config.jelly @@ -0,0 +1,21 @@ + + + + + + +
+
+ + + + + + +
+
+
+
+
\ No newline at end of file diff --git a/src/main/resources/org/jenkinsci/plugins/conditionalbuildstep/elsecondition/IfElseBlock/config.properties b/src/main/resources/org/jenkinsci/plugins/conditionalbuildstep/elsecondition/IfElseBlock/config.properties new file mode 100644 index 0000000..d75b9cb --- /dev/null +++ b/src/main/resources/org/jenkinsci/plugins/conditionalbuildstep/elsecondition/IfElseBlock/config.properties @@ -0,0 +1,28 @@ +# +# The MIT License +# +# Copyright (C) 2011 by Anthony Robinson +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. +# + +buildStep=Builder +condition=Run if +stepssection=Steps to run if condition is met +addsteps=Add step to condition \ No newline at end of file diff --git a/src/main/resources/org/jenkinsci/plugins/conditionalbuildstep/elsecondition/IfElseBlock/help-runCondition.jelly b/src/main/resources/org/jenkinsci/plugins/conditionalbuildstep/elsecondition/IfElseBlock/help-runCondition.jelly new file mode 100644 index 0000000..f3e814f --- /dev/null +++ b/src/main/resources/org/jenkinsci/plugins/conditionalbuildstep/elsecondition/IfElseBlock/help-runCondition.jelly @@ -0,0 +1,34 @@ + + + + + + + +
+

Available Token Macros

+ + +
\ No newline at end of file diff --git a/src/main/resources/org/jenkinsci/plugins/conditionalbuildstep/elsecondition/SingleIfElseBlock/config.jelly b/src/main/resources/org/jenkinsci/plugins/conditionalbuildstep/elsecondition/SingleIfElseBlock/config.jelly new file mode 100644 index 0000000..2f61c2e --- /dev/null +++ b/src/main/resources/org/jenkinsci/plugins/conditionalbuildstep/elsecondition/SingleIfElseBlock/config.jelly @@ -0,0 +1,10 @@ + + + + + + + + + \ No newline at end of file diff --git a/src/main/resources/org/jenkinsci/plugins/conditionalbuildstep/elsecondition/SingleIfElseBlock/config.properties b/src/main/resources/org/jenkinsci/plugins/conditionalbuildstep/elsecondition/SingleIfElseBlock/config.properties new file mode 100644 index 0000000..ecda19e --- /dev/null +++ b/src/main/resources/org/jenkinsci/plugins/conditionalbuildstep/elsecondition/SingleIfElseBlock/config.properties @@ -0,0 +1,26 @@ +# +# The MIT License +# +# Copyright (C) 2011 by Anthony Robinson +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. +# + +buildStep=Builder +condition=Run if \ No newline at end of file diff --git a/src/main/resources/org/jenkinsci/plugins/conditionalbuildstep/elsecondition/SingleIfElseBlock/help-runCondition.jelly b/src/main/resources/org/jenkinsci/plugins/conditionalbuildstep/elsecondition/SingleIfElseBlock/help-runCondition.jelly new file mode 100644 index 0000000..f3e814f --- /dev/null +++ b/src/main/resources/org/jenkinsci/plugins/conditionalbuildstep/elsecondition/SingleIfElseBlock/help-runCondition.jelly @@ -0,0 +1,34 @@ + + + + + + + +
+

Available Token Macros

+ + +
\ No newline at end of file diff --git a/src/main/resources/org/jenkinsci/plugins/conditionalbuildstep/singlestep/SingleConditionalBuilder/config.jelly b/src/main/resources/org/jenkinsci/plugins/conditionalbuildstep/singlestep/SingleConditionalBuilder/config.jelly index efe59af..95f310a 100644 --- a/src/main/resources/org/jenkinsci/plugins/conditionalbuildstep/singlestep/SingleConditionalBuilder/config.jelly +++ b/src/main/resources/org/jenkinsci/plugins/conditionalbuildstep/singlestep/SingleConditionalBuilder/config.jelly @@ -24,20 +24,39 @@ ~ THE SOFTWARE. --> - + - - + - - + + + + + + +
+ +
+
+
+
+
- + + + + + + + + + +
diff --git a/src/main/resources/org/jenkinsci/plugins/conditionalbuildstep/singlestep/SingleConditionalBuilder/config.properties b/src/main/resources/org/jenkinsci/plugins/conditionalbuildstep/singlestep/SingleConditionalBuilder/config.properties index 83370fc..3a64c20 100644 --- a/src/main/resources/org/jenkinsci/plugins/conditionalbuildstep/singlestep/SingleConditionalBuilder/config.properties +++ b/src/main/resources/org/jenkinsci/plugins/conditionalbuildstep/singlestep/SingleConditionalBuilder/config.properties @@ -22,6 +22,10 @@ # THE SOFTWARE. # -condition=Run? +condition=Run if +addIfElseBlock=Add If Else Block +ifBlock=If Block +ifElseBlock=If Else Block +elseBlock=Else Block runner=On evaluation failure buildStep=Builder diff --git a/src/main/resources/org/jenkinsci/plugins/conditionalbuildstep/singlestep/SingleConditionalBuilder/help-useElse.html b/src/main/resources/org/jenkinsci/plugins/conditionalbuildstep/singlestep/SingleConditionalBuilder/help-useElse.html new file mode 100644 index 0000000..9ea3606 --- /dev/null +++ b/src/main/resources/org/jenkinsci/plugins/conditionalbuildstep/singlestep/SingleConditionalBuilder/help-useElse.html @@ -0,0 +1,26 @@ + + +
Introduces an else block. The build step specified here would be executed when the run condition for all above + ifblocks and if-else blocks fails.
\ No newline at end of file diff --git a/src/test/java/org/jenkinsci/plugins/conditionalbuildstep/ConfigFileBuildWrapperTest.java b/src/test/java/org/jenkinsci/plugins/conditionalbuildstep/ConfigFileBuildWrapperTest.java index 1f0452b..504edd1 100644 --- a/src/test/java/org/jenkinsci/plugins/conditionalbuildstep/ConfigFileBuildWrapperTest.java +++ b/src/test/java/org/jenkinsci/plugins/conditionalbuildstep/ConfigFileBuildWrapperTest.java @@ -1,13 +1,20 @@ package org.jenkinsci.plugins.conditionalbuildstep; +import hudson.EnvVars; import hudson.maven.MavenModuleSet; +import hudson.model.FreeStyleBuild; import hudson.model.FreeStyleProject; +import hudson.slaves.EnvironmentVariablesNodeProperty; import hudson.tasks.Shell; +import java.util.ArrayList; import java.util.List; +import org.apache.commons.io.FileUtils; import org.jenkins_ci.plugins.run_condition.BuildStepRunner; import org.jenkins_ci.plugins.run_condition.core.BooleanCondition; +import org.jenkinsci.plugins.conditionalbuildstep.elsecondition.SingleIfElseBlock; +import org.jenkinsci.plugins.conditionalbuildstep.singlestep.SingleConditionalBuilder; import org.junit.Assert; import org.junit.Rule; import org.junit.Test; @@ -50,5 +57,57 @@ public void conditionalBuildersInFreestyleProjectMustBeResolvable() throws Excep Assert.assertNotNull("no builders returned", containedBuilders); Assert.assertEquals("not correct nummber of builders returned", 2, containedBuilders.size()); } + + @Test + public void singleConditionalBuilderElseValidation() throws Exception { + + final FreeStyleProject p = j.createFreeStyleProject(); + EnvironmentVariablesNodeProperty prop = new EnvironmentVariablesNodeProperty(); + EnvVars envVars = prop.getEnvVars(); + j.jenkins.getGlobalNodeProperties().add(prop); + + final String elseBlockString = "Inside Else Block"; + envVars.put("TEST", "false"); + Shell ifShell = new Shell("echo \"Inside If Block\""); + Shell elseShell = new Shell("echo \""+elseBlockString+"\""); + SingleConditionalBuilder scBuilder = new SingleConditionalBuilder(ifShell,new BooleanCondition("${TEST}"), new BuildStepRunner.Run(),null,true,elseShell); + + p.getBuildersList().add(scBuilder); + + FreeStyleBuild build = p.scheduleBuild2(0).get(); + String s = FileUtils.readFileToString(build.getLogFile()); + Assert.assertTrue("Else Block validation for singleConditionalBuilder failed.", + s.contains(elseBlockString)); + } + + @Test + public void singleConditionalBuilderIfElseValidation() throws Exception { + + final FreeStyleProject p = j.createFreeStyleProject(); + EnvironmentVariablesNodeProperty prop = new EnvironmentVariablesNodeProperty(); + EnvVars envVars = prop.getEnvVars(); + j.jenkins.getGlobalNodeProperties().add(prop); + + envVars.put("IFT", "false"); + envVars.put("IFELSET1", "true"); + envVars.put("IFELSET2", "true"); + + Shell ifShell = new Shell("echo \"Inside If Block\""); + Shell ifElseShell1 = new Shell("echo \"Inside first If-Else Block\""); + Shell ifElseShell2 = new Shell("echo \"Inside second If-Else Block\""); + Shell elseShell = new Shell("echo \"Inside Else Block\""); + List ifElseList = new ArrayList(); + ifElseList.add(new SingleIfElseBlock(ifElseShell1, new BooleanCondition("${IFELSET1}"))); + ifElseList.add(new SingleIfElseBlock(ifElseShell2, new BooleanCondition("${IFELSET2}"))); + SingleConditionalBuilder scBuilder = new SingleConditionalBuilder(ifShell,new BooleanCondition("${IFT}"), new BuildStepRunner.Run(),ifElseList,true,elseShell); + + p.getBuildersList().add(scBuilder); + + FreeStyleBuild build = p.scheduleBuild2(0).get(); + String s = FileUtils.readFileToString(build.getLogFile()); + //Since the first if else block evaluates to true, it should be selected + Assert.assertTrue("If Else Block validation for singleConditionalBuilder failed.", + s.contains("Inside first If-Else Block")); + } } From 9cde5069d0a6963d02ce5945a73bd5ecf0aa1fd5 Mon Sep 17 00:00:00 2001 From: SanjayThomas <36643314+SanjayThomas@users.noreply.github.com> Date: Sat, 6 Oct 2018 03:24:47 -0400 Subject: [PATCH 2/2] Changes for Unit testing in Windows - Replaces unix with Batchfile in Windows --- .../ConfigFileBuildWrapperTest.java | 62 +++++++++++++++---- 1 file changed, 50 insertions(+), 12 deletions(-) diff --git a/src/test/java/org/jenkinsci/plugins/conditionalbuildstep/ConfigFileBuildWrapperTest.java b/src/test/java/org/jenkinsci/plugins/conditionalbuildstep/ConfigFileBuildWrapperTest.java index 504edd1..f77ded1 100644 --- a/src/test/java/org/jenkinsci/plugins/conditionalbuildstep/ConfigFileBuildWrapperTest.java +++ b/src/test/java/org/jenkinsci/plugins/conditionalbuildstep/ConfigFileBuildWrapperTest.java @@ -1,10 +1,13 @@ package org.jenkinsci.plugins.conditionalbuildstep; import hudson.EnvVars; +import hudson.Functions; import hudson.maven.MavenModuleSet; import hudson.model.FreeStyleBuild; import hudson.model.FreeStyleProject; import hudson.slaves.EnvironmentVariablesNodeProperty; +import hudson.tasks.BatchFile; +import hudson.tasks.CommandInterpreter; import hudson.tasks.Shell; import java.util.ArrayList; @@ -32,11 +35,16 @@ public void conditionalBuildersInMavenProjectMustBeResolvable() throws Exception p.setRunHeadless(true); ConditionalBuilder cBuilder = new ConditionalBuilder(new BooleanCondition("true"), new BuildStepRunner.Run()); - Shell shell = new Shell("ls"); + + CommandInterpreter shell; + if(!Functions.isWindows()) + shell = new Shell("ls"); + else + shell = new BatchFile("dir"); cBuilder.getConditionalbuilders().add(shell); p.getPrebuilders().add(cBuilder); - final List containedBuilders = ConditionalBuildStepHelper.getContainedBuilders(p, Shell.class); + final List containedBuilders = ConditionalBuildStepHelper.getContainedBuilders(p, CommandInterpreter.class); Assert.assertNotNull("no builders returned", containedBuilders); Assert.assertEquals("not correct nummber of builders returned", 1, containedBuilders.size()); } @@ -47,13 +55,22 @@ public void conditionalBuildersInFreestyleProjectMustBeResolvable() throws Excep final FreeStyleProject p = j.createFreeStyleProject(); ConditionalBuilder cBuilder = new ConditionalBuilder(new BooleanCondition("true"), new BuildStepRunner.Run()); - Shell shell = new Shell("ls"); - Shell shell2 = new Shell("ls"); + CommandInterpreter shell; + CommandInterpreter shell2; + + if(!Functions.isWindows()) { + shell = new Shell("ls"); + shell2 = new Shell("ls"); + } + else { + shell = new BatchFile("dir"); + shell2 = new BatchFile("dir"); + } cBuilder.getConditionalbuilders().add(shell); cBuilder.getConditionalbuilders().add(shell2); p.getBuildersList().add(cBuilder); - final List containedBuilders = ConditionalBuildStepHelper.getContainedBuilders(p, Shell.class); + final List containedBuilders = ConditionalBuildStepHelper.getContainedBuilders(p, CommandInterpreter.class); Assert.assertNotNull("no builders returned", containedBuilders); Assert.assertEquals("not correct nummber of builders returned", 2, containedBuilders.size()); } @@ -66,10 +83,18 @@ public void singleConditionalBuilderElseValidation() throws Exception { EnvVars envVars = prop.getEnvVars(); j.jenkins.getGlobalNodeProperties().add(prop); - final String elseBlockString = "Inside Else Block"; + final String elseBlockString = ""; envVars.put("TEST", "false"); - Shell ifShell = new Shell("echo \"Inside If Block\""); - Shell elseShell = new Shell("echo \""+elseBlockString+"\""); + CommandInterpreter ifShell; + CommandInterpreter elseShell; + if(!Functions.isWindows()) { + ifShell = new Shell("echo \"Inside If Block\""); + elseShell = new Shell("echo \""+elseBlockString+"\""); + } + else { + ifShell = new BatchFile("echo \"Inside If Block\""); + elseShell = new BatchFile("echo \""+elseBlockString+"\""); + } SingleConditionalBuilder scBuilder = new SingleConditionalBuilder(ifShell,new BooleanCondition("${TEST}"), new BuildStepRunner.Run(),null,true,elseShell); p.getBuildersList().add(scBuilder); @@ -92,10 +117,23 @@ public void singleConditionalBuilderIfElseValidation() throws Exception { envVars.put("IFELSET1", "true"); envVars.put("IFELSET2", "true"); - Shell ifShell = new Shell("echo \"Inside If Block\""); - Shell ifElseShell1 = new Shell("echo \"Inside first If-Else Block\""); - Shell ifElseShell2 = new Shell("echo \"Inside second If-Else Block\""); - Shell elseShell = new Shell("echo \"Inside Else Block\""); + CommandInterpreter ifShell; + CommandInterpreter ifElseShell1; + CommandInterpreter ifElseShell2; + CommandInterpreter elseShell; + if(!Functions.isWindows()) { + ifShell = new Shell("echo \"Inside If Block\""); + ifElseShell1 = new Shell("echo \"Inside first If-Else Block\""); + ifElseShell2 = new Shell("echo \"Inside second If-Else Block\""); + elseShell = new Shell("echo \"Inside Else Block\""); + } + else { + ifShell = new BatchFile("echo \"Inside If Block\""); + ifElseShell1 = new BatchFile("echo \"Inside first If-Else Block\""); + ifElseShell2 = new BatchFile("echo \"Inside second If-Else Block\""); + elseShell = new BatchFile("echo \"Inside Else Block\""); + } + List ifElseList = new ArrayList(); ifElseList.add(new SingleIfElseBlock(ifElseShell1, new BooleanCondition("${IFELSET1}"))); ifElseList.add(new SingleIfElseBlock(ifElseShell2, new BooleanCondition("${IFELSET2}")));