Mercurial > hg > tc-symbol-server
annotate agent/src/jetbrains/buildServer/symbols/SymbolsIndexer.java @ 25:f4e0050e2a2f
resolve server url from config parameter
author | Evgeniy.Koshkin |
---|---|
date | Tue, 06 Aug 2013 14:18:09 +0400 |
parents | 7bd8a756aa78 |
children | 87b24e4efcc3 |
rev | line source |
---|---|
2
c6ca0a26d93e
initial implementation of agent-side symbol indexer
Evgeniy.Koshkin
parents:
diff
changeset
|
1 package jetbrains.buildServer.symbols; |
c6ca0a26d93e
initial implementation of agent-side symbol indexer
Evgeniy.Koshkin
parents:
diff
changeset
|
2 |
c6ca0a26d93e
initial implementation of agent-side symbol indexer
Evgeniy.Koshkin
parents:
diff
changeset
|
3 import com.intellij.execution.configurations.GeneralCommandLine; |
c6ca0a26d93e
initial implementation of agent-side symbol indexer
Evgeniy.Koshkin
parents:
diff
changeset
|
4 import jetbrains.buildServer.ExecResult; |
c6ca0a26d93e
initial implementation of agent-side symbol indexer
Evgeniy.Koshkin
parents:
diff
changeset
|
5 import jetbrains.buildServer.SimpleCommandLineProcessRunner; |
3 | 6 import jetbrains.buildServer.agent.*; |
2
c6ca0a26d93e
initial implementation of agent-side symbol indexer
Evgeniy.Koshkin
parents:
diff
changeset
|
7 import jetbrains.buildServer.agent.artifacts.ArtifactsWatcher; |
c6ca0a26d93e
initial implementation of agent-side symbol indexer
Evgeniy.Koshkin
parents:
diff
changeset
|
8 import jetbrains.buildServer.agent.impl.artifacts.ArtifactsBuilderAdapter; |
c6ca0a26d93e
initial implementation of agent-side symbol indexer
Evgeniy.Koshkin
parents:
diff
changeset
|
9 import jetbrains.buildServer.agent.impl.artifacts.ArtifactsCollection; |
c6ca0a26d93e
initial implementation of agent-side symbol indexer
Evgeniy.Koshkin
parents:
diff
changeset
|
10 import jetbrains.buildServer.agent.plugins.beans.PluginDescriptor; |
c6ca0a26d93e
initial implementation of agent-side symbol indexer
Evgeniy.Koshkin
parents:
diff
changeset
|
11 import jetbrains.buildServer.util.EventDispatcher; |
c6ca0a26d93e
initial implementation of agent-side symbol indexer
Evgeniy.Koshkin
parents:
diff
changeset
|
12 import jetbrains.buildServer.util.FileUtil; |
c6ca0a26d93e
initial implementation of agent-side symbol indexer
Evgeniy.Koshkin
parents:
diff
changeset
|
13 import org.apache.log4j.Logger; |
c6ca0a26d93e
initial implementation of agent-side symbol indexer
Evgeniy.Koshkin
parents:
diff
changeset
|
14 import org.jetbrains.annotations.NotNull; |
c6ca0a26d93e
initial implementation of agent-side symbol indexer
Evgeniy.Koshkin
parents:
diff
changeset
|
15 import org.jetbrains.annotations.Nullable; |
c6ca0a26d93e
initial implementation of agent-side symbol indexer
Evgeniy.Koshkin
parents:
diff
changeset
|
16 |
c6ca0a26d93e
initial implementation of agent-side symbol indexer
Evgeniy.Koshkin
parents:
diff
changeset
|
17 import java.io.File; |
c6ca0a26d93e
initial implementation of agent-side symbol indexer
Evgeniy.Koshkin
parents:
diff
changeset
|
18 import java.io.IOException; |
c6ca0a26d93e
initial implementation of agent-side symbol indexer
Evgeniy.Koshkin
parents:
diff
changeset
|
19 import java.util.*; |
c6ca0a26d93e
initial implementation of agent-side symbol indexer
Evgeniy.Koshkin
parents:
diff
changeset
|
20 |
c6ca0a26d93e
initial implementation of agent-side symbol indexer
Evgeniy.Koshkin
parents:
diff
changeset
|
21 /** |
c6ca0a26d93e
initial implementation of agent-side symbol indexer
Evgeniy.Koshkin
parents:
diff
changeset
|
22 * @author Evgeniy.Koshkin |
c6ca0a26d93e
initial implementation of agent-side symbol indexer
Evgeniy.Koshkin
parents:
diff
changeset
|
23 */ |
c6ca0a26d93e
initial implementation of agent-side symbol indexer
Evgeniy.Koshkin
parents:
diff
changeset
|
24 public class SymbolsIndexer extends ArtifactsBuilderAdapter { |
c6ca0a26d93e
initial implementation of agent-side symbol indexer
Evgeniy.Koshkin
parents:
diff
changeset
|
25 |
7 | 26 private static final Logger LOG = Logger.getLogger(SymbolsIndexer.class); |
2
c6ca0a26d93e
initial implementation of agent-side symbol indexer
Evgeniy.Koshkin
parents:
diff
changeset
|
27 |
c6ca0a26d93e
initial implementation of agent-side symbol indexer
Evgeniy.Koshkin
parents:
diff
changeset
|
28 public static final String PDB_FILE_EXTENSION = "pdb"; |
c6ca0a26d93e
initial implementation of agent-side symbol indexer
Evgeniy.Koshkin
parents:
diff
changeset
|
29 |
5 | 30 public static final String SYMBOLS_EXE = "JetBrains.CommandLine.Symbols.exe"; |
2
c6ca0a26d93e
initial implementation of agent-side symbol indexer
Evgeniy.Koshkin
parents:
diff
changeset
|
31 public static final String DUMP_SYMBOL_SIGN_CMD = "dumpSymbolSign"; |
c6ca0a26d93e
initial implementation of agent-side symbol indexer
Evgeniy.Koshkin
parents:
diff
changeset
|
32 |
c6ca0a26d93e
initial implementation of agent-side symbol indexer
Evgeniy.Koshkin
parents:
diff
changeset
|
33 @NotNull private final ArtifactsWatcher myArtifactsWatcher; |
c6ca0a26d93e
initial implementation of agent-side symbol indexer
Evgeniy.Koshkin
parents:
diff
changeset
|
34 @NotNull private final File myNativeToolPath; |
c6ca0a26d93e
initial implementation of agent-side symbol indexer
Evgeniy.Koshkin
parents:
diff
changeset
|
35 @Nullable private AgentRunningBuild myBuild; |
c6ca0a26d93e
initial implementation of agent-side symbol indexer
Evgeniy.Koshkin
parents:
diff
changeset
|
36 @Nullable private Collection<File> mySymbolsToProcess; |
c6ca0a26d93e
initial implementation of agent-side symbol indexer
Evgeniy.Koshkin
parents:
diff
changeset
|
37 |
c6ca0a26d93e
initial implementation of agent-side symbol indexer
Evgeniy.Koshkin
parents:
diff
changeset
|
38 public SymbolsIndexer(@NotNull final PluginDescriptor pluginDescriptor, @NotNull final EventDispatcher<AgentLifeCycleListener> agentDispatcher, @NotNull final ArtifactsWatcher artifactsWatcher) { |
12 | 39 myArtifactsWatcher = artifactsWatcher; |
2
c6ca0a26d93e
initial implementation of agent-side symbol indexer
Evgeniy.Koshkin
parents:
diff
changeset
|
40 myNativeToolPath = new File(new File(pluginDescriptor.getPluginRoot(), "bin"), SYMBOLS_EXE); |
12 | 41 |
2
c6ca0a26d93e
initial implementation of agent-side symbol indexer
Evgeniy.Koshkin
parents:
diff
changeset
|
42 agentDispatcher.addListener(new AgentLifeCycleAdapter() { |
c6ca0a26d93e
initial implementation of agent-side symbol indexer
Evgeniy.Koshkin
parents:
diff
changeset
|
43 @Override |
c6ca0a26d93e
initial implementation of agent-side symbol indexer
Evgeniy.Koshkin
parents:
diff
changeset
|
44 public void buildStarted(@NotNull final AgentRunningBuild runningBuild) { |
c6ca0a26d93e
initial implementation of agent-side symbol indexer
Evgeniy.Koshkin
parents:
diff
changeset
|
45 myBuild = runningBuild; |
c6ca0a26d93e
initial implementation of agent-side symbol indexer
Evgeniy.Koshkin
parents:
diff
changeset
|
46 mySymbolsToProcess = new HashSet<File>(); |
c6ca0a26d93e
initial implementation of agent-side symbol indexer
Evgeniy.Koshkin
parents:
diff
changeset
|
47 } |
c6ca0a26d93e
initial implementation of agent-side symbol indexer
Evgeniy.Koshkin
parents:
diff
changeset
|
48 |
c6ca0a26d93e
initial implementation of agent-side symbol indexer
Evgeniy.Koshkin
parents:
diff
changeset
|
49 @Override |
5 | 50 public void afterAtrifactsPublished(@NotNull AgentRunningBuild build, @NotNull BuildFinishedStatus buildStatus) { |
51 super.afterAtrifactsPublished(build, buildStatus); | |
12 | 52 if (myBuild == null || mySymbolsToProcess == null) return; |
3 | 53 if(myBuild.getBuildFeaturesOfType(SymbolsConstants.BUILD_FEATURE_TYPE).isEmpty()) return; |
54 | |
2
c6ca0a26d93e
initial implementation of agent-side symbol indexer
Evgeniy.Koshkin
parents:
diff
changeset
|
55 if (mySymbolsToProcess.isEmpty()) { |
3 | 56 myBuild.getBuildLogger().warning("Symbols weren't found in artifacts to be published."); |
2
c6ca0a26d93e
initial implementation of agent-side symbol indexer
Evgeniy.Koshkin
parents:
diff
changeset
|
57 LOG.debug("Symbols weren't found in artifacts to be published."); |
c6ca0a26d93e
initial implementation of agent-side symbol indexer
Evgeniy.Koshkin
parents:
diff
changeset
|
58 } else { |
c6ca0a26d93e
initial implementation of agent-side symbol indexer
Evgeniy.Koshkin
parents:
diff
changeset
|
59 try { |
12 | 60 final File symbolSignaturesFile = dumpSymbolSignatures(mySymbolsToProcess, myBuild.getBuildTempDirectory(), myBuild.getBuildLogger()); |
5 | 61 if(symbolSignaturesFile.exists()){ |
62 myArtifactsWatcher.addNewArtifactsPath(symbolSignaturesFile + "=>" + ".teamcity/symbols"); | |
63 } | |
2
c6ca0a26d93e
initial implementation of agent-side symbol indexer
Evgeniy.Koshkin
parents:
diff
changeset
|
64 } catch (IOException e) { |
c6ca0a26d93e
initial implementation of agent-side symbol indexer
Evgeniy.Koshkin
parents:
diff
changeset
|
65 LOG.error("Error while dumping symbols/binaries signatures.", e); |
5 | 66 myBuild.getBuildLogger().error("Error while dumping symbols/binaries signatures."); |
67 myBuild.getBuildLogger().exception(e); | |
2
c6ca0a26d93e
initial implementation of agent-side symbol indexer
Evgeniy.Koshkin
parents:
diff
changeset
|
68 } |
c6ca0a26d93e
initial implementation of agent-side symbol indexer
Evgeniy.Koshkin
parents:
diff
changeset
|
69 } |
c6ca0a26d93e
initial implementation of agent-side symbol indexer
Evgeniy.Koshkin
parents:
diff
changeset
|
70 mySymbolsToProcess = null; |
c6ca0a26d93e
initial implementation of agent-side symbol indexer
Evgeniy.Koshkin
parents:
diff
changeset
|
71 myBuild = null; |
c6ca0a26d93e
initial implementation of agent-side symbol indexer
Evgeniy.Koshkin
parents:
diff
changeset
|
72 } |
c6ca0a26d93e
initial implementation of agent-side symbol indexer
Evgeniy.Koshkin
parents:
diff
changeset
|
73 }); |
c6ca0a26d93e
initial implementation of agent-side symbol indexer
Evgeniy.Koshkin
parents:
diff
changeset
|
74 } |
c6ca0a26d93e
initial implementation of agent-side symbol indexer
Evgeniy.Koshkin
parents:
diff
changeset
|
75 |
c6ca0a26d93e
initial implementation of agent-side symbol indexer
Evgeniy.Koshkin
parents:
diff
changeset
|
76 @Override |
c6ca0a26d93e
initial implementation of agent-side symbol indexer
Evgeniy.Koshkin
parents:
diff
changeset
|
77 public void afterCollectingFiles(@NotNull List<ArtifactsCollection> artifacts) { |
c6ca0a26d93e
initial implementation of agent-side symbol indexer
Evgeniy.Koshkin
parents:
diff
changeset
|
78 super.afterCollectingFiles(artifacts); |
12 | 79 if(myBuild == null || mySymbolsToProcess == null) return; |
18
d1c5ce19d0f7
added warning in case source info was not found in pdb
Evgeniy.Koshkin
parents:
14
diff
changeset
|
80 final BuildProgressLogger buildLogger = myBuild.getBuildLogger(); |
2
c6ca0a26d93e
initial implementation of agent-side symbol indexer
Evgeniy.Koshkin
parents:
diff
changeset
|
81 if(myBuild.getBuildFeaturesOfType(SymbolsConstants.BUILD_FEATURE_TYPE).isEmpty()){ |
c6ca0a26d93e
initial implementation of agent-side symbol indexer
Evgeniy.Koshkin
parents:
diff
changeset
|
82 LOG.debug(SymbolsConstants.BUILD_FEATURE_TYPE + " build feature disabled. No indexing performed."); |
c6ca0a26d93e
initial implementation of agent-side symbol indexer
Evgeniy.Koshkin
parents:
diff
changeset
|
83 return; |
c6ca0a26d93e
initial implementation of agent-side symbol indexer
Evgeniy.Koshkin
parents:
diff
changeset
|
84 } |
5 | 85 LOG.debug(SymbolsConstants.BUILD_FEATURE_TYPE + " build feature enabled. Searching for suitable files."); |
20 | 86 final Collection<File> pdbFiles = getArtifactPathsByFileExtension(artifacts, PDB_FILE_EXTENSION); |
25 | 87 if(pdbFiles.isEmpty()) return; |
88 | |
89 final FileUrlProvider urlProvider = getUrlProviderForBuild(myBuild, buildLogger); | |
90 if(urlProvider == null) return; | |
91 | |
92 final PdbFilePatcher pdbFilePatcher = new PdbFilePatcher(myBuild.getBuildTempDirectory(), new SrcSrvStreamBuilder(urlProvider)); | |
12 | 93 for(File pdbFile : pdbFiles){ |
94 try { | |
18
d1c5ce19d0f7
added warning in case source info was not found in pdb
Evgeniy.Koshkin
parents:
14
diff
changeset
|
95 buildLogger.message("Indexing sources appeared in file " + pdbFile.getAbsolutePath()); |
d1c5ce19d0f7
added warning in case source info was not found in pdb
Evgeniy.Koshkin
parents:
14
diff
changeset
|
96 pdbFilePatcher.patch(pdbFile, buildLogger); |
12 | 97 mySymbolsToProcess.add(pdbFile); |
98 } catch (Throwable e) { | |
99 LOG.error("Error occurred while patching symbols file " + pdbFile, e); | |
18
d1c5ce19d0f7
added warning in case source info was not found in pdb
Evgeniy.Koshkin
parents:
14
diff
changeset
|
100 buildLogger.error("Error occurred while patching symbols file " + pdbFile); |
d1c5ce19d0f7
added warning in case source info was not found in pdb
Evgeniy.Koshkin
parents:
14
diff
changeset
|
101 buildLogger.exception(e); |
12 | 102 } |
103 } | |
2
c6ca0a26d93e
initial implementation of agent-side symbol indexer
Evgeniy.Koshkin
parents:
diff
changeset
|
104 } |
c6ca0a26d93e
initial implementation of agent-side symbol indexer
Evgeniy.Koshkin
parents:
diff
changeset
|
105 |
25 | 106 @Nullable |
107 private FileUrlProvider getUrlProviderForBuild(@NotNull AgentRunningBuild build, BuildProgressLogger buildLogger) { | |
108 String serverUrl = build.getSharedConfigParameters().get(SymbolsConstants.SERVER_URL_PARAMETER_NAME); | |
109 if(serverUrl == null){ | |
110 final String message = String.format("Configuration parameter %s was not set. ", SymbolsConstants.SERVER_URL_PARAMETER_NAME); | |
111 LOG.warn(message); | |
112 buildLogger.warning(message); | |
113 return null; | |
114 } | |
115 return new FileUrlProvider(serverUrl, build.getBuildId(), build.getCheckoutDirectory()); | |
116 } | |
117 | |
2
c6ca0a26d93e
initial implementation of agent-side symbol indexer
Evgeniy.Koshkin
parents:
diff
changeset
|
118 private Collection<File> getArtifactPathsByFileExtension(List<ArtifactsCollection> artifactsCollections, String fileExtension){ |
c6ca0a26d93e
initial implementation of agent-side symbol indexer
Evgeniy.Koshkin
parents:
diff
changeset
|
119 final Collection<File> result = new HashSet<File>(); |
c6ca0a26d93e
initial implementation of agent-side symbol indexer
Evgeniy.Koshkin
parents:
diff
changeset
|
120 for(ArtifactsCollection artifactsCollection : artifactsCollections){ |
c6ca0a26d93e
initial implementation of agent-side symbol indexer
Evgeniy.Koshkin
parents:
diff
changeset
|
121 if(artifactsCollection.isEmpty()) continue; |
c6ca0a26d93e
initial implementation of agent-side symbol indexer
Evgeniy.Koshkin
parents:
diff
changeset
|
122 for (File artifact : artifactsCollection.getFilePathMap().keySet()){ |
c6ca0a26d93e
initial implementation of agent-side symbol indexer
Evgeniy.Koshkin
parents:
diff
changeset
|
123 if(FileUtil.getExtension(artifact.getPath()).equalsIgnoreCase(fileExtension)) |
c6ca0a26d93e
initial implementation of agent-side symbol indexer
Evgeniy.Koshkin
parents:
diff
changeset
|
124 result.add(artifact); |
c6ca0a26d93e
initial implementation of agent-side symbol indexer
Evgeniy.Koshkin
parents:
diff
changeset
|
125 } |
c6ca0a26d93e
initial implementation of agent-side symbol indexer
Evgeniy.Koshkin
parents:
diff
changeset
|
126 } |
c6ca0a26d93e
initial implementation of agent-side symbol indexer
Evgeniy.Koshkin
parents:
diff
changeset
|
127 return result; |
c6ca0a26d93e
initial implementation of agent-side symbol indexer
Evgeniy.Koshkin
parents:
diff
changeset
|
128 } |
c6ca0a26d93e
initial implementation of agent-side symbol indexer
Evgeniy.Koshkin
parents:
diff
changeset
|
129 |
3 | 130 private File dumpSymbolSignatures(Collection<File> files, File targetDir, BuildProgressLogger buildLogger) throws IOException { |
2
c6ca0a26d93e
initial implementation of agent-side symbol indexer
Evgeniy.Koshkin
parents:
diff
changeset
|
131 final File tempFile = FileUtil.createTempFile(targetDir, "symbol-signatures-", ".xml", false); |
12 | 132 runNativeTool(DUMP_SYMBOL_SIGN_CMD, files, tempFile, buildLogger); |
2
c6ca0a26d93e
initial implementation of agent-side symbol indexer
Evgeniy.Koshkin
parents:
diff
changeset
|
133 return tempFile; |
c6ca0a26d93e
initial implementation of agent-side symbol indexer
Evgeniy.Koshkin
parents:
diff
changeset
|
134 } |
c6ca0a26d93e
initial implementation of agent-side symbol indexer
Evgeniy.Koshkin
parents:
diff
changeset
|
135 |
12 | 136 private void runNativeTool(String cmd, Collection<File> files, File output, BuildProgressLogger buildLogger){ |
2
c6ca0a26d93e
initial implementation of agent-side symbol indexer
Evgeniy.Koshkin
parents:
diff
changeset
|
137 final GeneralCommandLine commandLine = new GeneralCommandLine(); |
c6ca0a26d93e
initial implementation of agent-side symbol indexer
Evgeniy.Koshkin
parents:
diff
changeset
|
138 commandLine.setExePath(myNativeToolPath.getPath()); |
c6ca0a26d93e
initial implementation of agent-side symbol indexer
Evgeniy.Koshkin
parents:
diff
changeset
|
139 commandLine.addParameter(cmd); |
c6ca0a26d93e
initial implementation of agent-side symbol indexer
Evgeniy.Koshkin
parents:
diff
changeset
|
140 commandLine.addParameter(String.format("/o=\"%s\"", output.getPath())); |
c6ca0a26d93e
initial implementation of agent-side symbol indexer
Evgeniy.Koshkin
parents:
diff
changeset
|
141 for(File file : files){ |
c6ca0a26d93e
initial implementation of agent-side symbol indexer
Evgeniy.Koshkin
parents:
diff
changeset
|
142 commandLine.addParameter(file.getPath()); |
c6ca0a26d93e
initial implementation of agent-side symbol indexer
Evgeniy.Koshkin
parents:
diff
changeset
|
143 } |
5 | 144 buildLogger.message(String.format("Running command %s", commandLine.getCommandLineString())); |
2
c6ca0a26d93e
initial implementation of agent-side symbol indexer
Evgeniy.Koshkin
parents:
diff
changeset
|
145 final ExecResult execResult = SimpleCommandLineProcessRunner.runCommand(commandLine, null); |
21 | 146 final String stdout = execResult.getStdout(); |
147 if(!stdout.isEmpty()){ | |
148 buildLogger.message("Stdout: " + stdout); | |
149 } | |
2
c6ca0a26d93e
initial implementation of agent-side symbol indexer
Evgeniy.Koshkin
parents:
diff
changeset
|
150 if (execResult.getExitCode() == 0) return; |
5 | 151 buildLogger.warning(String.format("%s ends with non-zero exit code.", SYMBOLS_EXE)); |
21 | 152 buildLogger.warning("Stdout: " + stdout); |
153 buildLogger.warning("Stderr: " + execResult.getStderr()); | |
14
5856cab1ca05
logged exception end output of the native symbols utility
Evgeniy.Koshkin
parents:
12
diff
changeset
|
154 buildLogger.exception(execResult.getException()); |
2
c6ca0a26d93e
initial implementation of agent-side symbol indexer
Evgeniy.Koshkin
parents:
diff
changeset
|
155 } |
c6ca0a26d93e
initial implementation of agent-side symbol indexer
Evgeniy.Koshkin
parents:
diff
changeset
|
156 } |