Merge pull request #12 from barclay-reg/master

[FIXED JENKINS-10914]
This commit is contained in:
jtnord 2013-10-31 08:12:16 -07:00
commit 531f00df3c
2 changed files with 335 additions and 1 deletions

View File

@ -2,6 +2,7 @@
* The MIT License
*
* Copyright (c) 2011, Dominik Bartholdi
* Copyright (c) 2013, Robert Kleinschmager
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
@ -23,6 +24,14 @@
*/
package org.jvnet.hudson.plugins.m2release;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.logging.Logger;
import com.google.common.base.Preconditions;
import com.google.common.collect.Lists;
import hudson.maven.MavenArgumentInterceptorAction;
import hudson.maven.MavenModuleSetBuild;
import hudson.util.ArgumentListBuilder;
@ -32,10 +41,15 @@
* build.
*
* @author Dominik Bartholdi
* @author Robert Kleinschmager
* @version 0.9.0
*/
public class M2ReleaseArgumentInterceptorAction implements MavenArgumentInterceptorAction {
private static final Logger LOGGER = Logger.getLogger(M2ReleaseArgumentInterceptorAction.class.getName());
private String goalsAndOptions;
@Deprecated
private transient boolean isDryRun; // keep backward compatible
@ -61,7 +75,121 @@ public String getGoalsAndOptions(MavenModuleSetBuild build) {
}
public ArgumentListBuilder intercept(ArgumentListBuilder mavenargs, MavenModuleSetBuild build) {
return null;
// calling internal Method, which now (without MavenModuleSetBuil) can be tested easily
return internalIntercept(mavenargs, build.getProject().isIncrementalBuild());
}
ArgumentListBuilder internalIntercept(ArgumentListBuilder mavenArgumentListBuilder, boolean isIncrementalBuild) {
ArgumentListBuilder returnListBuilder = new ArgumentListBuilder();
List<String> argumentList = mavenArgumentListBuilder.toList();
if (isIncrementalBuild && containsJenkinsIncrementalBuildArguments(argumentList))
{
LOGGER.config("This Maven build seems to be configured as 'Incremental build'. This will be disables, as always the full project will be released");
returnListBuilder = removeAllIncrementalBuildArguments(mavenArgumentListBuilder.clone());
} else
{
returnListBuilder = mavenArgumentListBuilder.clone();
}
return returnListBuilder;
}
/**
* tries to assume, if jenkins itself added some parameters to the argument list, which cause a maven multi module project to be build incremental
* @param mavenargs
* @param build
* @return
*
* @see
*/
private boolean containsJenkinsIncrementalBuildArguments(List<String> mavenargs) {
int amdIndex = mavenargs.indexOf("-amd");
int plIndex = mavenargs.indexOf("-pl");
boolean amdArgumentExists = amdIndex != -1;
boolean plArgumentExists = plIndex != -1;
if (amdArgumentExists && plArgumentExists)
{
boolean amdAndPlArgumentAreInSupposedOrder = amdIndex == plIndex-1;
// assuming, that the argument behind -pl is the list of projects, as added in {@link MavenModuleSetBuild}
return amdAndPlArgumentAreInSupposedOrder && thereIsAnArgumentBehinPlArgument(mavenargs, plIndex);
} else {
return false;
}
}
private boolean thereIsAnArgumentBehinPlArgument(List<String> mavenargs, int plIndex) {
if (mavenargs.size() >= plIndex+1)
{
return mavenargs.get(plIndex+1) != null;
}
return false;
}
private ArgumentListBuilder removeAllIncrementalBuildArguments(
ArgumentListBuilder mavenargs) {
// remove the three elements which was added by MavenModuleSetBuild
// -amd
// -pl
// <list of modules>
LOGGER.finer("Start removing the arguments '-amd -pl <list of modules>' from argument list");
ArgumentListBuilder returnListBuilder = new ArgumentListBuilder();
int amdIndex = mavenargs.toList().indexOf("-amd");
ensureArgumentsAndMaskHaveSaveSize(mavenargs);
boolean[] maskArray = mavenargs.toMaskArray();
ArrayList<Boolean> maskList = Lists.newArrayList();
for (boolean b : maskArray) {
maskList.add(Boolean.valueOf(b));
}
List<String> oldArgumentList = mavenargs.toList();
// as List.remove is shifting all elements, we can reuse the index
String removedAmd = oldArgumentList.remove(amdIndex);
Preconditions.checkArgument("-amd".equals(removedAmd));
maskList.remove(amdIndex);
String removedPl = oldArgumentList.remove(amdIndex);
Preconditions.checkArgument("-pl".equals(removedPl));
maskList.remove(amdIndex);
String removedModuleList = oldArgumentList.remove(amdIndex);
maskList.remove(amdIndex);
LOGGER.finer(String.format("Removed the arguments '-amd -pl %s' from argument list", removedModuleList));
// rebuild
for (int i=0; i < oldArgumentList.size() ; i++) {
returnListBuilder.add(oldArgumentList.get(i), maskList.get(i).booleanValue());
}
ensureArgumentsAndMaskHaveSaveSize(returnListBuilder);
LOGGER.fine(String.format("Rebuild maven argument list, old size=%s; new size=%s", oldArgumentList.size(), returnListBuilder.toList().size()));
return returnListBuilder;
}
private void ensureArgumentsAndMaskHaveSaveSize(ArgumentListBuilder alb) {
if (alb.toList().size() != alb.toMaskArray().length)
{
throw new RuntimeException("could not intercept argument list: ArgumentList and Mask are out of sync ");
}
}
}

