[ https://issues.jenkins-ci.org/browse/JENKINS-10147?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=162956#comment-162956 ]
Julien-Pierre Avérous commented on JENKINS-10147: ------------------------------------------------- Here a git diff with a little bit cleaner implementation, with a check box in the UI to activate / deactivate this functionality. {code} 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) + { + // Check that we don't have change in SCM + PollingResult res = project.poll(LogTaskListener.NULL); + + if (res == NO_CHANGES) + { + // Check that we have a sucessfull build + 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()){ //handle non-blocking configs if(futures.isEmpty()){ - listener.getLogger().println("Triggering projects: " + getProjectListAsString(projectList)); + listener.getLogger().println("Triggering or skipped projects: " + getProjectListAsString(projectList)); continue; } //handle blocking configs 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)}" /> {code} > Add 'poll SCM' option to build step > ----------------------------------- > > Key: JENKINS-10147 > URL: https://issues.jenkins-ci.org/browse/JENKINS-10147 > Project: Jenkins > Issue Type: New Feature > Components: parameterized-trigger > Reporter: G. Ann Campbell > Assignee: huybrechts > Priority: Minor > > It would be nice, in at least the 'build step' part of the > parameterized-trigger plugin, to have the option to build conditionally based > on SCM polling. -- This message is automatically generated by JIRA. If you think it was sent incorrectly, please contact your JIRA administrators: https://issues.jenkins-ci.org/secure/ContactAdministrators!default.jspa For more information on JIRA, see: http://www.atlassian.com/software/jira