Skip to content

Commit

Permalink
JENKINS-9786 : Jenkins can read repositories definitions from Maven P…
Browse files Browse the repository at this point in the history
…OMs to use the deploy task after the build. It's no more necessary to set/duplicate this information in the job configuration.

Originally-Committed-As: fe30ad88027bdc1b39fceb82a1ed6f1162a3fbdd
  • Loading branch information
aheritier committed May 31, 2011
1 parent c2ec876 commit 5848d3f
Show file tree
Hide file tree
Showing 5 changed files with 121 additions and 114 deletions.
97 changes: 46 additions & 51 deletions src/main/java/hudson/maven/RedeployPublisher.java
Expand Up @@ -28,31 +28,15 @@
import hudson.Launcher;
import hudson.Util;
import hudson.maven.reporters.MavenAbstractArtifactRecord;
import hudson.model.AbstractBuild;
import hudson.model.AbstractProject;
import hudson.model.BuildListener;
import hudson.model.Hudson;
import hudson.model.Node;
import hudson.model.Result;
import hudson.model.TaskListener;
import hudson.maven.reporters.MavenArtifactRecord;
import hudson.model.*;
import hudson.remoting.Callable;
import hudson.tasks.BuildStepDescriptor;
import hudson.tasks.BuildStepMonitor;
import hudson.tasks.Maven.MavenInstallation;
import hudson.tasks.Publisher;
import hudson.tasks.Recorder;
import hudson.util.FormValidation;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map.Entry;
import java.util.Properties;

import net.sf.json.JSONObject;

import org.apache.commons.lang.StringUtils;
import org.apache.maven.artifact.Artifact;
import org.apache.maven.artifact.deployer.ArtifactDeploymentException;
Expand All @@ -65,9 +49,13 @@
import org.apache.maven.repository.Proxy;
import org.codehaus.plexus.component.repository.exception.ComponentLookupException;
import org.kohsuke.stapler.DataBoundConstructor;
import org.kohsuke.stapler.QueryParameter;
import org.kohsuke.stapler.StaplerRequest;

import java.io.File;
import java.io.IOException;
import java.util.*;
import java.util.Map.Entry;

/**
* {@link Publisher} for {@link MavenModuleSetBuild} to deploy artifacts
* after a build is fully succeeded.
Expand All @@ -90,6 +78,7 @@ public class RedeployPublisher extends Recorder {
/**
* For backward compatibility
*/
@Deprecated
public RedeployPublisher(String id, String url, boolean uniqueVersion) {
this(id, url, uniqueVersion, false);
}
Expand All @@ -105,47 +94,52 @@ public RedeployPublisher(String id, String url, boolean uniqueVersion, boolean e
this.evenIfUnstable = evenIfUnstable;
}

