Mercurial > hg > tc-symbol-server
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 } |