/* * Copyright (C) 2010 JFrog Ltd. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.jfrog.hudson.maven2; import com.google.common.collect.Lists; import com.google.common.collect.Sets; import hudson.maven.MavenBuild; import hudson.maven.MavenModule; import hudson.maven.MavenModuleSetBuild; import hudson.maven.reporters.MavenArtifact; import hudson.maven.reporters.MavenArtifactRecord; import hudson.model.Result; import hudson.model.TaskListener; import hudson.tasks.Fingerprinter; import org.jfrog.build.api.Artifact; import org.jfrog.build.api.Build; import org.jfrog.build.api.BuildType; import org.jfrog.build.api.Module; import org.jfrog.build.api.builder.ArtifactBuilder; import org.jfrog.build.api.builder.DependencyBuilder; import org.jfrog.build.api.builder.ModuleBuilder; import org.jfrog.build.extractor.clientConfiguration.client.ArtifactoryBuildInfoClient; import org.jfrog.hudson.AbstractBuildInfoDeployer; import org.jfrog.hudson.BuildInfoAwareConfigurator; import org.jfrog.hudson.MavenDependenciesRecord; import org.jfrog.hudson.MavenDependency; import org.jfrog.hudson.action.ActionableHelper; import java.io.IOException; import java.util.List; import java.util.Map; import java.util.Set; /** * Builds the build info. This class is used only when the Maven 3 extractor is not active. * * @author Yossi Shaul */ public class MavenBuildInfoDeployer extends AbstractBuildInfoDeployer { private final Build buildInfo; private BuildInfoAwareConfigurator configurator; public MavenBuildInfoDeployer(BuildInfoAwareConfigurator configurator, ArtifactoryBuildInfoClient client, MavenModuleSetBuild build, TaskListener listener) throws IOException, InterruptedException { super(configurator, build, listener, client); this.configurator = configurator; buildInfo = createBuildInfo("Maven", build.getParent().getMaven().getName(), BuildType.MAVEN); gatherModuleAndDependencyInfo(build); } public void deploy() throws IOException { String url = configurator.getArtifactoryServer().getUrl() + "/api/build"; listener.getLogger().println("Deploying build info to: " + url); client.sendBuildInfo(buildInfo); } private void gatherModuleAndDependencyInfo(MavenModuleSetBuild mavenModulesBuild) { Map<MavenModule, MavenBuild> mavenBuildMap = mavenModulesBuild.getModuleLastBuilds(); List<Module> modules = Lists.newArrayList(); for (Map.Entry<MavenModule, MavenBuild> moduleBuild : mavenBuildMap.entrySet()) { MavenModule mavenModule = moduleBuild.getKey(); MavenBuild mavenBuild = moduleBuild.getValue(); Result result = mavenBuild.getResult(); if (Result.NOT_BUILT.equals(result)) { // HAP-52 - the module build might be skipped if using incremental build continue; } MavenArtifactRecord mar = ActionableHelper.getLatestMavenArtifactRecord(mavenBuild); String moduleId = mavenModule.getName() + ":" + mavenModule.getVersion(); ModuleBuilder moduleBuilder = new ModuleBuilder().id(moduleId); // add artifacts moduleBuilder.addArtifact(toArtifact(mar.mainArtifact)); if (!mar.isPOM() && mar.pomArtifact != null && mar.pomArtifact != mar.mainArtifact) { moduleBuilder.addArtifact(toArtifact(mar.pomArtifact)); } for (MavenArtifact attachedArtifact : mar.attachedArtifacts) { moduleBuilder.addArtifact(toArtifact(attachedArtifact)); } addDependencies(moduleBuilder, mavenBuild); modules.add(moduleBuilder.build()); } buildInfo.setModules(modules); } private void addDependencies(ModuleBuilder moduleBuilder, MavenBuild mavenBuild) { MavenDependenciesRecord dependenciesRecord = ActionableHelper.getLatestAction(mavenBuild, MavenDependenciesRecord.class); if (dependenciesRecord != null) { Set<MavenDependency> dependencies = dependenciesRecord.getDependencies(); for (MavenDependency dependency : dependencies) { DependencyBuilder dependencyBuilder = new DependencyBuilder() .id(dependency.getId()) .scopes(Sets.newHashSet(dependency.getScope())) .type(dependency.getType()) .md5(getMd5(dependency.getGroupId(), dependency.getFileName(), mavenBuild)); moduleBuilder.addDependency(dependencyBuilder.build()); } // delete them once used build.getActions().removeAll(build.getActions(MavenDependenciesRecord.class)); } } private Artifact toArtifact(MavenArtifact mavenArtifact) { ArtifactBuilder artifactBuilder = new ArtifactBuilder(mavenArtifact.canonicalName) .type(mavenArtifact.type).md5(mavenArtifact.md5sum); return artifactBuilder.build(); } private String getMd5(String groupId, String fileName, MavenBuild mavenBuild) { String md5 = null; Fingerprinter.FingerprintAction fingerprint = ActionableHelper.getLatestAction( mavenBuild, Fingerprinter.FingerprintAction.class); if (fingerprint != null) { md5 = fingerprint.getRecords().get(groupId + ":" + fileName); } return md5; } }