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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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
53028ba390e0 improved build progress messages
Evgeniy.Koshkin
parents: 2
diff changeset
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
Evgeniy.Koshkin
parents: 5
diff changeset
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
662a0be55de7 - source indexing works!
Evgeniy.Koshkin
parents: 11
diff changeset
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
662a0be55de7 - source indexing works!
Evgeniy.Koshkin
parents: 11
diff changeset
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
f7602ee7e8b1 implemented symbols index data publishing
Evgeniy.Koshkin
parents: 3
diff changeset
48 public void afterAtrifactsPublished(@NotNull AgentRunningBuild build, @NotNull BuildFinishedStatus buildStatus) {
f7602ee7e8b1 implemented symbols index data publishing
Evgeniy.Koshkin
parents: 3
diff changeset
49 super.afterAtrifactsPublished(build, buildStatus);
12
662a0be55de7 - source indexing works!
Evgeniy.Koshkin
parents: 11
diff changeset
50 if (myBuild == null || mySymbolsToProcess == null) return;
3
53028ba390e0 improved build progress messages
Evgeniy.Koshkin
parents: 2
diff changeset
51 if(myBuild.getBuildFeaturesOfType(SymbolsConstants.BUILD_FEATURE_TYPE).isEmpty()) return;
53028ba390e0 improved build progress messages
Evgeniy.Koshkin
parents: 2
diff changeset
52
2
c6ca0a26d93e initial implementation of agent-side symbol indexer
Evgeniy.Koshkin
parents:
diff changeset
53 if (mySymbolsToProcess.isEmpty()) {
3
53028ba390e0 improved build progress messages
Evgeniy.Koshkin
parents: 2
diff changeset
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
f7602ee7e8b1 implemented symbols index data publishing
Evgeniy.Koshkin
parents: 3
diff changeset
60 if(symbolSignaturesFile.exists()){
f7602ee7e8b1 implemented symbols index data publishing
Evgeniy.Koshkin
parents: 3
diff changeset
61 myArtifactsWatcher.addNewArtifactsPath(symbolSignaturesFile + "=>" + ".teamcity/symbols");
f7602ee7e8b1 implemented symbols index data publishing
Evgeniy.Koshkin
parents: 3
diff changeset
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
f7602ee7e8b1 implemented symbols index data publishing
Evgeniy.Koshkin
parents: 3
diff changeset
65 myBuild.getBuildLogger().error("Error while dumping symbols/binaries signatures.");
f7602ee7e8b1 implemented symbols index data publishing
Evgeniy.Koshkin
parents: 3
diff changeset
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
662a0be55de7 - source indexing works!
Evgeniy.Koshkin
parents: 11
diff changeset
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
f7602ee7e8b1 implemented symbols index data publishing
Evgeniy.Koshkin
parents: 3
diff changeset
84 LOG.debug(SymbolsConstants.BUILD_FEATURE_TYPE + " build feature enabled. Searching for suitable files.");
20
10cb71666d5e more fixes in generated srcsrv
Evgeniy.Koshkin
parents: 18
diff changeset
85 final Collection<File> pdbFiles = getArtifactPathsByFileExtension(artifacts, PDB_FILE_EXTENSION);
25
f4e0050e2a2f resolve server url from config parameter
Evgeniy.Koshkin
parents: 23
diff changeset
86 if(pdbFiles.isEmpty()) return;
f4e0050e2a2f resolve server url from config parameter
Evgeniy.Koshkin
parents: 23
diff changeset
87
f4e0050e2a2f resolve server url from config parameter
Evgeniy.Koshkin
parents: 23
diff changeset
88 final FileUrlProvider urlProvider = getUrlProviderForBuild(myBuild, buildLogger);
f4e0050e2a2f resolve server url from config parameter
Evgeniy.Koshkin
parents: 23
diff changeset
89 if(urlProvider == null) return;
f4e0050e2a2f resolve server url from config parameter
Evgeniy.Koshkin
parents: 23
diff changeset
90
f4e0050e2a2f resolve server url from config parameter
Evgeniy.Koshkin
parents: 23
diff changeset
91 final PdbFilePatcher pdbFilePatcher = new PdbFilePatcher(myBuild.getBuildTempDirectory(), new SrcSrvStreamBuilder(urlProvider));
12
662a0be55de7 - source indexing works!
Evgeniy.Koshkin
parents: 11
diff changeset
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
662a0be55de7 - source indexing works!
Evgeniy.Koshkin
parents: 11
diff changeset
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
662a0be55de7 - source indexing works!
Evgeniy.Koshkin
parents: 11
diff changeset
100 mySymbolsToProcess.add(pdbFile);
662a0be55de7 - source indexing works!
Evgeniy.Koshkin
parents: 11
diff changeset
101 } catch (Throwable e) {
662a0be55de7 - source indexing works!
Evgeniy.Koshkin
parents: 11
diff changeset
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
662a0be55de7 - source indexing works!
Evgeniy.Koshkin
parents: 11
diff changeset
105 }
662a0be55de7 - source indexing works!
Evgeniy.Koshkin
parents: 11
diff changeset
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
f4e0050e2a2f resolve server url from config parameter
Evgeniy.Koshkin
parents: 23
diff changeset
109 @Nullable
f4e0050e2a2f resolve server url from config parameter
Evgeniy.Koshkin
parents: 23
diff changeset
110 private FileUrlProvider getUrlProviderForBuild(@NotNull AgentRunningBuild build, BuildProgressLogger buildLogger) {
f4e0050e2a2f resolve server url from config parameter
Evgeniy.Koshkin
parents: 23
diff changeset
111 String serverUrl = build.getSharedConfigParameters().get(SymbolsConstants.SERVER_URL_PARAMETER_NAME);
f4e0050e2a2f resolve server url from config parameter
Evgeniy.Koshkin
parents: 23
diff changeset
112 if(serverUrl == null){
f4e0050e2a2f resolve server url from config parameter
Evgeniy.Koshkin
parents: 23
diff changeset
113 final String message = String.format("Configuration parameter %s was not set. ", SymbolsConstants.SERVER_URL_PARAMETER_NAME);
f4e0050e2a2f resolve server url from config parameter
Evgeniy.Koshkin
parents: 23
diff changeset
114 LOG.warn(message);
f4e0050e2a2f resolve server url from config parameter
Evgeniy.Koshkin
parents: 23
diff changeset
115 buildLogger.warning(message);
f4e0050e2a2f resolve server url from config parameter
Evgeniy.Koshkin
parents: 23
diff changeset
116 return null;
f4e0050e2a2f resolve server url from config parameter
Evgeniy.Koshkin
parents: 23
diff changeset
117 }
f4e0050e2a2f resolve server url from config parameter
Evgeniy.Koshkin
parents: 23
diff changeset
118 return new FileUrlProvider(serverUrl, build.getBuildId(), build.getCheckoutDirectory());
f4e0050e2a2f resolve server url from config parameter
Evgeniy.Koshkin
parents: 23
diff changeset
119 }
f4e0050e2a2f resolve server url from config parameter
Evgeniy.Koshkin
parents: 23
diff changeset
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 }