comparison agent/src/jetbrains/buildServer/symbols/SymbolsIndexer.java @ 27:76ed2d58c871

- reused home path between all srcsrv-related utilities - extracted JetSymbols utility class
author Evgeniy.Koshkin
date Wed, 07 Aug 2013 18:37:23 +0400
parents 87b24e4efcc3
children b983676b66f9
comparison
equal deleted inserted replaced
26:87b24e4efcc3 27:76ed2d58c871
1 package jetbrains.buildServer.symbols; 1 package jetbrains.buildServer.symbols;
2 2
3 import com.intellij.execution.configurations.GeneralCommandLine;
4 import jetbrains.buildServer.ExecResult;
5 import jetbrains.buildServer.SimpleCommandLineProcessRunner;
6 import jetbrains.buildServer.agent.*; 3 import jetbrains.buildServer.agent.*;
7 import jetbrains.buildServer.agent.artifacts.ArtifactsWatcher; 4 import jetbrains.buildServer.agent.artifacts.ArtifactsWatcher;
8 import jetbrains.buildServer.agent.impl.artifacts.ArtifactsBuilderAdapter; 5 import jetbrains.buildServer.agent.impl.artifacts.ArtifactsBuilderAdapter;
9 import jetbrains.buildServer.agent.impl.artifacts.ArtifactsCollection; 6 import jetbrains.buildServer.agent.impl.artifacts.ArtifactsCollection;
10 import jetbrains.buildServer.agent.plugins.beans.PluginDescriptor; 7 import jetbrains.buildServer.agent.plugins.beans.PluginDescriptor;
8 import jetbrains.buildServer.symbols.tools.JetSymbolsExe;
11 import jetbrains.buildServer.util.EventDispatcher; 9 import jetbrains.buildServer.util.EventDispatcher;
12 import jetbrains.buildServer.util.FileUtil; 10 import jetbrains.buildServer.util.FileUtil;
13 import org.apache.log4j.Logger; 11 import org.apache.log4j.Logger;
14 import org.jetbrains.annotations.NotNull; 12 import org.jetbrains.annotations.NotNull;
15 import org.jetbrains.annotations.Nullable; 13 import org.jetbrains.annotations.Nullable;
16 14
17 import java.io.File; 15 import java.io.File;
18 import java.io.IOException; 16 import java.io.IOException;
19 import java.util.*; 17 import java.util.Collection;
18 import java.util.HashSet;
19 import java.util.List;
20 import java.util.concurrent.CopyOnWriteArrayList; 20 import java.util.concurrent.CopyOnWriteArrayList;
21 21
22 /** 22 /**
23 * @author Evgeniy.Koshkin 23 * @author Evgeniy.Koshkin
24 */ 24 */
26 26
27 private static final Logger LOG = Logger.getLogger(SymbolsIndexer.class); 27 private static final Logger LOG = Logger.getLogger(SymbolsIndexer.class);
28 28
29 public static final String PDB_FILE_EXTENSION = "pdb"; 29 public static final String PDB_FILE_EXTENSION = "pdb";
30 30
31 public static final String SYMBOLS_EXE = "JetBrains.CommandLine.Symbols.exe";
32 public static final String DUMP_SYMBOL_SIGN_CMD = "dumpSymbolSign";
33
34 @NotNull private final ArtifactsWatcher myArtifactsWatcher; 31 @NotNull private final ArtifactsWatcher myArtifactsWatcher;
35 @NotNull private final File myNativeToolPath; 32 @NotNull private final JetSymbolsExe myJetSymbolsExe;
36 @Nullable private AgentRunningBuild myBuild; 33 @Nullable private AgentRunningBuild myBuild;
37 @Nullable private Collection<File> mySymbolsToProcess; 34 @Nullable private Collection<File> mySymbolsToProcess;
38 35
39 public SymbolsIndexer(@NotNull final PluginDescriptor pluginDescriptor, @NotNull final EventDispatcher<AgentLifeCycleListener> agentDispatcher, @NotNull final ArtifactsWatcher artifactsWatcher) { 36 public SymbolsIndexer(@NotNull final PluginDescriptor pluginDescriptor, @NotNull final EventDispatcher<AgentLifeCycleListener> agentDispatcher, @NotNull final ArtifactsWatcher artifactsWatcher) {
40 myArtifactsWatcher = artifactsWatcher; 37 myArtifactsWatcher = artifactsWatcher;
41 myNativeToolPath = new File(new File(pluginDescriptor.getPluginRoot(), "bin"), SYMBOLS_EXE); 38 myJetSymbolsExe = new JetSymbolsExe(new File(pluginDescriptor.getPluginRoot(), "bin"));
42 39
43 agentDispatcher.addListener(new AgentLifeCycleAdapter() { 40 agentDispatcher.addListener(new AgentLifeCycleAdapter() {
44 @Override 41 @Override
45 public void buildStarted(@NotNull final AgentRunningBuild runningBuild) { 42 public void buildStarted(@NotNull final AgentRunningBuild runningBuild) {
46 myBuild = runningBuild; 43 myBuild = runningBuild;
56 if (mySymbolsToProcess.isEmpty()) { 53 if (mySymbolsToProcess.isEmpty()) {
57 myBuild.getBuildLogger().warning("Symbols weren't found in artifacts to be published."); 54 myBuild.getBuildLogger().warning("Symbols weren't found in artifacts to be published.");
58 LOG.debug("Symbols weren't found in artifacts to be published."); 55 LOG.debug("Symbols weren't found in artifacts to be published.");
59 } else { 56 } else {
60 try { 57 try {
61 final File symbolSignaturesFile = dumpSymbolSignatures(mySymbolsToProcess, myBuild.getBuildTempDirectory(), myBuild.getBuildLogger()); 58 final File symbolSignaturesFile = FileUtil.createTempFile(myBuild.getBuildTempDirectory(), "symbol-signatures-", ".xml", false);
59 myJetSymbolsExe.dumpGuidsToFile(mySymbolsToProcess, symbolSignaturesFile, myBuild.getBuildLogger());
62 if(symbolSignaturesFile.exists()){ 60 if(symbolSignaturesFile.exists()){
63 myArtifactsWatcher.addNewArtifactsPath(symbolSignaturesFile + "=>" + ".teamcity/symbols"); 61 myArtifactsWatcher.addNewArtifactsPath(symbolSignaturesFile + "=>" + ".teamcity/symbols");
64 } 62 }
65 } catch (IOException e) { 63 } catch (IOException e) {
66 LOG.error("Error while dumping symbols/binaries signatures.", e); 64 LOG.error("Error while dumping symbols/binaries signatures.", e);
129 result.add(artifact); 127 result.add(artifact);
130 } 128 }
131 } 129 }
132 return result; 130 return result;
133 } 131 }
134
135 private File dumpSymbolSignatures(Collection<File> files, File targetDir, BuildProgressLogger buildLogger) throws IOException {
136 final File tempFile = FileUtil.createTempFile(targetDir, "symbol-signatures-", ".xml", false);
137 runNativeTool(DUMP_SYMBOL_SIGN_CMD, files, tempFile, buildLogger);
138 return tempFile;
139 }
140
141 private void runNativeTool(String cmd, Collection<File> files, File output, BuildProgressLogger buildLogger){
142 final GeneralCommandLine commandLine = new GeneralCommandLine();
143 commandLine.setExePath(myNativeToolPath.getPath());
144 commandLine.addParameter(cmd);
145 commandLine.addParameter(String.format("/o=\"%s\"", output.getPath()));
146 for(File file : files){
147 commandLine.addParameter(file.getPath());
148 }
149 buildLogger.message(String.format("Running command %s", commandLine.getCommandLineString()));
150 final ExecResult execResult = SimpleCommandLineProcessRunner.runCommand(commandLine, null);
151 final String stdout = execResult.getStdout();
152 if(!stdout.isEmpty()){
153 buildLogger.message("Stdout: " + stdout);
154 }
155 if (execResult.getExitCode() == 0) return;
156 buildLogger.warning(String.format("%s ends with non-zero exit code.", SYMBOLS_EXE));
157 buildLogger.warning("Stdout: " + stdout);
158 buildLogger.warning("Stderr: " + execResult.getStderr());
159 buildLogger.exception(execResult.getException());
160 }
161 } 132 }