diff --git a/src/main/java/hudson/plugins/parameterizedtrigger/BlockableBuildTriggerConfig.java b/src/main/java/hudson/plugins/parameterizedtrigger/BlockableBuildTriggerConfig.java
index d955f4c..304337d 100644
--- a/src/main/java/hudson/plugins/parameterizedtrigger/BlockableBuildTriggerConfig.java
+++ b/src/main/java/hudson/plugins/parameterizedtrigger/BlockableBuildTriggerConfig.java
@@ -12,6 +12,11 @@ import hudson.model.Node;
import hudson.model.Run;
import org.kohsuke.stapler.DataBoundConstructor;
+import hudson.scm.SCM;
+import hudson.scm.PollingResult;
+import hudson.util.LogTaskListener;
+import static hudson.scm.PollingResult.*;
+
import com.google.common.collect.ArrayListMultimap;
import com.google.common.collect.ListMultimap;
@@ -27,22 +32,56 @@ import java.util.concurrent.Future;
*/
public class BlockableBuildTriggerConfig extends BuildTriggerConfig {
private final BlockingBehaviour block;
+ private final boolean buildScm;
+
public boolean buildAllNodesWithLabel;
- public BlockableBuildTriggerConfig(String projects, BlockingBehaviour block, List<AbstractBuildParameters> configs) {
+ public BlockableBuildTriggerConfig(String projects, BlockingBehaviour block, boolean buildScm, List<AbstractBuildParameters> configs) {
super(projects, ResultCondition.ALWAYS, false, configs);
this.block = block;
+ this.buildScm = buildScm;
}
@DataBoundConstructor
- public BlockableBuildTriggerConfig(String projects, BlockingBehaviour block, List<AbstractBuildParameterFactory> configFactories,List<AbstractBuildParameters> configs) {
+ public BlockableBuildTriggerConfig(String projects, BlockingBehaviour block, boolean buildScm, List<AbstractBuildParameterFactory> configFactories,List<AbstractBuildParameters> configs) {
super(projects, ResultCondition.ALWAYS, false, configFactories, configs);
this.block = block;
+ this.buildScm = buildScm;
}
public BlockingBehaviour getBlock() {
return block;
}
+
+ public boolean getBuildScm() {
+ return buildScm;
+ }
+
+ @Override
+ public boolean needRebuild(AbstractProject project)
+ {
+ if (getBuildScm() == false)
+ return true;
+
+ SCM scm = project.getScm();
+
+ if (scm != null)
+ {
+ + PollingResult res = project.poll(LogTaskListener.NULL);
+
+ if (res == NO_CHANGES)
+ {
+ + Run success = project.getLastSuccessfulBuild();
+
+ if (success != null)
+ return false;
+ }
+ }
+
+ return true;
+ }
@Override
public List<Future<AbstractBuild>> perform(AbstractBuild<?, ?> build, Launcher launcher, BuildListener listener) throws InterruptedException, IOException {
diff --git a/src/main/java/hudson/plugins/parameterizedtrigger/BuildTriggerConfig.java b/src/main/java/hudson/plugins/parameterizedtrigger/BuildTriggerConfig.java
index d5144a7..c6f52be 100644
--- a/src/main/java/hudson/plugins/parameterizedtrigger/BuildTriggerConfig.java
+++ b/src/main/java/hudson/plugins/parameterizedtrigger/BuildTriggerConfig.java
@@ -31,6 +31,8 @@ import hudson.plugins.parameterizedtrigger.AbstractBuildParameters.DontTriggerEx
import hudson.tasks.Messages;
import hudson.util.FormValidation;
+import hudson.console.HyperlinkNote;
+
import jenkins.model.Jenkins;
import org.apache.commons.lang.StringUtils;
import org.kohsuke.stapler.AncestorInPath;
@@ -201,6 +203,11 @@ public class BuildTriggerConfig implements Describable<BuildTriggerConfig> {
}
return actions;
}
+
+ public boolean needRebuild(AbstractProject project)
+ {
+ return true;
+ }
/**
* Note that with Hudson 1.341, trigger should be using
@@ -222,7 +229,10 @@ public class BuildTriggerConfig implements Describable<BuildTriggerConfig> {
for (AbstractProject project : getProjectList(build.getProject().getParent(),env)) {
List<Action> list = getBuildActions(actions, project);
- futures.add(schedule(build, project, list));
+ if (needRebuild(project))
+ futures.add(schedule(build, project, list));
+ else
+ listener.getLogger().println("Skipping " + HyperlinkNote.encodeTo('/'+ project.getUrl(), project.getFullDisplayName()) + ". Don't need to rebuild.");
}
}
@@ -247,7 +257,10 @@ public class BuildTriggerConfig implements Describable<BuildTriggerConfig> {
for (AbstractProject project : getProjectList(build.getProject().getParent(),env)) {
List<Action> list = getBuildActions(actions, project);
- futures.put(project, schedule(build, project, list));
+ if (needRebuild(project))
+ futures.put(project, schedule(build, project, list));
+ else
+ listener.getLogger().println("Skipping " + HyperlinkNote.encodeTo('/'+ project.getUrl(), project.getFullDisplayName()) + ". Don't need to rebuild.");
}
}
return futures;
diff --git a/src/main/java/hudson/plugins/parameterizedtrigger/TriggerBuilder.java b/src/main/java/hudson/plugins/parameterizedtrigger/TriggerBuilder.java
index b5b4262..fb6b100 100644
--- a/src/main/java/hudson/plugins/parameterizedtrigger/TriggerBuilder.java
+++ b/src/main/java/hudson/plugins/parameterizedtrigger/TriggerBuilder.java
@@ -99,7 +99,7 @@ public class TriggerBuilder extends Builder implements DependecyDeclarer {
if(!projectList.isEmpty()){
if(futures.isEmpty()){
- listener.getLogger().println("Triggering projects: " + getProjectListAsString(projectList));
+ listener.getLogger().println("Triggering or skipped projects: " + getProjectListAsString(projectList));
continue;
}
diff --git a/src/main/resources/hudson/plugins/parameterizedtrigger/BlockableBuildTriggerConfig/config.jelly b/src/main/resources/hudson/plugins/parameterizedtrigger/BlockableBuildTriggerConfig/config.jelly
index 1c49bbd..a279ef5 100644
--- a/src/main/resources/hudson/plugins/parameterizedtrigger/BlockableBuildTriggerConfig/config.jelly
+++ b/src/main/resources/hudson/plugins/parameterizedtrigger/BlockableBuildTriggerConfig/config.jelly
@@ -22,9 +22,15 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
-->
<j:jelly xmlns:j="jelly:core" xmlns:st="jelly:stapler" xmlns:d="jelly:define" xmlns:l="/lib/layout" xmlns:t="/lib/hudson" xmlns:f="/lib/form">
+
<f:entry title="${%Projects to build}" field="projects">
<f:textbox />
</f:entry>
+
+ <f:block>
+ <f:checkbox title="${%Build triggered projects only if there is SCM changes}" field="buildScm" checked="${instance.buildScm==true}" />
+ </f:block>
+
<!-- TODO: replace with <f:optionalProperty> -->
<f:optionalBlock field="block" title="${%Block until the triggered projects finish their builds}" checked="${instance.block!=null}">
<j:set var="descriptor" value="${app.getDescriptorOrDie(descriptor.getPropertyType(field).clazz)}" />
I'd like to see this feature also. There is short description of my use case here. Basically I'd like to be able to use the 'trigger build only if downstream job has SCM changes' functionality from the Downstream Ext plugin to be available when triggering downstream jobs with parameters.
If possible I'd like to raise the priority of this request (rather than creating a duplicate with the higher priority) as it's quite important for our use case.
Ta
Andy