Skip to content

Commit

Permalink
Merge branch 'JENKINS-14545' of git://github.com/cjo9900/parameterize…
Browse files Browse the repository at this point in the history
…d-trigger-plugin into 2.17-RC
  • Loading branch information
cjo9900 committed Jan 29, 2013
2 parents 86e2969 + ac43521 commit fae74af
Show file tree
Hide file tree
Showing 3 changed files with 179 additions and 33 deletions.
@@ -1,7 +1,7 @@
/*
* The MIT License
*
* Copyright (c) 2011, Jørgen P. Tjernø <jorgenpt@gmail.com>
* Copyright (c) 2011-2, Jørgen P. Tjernø <jorgenpt@gmail.com> Chris Johnson
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
Expand All @@ -25,14 +25,18 @@
package hudson.plugins.parameterizedtrigger;

import java.util.Map;
import java.util.Arrays;

import hudson.EnvVars;
import hudson.Util;
import hudson.model.EnvironmentContributingAction;
import hudson.model.AbstractBuild;

public class BuildInfoExporterAction implements EnvironmentContributingAction {
public static final String JOB_NAME_VARIABLE = "LAST_TRIGGERED_JOB_NAME";
public static final String ALL_JOBS_NAME_VARIABLE = "TRIGGERED_JOB_NAMES";
public static final String BUILD_NUMBER_VARIABLE_PREFIX = "TRIGGERED_BUILD_NUMBER_";
public static final String ALL_BUILD_NUMBER_VARIABLE_PREFIX = "TRIGGERED_BUILD_NUMBERS_";

private String buildName;
private int buildNumber;
Expand All @@ -57,7 +61,27 @@ public String getUrlName() {


public void buildEnvVars(AbstractBuild<?, ?> build, EnvVars env) {
env.put(JOB_NAME_VARIABLE, buildName);
env.put(BUILD_NUMBER_VARIABLE_PREFIX + buildName, Integer.toString(buildNumber));
String sanatizedBuildName = buildName.replaceAll("[^a-zA-Z0-9]+", "_");
// Note: this will only indicate the last project in the list that is ran
env.put(JOB_NAME_VARIABLE, sanatizedBuildName);
// All Triggered job names
String originalvalue = env.get(ALL_JOBS_NAME_VARIABLE);
if(originalvalue == null) {
env.put(ALL_JOBS_NAME_VARIABLE, sanatizedBuildName);
} else {
String[] items = Util.tokenize(originalvalue, ",");
if(! Arrays.asList(items).contains(sanatizedBuildName))
env.put(ALL_JOBS_NAME_VARIABLE, originalvalue+","+sanatizedBuildName);
}
env.put(BUILD_NUMBER_VARIABLE_PREFIX + sanatizedBuildName, Integer.toString(buildNumber));

// handle case where multiple builds are triggered
String buildVariable = ALL_BUILD_NUMBER_VARIABLE_PREFIX + sanatizedBuildName;
originalvalue = env.get(buildVariable);
if(originalvalue == null) {
env.put(buildVariable, Integer.toString(buildNumber));
} else {
env.put(buildVariable, originalvalue+","+Integer.toString(buildNumber));
}
}
}
Expand Up @@ -41,4 +41,16 @@
case, the build will be considered as unstable based on the result of the
triggered builds and the value of this option.</li>
</ul>
With this option enabled the builds for the projects triggered are available as
Env variables for future build steps<br/>
<ul>
<li><b>LAST_TRIGGERED_JOB_NAME</b>="Last project started"</li>
<li><b>TRIGGERED_JOB_NAMES</b>="Comma separated list of all triggered projects"</li>
<li><b>TRIGGERED_BUILD_NUMBER_&lt;project name&gt;</b>="Last build number
triggered"</li>
<li><b>TRIGGERED_BUILD_NUMBERS_&lt;project name&gt;</b>="Comma separated
list of build numbers triggered"</li>
</ul>
All Project names have characters not a-zA-Z or 0-9 replaced by
_(multiple characters are condensed into a single _).
</div>
Expand Up @@ -23,16 +23,22 @@
*/
package hudson.plugins.parameterizedtrigger.test;

import com.google.common.collect.ImmutableList;

import hudson.EnvVars;
import hudson.model.AbstractBuild;
import hudson.model.Cause.UserCause;
import hudson.model.Project;
import hudson.model.Result;
import hudson.plugins.parameterizedtrigger.AbstractBuildParameterFactory;
import hudson.plugins.parameterizedtrigger.AbstractBuildParameters;
import hudson.plugins.parameterizedtrigger.BlockableBuildTriggerConfig;
import hudson.plugins.parameterizedtrigger.BlockingBehaviour;
import hudson.plugins.parameterizedtrigger.CounterBuildParameterFactory;
import hudson.plugins.parameterizedtrigger.CurrentBuildParameters;
import hudson.plugins.parameterizedtrigger.TriggerBuilder;

