/******************************************************************************* * Copyright (c) 2017 Synopsys, Inc * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Synopsys, Inc - initial implementation and documentation *******************************************************************************/ package jenkins.plugins.coverity.CoverityTool; import java.io.File; import java.io.FilenameFilter; import hudson.EnvVars; import hudson.Launcher; import hudson.model.AbstractBuild; import hudson.model.BuildListener; import hudson.model.Executor; import hudson.model.Node; import hudson.model.Result; import jenkins.plugins.coverity.CIMInstance; import jenkins.plugins.coverity.CIMStream; import jenkins.plugins.coverity.CoverityInstallation; import jenkins.plugins.coverity.CoverityLauncherDecorator; import jenkins.plugins.coverity.CoverityPublisher; import jenkins.plugins.coverity.CoverityTempDir; import jenkins.plugins.coverity.CoverityUtils; import jenkins.plugins.coverity.CoverityVersion; import jenkins.plugins.coverity.InvocationAssistance; import jenkins.plugins.coverity.ScmOptionBlock; import jenkins.plugins.coverity.TaOptionBlock; import jenkins.plugins.coverity.ws.DefectReader; /** * CoverityToolHandler handles the actual executing of Coverity executables. */ public class CoverityToolHandler { private CoverityVersion version; public CoverityToolHandler(CoverityVersion version) { this.version = version; } public void perform(AbstractBuild<?, ?> build, Launcher launcher, BuildListener listener, CoverityPublisher publisher) throws Exception { EnvVars envVars = build.getEnvironment(listener); CoverityTempDir temp = build.getAction(CoverityTempDir.class); Node node = Executor.currentExecutor().getOwner().getNode(); String home = publisher.getDescriptor().getHome(node, build.getEnvironment(listener)); InvocationAssistance invocationAssistance = publisher.getInvocationAssistance(); CIMStream cimStream = publisher.getCimStream(); CIMInstance cim = publisher.getDescriptor().getInstance(cimStream.getInstance()); boolean useAdvancedParser = false; if(invocationAssistance != null && invocationAssistance.getUseAdvancedParser()){ useAdvancedParser = true; } if(invocationAssistance != null && invocationAssistance.getSaOverride() != null) { home = new CoverityInstallation(CoverityUtils.evaluateEnvVars(invocationAssistance.getSaOverride(), envVars, useAdvancedParser)).forEnvironment(build.getEnvironment(listener)).getHome(); } CoverityUtils.checkDir(launcher.getChannel(), home); /** * Fix Bug 84077 * Sets COV_ANALYSIS_ROOT and COV_IDIR so they are available to the scripts used, for instance, in the post * cov-build and cov-analyze commands. */ if (!envVars.containsKey("COV_IDIR")) { if (temp != null) { envVars.put("COV_IDIR", temp.getTempDir().getRemote()); } } if (!envVars.containsKey("COV_ANALYSIS_ROOT")) { envVars.put("COV_ANALYSIS_ROOT", home); } //run cov-build for scripting language sources only. try { CoverityLauncherDecorator.CoverityPostBuildAction.set(true); Command covBuildScriptCommand = new CovBuildScriptCommand(build, launcher, listener, publisher, home, envVars); int result = covBuildScriptCommand.runCommand(); if(result != 0) { listener.getLogger().println("[Coverity] cov-build returned " + result + ", aborting..."); build.setResult(Result.FAILURE); return; } } finally { CoverityLauncherDecorator.CoverityPostBuildAction.set(false); } //run post cov-build command. try { CoverityLauncherDecorator.CoverityPostBuildAction.set(true); Command postCovBuildCommand = new PostCovBuildCommand(build, launcher, listener, publisher, envVars); int result = postCovBuildCommand.runCommand(); if(result != 0) { listener.getLogger().println("[Coverity] post cov-build command returned " + result + ", aborting..."); build.setResult(Result.FAILURE); return; } } finally { CoverityLauncherDecorator.CoverityPostBuildAction.set(false); } // Run Cov-Emit-Java try { CoverityLauncherDecorator.CoverityPostBuildAction.set(true); Command covEmitJavaCommand = new CovEmitJavaCommand(build, launcher, listener, publisher, home, envVars, useAdvancedParser); int result = covEmitJavaCommand.runCommand(); if(result != 0) { listener.getLogger().println("[Coverity] cov-emit-java returned " + result + ", aborting..."); build.setResult(Result.FAILURE); return; } } finally { CoverityLauncherDecorator.CoverityPostBuildAction.set(false); } // Run Cov-Capture try { CoverityLauncherDecorator.CoverityPostBuildAction.set(true); Command covCaptureCommand = new CovCaptureCommand(build, launcher, listener, publisher, home, envVars); int result = covCaptureCommand.runCommand(); if(result != 0) { listener.getLogger().println("[Coverity] cov-capture returned " + result + ", aborting..."); build.setResult(Result.FAILURE); return; } } finally { CoverityLauncherDecorator.CoverityPostBuildAction.set(false); } // Run Cov Manage History try { CoverityLauncherDecorator.CoverityPostBuildAction.set(true); Command covManageHistoryCommand = new CovManageHistoryCommand(build, launcher, listener, publisher, home, envVars, cimStream, cim, version); int result = covManageHistoryCommand.runCommand(); if(result != 0) { listener.getLogger().println("[Coverity] cov-manage-history returned " + result + ", aborting..."); build.setResult(Result.FAILURE); return; } } finally { CoverityLauncherDecorator.CoverityPostBuildAction.set(false); } // Run Cov Import Scm try { CoverityLauncherDecorator.CoverityPostBuildAction.set(true); Command covImportScmCommand = new CovImportScmCommand(build, launcher, listener, publisher, home, envVars); int result = covImportScmCommand.runCommand(); if(result != 0) { listener.getLogger().println("[Coverity] cov-import-scm returned " + result + ", aborting..."); build.setResult(Result.FAILURE); return; } } finally { CoverityLauncherDecorator.CoverityPostBuildAction.set(false); } //run cov-analyze try { CoverityLauncherDecorator.CoverityPostBuildAction.set(true); Command covAnalyzeCommand = new CovAnalyzeCommand(build, launcher, listener, publisher, home, envVars); int result = covAnalyzeCommand.runCommand(); if(result != 0) { listener.getLogger().println("[Coverity] cov-analyze returned " + result + ", aborting..."); build.setResult(Result.FAILURE); return; } } finally { CoverityLauncherDecorator.CoverityPostBuildAction.set(false); } //run post cov-analyze command. try { CoverityLauncherDecorator.CoverityPostBuildAction.set(true); Command postCovAnalyzeCommand = new PostCovAnalyzeCommand(build, launcher, listener, publisher, envVars); int result = postCovAnalyzeCommand.runCommand(); if(result != 0) { listener.getLogger().println("[Coverity] post cov-analyze command returned " + result + ", aborting..."); build.setResult(Result.FAILURE); return; } } finally { CoverityLauncherDecorator.CoverityPostBuildAction.set(false); } // Import Microsoft Visual Studio Code Anaysis results try{ CoverityLauncherDecorator.CoverityPostBuildAction.set(true); Command covImportMsvscaCommand = new CovImportMsvscaCommand(build, launcher, listener, publisher, home, envVars, build.getWorkspace()); int result = covImportMsvscaCommand.runCommand(); if(result != 0) { listener.getLogger().println("[Coverity] cov-import-msvsca returned " + result + ", aborting..."); build.setResult(Result.FAILURE); return; } }finally{ CoverityLauncherDecorator.CoverityPostBuildAction.set(false); } //run cov-commit-defects try { CoverityLauncherDecorator.CoverityPostBuildAction.set(true); Command covCommitDefectsCommand = new CovCommitDefectsCommand(build, launcher, listener, publisher, home, envVars, cimStream, cim, version); int result = covCommitDefectsCommand.runCommand(); if(result != 0) { listener.getLogger().println("[Coverity] cov-commit-defects returned " + result + ", aborting..."); build.setResult(Result.FAILURE); return; } } finally { CoverityLauncherDecorator.CoverityPostBuildAction.set(false); } if(!publisher.isSkipFetchingDefects()) { DefectReader defectReader = new DefectReader(build, listener, publisher); defectReader.getLatestDefectsForBuild(); } } }