View File

@ -0,0 +1,206 @@
/*
* The MIT License
*
* Copyright (c) 2013, Robert Kleinschmager
*
* 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.
*/
package org.jvnet.hudson.plugins.m2release;
import static org.junit.Assert.*;
import static org.mockito.BDDMockito.*;
import hudson.maven.MavenModuleSet;
import hudson.maven.MavenModuleSetBuild;
import hudson.util.ArgumentListBuilder;
import org.junit.Before;
import org.junit.Test;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
/**
* @author Robert Kleinschmager
*
*/
public class M2ReleaseArgumentInterceptorActionTest {
private M2ReleaseArgumentInterceptorAction sut;
private ArgumentListBuilder listBuilder;
@Before
public void setUp()
{
sut = new M2ReleaseArgumentInterceptorAction("");
listBuilder = new ArgumentListBuilder();
}
/**
* Test method for {@link org.jvnet.hudson.plugins.m2release.M2ReleaseArgumentInterceptorAction#intercept(hudson.util.ArgumentListBuilder, hudson.maven.MavenModuleSetBuild)}.
*/
@Test
public void interceptorShouldNotTouchArgumentList() {
//GIVEN
listBuilder.add("argument1");
listBuilder.add("argument2");
listBuilder.add("argument3", true);
listBuilder.add("argument4", false);
//WHEN
ArgumentListBuilder resultingListBuilder = sut.internalIntercept(listBuilder, true);
//THEN
assertEquals("argument1", resultingListBuilder.toList().get(0));
assertEquals(false, resultingListBuilder.toMaskArray()[0]);
assertEquals("argument2", resultingListBuilder.toList().get(1));
assertEquals(false, resultingListBuilder.toMaskArray()[1]);
assertEquals("argument3", resultingListBuilder.toList().get(2));
assertEquals(true, resultingListBuilder.toMaskArray()[2]);
assertEquals("argument4", resultingListBuilder.toList().get(3));
assertEquals(false, resultingListBuilder.toMaskArray()[3]);
}
/**
* Test method for {@link org.jvnet.hudson.plugins.m2release.M2ReleaseArgumentInterceptorAction#intercept(hudson.util.ArgumentListBuilder, hudson.maven.MavenModuleSetBuild)}.
*/
@Test
public void interceptorShouldFilterElements() {
//GIVEN
listBuilder.add("argument1");
listBuilder.add("argument2");
// incremental build arguments, which should be filtered out
listBuilder.add("-amd");
listBuilder.add("-pl");
listBuilder.add("foo,bar");
listBuilder.add("argument3", true);
listBuilder.add("argument4", false);
//WHEN
ArgumentListBuilder resultingListBuilder = sut.internalIntercept(listBuilder, true);
//THEN
assertEquals("argument1", resultingListBuilder.toList().get(0));
assertEquals(false, resultingListBuilder.toMaskArray()[0]);
assertEquals("argument2", resultingListBuilder.toList().get(1));
assertEquals(false, resultingListBuilder.toMaskArray()[1]);
assertEquals("argument3", resultingListBuilder.toList().get(2));
assertEquals(true, resultingListBuilder.toMaskArray()[2]);
assertEquals("argument4", resultingListBuilder.toList().get(3));
assertEquals(false, resultingListBuilder.toMaskArray()[3]);
}
/**
* Test method for {@link org.jvnet.hudson.plugins.m2release.M2ReleaseArgumentInterceptorAction#intercept(hudson.util.ArgumentListBuilder, hudson.maven.MavenModuleSetBuild)}.
*/
@Test
public void interceptorSkipIfOrderIsNotCorrect() {
//GIVEN
listBuilder.add("argument1");
listBuilder.add("argument2");
// wrong order of the incrementalBuild arguments, means, that they are not added by jenkins incremental feature
listBuilder.add("-amd");
listBuilder.add("foo,bar");
listBuilder.add("-pl");
listBuilder.add("argument3", true);
listBuilder.add("argument4", false);
//WHEN
ArgumentListBuilder resultingListBuilder = sut.internalIntercept(listBuilder, true);
//THEN
assertEquals("argument1", resultingListBuilder.toList().get(0));
assertEquals(false, resultingListBuilder.toMaskArray()[0]);
assertEquals("argument2", resultingListBuilder.toList().get(1));
assertEquals(false, resultingListBuilder.toMaskArray()[1]);
assertEquals("-amd", resultingListBuilder.toList().get(2));
assertEquals(false, resultingListBuilder.toMaskArray()[2]);
assertEquals("foo,bar", resultingListBuilder.toList().get(3));
assertEquals(false, resultingListBuilder.toMaskArray()[3]);
assertEquals("-pl", resultingListBuilder.toList().get(4));
assertEquals(false, resultingListBuilder.toMaskArray()[4]);
assertEquals("argument3", resultingListBuilder.toList().get(5));
assertEquals(true, resultingListBuilder.toMaskArray()[5]);
assertEquals("argument4", resultingListBuilder.toList().get(6));
assertEquals(false, resultingListBuilder.toMaskArray()[6]);
}
/**
* Test method for {@link org.jvnet.hudson.plugins.m2release.M2ReleaseArgumentInterceptorAction#intercept(hudson.util.ArgumentListBuilder, hudson.maven.MavenModuleSetBuild)}.
*/
@Test
public void interceptorShouldSkipIfNoIncrementalBuild() {
//GIVEN
listBuilder.add("argument1");
listBuilder.add("argument2");
// incremental build arguments, which should be filtered out
listBuilder.add("-amd");
listBuilder.add("-pl");
listBuilder.add("foo,bar");
listBuilder.add("argument3", true);
listBuilder.add("argument4", false);
//WHEN
ArgumentListBuilder resultingListBuilder = sut.internalIntercept(listBuilder, false);
//THEN
assertEquals("argument1", resultingListBuilder.toList().get(0));
assertEquals(false, resultingListBuilder.toMaskArray()[0]);
assertEquals("argument2", resultingListBuilder.toList().get(1));
assertEquals(false, resultingListBuilder.toMaskArray()[1]);
assertEquals("-amd", resultingListBuilder.toList().get(2));
assertEquals(false, resultingListBuilder.toMaskArray()[2]);
assertEquals("-pl", resultingListBuilder.toList().get(3));
assertEquals(false, resultingListBuilder.toMaskArray()[3]);
assertEquals("foo,bar", resultingListBuilder.toList().get(4));
assertEquals(false, resultingListBuilder.toMaskArray()[4]);
assertEquals("argument3", resultingListBuilder.toList().get(5));
assertEquals(true, resultingListBuilder.toMaskArray()[5]);
assertEquals("argument4", resultingListBuilder.toList().get(6));
assertEquals(false, resultingListBuilder.toMaskArray()[6]);
}
}