Skip to content

Commit

Permalink
added functionality to resolve parameter variable in war/ear name field
Browse files Browse the repository at this point in the history
  • Loading branch information
Ivan Stefko committed Feb 20, 2018
1 parent 27b805a commit 6dd797a
Showing 1 changed file with 61 additions and 44 deletions.
105 changes: 61 additions & 44 deletions src/main/java/hudson/plugins/deploy/DeployPublisher.java
Original file line number Diff line number Diff line change
@@ -1,40 +1,44 @@
package hudson.plugins.deploy;

import java.io.IOException;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;

import javax.annotation.Nonnull;

import org.jenkinsci.Symbol;
import org.kohsuke.accmod.Restricted;
import org.kohsuke.accmod.restrictions.NoExternalUse;
import org.kohsuke.stapler.DataBoundConstructor;
import org.kohsuke.stapler.DataBoundSetter;

import com.cloudbees.plugins.credentials.common.StandardUsernamePasswordCredentials;

import hudson.AbortException;
import hudson.EnvVars;
import hudson.Extension;
import hudson.FilePath;
import hudson.Launcher;
import hudson.Util;
import hudson.model.Result;
import hudson.model.AbstractBuild;
import hudson.model.AbstractProject;
import hudson.model.listeners.ItemListener;
import hudson.model.Result;
import hudson.model.Run;
import hudson.model.TaskListener;
import hudson.model.listeners.ItemListener;
import hudson.tasks.BuildStepDescriptor;
import hudson.tasks.BuildStepMonitor;
import hudson.tasks.Notifier;
import hudson.tasks.Publisher;

import java.io.IOException;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;

import hudson.util.VariableResolver;
import jenkins.model.Jenkins;
import jenkins.util.io.FileBoolean;
import org.kohsuke.accmod.Restricted;
import org.kohsuke.accmod.restrictions.NoExternalUse;
import jenkins.tasks.SimpleBuildStep;
import org.jenkinsci.Symbol;
import org.kohsuke.stapler.DataBoundConstructor;
import org.kohsuke.stapler.DataBoundSetter;

import javax.annotation.Nonnull;
import jenkins.util.io.FileBoolean;

/**
* Deploys WAR to a container.
Expand All @@ -46,23 +50,24 @@ public class DeployPublisher extends Notifier implements SimpleBuildStep, Serial
private List<ContainerAdapter> adapters;
private String contextPath = "";

private String war;
private final String war;
private boolean onFailure = true;

/**
* @deprecated
* Use {@link #getAdapters()}
*/
public final ContainerAdapter adapter = null;
@Deprecated
public final ContainerAdapter adapter = null;

