package org.jfrog.hudson.pipeline; import hudson.model.Run; import hudson.model.TaskListener; import org.apache.commons.lang.StringUtils; import org.jfrog.build.api.*; import org.jfrog.build.api.builder.BuildInfoBuilder; import org.jfrog.build.api.dependency.BuildDependency; import org.jfrog.build.extractor.clientConfiguration.client.ArtifactoryBuildInfoClient; import org.jfrog.hudson.AbstractBuildInfoDeployer; import org.jfrog.hudson.BuildInfoResultAction; import org.jfrog.hudson.pipeline.types.buildInfo.BuildInfoAccessor; import java.io.IOException; import java.security.NoSuchAlgorithmException; import java.util.ArrayList; import java.util.List; import java.util.Map; import static org.jfrog.build.client.ArtifactoryHttpClient.encodeUrl; /** * Created by romang on 4/25/16. */ public class BuildInfoDeployer extends AbstractBuildInfoDeployer { private final Run build; private final Map<String, String> sysVars; private final Map<String, String> envVars; private ArtifactoryConfigurator configurator; private Build buildInfo; public BuildInfoDeployer(ArtifactoryConfigurator configurator, ArtifactoryBuildInfoClient client, Run build, TaskListener listener, BuildInfoAccessor buildinfoAccessor) throws IOException, InterruptedException, NoSuchAlgorithmException { super(configurator, build, listener, client); this.configurator = configurator; this.build = build; envVars = buildinfoAccessor.getEnvVars(); sysVars = buildinfoAccessor.getSysVars(); buildInfo = createBuildInfo("Pipeline", "Pipeline", BuildType.GENERIC); buildInfo.setBuildRetention(buildinfoAccessor.getRetention().build()); if (buildinfoAccessor.getStartDate() != null) { buildInfo.setStartedDate(buildinfoAccessor.getStartDate()); } buildInfo.setModules(new ArrayList<Module>(buildinfoAccessor.getModules())); this.buildInfo.setBuildDependencies(new ArrayList<BuildDependency>(buildinfoAccessor.getBuildDependencies())); if (StringUtils.isNotEmpty(buildinfoAccessor.getBuildName())) { buildInfo.setName(buildinfoAccessor.getBuildName()); } if (StringUtils.isNotEmpty(buildinfoAccessor.getBuildNumber())) { buildInfo.setNumber(buildinfoAccessor.getBuildNumber()); } addVcsDataToBuild(build); } private void addVcsDataToBuild(Run build) { List<Vcs> vcsList = Utils.extractVcsBuildData(build); buildInfo.setVcs(vcsList); } public void deploy() throws IOException { String artifactoryUrl = configurator.getArtifactoryServer().getUrl(); listener.getLogger().println("Deploying build info to: " + artifactoryUrl + "/api/build"); BuildRetention retention = buildInfo.getBuildRetention(); buildInfo.setBuildRetention(null); org.jfrog.build.extractor.retention.Utils.sendBuildAndBuildRetention(client, this.buildInfo, retention); String url = artifactoryUrl + ArtifactoryBuildInfoClient.BUILD_BROWSE_URL + "/" + encodeUrl(buildInfo.getName()) + "/" + encodeUrl(buildInfo.getNumber()); listener.getLogger().println("Build successfully deployed. Browse it in Artifactory under " + url); addBuildInfoResultAction(artifactoryUrl); } private void addBuildInfoResultAction(String artifactoryUrl) { synchronized (build.getActions()) { BuildInfoResultAction action = build.getAction(BuildInfoResultAction.class); if (action == null) { action = new BuildInfoResultAction(build); build.getActions().add(action); } action.addBuildInfoResults(artifactoryUrl, buildInfo); } } /** * Adding environment and system variables to build info. * * @param builder */ @Override protected void addBuildInfoProperties(BuildInfoBuilder builder) { if (envVars != null) { for (Map.Entry<String, String> entry : envVars.entrySet()) { builder.addProperty(BuildInfoProperties.BUILD_INFO_ENVIRONMENT_PREFIX + entry.getKey(), entry.getValue()); } } if (sysVars != null) { for (Map.Entry<String, String> entry : sysVars.entrySet()) { builder.addProperty(entry.getKey(), entry.getValue()); } } } }