diff --git a/pom.xml b/pom.xml index 972d8c89..abb1a71b 100644 --- a/pom.xml +++ b/pom.xml @@ -56,10 +56,22 @@ 3.1.0 provided + + org.jenkins-ci.plugins + conditional-buildstep + 1.3.1 + true + + + org.jenkins-ci.tools + maven-hpi-plugin + 1.97 + true + org.jvnet @@ -81,6 +93,34 @@ + + + + org.eclipse.m2e + lifecycle-mapping + 1.0.0 + + + + + + org.jvnet + animal-sniffer + [1.2,) + + check + + + + + + + + + + + + diff --git a/src/main/java/hudson/plugins/parameterizedtrigger/Plugin.java b/src/main/java/hudson/plugins/parameterizedtrigger/Plugin.java index 163bc575..cbc55271 100644 --- a/src/main/java/hudson/plugins/parameterizedtrigger/Plugin.java +++ b/src/main/java/hudson/plugins/parameterizedtrigger/Plugin.java @@ -1,16 +1,21 @@ package hudson.plugins.parameterizedtrigger; import hudson.Extension; -import hudson.model.Hudson; import hudson.model.Item; +import hudson.model.Hudson; import hudson.model.Project; import hudson.model.listeners.ItemListener; import hudson.util.EnumConverter; + import java.io.IOException; +import java.util.List; import java.util.ListIterator; import java.util.logging.Level; import java.util.logging.Logger; +import jenkins.model.Jenkins; + +import org.jenkinsci.plugins.conditionalbuildstep.ConditionalBuildStepHelper; import org.kohsuke.stapler.Stapler; public class Plugin extends hudson.Plugin { @@ -44,6 +49,12 @@ public void onRenamed(Item item, String oldName, String newName) { changed |= co.onJobRenamed(oldName, newName); } } + + //iterate the BuildTriggers within conditional buildsteps + if(isConditionalBuildStepInstalled()) { + changed |= renameInConditionalBuildStep(p, oldName, newName); + } + //if something changed, save the project if (changed){ try { @@ -88,6 +99,12 @@ public void onDeleted(Item item) { } } } + + //iterate the BuildTriggers within conditional buildsteps + if(isConditionalBuildStepInstalled()) { + changed |= deleteInConditionalBuildStep(p, oldName); + } + //if something changed, save the project if (changed){ try { @@ -105,5 +122,52 @@ public void onDeleted(Item item) { } } } + + /** + * renames the project references within all {@link TriggerBuilder}s which are wrapped by a conditional buildsteps + * @param p the project the check + * @param oldName the old project name + * @param newName the new project name + * @return whether a change has been made + */ + private boolean renameInConditionalBuildStep(Project p, String oldName, String newName) { + boolean changed = false; + final List containedBuilders = ConditionalBuildStepHelper.getContainedBuilders(p, TriggerBuilder.class); + for (TriggerBuilder triggerBuilder : containedBuilders) { + for (BuildTriggerConfig co : triggerBuilder.getConfigs()){ + changed |= co.onJobRenamed(oldName, newName); + } + } + return changed; + } + + /** + * removes the project references within all {@link TriggerBuilder}s which are wrapped by a conditional buildsteps + * @param p the project the check + * @param oldName the old project name + * @return whether a change has been made + */ + private boolean deleteInConditionalBuildStep(Project p, String oldName) { + boolean changed = false; + final List containedBuilders = ConditionalBuildStepHelper.getContainedBuilders(p, TriggerBuilder.class); + for (TriggerBuilder triggerBuilder : containedBuilders) { + for (ListIterator bbtc = triggerBuilder.getConfigs().listIterator(); bbtc.hasNext();) { + BuildTriggerConfig c = bbtc.next(); + if (c.onDeleted(oldName)) { + changed = true; + if (c.getProjects().length() == 0){ + bbtc.remove(); + } + } + } + } + return changed; + } + + } + + public static boolean isConditionalBuildStepInstalled(){ + final hudson.Plugin plugin = Jenkins.getInstance().getPlugin("conditional-buildstep"); + return plugin != null ? plugin.getWrapper().isActive() : false; } } diff --git a/src/test/java/hudson/plugins/parameterizedtrigger/test/RenameJobTest.java b/src/test/java/hudson/plugins/parameterizedtrigger/test/RenameJobTest.java index c8156a9d..6334339d 100644 --- a/src/test/java/hudson/plugins/parameterizedtrigger/test/RenameJobTest.java +++ b/src/test/java/hudson/plugins/parameterizedtrigger/test/RenameJobTest.java @@ -31,12 +31,16 @@ import hudson.plugins.parameterizedtrigger.CurrentBuildParameters; import hudson.plugins.parameterizedtrigger.ResultCondition; import hudson.plugins.parameterizedtrigger.TriggerBuilder; -import hudson.tasks.Builder; +import hudson.tasks.BuildStep; import java.io.IOException; import java.util.ArrayList; import java.util.List; +import org.jenkins_ci.plugins.run_condition.BuildStepRunner; +import org.jenkins_ci.plugins.run_condition.core.AlwaysRun; +import org.jenkinsci.plugins.conditionalbuildstep.ConditionalBuilder; +import org.jenkinsci.plugins.conditionalbuildstep.singlestep.SingleConditionalBuilder; import org.jvnet.hudson.test.HudsonTestCase; public class RenameJobTest extends HudsonTestCase { @@ -74,6 +78,18 @@ public void testRenameAndDeleteJobMultipleProjects() throws Exception { //confirm projectA's build step trigger is updated automatically assertEquals("build step trigger project should be renamed", "projectB-renamed,projectC", projectA.getBuildersList().get(TriggerBuilder.class).getConfigs().get(0).getProjects()); + + final List all = projectA.getBuildersList().getAll(ConditionalBuilder.class); + final TriggerBuilder wrappedBuilder0 = (TriggerBuilder)all.get(0).getConditionalbuilders().get(0); + assertEquals("build step trigger project within first conditionalbuildstep should be renamed", "projectB-renamed,projectC", wrappedBuilder0.getConfigs().get(0).getProjects()); + final TriggerBuilder wrappedBuilder1 = (TriggerBuilder)all.get(1).getConditionalbuilders().get(0); + assertEquals("build step trigger project within second conditionalbuildstep should be renamed", "projectB-renamed,projectC", wrappedBuilder1.getConfigs().get(0).getProjects()); + + final List allSingleConditions = projectA.getBuildersList().getAll(SingleConditionalBuilder.class); + final TriggerBuilder singleCondTrigger0 = (TriggerBuilder)allSingleConditions.get(0).getBuildStep(); + assertEquals("build step trigger project within first singleconditionalbuildstep should be renamed", "projectB-renamed,projectC", singleCondTrigger0.getConfigs().get(0).getProjects()); + final TriggerBuilder singleCondTrigger1 = (TriggerBuilder)allSingleConditions.get(1).getBuildStep(); + assertEquals("build step trigger project within second singleconditionalbuildstep should be renamed", "projectB-renamed,projectC", singleCondTrigger1.getConfigs().get(0).getProjects()); //confirm projectA's post build trigger is updated automatically assertEquals("post build trigger project should be renamed", "projectB-renamed,projectC", projectA.getPublishersList().get(BuildTrigger.class).getConfigs().get(0).getProjects()); @@ -85,6 +101,21 @@ public void testRenameAndDeleteJobMultipleProjects() throws Exception { //confirm projectA's post build trigger is updated automatically: assertEquals("post build trigger project should be removed", "projectC", projectA.getPublishersList().get(BuildTrigger.class).getConfigs().get(0).getProjects()); + + //confirm deletes are reflected within conditional buildsteps too + final List allAfterDelete = projectA.getBuildersList().getAll(ConditionalBuilder.class); + final TriggerBuilder wrappedBuilderAfterDel0 = (TriggerBuilder)allAfterDelete.get(0).getConditionalbuilders().get(0); + assertEquals("build step trigger project within first conditionalbuildstep should be removed", "projectC", wrappedBuilderAfterDel0.getConfigs().get(0).getProjects()); + final TriggerBuilder wrappedBuilderAfterDel1 = (TriggerBuilder)allAfterDelete.get(1).getConditionalbuilders().get(0); + assertEquals("build step trigger project within second conditionalbuildstep should be removed", "projectC", wrappedBuilderAfterDel1.getConfigs().get(0).getProjects()); + + + final List allSingleAfterDelete = projectA.getBuildersList().getAll(SingleConditionalBuilder.class); + final TriggerBuilder singleCondTriggerAfterDel0 = (TriggerBuilder)allSingleAfterDelete.get(0).getBuildStep(); + assertEquals("build step trigger project within first singleconditionalbuildstep should be removed", "projectC", singleCondTriggerAfterDel0.getConfigs().get(0).getProjects()); + final TriggerBuilder singleCondTriggerAfterDel1 = (TriggerBuilder)allSingleAfterDelete.get(1).getBuildStep(); + assertEquals("build step trigger project within second singleconditionalbuildstep should be removed", "projectC", singleCondTriggerAfterDel1.getConfigs().get(0).getProjects()); + } private Project createParentProject(String parentJobName, String... childJobNames) throws IOException { @@ -102,6 +133,16 @@ public void testRenameAndDeleteJobMultipleProjects() throws Exception { //setup build step trigger project.getBuildersList().add(new TriggerBuilder(new BlockableBuildTriggerConfig(childJobNamesString.toString(), null, buildParameters))); + + TriggerBuilder tb = new TriggerBuilder(new BlockableBuildTriggerConfig(childJobNamesString.toString(), null, buildParameters)); + List blist = new ArrayList(); + blist.add(tb); + project.getBuildersList().add(new ConditionalBuilder(new AlwaysRun(), new BuildStepRunner.Run(), blist)); + project.getBuildersList().add(new ConditionalBuilder(new AlwaysRun(), new BuildStepRunner.Run(), blist)); + + TriggerBuilder tb2 = new TriggerBuilder(new BlockableBuildTriggerConfig(childJobNamesString.toString(), null, buildParameters)); + project.getBuildersList().add(new SingleConditionalBuilder(tb2, new AlwaysRun(), new BuildStepRunner.Run())); + project.getBuildersList().add(new SingleConditionalBuilder(tb2, new AlwaysRun(), new BuildStepRunner.Run())); //setup post build trigger project.getPublishersList().add(new BuildTrigger(new BuildTriggerConfig(childJobNamesString.toString(), ResultCondition.SUCCESS, new CurrentBuildParameters())));