import java.util.Collections;
import java.util.Map;
import java.util.ArrayList;
import java.util.List;
Expand All @@ -46,42 +52,146 @@

public class BuildInfoExporterTest extends HudsonTestCase {

public void test() throws Exception {
Project<?,?> projectA = createFreeStyleProject("projectA");
List<AbstractBuildParameters> buildParameters = new ArrayList<AbstractBuildParameters>();
buildParameters.add(new CurrentBuildParameters());
BlockingBehaviour neverFail = new BlockingBehaviour("never", "never", "never");
BlockableBuildTriggerConfig config = new BlockableBuildTriggerConfig("projectB", neverFail, buildParameters);
projectA.getBuildersList().add(new TriggerBuilder(config));
public void test() throws Exception {
Project<?,?> projectA = createFreeStyleProject("projectA");
List<AbstractBuildParameters> buildParameters = new ArrayList<AbstractBuildParameters>();
buildParameters.add(new CurrentBuildParameters());
BlockingBehaviour neverFail = new BlockingBehaviour("never", "never", "never");
BlockableBuildTriggerConfig config = new BlockableBuildTriggerConfig("projectB", neverFail, buildParameters);
projectA.getBuildersList().add(new TriggerBuilder(config));

CaptureEnvironmentBuilder builder = new CaptureEnvironmentBuilder();
projectA.getBuildersList().add(builder);

Project projectB = createFreeStyleProject("projectB");
projectB.setQuietPeriod(0);
hudson.rebuildDependencyGraph();

// Just to make sure they differ from projectA's build numbers.
projectB.updateNextBuildNumber(3);

int expectedBuildNumber = projectB.getNextBuildNumber();
projectA.scheduleBuild2(0, new UserCause()).get();

EnvVars envVars = builder.getEnvVars();
assertThat(envVars, notNullValue());
assertThat(envVars, hasEntry("LAST_TRIGGERED_JOB_NAME", "projectB"));
assertThat(envVars, hasEntry("TRIGGERED_BUILD_NUMBER_projectB", Integer.toString(expectedBuildNumber)));

// The below test for expectedBuildNumber is meaningless if the
// value doesn't update, though it should always update.
assertThat(projectB.getNextBuildNumber(), is(not(expectedBuildNumber)));

expectedBuildNumber = projectB.getNextBuildNumber();
projectA.scheduleBuild2(0, new UserCause()).get();
envVars = builder.getEnvVars();

assertThat(envVars, notNullValue());
assertThat(envVars, hasEntry("LAST_TRIGGERED_JOB_NAME", "projectB"));
assertThat(envVars, hasEntry("TRIGGERED_BUILD_NUMBER_projectB", Integer.toString(expectedBuildNumber)));
}

public void test_oddchars() throws Exception {
Project<?,?> projectA = createFreeStyleProject("projectA");
List<AbstractBuildParameters> buildParameters = new ArrayList<AbstractBuildParameters>();
buildParameters.add(new CurrentBuildParameters());
BlockingBehaviour neverFail = new BlockingBehaviour("never", "never", "never");

String testName = "odd£()+}{-=~chars-10";
String testNameResult = "odd_chars_10";
BlockableBuildTriggerConfig config = new BlockableBuildTriggerConfig(testName, neverFail, buildParameters);
projectA.getBuildersList().add(new TriggerBuilder(config));

CaptureEnvironmentBuilder builder = new CaptureEnvironmentBuilder();
projectA.getBuildersList().add(builder);

Project projectB = createFreeStyleProject(testName);
projectB.setQuietPeriod(0);
hudson.rebuildDependencyGraph();
// Just to make sure they differ from projectA's build numbers.
projectB.updateNextBuildNumber(3);

int expectedBuildNumber = projectB.getNextBuildNumber();
projectA.scheduleBuild2(0, new UserCause()).get();

EnvVars envVars = builder.getEnvVars();

CaptureEnvironmentBuilder builder = new CaptureEnvironmentBuilder();
projectA.getBuildersList().add(builder);
assertThat(envVars, notNullValue());
assertThat(envVars, hasEntry("LAST_TRIGGERED_JOB_NAME", testNameResult));
assertThat(envVars, hasEntry("TRIGGERED_BUILD_NUMBER_"+testNameResult, Integer.toString(expectedBuildNumber)));

Project projectB = createFreeStyleProject("projectB");
projectB.setQuietPeriod(0);
hudson.rebuildDependencyGraph();
// The below test for expectedBuildNumber is meaningless if the
// value doesn't update, though it should always update.
assertThat(projectB.getNextBuildNumber(), is(not(expectedBuildNumber)));

// Just to make sure they differ from projectA's build numbers.
projectB.updateNextBuildNumber(3);
expectedBuildNumber = projectB.getNextBuildNumber();
projectA.scheduleBuild2(0, new UserCause()).get();
envVars = builder.getEnvVars();

int expectedBuildNumber = projectB.getNextBuildNumber();
projectA.scheduleBuild2(0, new UserCause()).get();
assertThat(envVars, notNullValue());
assertThat(envVars, hasEntry("LAST_TRIGGERED_JOB_NAME", testNameResult));
assertThat(envVars, hasEntry("TRIGGERED_BUILD_NUMBER_"+testNameResult, Integer.toString(expectedBuildNumber)));
}

public void test_multipletriggers() throws Exception {
String testNameResult = "projectB";
String testNameResult2 = "projectC";
int buildsToTest = 3;

Project<?,?> projectA = createFreeStyleProject();
Project projectB = createFreeStyleProject(testNameResult);
Project projectC = createFreeStyleProject(testNameResult2);
projectA.getBuildersList().add(
new TriggerBuilder(
new BlockableBuildTriggerConfig(testNameResult +"," + testNameResult2,
new BlockingBehaviour(Result.FAILURE, Result.UNSTABLE, Result.FAILURE),
ImmutableList.<AbstractBuildParameterFactory>of(new CounterBuildParameterFactory("0",Integer.toString(buildsToTest-1),"1", "TEST=COUNT$COUNT")),
Collections.<AbstractBuildParameters>emptyList())));

EnvVars envVars = builder.getEnvVars();
assertThat(envVars, notNullValue());
assertThat(envVars, hasEntry("LAST_TRIGGERED_JOB_NAME", "projectB"));
assertThat(envVars, hasEntry("TRIGGERED_BUILD_NUMBER_projectB", Integer.toString(expectedBuildNumber)));
CaptureEnvironmentBuilder builder = new CaptureEnvironmentBuilder();
projectA.getBuildersList().add(builder);

// The below test for expectedBuildNumber is meaningless if the
// value doesn't update, though it should always update.
assertThat(projectB.getNextBuildNumber(), is(not(expectedBuildNumber)));
projectB.setQuietPeriod(0);
projectB.updateNextBuildNumber(3);

projectC.setQuietPeriod(0);
projectC.updateNextBuildNumber(12);
hudson.rebuildDependencyGraph();

int firstExpectedBuildNumberB = projectB.getNextBuildNumber();
int firstExpectedBuildNumberC = projectC.getNextBuildNumber();

expectedBuildNumber = projectB.getNextBuildNumber();
projectA.scheduleBuild2(0, new UserCause()).get();
envVars = builder.getEnvVars();
projectA.scheduleBuild2(0, new UserCause()).get();
waitUntilNoActivity();

assertEquals(buildsToTest, projectB.getBuilds().size());
assertEquals(buildsToTest, projectC.getBuilds().size());

int lastBuildNumberB = firstExpectedBuildNumberB + (buildsToTest-1);
int lastBuildNumberC = firstExpectedBuildNumberC + (buildsToTest-1);

String allBuildNumbersB = Integer.toString(firstExpectedBuildNumberB);
while(firstExpectedBuildNumberB < lastBuildNumberB) {
firstExpectedBuildNumberB++;
allBuildNumbersB += "," + firstExpectedBuildNumberB;
}
String allBuildNumbersC = Integer.toString(firstExpectedBuildNumberC);
while(firstExpectedBuildNumberC < lastBuildNumberC) {
firstExpectedBuildNumberC++;
allBuildNumbersC += "," + firstExpectedBuildNumberC;
}

EnvVars envVars = builder.getEnvVars();

assertThat(envVars, notNullValue());
assertThat(envVars, hasEntry("LAST_TRIGGERED_JOB_NAME", testNameResult2));
assertThat(envVars, hasEntry("TRIGGERED_BUILD_NUMBER_"+testNameResult, Integer.toString(lastBuildNumberB)));
assertThat(envVars, hasEntry("TRIGGERED_BUILD_NUMBER_"+testNameResult2, Integer.toString(lastBuildNumberC)));

assertThat(envVars, hasEntry("TRIGGERED_JOB_NAMES", testNameResult + "," + testNameResult2));

assertThat(envVars, hasEntry("TRIGGERED_BUILD_NUMBERS_"+testNameResult, allBuildNumbersB));
assertThat(envVars, hasEntry("TRIGGERED_BUILD_NUMBERS_"+testNameResult2, allBuildNumbersC));

assertThat(envVars, notNullValue());
assertThat(envVars, hasEntry("LAST_TRIGGERED_JOB_NAME", "projectB"));
assertThat(envVars, hasEntry("TRIGGERED_BUILD_NUMBER_projectB", Integer.toString(expectedBuildNumber)));
}
}
}

0 comments on commit fae74af

Please sign in to comment.