public boolean perform(AbstractBuild<?,?> build, Launcher launcher, BuildListener listener) throws InterruptedException, IOException {
if(build.getResult().isWorseThan(getTreshold()))
public boolean perform(AbstractBuild<?, ?> build, Launcher launcher, BuildListener listener) throws InterruptedException, IOException {
if (build.getResult().isWorseThan(getTreshold()))
return true; // build failed. Don't publish

if (url==null) {
listener.getLogger().println("No Repository URL is specified.");
List<MavenAbstractArtifactRecord> mavenAbstractArtifactRecords = getActions(build, listener);
if (mavenAbstractArtifactRecords == null || mavenAbstractArtifactRecords.isEmpty()) {
listener.getLogger().println("[ERROR] No artifacts are recorded. Is this a Maven project?");
build.setResult(Result.FAILURE);
return true;
}

List<MavenAbstractArtifactRecord> mars = getActions( build, listener );
if(mars==null || mars.isEmpty()) {
listener.getLogger().println("No artifacts are recorded. Is this a Maven project?");
build.setResult(Result.FAILURE);
return true;
}

if(build instanceof MavenModuleSetBuild && ((MavenModuleSetBuild)build).getParent().isArchivingDisabled()){
listener.getLogger().println("[ERROR] You cannot use the \"Deploy artifacts to Maven repository\" feature if you " +
"disabled " +
"automatic artifact archiving");
"disabled automatic artifact archiving");
build.setResult(Result.FAILURE);
return true;
}

listener.getLogger().println("Deploying artifacts to "+url);
long startupTime = Calendar.getInstance().getTimeInMillis();

try {

//MavenEmbedder embedder = MavenUtil.createEmbedder(listener,build);
MavenEmbedder embedder = createEmbedder(listener,build);
MavenEmbedder embedder = createEmbedder(listener, build);
ArtifactRepositoryLayout layout =
(ArtifactRepositoryLayout) embedder.lookup( ArtifactRepositoryLayout.ROLE,"default");
(ArtifactRepositoryLayout) embedder.lookup(ArtifactRepositoryLayout.ROLE, "default");
ArtifactRepositoryFactory factory =
(ArtifactRepositoryFactory) embedder.lookup(ArtifactRepositoryFactory.ROLE);

final ArtifactRepository repository = factory.createDeploymentArtifactRepository(
id, url, layout, uniqueVersion);
WrappedArtifactRepository repo = new WrappedArtifactRepository(repository,uniqueVersion);
for (MavenAbstractArtifactRecord mar : mars)
mar.deploy(embedder,repo,listener);

(ArtifactRepositoryFactory) embedder.lookup(ArtifactRepositoryFactory.ROLE);
ArtifactRepository artifactRepository = null;
if (url != null) {
// By default we try to get the repository definition from the job configuration
artifactRepository = getDeploymentRepository(factory, layout, id, url);
}
for (MavenAbstractArtifactRecord mavenAbstractArtifactRecord : mavenAbstractArtifactRecords) {
if (artifactRepository == null && mavenAbstractArtifactRecord instanceof MavenArtifactRecord) {
// If no repository definition is set on the job level we try to take it from the POM
MavenArtifactRecord mavenArtifactRecord = (MavenArtifactRecord) mavenAbstractArtifactRecord;
artifactRepository = getDeploymentRepository(factory, layout, mavenArtifactRecord.repositoryId, mavenArtifactRecord.repositoryUrl);
}
if (artifactRepository == null) {
listener.getLogger().println("[ERROR] No Repository settings defined in the job configuration or distributionManagement of the module.");
build.setResult(Result.FAILURE);
return true;
}
mavenAbstractArtifactRecord.deploy(embedder, artifactRepository, listener);
}
listener.getLogger().println("[INFO] Deployment done in " + Util.getTimeSpanString(Calendar.getInstance().getTimeInMillis() - startupTime));
return true;
} catch (MavenEmbedderException e) {
e.printStackTrace(listener.error(e.getMessage()));
Expand All @@ -156,9 +150,17 @@ public boolean perform(AbstractBuild<?,?> build, Launcher launcher, BuildListene
}
// failed
build.setResult(Result.FAILURE);
listener.getLogger().println("[INFO] Deployment failed after " + Util.getTimeSpanString(Calendar.getInstance().getTimeInMillis() - startupTime));
return true;
}

private ArtifactRepository getDeploymentRepository(ArtifactRepositoryFactory factory, ArtifactRepositoryLayout layout, String repositoryId, String repositoryUrl) throws ComponentLookupException {
if (repositoryUrl == null) return null;
final ArtifactRepository repository = factory.createDeploymentArtifactRepository(
repositoryId, repositoryUrl, layout, uniqueVersion);
return new WrappedArtifactRepository(repository, uniqueVersion);
}

/**
*
* copy from MavenUtil but here we have to ignore localRepo path and setting as thoses paths comes
Expand Down Expand Up @@ -312,13 +314,6 @@ public boolean showEvenIfUnstableOption() {
return true;
}

public FormValidation doCheckUrl(@QueryParameter String url) {
String fixedUrl = hudson.Util.fixEmptyAndTrim(url);
if (fixedUrl==null)
return FormValidation.error(Messages.RedeployPublisher_RepositoryURL_Mandatory());

return FormValidation.ok();
}
}

//---------------------------------------------
Expand Down
47 changes: 24 additions & 23 deletions src/main/java/hudson/maven/reporters/MavenArtifactArchiver.java
Expand Up @@ -23,29 +23,24 @@
*/
package hudson.maven.reporters;

import hudson.maven.MavenBuildProxy;
import hudson.maven.MavenModule;
import hudson.maven.MavenReporter;
import hudson.maven.MavenReporterDescriptor;
import hudson.maven.MojoInfo;
import hudson.maven.MavenBuild;
import hudson.model.BuildListener;
import hudson.util.InvocationInterceptor;
import hudson.FilePath;
import hudson.Extension;
import hudson.FilePath;
import hudson.Util;
import hudson.maven.*;
import hudson.model.BuildListener;
import hudson.util.InvocationInterceptor;
import org.apache.maven.artifact.Artifact;
import org.apache.maven.project.MavenProject;

import java.io.IOException;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.HashSet;
import java.lang.reflect.Method;
import java.lang.reflect.InvocationHandler;

/**
* Archives artifacts of the build.
Expand Down Expand Up @@ -99,41 +94,47 @@ public boolean postBuild(MavenBuildProxy build, MavenProject pom, final BuildLis
// artifacts that are known to Maven.
Set<File> mavenArtifacts = new HashSet<File>();

if(pom.getFile()!=null) {// goals like 'clean' runs without loading POM, apparently.
if (pom.getFile() != null) {// goals like 'clean' runs without loading POM, apparently.
// record POM
final MavenArtifact pomArtifact = new MavenArtifact(
pom.getGroupId(), pom.getArtifactId(), pom.getVersion(), null, "pom", pom.getFile().getName(), Util.getDigestOf(new FileInputStream(pom.getFile())));
pom.getGroupId(), pom.getArtifactId(), pom.getVersion(), null, "pom", pom.getFile().getName(), Util.getDigestOf(new FileInputStream(pom.getFile())));

final String repositoryUrl = pom.getDistributionManagementArtifactRepository() == null ? null : Util.fixEmptyAndTrim(pom.getDistributionManagementArtifactRepository().getUrl());
final String repositoryId = pom.getDistributionManagementArtifactRepository() == null ? null : Util.fixEmptyAndTrim(pom.getDistributionManagementArtifactRepository().getId());

mavenArtifacts.add(pom.getFile());
pomArtifact.archive(build,pom.getFile(),listener);
pomArtifact.archive(build, pom.getFile(), listener);

// record main artifact (if packaging is POM, this doesn't exist)
final MavenArtifact mainArtifact = MavenArtifact.create(pom.getArtifact());
if(mainArtifact!=null) {
if (mainArtifact != null) {
File f = pom.getArtifact().getFile();
mavenArtifacts.add(f);
mainArtifact.archive(build, f,listener);
mainArtifact.archive(build, f, listener);
}

// record attached artifacts
final List<MavenArtifact> attachedArtifacts = new ArrayList<MavenArtifact>();
for( Artifact a : (List<Artifact>)pom.getAttachedArtifacts() ) {
for (Artifact a : (List<Artifact>) pom.getAttachedArtifacts()) {
MavenArtifact ma = MavenArtifact.create(a);
if(ma!=null) {
if (ma != null) {
mavenArtifacts.add(a.getFile());
ma.archive(build,a.getFile(),listener);
ma.archive(build, a.getFile(), listener);
attachedArtifacts.add(ma);
}
}

// record the action
build.executeAsync(new MavenBuildProxy.BuildCallable<Void,IOException>() {
build.executeAsync(new MavenBuildProxy.BuildCallable<Void, IOException>() {
public Void call(MavenBuild build) throws IOException, InterruptedException {
// if a build forks lifecycles, this method can be called multiple times
List<MavenArtifactRecord> old = Util.filter(build.getActions(), MavenArtifactRecord.class);
if (!old.isEmpty())
build.getActions().removeAll(old);

MavenArtifactRecord mar = new MavenArtifactRecord(build,pomArtifact,mainArtifact,attachedArtifacts);
MavenArtifactRecord mar = new MavenArtifactRecord(build, pomArtifact, mainArtifact, attachedArtifacts,
repositoryUrl,
repositoryId);
build.addAction(mar);

mar.recordFingerprints();
Expand Down
80 changes: 45 additions & 35 deletions src/main/java/hudson/maven/reporters/MavenArtifactRecord.java
Expand Up @@ -23,23 +23,10 @@
*/
package hudson.maven.reporters;

import hudson.maven.AggregatableAction;
import hudson.maven.MavenAggregatedReport;
import hudson.maven.MavenBuild;
import hudson.maven.MavenEmbedder;
import hudson.maven.MavenEmbedderException;
import hudson.maven.MavenModule;
import hudson.maven.MavenModuleSetBuild;
import hudson.maven.MavenUtil;
import hudson.maven.*;
import hudson.maven.RedeployPublisher.WrappedArtifactRepository;
import hudson.model.Action;
import hudson.model.TaskListener;

import java.io.IOException;
import java.io.PrintStream;
import java.util.List;
import java.util.Map;

import org.apache.maven.artifact.Artifact;
import org.apache.maven.artifact.deployer.ArtifactDeployer;
import org.apache.maven.artifact.deployer.ArtifactDeploymentException;
Expand All @@ -51,6 +38,11 @@
import org.apache.maven.project.artifact.ProjectArtifactMetadata;
import org.codehaus.plexus.component.repository.exception.ComponentLookupException;

import java.io.IOException;
import java.io.PrintStream;
import java.util.List;
import java.util.Map;

/**
* {@link Action} that remembers {@link MavenArtifact artifact}s that are built.
*
Expand Down Expand Up @@ -82,16 +74,34 @@ public class MavenArtifactRecord extends MavenAbstractArtifactRecord<MavenBuild>
*/
public final List<MavenArtifact> attachedArtifacts;

/**
* The repository identifier (matching maven settings) used for credentials to deploy artifacts
*/
public final String repositoryId;

/**
* The repository URL used for credentials to deploy artifacts
*/
public final String repositoryUrl;

@Deprecated
public MavenArtifactRecord(MavenBuild parent, MavenArtifact pomArtifact, MavenArtifact mainArtifact, List<MavenArtifact> attachedArtifacts) {
assert parent!=null;
assert pomArtifact!=null;
assert attachedArtifacts!=null;
if(mainArtifact==null) mainArtifact=pomArtifact;
this(parent, pomArtifact, mainArtifact, attachedArtifacts, null, null);
}

public MavenArtifactRecord(MavenBuild parent, MavenArtifact pomArtifact, MavenArtifact mainArtifact,
List<MavenArtifact> attachedArtifacts, String repositoryUrl, String repositoryId) {
assert parent != null;
assert pomArtifact != null;
assert attachedArtifacts != null;
if (mainArtifact == null) mainArtifact = pomArtifact;

this.parent = parent;
this.pomArtifact = pomArtifact;
this.mainArtifact = mainArtifact;
this.attachedArtifacts = attachedArtifacts;
this.repositoryUrl = repositoryUrl;
this.repositoryId = repositoryId;
}

public MavenBuild getBuild() {
Expand All @@ -109,38 +119,38 @@ public MavenAggregatedReport createAggregatedAction(MavenModuleSetBuild build, M
@Override
public void deploy(MavenEmbedder embedder, ArtifactRepository deploymentRepository, TaskListener listener) throws MavenEmbedderException, IOException, ComponentLookupException, ArtifactDeploymentException {
ArtifactHandlerManager handlerManager = embedder.lookup(ArtifactHandlerManager.class);
ArtifactFactory factory = embedder.lookup(ArtifactFactory.class);

ArtifactFactory artifactFactory = embedder.lookup(ArtifactFactory.class);
PrintStream logger = listener.getLogger();
boolean maven3orLater = MavenUtil.maven3orLater(parent.getModuleSetBuild().getMavenVersionUsed());
boolean uniqueVersion = true;
if (!deploymentRepository.isUniqueVersion()) {
if (maven3orLater) {
logger.println("uniqueVersion == false is not anymore supported in maven 3");
logger.println("[ERROR] uniqueVersion == false is not anymore supported in maven 3");
} else {
((WrappedArtifactRepository) deploymentRepository).setUniqueVersion( false );
((WrappedArtifactRepository) deploymentRepository).setUniqueVersion(false);
uniqueVersion = false;
}
} else {
((WrappedArtifactRepository) deploymentRepository).setUniqueVersion( true );
((WrappedArtifactRepository) deploymentRepository).setUniqueVersion(true);
}
Artifact main = mainArtifact.toArtifact(handlerManager,factory,parent);
if(!isPOM())
main.addMetadata(new ProjectArtifactMetadata(main,pomArtifact.getFile(parent)));
Artifact main = mainArtifact.toArtifact(handlerManager, artifactFactory, parent);
if (!isPOM())
main.addMetadata(new ProjectArtifactMetadata(main, pomArtifact.getFile(parent)));


ArtifactDeployer deployer = embedder.lookup(ArtifactDeployer.class, uniqueVersion ? "default" : "maven2");
logger.println(
"[INFO] Deployment in " + deploymentRepository.getUrl() + "(id=" + deploymentRepository.getId() + ", uniqueVersion=" + deploymentRepository.isUniqueVersion()+")");

// deploy the main artifact. This also deploys the POM
logger.println(Messages.MavenArtifact_DeployingMainArtifact(main.getFile().getName()));

ArtifactDeployer deployer = embedder.lookup(ArtifactDeployer.class,uniqueVersion ? "default":"maven2");

deployer.deploy( main.getFile(), main, deploymentRepository, embedder.getLocalRepository() );

//deployMavenArtifact( main, deploymentRepository, embedder, uniqueVersion );
deployer.deploy(main.getFile(), main, deploymentRepository, embedder.getLocalRepository());

for (MavenArtifact aa : attachedArtifacts) {
Artifact a = aa.toArtifact(handlerManager,factory, parent);
logger.println(Messages.MavenArtifact_DeployingAttachedArtifact(a.getFile().getName()));
deployer.deploy( a.getFile(), a, deploymentRepository, embedder.getLocalRepository() );
Artifact a = aa.toArtifact(handlerManager, artifactFactory, parent);
logger.println(Messages.MavenArtifact_DeployingMainArtifact(a.getFile().getName()));
deployer.deploy(a.getFile(), a, deploymentRepository, embedder.getLocalRepository());
}
}

Expand Down

0 comments on commit 5848d3f

Please sign in to comment.