@DataBoundConstructor
public DeployPublisher(List<ContainerAdapter> adapters, String war) {
public DeployPublisher(final List<ContainerAdapter> adapters, final String war) {
this.adapters = adapters;
this.war = war;
}

@Deprecated
public DeployPublisher(List<ContainerAdapter> adapters, String war, String contextPath, boolean onFailure) {
public DeployPublisher(final List<ContainerAdapter> adapters, final String war, final String contextPath, final boolean onFailure) {
this.adapters = adapters;
this.war = war;
}
Expand All @@ -76,7 +81,7 @@ public boolean isOnFailure () {
}

@DataBoundSetter
public void setOnFailure (boolean onFailure) {
public void setOnFailure (final boolean onFailure) {
this.onFailure = onFailure;
}

Expand All @@ -85,28 +90,37 @@ public String getContextPath () {
}

@DataBoundSetter
public void setContextPath (String contextPath) {
public void setContextPath (final String contextPath) {
this.contextPath = Util.fixEmpty(contextPath);
}

@Override
public void perform(@Nonnull Run<?, ?> run, @Nonnull FilePath workspace, @Nonnull Launcher launcher, @Nonnull TaskListener listener) throws InterruptedException, IOException {
Result result = run.getResult();
public void perform(@Nonnull final Run<?, ?> run, @Nonnull final FilePath workspace, @Nonnull final Launcher launcher, @Nonnull final TaskListener listener) throws InterruptedException, IOException {
final Result result = run.getResult();
if (onFailure || result == null || Result.SUCCESS.equals(result)) {
if (!workspace.exists()) {
listener.getLogger().println("[DeployPublisher][ERROR] Workspace not found");
throw new AbortException("Workspace not found");
}

EnvVars envVars = new EnvVars();
if (run instanceof AbstractBuild) {
final AbstractBuild build = (AbstractBuild) run;
envVars = build.getEnvironment(listener);
}

final VariableResolver<String> resolver = new VariableResolver.ByMap<String>(envVars);
final String warFiles = Util.replaceMacro(envVars.expand(this.war), resolver);

FilePath[] wars = workspace.list(this.war);
final FilePath[] wars = workspace.list(warFiles);
if (wars == null || wars.length == 0) {
listener.getLogger().printf("[DeployPublisher][WARN] No wars found. Deploy aborted. %n");
return;
}
listener.getLogger().printf("[DeployPublisher][INFO] Attempting to deploy %d war file(s)%n", wars.length);

for (FilePath warFile : wars) {
for (ContainerAdapter adapter : adapters) {
for (final FilePath warFile : wars) {
for (final ContainerAdapter adapter : adapters) {
adapter.redeployFile(warFile, contextPath, run, launcher, listener);
}
}
Expand All @@ -115,7 +129,8 @@ public void perform(@Nonnull Run<?, ?> run, @Nonnull FilePath workspace, @Nonnul
}
}

public BuildStepMonitor getRequiredMonitorService() {
@Override
public BuildStepMonitor getRequiredMonitorService() {
return BuildStepMonitor.BUILD;
}

Expand All @@ -142,15 +157,16 @@ public List<ContainerAdapter> getAdapters() {
@Extension
public static final class DescriptorImpl extends BuildStepDescriptor<Publisher> {
@Override
public boolean isApplicable(Class<? extends AbstractProject> jobType) {
public boolean isApplicable(final Class<? extends AbstractProject> jobType) {
return true;
}

public boolean defaultOnFailure (Object job) {
public boolean defaultOnFailure (final Object job) {
return !(job instanceof AbstractProject);
}

public String getDisplayName() {
@Override
public String getDisplayName() {
return Messages.DeployPublisher_DisplayName();
}

Expand All @@ -160,9 +176,10 @@ public String getDisplayName() {
* @return a alphabetically sorted list of AdapterDescriptors
*/
public List<ContainerAdapterDescriptor> getAdaptersDescriptors() {
List<ContainerAdapterDescriptor> r = new ArrayList<ContainerAdapterDescriptor>(ContainerAdapter.all());
final List<ContainerAdapterDescriptor> r = new ArrayList<ContainerAdapterDescriptor>(ContainerAdapter.all());
Collections.sort(r,new Comparator<ContainerAdapterDescriptor>() {
public int compare(ContainerAdapterDescriptor o1, ContainerAdapterDescriptor o2) {
@Override
public int compare(final ContainerAdapterDescriptor o1, final ContainerAdapterDescriptor o2) {
return o1.getDisplayName().compareTo(o2.getDisplayName());
}
});
Expand All @@ -179,22 +196,22 @@ public static final class Migrator extends ItemListener {
@SuppressWarnings("deprecation")
@Override
public void onLoaded() {
FileBoolean migrated = new FileBoolean(getClass(), "migratedCredentials");
final FileBoolean migrated = new FileBoolean(getClass(), "migratedCredentials");
if (migrated.isOn()) {
return;
}
List<StandardUsernamePasswordCredentials> generatedCredentials = new ArrayList<StandardUsernamePasswordCredentials>();
for (AbstractProject<?,?> project : Jenkins.getActiveInstance().getAllItems(AbstractProject.class)) {
final List<StandardUsernamePasswordCredentials> generatedCredentials = new ArrayList<StandardUsernamePasswordCredentials>();
for (final AbstractProject<?,?> project : Jenkins.getActiveInstance().getAllItems(AbstractProject.class)) {
try {
DeployPublisher d = project.getPublishersList().get(DeployPublisher.class);
final DeployPublisher d = project.getPublishersList().get(DeployPublisher.class);
if (d == null) {
continue;
}
boolean modified = false;
boolean successful = true;
for (ContainerAdapter a : d.getAdapters()) {
for (final ContainerAdapter a : d.getAdapters()) {
if (a instanceof PasswordProtectedAdapterCargo) {
PasswordProtectedAdapterCargo ppac = (PasswordProtectedAdapterCargo) a;
final PasswordProtectedAdapterCargo ppac = (PasswordProtectedAdapterCargo) a;
if (ppac.getCredentialsId() == null) {
successful &= ppac.migrateCredentials(generatedCredentials);
modified = true;
Expand All @@ -210,7 +227,7 @@ public void onLoaded() {
Logger.getLogger(DeployPublisher.class.getName()).log(Level.SEVERE, "Failed to create credentials and migrate DeployPublisher in project: {0}, please manually add credentials.", project.getName());
}
}
} catch (IOException e) {
} catch (final IOException e) {
Logger.getLogger(DeployPublisher.class.getName()).log(Level.WARNING, "Migration unsuccessful", e);
}
}
Expand Down

0 comments on commit 6dd797a

Please sign in to comment.