Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Merge pull request #70 from ikedam/feature/JENKINS-30357_NpeInParamet…
…erizedBuildSelector

[JENKINS-30357] Fixed NPE and other improvements in ParameterizedBuildSelector
  • Loading branch information
ikedam committed Oct 4, 2015
2 parents f494646 + d7df521 commit b72f3f9
Show file tree
Hide file tree
Showing 4 changed files with 370 additions and 5 deletions.
18 changes: 15 additions & 3 deletions src/main/java/hudson/plugins/copyartifact/CopyArtifact.java
Expand Up @@ -365,12 +365,24 @@ public void perform(@Nonnull Run<?, ?> build, @Nonnull FilePath workspace, @Nonn
upgradeIfNecessary(((AbstractBuild)build).getProject());
}

EnvVars env;
EnvVars env = build.getEnvironment(listener);
if (build instanceof AbstractBuild) {
env = build.getEnvironment(listener);
env.overrideAll(((AbstractBuild)build).getBuildVariables()); // Add in matrix axes..
} else {
env = new EnvVars();
// Abstract#getEnvironment(TaskListener) put build parameters to
// environments, but Run#getEnvironment(TaskListener) doesn't.
// That means we can't retrieve build parameters from WorkflowRun
// as it is a subclass of Run, not of AbstractBuild.
// We need expand build parameters manually.
// See JENKINS-26694, JENKINS-30357 for details.
for(ParametersAction pa: build.getActions(ParametersAction.class)) {
// We have to extract parameters manally as ParametersAction#buildEnvVars
// (overrides EnvironmentContributingAction#buildEnvVars)
// is applicable only for AbstractBuild.
for(ParameterValue pv: pa.getParameters()) {
pv.buildEnvironment(build, env);
}
}
}

PrintStream console = listener.getLogger();
Expand Down
Expand Up @@ -23,11 +23,16 @@
*/
package hudson.plugins.copyartifact;

import java.util.logging.Level;
import java.util.logging.Logger;

import hudson.EnvVars;
import hudson.Extension;
import hudson.model.Descriptor;
import hudson.model.Job;
import hudson.model.Run;

import org.apache.commons.lang.StringUtils;
import org.kohsuke.stapler.DataBoundConstructor;

/**
Expand All @@ -37,6 +42,7 @@
*/
public class ParameterizedBuildSelector extends BuildSelector {
private String parameterName;
private static final Logger LOG = Logger.getLogger(ParameterizedBuildSelector.class.getName());

@DataBoundConstructor
public ParameterizedBuildSelector(String parameterName) {
Expand All @@ -49,8 +55,51 @@ public String getParameterName() {

@Override
public Run<?,?> getBuild(Job<?,?> job, EnvVars env, BuildFilter filter, Run<?,?> parent) {
return BuildSelectorParameter.getSelectorFromXml(env.get(parameterName))
.getBuild(job, env, filter, parent);
String xml = resolveParameter(env);
if (xml == null) {
return null;
}
BuildSelector selector = null;
try {
selector = BuildSelectorParameter.getSelectorFromXml(xml);
} catch (Exception e) {
LOG.log(Level.SEVERE, String.format("Failed to resolve selector: %s", xml), e);
return null;
}
return selector.getBuild(job, env, filter, parent);
}

/**
* Expand the parameter and resolve it to a xstream expression.
* <ol>
* <li>Considers an immediate value if contains '&lt;'.
* This is expected to be used in especially in workflow jobs.</li>
* <li>Otherwise, considers a variable expression if contains '$'.
* This is to keep the compatibility of usage between workflow jobs and non-workflow jobs.</li>
* <li>Otherwise, considers a variable name.</li>
* </ol>
*
* @param env
* @return xstream expression.
*/
private String resolveParameter(EnvVars env) {
if (StringUtils.isBlank(getParameterName())) {
LOG.log(Level.WARNING, "Parameter name is not specified");
return null;
}
if (getParameterName().contains("<")) {
LOG.log(Level.FINEST, "{0} is considered a xstream expression", getParameterName());
return getParameterName();
}
if (getParameterName().contains("$")) {
LOG.log(Level.FINEST, "{0} is considered a variable expression", getParameterName());
return env.expand(getParameterName());
}
String xml = env.get(getParameterName());
if (xml == null) {
LOG.log(Level.WARNING, "{0} is not defined", getParameterName());
}
return xml;
}

@Extension(ordinal=-20)
Expand Down
Expand Up @@ -2,4 +2,7 @@
Name of the "build selector" parameter. A parameter with this name should be added
in the build parameters section above. There is a special parameter type for choosing
the build selector.
<p>
You can pass not only the parameter name, but also the parameter value itself.
This is useful especially used with workflow-plugin.
</div>

0 comments on commit b72f3f9

Please sign in to comment.