Mercurial > hg > tc-symbol-server
annotate 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 |
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 |
3 | 3 import jetbrains.buildServer.agent.*; |
2
c6ca0a26d93e
initial implementation of agent-side symbol indexer
Evgeniy.Koshkin
parents:
diff
changeset
|
4 import jetbrains.buildServer.agent.artifacts.ArtifactsWatcher; |
c6ca0a26d93e
initial implementation of agent-side symbol indexer
Evgeniy.Koshkin
parents:
diff
changeset
|
5 import jetbrains.buildServer.agent.impl.artifacts.ArtifactsBuilderAdapter; |
c6ca0a26d93e
initial implementation of agent-side symbol indexer
Evgeniy.Koshkin
parents:
diff
changeset
|
6 import jetbrains.buildServer.agent.impl.artifacts.ArtifactsCollection; |
c6ca0a26d93e
initial implementation of agent-side symbol indexer
Evgeniy.Koshkin
parents:
diff
changeset
|
7 import jetbrains.buildServer.agent.plugins.beans.PluginDescriptor; |
27
76ed2d58c871
- reused home path between all srcsrv-related utilities
Evgeniy.Koshkin
parents:
26
diff
changeset
|
8 import jetbrains.buildServer.symbols.tools.JetSymbolsExe; |
2
c6ca0a26d93e
initial implementation of agent-side symbol indexer
Evgeniy.Koshkin
parents:
diff
changeset
|
9 import jetbrains.buildServer.util.EventDispatcher; |
c6ca0a26d93e
initial implementation of agent-side symbol indexer
Evgeniy.Koshkin
parents:
diff
changeset
|
10 import jetbrains.buildServer.util.FileUtil; |
c6ca0a26d93e
initial implementation of agent-side symbol indexer
Evgeniy.Koshkin
parents:
diff
changeset
|
11 import org.apache.log4j.Logger; |
c6ca0a26d93e
initial implementation of agent-side symbol indexer
Evgeniy.Koshkin
parents:
diff
changeset
|
12 import org.jetbrains.annotations.NotNull; |
c6ca0a26d93e
initial implementation of agent-side symbol indexer
Evgeniy.Koshkin
parents:
diff
changeset
|
13 import org.jetbrains.annotations.Nullable; |
c6ca0a26d93e
initial implementation of agent-side symbol indexer
Evgeniy.Koshkin
parents:
diff
changeset
|
14 |
c6ca0a26d93e
initial implementation of agent-side symbol indexer
Evgeniy.Koshkin
parents:
diff
changeset
|
15 import java.io.File; |
c6ca0a26d93e
initial implementation of agent-side symbol indexer
Evgeniy.Koshkin
parents:
diff
changeset
|
16 import java.io.IOException; |
27
76ed2d58c871
- reused home path between all srcsrv-related utilities
Evgeniy.Koshkin
parents:
26
diff
changeset
|
17 import java.util.Collection; |
76ed2d58c871
- reused home path between all srcsrv-related utilities
Evgeniy.Koshkin
parents:
26
diff
changeset
|
18 import java.util.HashSet; |
76ed2d58c871
- reused home path between all srcsrv-related utilities
Evgeniy.Koshkin
parents:
26
diff
changeset
|
19 import java.util.List; |
26
87b24e4efcc3
fixed multiple indexing of the same pdb file
Evgeniy.Koshkin
parents:
25
diff
changeset
|
20 import java.util.concurrent.CopyOnWriteArrayList; |
2
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 /** |
c6ca0a26d93e
initial implementation of agent-side symbol indexer
Evgeniy.Koshkin
parents:
diff
changeset
|
23 * @author Evgeniy.Koshkin |
c6ca0a26d93e
initial implementation of agent-side symbol indexer
Evgeniy.Koshkin
parents:
diff
changeset
|
24 */ |
c6ca0a26d93e
initial implementation of agent-side symbol indexer
Evgeniy.Koshkin
parents:
diff
changeset
|
25 public class SymbolsIndexer extends ArtifactsBuilderAdapter { |
c6ca0a26d93e
initial implementation of agent-side symbol indexer
Evgeniy.Koshkin
parents:
diff
changeset
|
26 |
7 | 27 private static final Logger LOG = Logger.getLogger(SymbolsIndexer.class); |
2
c6ca0a26d93e
initial implementation of agent-side symbol indexer
Evgeniy.Koshkin
parents:
diff
changeset
|
28 |
c6ca0a26d93e
initial implementation of agent-side symbol indexer
Evgeniy.Koshkin
parents:
diff
changeset
|
29 public static final String PDB_FILE_EXTENSION = "pdb"; |
c6ca0a26d93e
initial implementation of agent-side symbol indexer
Evgeniy.Koshkin
parents:
diff
changeset
|
30 |
c6ca0a26d93e
initial implementation of agent-side symbol indexer
Evgeniy.Koshkin
parents:
diff
changeset
|
31 @NotNull private final ArtifactsWatcher myArtifactsWatcher; |
27
76ed2d58c871
- reused home path between all srcsrv-related utilities
Evgeniy.Koshkin
parents:
26
diff
changeset
|
32 @NotNull private final JetSymbolsExe myJetSymbolsExe; |
2
c6ca0a26d93e
initial implementation of agent-side symbol indexer
Evgeniy.Koshkin
parents:
diff
changeset
|
33 @Nullable private AgentRunningBuild myBuild; |
c6ca0a26d93e
initial implementation of agent-side symbol indexer
Evgeniy.Koshkin
parents:
diff
changeset
|
34 @Nullable private Collection<File> mySymbolsToProcess; |
c6ca0a26d93e
initial implementation of agent-side symbol indexer
Evgeniy.Koshkin
parents:
diff
changeset
|
35 |
c6ca0a26d93e
initial implementation of agent-side symbol indexer
Evgeniy.Koshkin
parents:
diff
changeset
|
36 public SymbolsIndexer(@NotNull final PluginDescriptor pluginDescriptor, @NotNull final EventDispatcher<AgentLifeCycleListener> agentDispatcher, @NotNull final ArtifactsWatcher artifactsWatcher) { |
12 | 37 myArtifactsWatcher = artifactsWatcher; |
27
76ed2d58c871
- reused home path between all srcsrv-related utilities
Evgeniy.Koshkin
parents:
26
diff
changeset
|
38 myJetSymbolsExe = new JetSymbolsExe(new File(pluginDescriptor.getPluginRoot(), "bin")); |
12 | 39 |
2
c6ca0a26d93e
initial implementation of agent-side symbol indexer
Evgeniy.Koshkin
parents:
diff
changeset
|
40 agentDispatcher.addListener(new AgentLifeCycleAdapter() { |
c6ca0a26d93e
initial implementation of agent-side symbol indexer
Evgeniy.Koshkin
parents:
diff
changeset
|
41 @Override |
c6ca0a26d93e
initial implementation of agent-side symbol indexer
Evgeniy.Koshkin
parents:
diff
changeset
|
42 public void buildStarted(@NotNull final AgentRunningBuild runningBuild) { |
c6ca0a26d93e
initial implementation of agent-side symbol indexer
Evgeniy.Koshkin
parents:
diff
changeset
|
43 myBuild = runningBuild; |
26
87b24e4efcc3
fixed multiple indexing of the same pdb file
Evgeniy.Koshkin
parents:
25
diff
changeset
|
44 mySymbolsToProcess = new CopyOnWriteArrayList<File>(); |
2
c6ca0a26d93e
initial implementation of agent-side symbol indexer
Evgeniy.Koshkin
parents:
diff
changeset
|
45 } |
c6ca0a26d93e
initial implementation of agent-side symbol indexer
Evgeniy.Koshkin
parents:
diff
changeset
|
46 |
c6ca0a26d93e
initial implementation of agent-side symbol indexer
Evgeniy.Koshkin
parents:
diff
changeset
|
47 @Override |
5 | 48 public void afterAtrifactsPublished(@NotNull AgentRunningBuild build, @NotNull BuildFinishedStatus buildStatus) { |
49 super.afterAtrifactsPublished(build, buildStatus); | |
12 | 50 if (myBuild == null || mySymbolsToProcess == null) return; |
3 | 51 if(myBuild.getBuildFeaturesOfType(SymbolsConstants.BUILD_FEATURE_TYPE).isEmpty()) return; |
52 | |
2
c6ca0a26d93e
initial implementation of agent-side symbol indexer
Evgeniy.Koshkin
parents:
diff
changeset
|
53 if (mySymbolsToProcess.isEmpty()) { |
3 | 54 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
|
55 LOG.debug("Symbols weren't found in artifacts to be published."); |
c6ca0a26d93e
initial implementation of agent-side symbol indexer
Evgeniy.Koshkin
parents:
diff
changeset
|
56 } else { |
c6ca0a26d93e
initial implementation of agent-side symbol indexer
Evgeniy.Koshkin
parents:
diff
changeset
|
57 try { |
27
76ed2d58c871
- reused home path between all srcsrv-related utilities
Evgeniy.Koshkin
parents:
26
diff
changeset
|
58 final File symbolSignaturesFile = FileUtil.createTempFile(myBuild.getBuildTempDirectory(), "symbol-signatures-", ".xml", false); |
76ed2d58c871
- reused home path between all srcsrv-related utilities
Evgeniy.Koshkin
parents:
26
diff
changeset
|
59 myJetSymbolsExe.dumpGuidsToFile(mySymbolsToProcess, symbolSignaturesFile, myBuild.getBuildLogger()); |
5 | 60 if(symbolSignaturesFile.exists()){ |
61 myArtifactsWatcher.addNewArtifactsPath(symbolSignaturesFile + "=>" + ".teamcity/symbols"); | |
62 } | |
2
c6ca0a26d93e
initial implementation of agent-side symbol indexer
Evgeniy.Koshkin
parents:
diff
changeset
|
63 } catch (IOException e) { |
c6ca0a26d93e
initial implementation of agent-side symbol indexer
Evgeniy.Koshkin
parents:
diff
changeset
|
64 LOG.error("Error while dumping symbols/binaries signatures.", e); |
5 | 65 myBuild.getBuildLogger().error("Error while dumping symbols/binaries signatures."); |
66 myBuild.getBuildLogger().exception(e); | |
2
c6ca0a26d93e
initial implementation of agent-side symbol indexer
Evgeniy.Koshkin
parents:
diff
changeset
|
67 } |
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 mySymbolsToProcess = null; |
c6ca0a26d93e
initial implementation of agent-side symbol indexer
Evgeniy.Koshkin
parents:
diff
changeset
|
70 myBuild = null; |
c6ca0a26d93e
initial implementation of agent-side symbol indexer
Evgeniy.Koshkin
parents:
diff
changeset
|
71 } |
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 @Override |
c6ca0a26d93e
initial implementation of agent-side symbol indexer
Evgeniy.Koshkin
parents:
diff
changeset
|
76 public void afterCollectingFiles(@NotNull List<ArtifactsCollection> artifacts) { |
c6ca0a26d93e
initial implementation of agent-side symbol indexer
Evgeniy.Koshkin
parents:
diff
changeset
|
77 super.afterCollectingFiles(artifacts); |
12 | 78 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
|
79 final BuildProgressLogger buildLogger = myBuild.getBuildLogger(); |
2
c6ca0a26d93e
initial implementation of agent-side symbol indexer
Evgeniy.Koshkin
parents:
diff
changeset
|
80 if(myBuild.getBuildFeaturesOfType(SymbolsConstants.BUILD_FEATURE_TYPE).isEmpty()){ |
c6ca0a26d93e
initial implementation of agent-side symbol indexer
Evgeniy.Koshkin
parents:
diff
changeset
|
81 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
|
82 return; |
c6ca0a26d93e
initial implementation of agent-side symbol indexer
Evgeniy.Koshkin
parents:
diff
changeset
|
83 } |
5 | 84 LOG.debug(SymbolsConstants.BUILD_FEATURE_TYPE + " build feature enabled. Searching for suitable files."); |
20 | 85 final Collection<File> pdbFiles = getArtifactPathsByFileExtension(artifacts, PDB_FILE_EXTENSION); |
25 | 86 if(pdbFiles.isEmpty()) return; |
87 | |
88 final FileUrlProvider urlProvider = getUrlProviderForBuild(myBuild, buildLogger); | |
89 if(urlProvider == null) return; | |
90 | |
91 final PdbFilePatcher pdbFilePatcher = new PdbFilePatcher(myBuild.getBuildTempDirectory(), new SrcSrvStreamBuilder(urlProvider)); | |
12 | 92 for(File pdbFile : pdbFiles){ |
26
87b24e4efcc3
fixed multiple indexing of the same pdb file
Evgeniy.Koshkin
parents:
25
diff
changeset
|
93 if(mySymbolsToProcess.contains(pdbFile)){ |
87b24e4efcc3
fixed multiple indexing of the same pdb file
Evgeniy.Koshkin
parents:
25
diff
changeset
|
94 LOG.debug(String.format("File %s already processed. Skipped.", pdbFile.getAbsolutePath())); |
87b24e4efcc3
fixed multiple indexing of the same pdb file
Evgeniy.Koshkin
parents:
25
diff
changeset
|
95 continue; |
87b24e4efcc3
fixed multiple indexing of the same pdb file
Evgeniy.Koshkin
parents:
25
diff
changeset
|
96 } |
12 | 97 try { |
18
d1c5ce19d0f7
added warning in case source info was not found in pdb
Evgeniy.Koshkin
parents:
14
diff
changeset
|
98 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
|
99 pdbFilePatcher.patch(pdbFile, buildLogger); |
12 | 100 mySymbolsToProcess.add(pdbFile); |
101 } catch (Throwable e) { | |
102 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
|
103 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
|
104 buildLogger.exception(e); |
12 | 105 } |
106 } | |
2
c6ca0a26d93e
initial implementation of agent-side symbol indexer
Evgeniy.Koshkin
parents:
diff
changeset
|
107 } |
c6ca0a26d93e
initial implementation of agent-side symbol indexer
Evgeniy.Koshkin
parents:
diff
changeset
|
108 |
25 | 109 @Nullable |
110 private FileUrlProvider getUrlProviderForBuild(@NotNull AgentRunningBuild build, BuildProgressLogger buildLogger) { | |
111 String serverUrl = build.getSharedConfigParameters().get(SymbolsConstants.SERVER_URL_PARAMETER_NAME); | |
112 if(serverUrl == null){ | |
113 final String message = String.format("Configuration parameter %s was not set. ", SymbolsConstants.SERVER_URL_PARAMETER_NAME); | |
114 LOG.warn(message); | |
115 buildLogger.warning(message); | |
116 return null; | |
117 } | |
118 return new FileUrlProvider(serverUrl, build.getBuildId(), build.getCheckoutDirectory()); | |
119 } | |
120 | |
2
c6ca0a26d93e
initial implementation of agent-side symbol indexer
Evgeniy.Koshkin
parents:
diff
changeset
|
121 private Collection<File> getArtifactPathsByFileExtension(List<ArtifactsCollection> artifactsCollections, String fileExtension){ |
c6ca0a26d93e
initial implementation of agent-side symbol indexer
Evgeniy.Koshkin
parents:
diff
changeset
|
122 final Collection<File> result = new HashSet<File>(); |
c6ca0a26d93e
initial implementation of agent-side symbol indexer
Evgeniy.Koshkin
parents:
diff
changeset
|
123 for(ArtifactsCollection artifactsCollection : artifactsCollections){ |
c6ca0a26d93e
initial implementation of agent-side symbol indexer
Evgeniy.Koshkin
parents:
diff
changeset
|
124 if(artifactsCollection.isEmpty()) continue; |
c6ca0a26d93e
initial implementation of agent-side symbol indexer
Evgeniy.Koshkin
parents:
diff
changeset
|
125 for (File artifact : artifactsCollection.getFilePathMap().keySet()){ |
c6ca0a26d93e
initial implementation of agent-side symbol indexer
Evgeniy.Koshkin
parents:
diff
changeset
|
126 if(FileUtil.getExtension(artifact.getPath()).equalsIgnoreCase(fileExtension)) |
c6ca0a26d93e
initial implementation of agent-side symbol indexer
Evgeniy.Koshkin
parents:
diff
changeset
|
127 result.add(artifact); |
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 } |
c6ca0a26d93e
initial implementation of agent-side symbol indexer
Evgeniy.Koshkin
parents:
diff
changeset
|
130 return result; |
c6ca0a26d93e
initial implementation of agent-side symbol indexer
Evgeniy.Koshkin
parents:
diff
changeset
|
131 } |
c6ca0a26d93e
initial implementation of agent-side symbol indexer
Evgeniy.Koshkin
parents:
diff
changeset
|
132 } |