Skip to content

Commit

Permalink
[FIXED JENKINS-18967] update/delete project references in conditional…
Browse files Browse the repository at this point in the history
… buildsteps
  • Loading branch information
imod committed Aug 18, 2013
1 parent 931a3a2 commit 0685878
Show file tree
Hide file tree
Showing 3 changed files with 147 additions and 2 deletions.
40 changes: 40 additions & 0 deletions pom.xml
Expand Up @@ -56,10 +56,22 @@
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.jenkins-ci.plugins</groupId>
<artifactId>conditional-buildstep</artifactId>
<version>1.3.1</version>
<optional>true</optional>
</dependency>
</dependencies>

<build>
<plugins>
<plugin>
<groupId>org.jenkins-ci.tools</groupId>
<artifactId>maven-hpi-plugin</artifactId>
<version>1.97</version>
<extensions>true</extensions>
</plugin>
<plugin>
<!-- make sure our code doesn't have 1.6 dependencies except where we know it -->
<groupId>org.jvnet</groupId>
Expand All @@ -81,6 +93,34 @@
</executions>
</plugin>
</plugins>
<pluginManagement>
<plugins>
<plugin>
<groupId>org.eclipse.m2e</groupId>
<artifactId>lifecycle-mapping</artifactId>
<version>1.0.0</version>
<configuration>
<lifecycleMappingMetadata>
<pluginExecutions>
<pluginExecution>
<pluginExecutionFilter>
<groupId>org.jvnet</groupId>
<artifactId>animal-sniffer</artifactId>
<versionRange>[1.2,)</versionRange>
<goals>
<goal>check</goal>
</goals>
</pluginExecutionFilter>
<action>
<ignore />
</action>
</pluginExecution>
</pluginExecutions>
</lifecycleMappingMetadata>
</configuration>
</plugin>
</plugins>
</pluginManagement>
</build>

<scm>
Expand Down
66 changes: 65 additions & 1 deletion 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 {
Expand Down Expand Up @@ -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 {
Expand Down Expand Up @@ -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 {
Expand All @@ -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<TriggerBuilder> 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<TriggerBuilder> containedBuilders = ConditionalBuildStepHelper.getContainedBuilders(p, TriggerBuilder.class);
for (TriggerBuilder triggerBuilder : containedBuilders) {
for (ListIterator<BlockableBuildTriggerConfig> 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;
}
}
Expand Up @@ -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 {
Expand Down Expand Up @@ -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<ConditionalBuilder> 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<SingleConditionalBuilder> 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());
Expand All @@ -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<ConditionalBuilder> 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<SingleConditionalBuilder> 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 {
Expand All @@ -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<BuildStep> blist = new ArrayList<BuildStep>();
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())));
Expand Down

0 comments on commit 0685878

Please sign in to comment.