package hudson.tasks;
import hudson.EnvVars;
import hudson.model.labels.LabelAtom;
import hudson.maven.MavenModuleSet;
import hudson.maven.MavenModuleSetBuild;
import hudson.model.AbstractBuild;
import hudson.model.FreeStyleBuild;
import hudson.model.FreeStyleProject;
import hudson.model.JDK;
import hudson.model.Result;
import hudson.slaves.DumbSlave;
import hudson.tasks.Ant.AntInstallation;
import hudson.tasks.Maven.MavenInstallation;
import org.apache.tools.ant.taskdefs.condition.Os;
import org.junit.Assume;
import org.jvnet.hudson.test.ExtractResourceSCM;
import org.jvnet.hudson.test.HudsonTestCase;
import static hudson.tasks._ant.Messages.Ant_ExecutableNotFound;
import org.junit.rules.TemporaryFolder;
import org.jvnet.hudson.test.ToolInstallations;
public class EnvVarsInConfigTasksTest extends HudsonTestCase {
public static final String DUMMY_LOCATION_VARNAME = "TOOLS_DUMMY_LOCATION";
private DumbSlave slaveEnv = null;
private DumbSlave slaveRegular = null;
private TemporaryFolder tmp = new TemporaryFolder();
public void setUp() throws Exception {
super.setUp();
tmp.create(); // until we can switch to JenkinsRule and tmp becomes a @Rule itself
JDK defaultJDK = jenkins.getJDK(null);
JDK varJDK = new JDK("varJDK", withVariable(defaultJDK.getHome()));
jenkins.getJDKs().add(varJDK);
// Maven with a variable in its path
ToolInstallations.configureDefaultMaven();
MavenInstallation defaultMaven = jenkins.getDescriptorByType(Maven.DescriptorImpl.class).getInstallations()[0];
MavenInstallation varMaven = new MavenInstallation("varMaven",
withVariable(defaultMaven.getHome()), NO_PROPERTIES);
jenkins.getDescriptorByType(Maven.DescriptorImpl.class).setInstallations(varMaven);
// Ant with a variable in its path
AntInstallation ant = ToolInstallations.configureDefaultAnt(tmp);
AntInstallation antInstallation = new AntInstallation("varAnt",
withVariable(ant.getHome()),NO_PROPERTIES);
jenkins.getDescriptorByType(Ant.DescriptorImpl.class).setInstallations(antInstallation);
// create slaves
EnvVars additionalEnv = new EnvVars(DUMMY_LOCATION_VARNAME, "");
slaveEnv = createSlave(new LabelAtom("slaveEnv"), additionalEnv);
slaveRegular = createSlave(new LabelAtom("slaveRegular"));
}
@Override
protected void tearDown() throws Exception {
super.tearDown();
tmp.delete();
}
private String withVariable(String s) {
return s + "${" + DUMMY_LOCATION_VARNAME + "}";
}
public void testFreeStyleShellOnSlave() throws Exception {
FreeStyleProject project = createFreeStyleProject();
if (Os.isFamily("dos")) {
project.getBuildersList().add(new BatchFile("echo %JAVA_HOME%"));
} else {
project.getBuildersList().add(new Shell("echo \"$JAVA_HOME\""));
}
project.setJDK(jenkins.getJDK("varJDK"));
// set appropriate SCM to get the necessary build files
project.setScm(new ExtractResourceSCM(getClass().getResource(
"/simple-projects.zip")));
// test the regular slave - variable not expanded
project.setAssignedLabel(slaveRegular.getSelfLabel());
FreeStyleBuild build = project.scheduleBuild2(0).get();
System.out.println(build.getDisplayName() + " completed");
assertBuildStatusSuccess(build);
String buildLogRegular = getBuildLog(build);
System.out.println(buildLogRegular);
assertTrue(buildLogRegular.contains(DUMMY_LOCATION_VARNAME));
// test the slave with prepared environment
project.setAssignedLabel(slaveEnv.getSelfLabel());
build = project.scheduleBuild2(0).get();
System.out.println(build.getDisplayName() + " completed");
assertBuildStatusSuccess(build);
// Check variable was expanded
String buildLogEnv = getBuildLog(build);
System.out.println(buildLogEnv);
assertFalse(buildLogEnv.contains(DUMMY_LOCATION_VARNAME));
}
public void testFreeStyleAntOnSlave() throws Exception {
Assume.assumeFalse(
"Cannot do testFreeStyleAntOnSlave without ANT_HOME",
jenkins.getDescriptorByType(Ant.DescriptorImpl.class).getInstallations().length == 0
);
FreeStyleProject project = createFreeStyleProject();
project.setJDK(jenkins.getJDK("varJDK"));
project.setScm(new ExtractResourceSCM(getClass().getResource(
"/simple-projects.zip")));
String buildFile = "build.xml${" + DUMMY_LOCATION_VARNAME + "}";
// we need additional escapes because bash itself expanding
project.getBuildersList().add(
new Ant("-Dtest.property=cor${" + DUMMY_LOCATION_VARNAME
+ "}rect", "varAnt", "", buildFile, ""));
// test the regular slave - variable not expanded
project.setAssignedLabel(slaveRegular.getSelfLabel());
FreeStyleBuild build = project.scheduleBuild2(0).get();
System.out.println(build.getDisplayName() + " completed");
assertBuildStatus(Result.FAILURE, build);
String buildLogRegular = getBuildLog(build);
assertTrue(buildLogRegular.contains(Ant_ExecutableNotFound("varAnt")));
// test the slave with prepared environment
project.setAssignedLabel(slaveEnv.getSelfLabel());
build = project.scheduleBuild2(0).get();
System.out.println(build.getDisplayName() + " completed");
assertBuildStatusSuccess(build);
// Check variable was expanded
String buildLogEnv = getBuildLog(build);
System.out.println(buildLogEnv);
assertTrue(buildLogEnv.contains("Ant home: "));
assertTrue(buildLogEnv.contains("Test property: correct"));
assertFalse(buildLogEnv.matches("(?s)^.*Ant home: [^\\n\\r]*"
+ DUMMY_LOCATION_VARNAME + ".*$"));
assertFalse(buildLogEnv.matches("(?s)^.*Test property: [^\\n\\r]*"
+ DUMMY_LOCATION_VARNAME + ".*$"));
}
public void testFreeStyleMavenOnSlave() throws Exception {
FreeStyleProject project = createFreeStyleProject();
project.setJDK(jenkins.getJDK("varJDK"));
project.setScm(new ExtractResourceSCM(getClass().getResource(
"/simple-projects.zip")));
project.getBuildersList().add(
new Maven("test", "varMaven", "pom.xml${"
+ DUMMY_LOCATION_VARNAME + "}", "", "",
false));
// test the regular slave - variable not expanded
project.setAssignedLabel(slaveRegular.getSelfLabel());
FreeStyleBuild build = project.scheduleBuild2(0).get();
System.out.println(build.getDisplayName() + " completed");
assertBuildStatus(Result.FAILURE, build);
String buildLogRegular = getBuildLog(build);
System.out.println(buildLogRegular);
assertTrue(buildLogRegular.contains(DUMMY_LOCATION_VARNAME));
// test the slave with prepared environment
project.setAssignedLabel(slaveEnv.getSelfLabel());
build = project.scheduleBuild2(0).get();
System.out.println(build.getDisplayName() + " completed");
assertBuildStatusSuccess(build);
// Check variable was expanded
String buildLogEnv = getBuildLog(build);
System.out.println(buildLogEnv);
assertFalse(buildLogEnv.contains(DUMMY_LOCATION_VARNAME));
}
public void testNativeMavenOnSlave() throws Exception {
MavenModuleSet project = jenkins.createProject(MavenModuleSet.class, "p");
project.setJDK(jenkins.getJDK("varJDK"));
project.setScm(new ExtractResourceSCM(getClass().getResource(
"/simple-projects.zip")));
project.setMaven("varMaven");
project.setGoals("clean${" + DUMMY_LOCATION_VARNAME + "}");
// test the regular slave - variable not expanded
project.setAssignedLabel(slaveRegular.getSelfLabel());
MavenModuleSetBuild build = project.scheduleBuild2(0).get();
System.out.println(build.getDisplayName() + " completed");
assertBuildStatus(Result.FAILURE, build);
String buildLogRegular = getBuildLog(build);
System.out.println(buildLogRegular);
// test the slave with prepared environment
project.setAssignedLabel(slaveEnv.getSelfLabel());
build = project.scheduleBuild2(0).get();
System.out.println(build.getDisplayName() + " completed");
assertBuildStatusSuccess(build);
// Check variable was expanded
String buildLogEnv = getBuildLog(build);
System.out.println(buildLogEnv);
assertFalse(buildLogEnv.contains(DUMMY_LOCATION_VARNAME));
}
@SuppressWarnings("deprecation") // it's okay to use it in tests
private String getBuildLog(AbstractBuild<?,?> build) throws Exception {
return build.getLog();
}
}