package org.jfrog.hudson.pipeline.steps; import com.google.inject.Inject; import hudson.EnvVars; import hudson.Extension; import hudson.FilePath; import hudson.Launcher; import hudson.model.Result; import hudson.model.Run; import hudson.model.TaskListener; import org.apache.commons.lang.StringUtils; import org.jenkinsci.plugins.workflow.steps.AbstractStepDescriptorImpl; import org.jenkinsci.plugins.workflow.steps.AbstractStepImpl; import org.jenkinsci.plugins.workflow.steps.AbstractSynchronousNonBlockingStepExecution; import org.jenkinsci.plugins.workflow.steps.StepContextParameter; import org.jfrog.build.api.Build; import org.jfrog.build.api.BuildInfoFields; import org.jfrog.hudson.maven3.Maven3Builder; import org.jfrog.hudson.pipeline.Utils; import org.jfrog.hudson.pipeline.executors.MavenGradleEnvExtractor; import org.jfrog.hudson.pipeline.types.MavenBuild; import org.jfrog.hudson.pipeline.types.buildInfo.BuildInfo; import org.jfrog.hudson.pipeline.types.deployers.Deployer; import org.jfrog.hudson.pipeline.types.deployers.MavenDeployer; import org.kohsuke.stapler.DataBoundConstructor; /** * Created by Tamirh on 04/08/2016. */ public class ArtifactoryMavenBuild extends AbstractStepImpl { private MavenBuild mavenBuild; private String goal; private String pom; private String tool; private String opts; private BuildInfo buildInfo; @DataBoundConstructor public ArtifactoryMavenBuild(MavenBuild mavenBuild, String tool, String pom, String goals, String opts, BuildInfo buildInfo) { this.mavenBuild = mavenBuild; this.goal = goals == null ? "" : goals; this.pom = pom == null ? "" : pom; this.tool = tool == null ? "" : tool; this.opts = opts == null ? "" : opts; this.buildInfo = buildInfo; } public MavenBuild getMavenBuild() { return mavenBuild; } public String getTool() { return tool; } public String getOpts() { return opts; } public String getGoal() { return goal; } public String getPom() { return pom; } public BuildInfo getBuildInfo() { return buildInfo; } public void setMavenBuild(MavenBuild mavenBuild) { this.mavenBuild = mavenBuild; } public static class Execution extends AbstractSynchronousNonBlockingStepExecution<BuildInfo> { private static final long serialVersionUID = 1L; @StepContextParameter private transient Run build; @StepContextParameter private transient TaskListener listener; @StepContextParameter private transient Launcher launcher; @Inject(optional = true) private transient ArtifactoryMavenBuild step; @StepContextParameter private transient FilePath ws; @StepContextParameter private transient EnvVars env; @Override protected BuildInfo run() throws Exception { BuildInfo buildInfo = Utils.prepareBuildinfo(build, step.getBuildInfo()); Deployer deployer = getDeployer(); deployer.createPublisherBuildInfoDetails(buildInfo); MavenGradleEnvExtractor envExtractor = new MavenGradleEnvExtractor(build, buildInfo, deployer, step.getMavenBuild().getResolver(), listener, launcher); envExtractor.buildEnvVars(ws, env); String mavenOpts = step.getOpts() + (env.get("MAVEN_OPTS") != null ? env.get("MAVEN_OPTS") : ""); mavenOpts = mavenOpts.replaceAll("[\t\r\n]+", " "); Maven3Builder maven3Builder = new Maven3Builder(step.getTool(), step.getPom(), step.getGoal(), mavenOpts); convertJdkPath(); boolean result = maven3Builder.perform(build, launcher, listener, env, ws); if (!result) { build.setResult(Result.FAILURE); throw new RuntimeException("Maven build failed"); } String generatedBuildPath = env.get(BuildInfoFields.GENERATED_BUILD_INFO); Build regularBuildInfo = Utils.getGeneratedBuildInfo(build, listener, launcher, generatedBuildPath); buildInfo.append(regularBuildInfo); return buildInfo; } /** * The Maven3Builder class is looking for the PATH+JDK environment varibale due to legacy code. * In The pipeline flow we need to convert the JAVA_HOME to PATH+JDK in order to reuse the code. */ private void convertJdkPath() { String seperator = launcher.isUnix() ? "/" : "\\"; String java_home = env.get("JAVA_HOME"); if (StringUtils.isNotEmpty(java_home)) { if (!StringUtils.endsWith(java_home, seperator)) { java_home += seperator; } env.put("PATH+JDK", java_home + "bin"); } } private Deployer getDeployer() { Deployer deployer = step.getMavenBuild().getDeployer(); if (deployer == null || deployer.isEmpty()) { deployer = MavenDeployer.EMPTY_DEPLOYER; } return deployer; } } @Extension public static final class DescriptorImpl extends AbstractStepDescriptorImpl { public DescriptorImpl() { super(ArtifactoryMavenBuild.Execution.class); } @Override public String getFunctionName() { return "ArtifactoryMavenBuild"; } @Override public String getDisplayName() { return "run Artifactory maven"; } @Override public boolean isAdvanced() { return true; } } }