Mercurial > hg > tc-symbol-server
changeset 110:0d0a3c1aa428
fix TW-45209 - calculate resulting artifacts for published pdb's on agent side
author | Evgeniy.Koshkin@unit-519.Labs.IntelliJ.Net |
---|---|
date | Wed, 18 May 2016 17:34:21 +0300 |
parents | 06f054af8232 |
children | 204681404aa1 |
files | agent/src/META-INF/build-agent-plugin-symbol-server.xml agent/src/jetbrains/buildServer/symbols/ArtifactPathHelper.java agent/src/jetbrains/buildServer/symbols/SymbolsIndexer.java common/src/jetbrains/buildServer/symbols/PdbSignatureIndexEntry.java common/src/jetbrains/buildServer/symbols/PdbSignatureIndexUtil.java server-tests/src/jetbrains/buildServer/symbols/DownloadSymbolsControllerTest.java server-tests/src/jetbrains/buildServer/symbols/MetadataStorageMock.java server/src/jetbrains/buildServer/symbols/BuildSymbolsIndexProvider.java server/src/jetbrains/buildServer/symbols/DownloadSymbolsController.java |
diffstat | 9 files changed, 100 insertions(+), 70 deletions(-) [+] |
line wrap: on
line diff
--- a/agent/src/META-INF/build-agent-plugin-symbol-server.xml Tue May 17 16:51:36 2016 +0300 +++ b/agent/src/META-INF/build-agent-plugin-symbol-server.xml Wed May 18 17:34:21 2016 +0300 @@ -8,5 +8,6 @@ <bean class="jetbrains.buildServer.symbols.SymbolsIndexer"/> <bean class="jetbrains.buildServer.symbols.WinDbgToolsDetector"/> + <bean class="jetbrains.buildServer.symbols.ArtifactPathHelper"/> </beans> \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/agent/src/jetbrains/buildServer/symbols/ArtifactPathHelper.java Wed May 18 17:34:21 2016 +0300 @@ -0,0 +1,36 @@ +package jetbrains.buildServer.symbols; + +import jetbrains.buildServer.ExtensionHolder; +import jetbrains.buildServer.agent.impl.artifacts.ArchivePreprocessor; +import jetbrains.buildServer.util.CollectionsUtil; +import jetbrains.buildServer.util.filters.Filter; +import org.jetbrains.annotations.NotNull; + +/** + * Created by Evgeniy.Koshkin. + */ +public class ArtifactPathHelper { + private static final String ARCHIVE_DELIMITER = "!"; + private static final String FOLDER_DELIMITER = "/"; + + private final ExtensionHolder myExtensions; + + public ArtifactPathHelper(@NotNull final ExtensionHolder extensions) { + myExtensions = extensions; + } + + @NotNull + String concatenateArtifactPath(String fileNamePrefix, String pdbFileName) { + final String delimiter = (isPathToArchive(fileNamePrefix) && !fileNamePrefix.contains(ARCHIVE_DELIMITER)) ? ARCHIVE_DELIMITER : FOLDER_DELIMITER; + return fileNamePrefix + delimiter + pdbFileName; + } + + private boolean isPathToArchive(@NotNull final String path){ + return CollectionsUtil.contains(myExtensions.getExtensions(ArchivePreprocessor.class), new Filter<ArchivePreprocessor>() { + @Override + public boolean accept(@NotNull ArchivePreprocessor data) { + return data.shouldProcess(path); + } + }); + } +}
--- a/agent/src/jetbrains/buildServer/symbols/SymbolsIndexer.java Tue May 17 16:51:36 2016 +0300 +++ b/agent/src/jetbrains/buildServer/symbols/SymbolsIndexer.java Wed May 18 17:34:21 2016 +0300 @@ -32,6 +32,8 @@ private static final String X86_SRCSRV = "\\x86\\srcsrv"; @NotNull private final ArtifactsWatcher myArtifactsWatcher; + @NotNull private final ArtifactPathHelper myArtifactPathHelper; + @NotNull private final JetSymbolsExe myJetSymbolsExe; @NotNull private final Map<File, String> myFileToArtifactMapToProcess = new ConcurrentHashMap<File, String>(); @@ -40,9 +42,13 @@ @Nullable private File mySrcSrvHomeDir; @Nullable private FileUrlProvider myFileUrlProvider; - public SymbolsIndexer(@NotNull final PluginDescriptor pluginDescriptor, @NotNull final EventDispatcher<AgentLifeCycleListener> agentDispatcher, @NotNull final ArtifactsWatcher artifactsWatcher) { + public SymbolsIndexer(@NotNull final PluginDescriptor pluginDescriptor, + @NotNull final EventDispatcher<AgentLifeCycleListener> agentDispatcher, + @NotNull final ArtifactsWatcher artifactsWatcher, + @NotNull final ArtifactPathHelper artifactPathHelper) { myArtifactsWatcher = artifactsWatcher; myJetSymbolsExe = new JetSymbolsExe(new File(pluginDescriptor.getPluginRoot(), "bin")); + myArtifactPathHelper = artifactPathHelper; agentDispatcher.addListener(new AgentLifeCycleAdapter() { @Override @@ -86,7 +92,7 @@ for(PdbSignatureIndexEntry signatureIndexEntry : signatureLocalFilesData){ final File targetPdbFile = new File(signatureIndexEntry.getArtifactPath()); if(myFileToArtifactMapToProcess.containsKey(targetPdbFile)) { - indexData.add(new PdbSignatureIndexEntry(signatureIndexEntry.getGuid(), myFileToArtifactMapToProcess.get(targetPdbFile))); + indexData.add(new PdbSignatureIndexEntry(signatureIndexEntry.getGuid(), myFileToArtifactMapToProcess.get(targetPdbFile), targetPdbFile.getName())); } } final File indexDataFile = FileUtil.createTempFile(myBuildTempDirectory, SymbolsConstants.SYMBOL_SIGNATURES_FILE_NAME_PREFIX, ".xml", false); @@ -126,7 +132,7 @@ try { myProgressLogger.message("Indexing sources appeared in file " + pdbFile.getAbsolutePath()); pdbFilePatcher.patch(pdbFile, myProgressLogger); - myFileToArtifactMapToProcess.put(pdbFile, pdbFiles.get(pdbFile)); + myFileToArtifactMapToProcess.put(pdbFile, myArtifactPathHelper.concatenateArtifactPath(pdbFiles.get(pdbFile), pdbFile.getName())); } catch (Throwable e) { LOG.error("Error occurred while patching symbols file " + pdbFile, e); myProgressLogger.error("Error occurred while patching symbols file " + pdbFile);
--- a/common/src/jetbrains/buildServer/symbols/PdbSignatureIndexEntry.java Tue May 17 16:51:36 2016 +0300 +++ b/common/src/jetbrains/buildServer/symbols/PdbSignatureIndexEntry.java Wed May 18 17:34:21 2016 +0300 @@ -1,17 +1,20 @@ package jetbrains.buildServer.symbols; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; /** * Created by Evgeniy.Koshkin. */ public class PdbSignatureIndexEntry { private final String myGuid; + private final String myFileName; private final String myArtifactPath; - public PdbSignatureIndexEntry(@NotNull String guid, @NotNull String artifactPath) { + public PdbSignatureIndexEntry(@NotNull String guid, @NotNull String filePath, @Nullable String fileName) { myGuid = guid; - myArtifactPath = artifactPath; + myArtifactPath = filePath; + myFileName = fileName; } @NotNull @@ -23,4 +26,9 @@ public String getArtifactPath() { return myArtifactPath; } + + @Nullable + public String getFileName() { + return myFileName; + } }
--- a/common/src/jetbrains/buildServer/symbols/PdbSignatureIndexUtil.java Tue May 17 16:51:36 2016 +0300 +++ b/common/src/jetbrains/buildServer/symbols/PdbSignatureIndexUtil.java Wed May 18 17:34:21 2016 +0300 @@ -16,35 +16,40 @@ * Created by Evgeniy.Koshkin. */ class PdbSignatureIndexUtil { - private static final String SIGN = "sign"; - private static final String FILE = "file"; - private static final String FILE_SIGNS = "file-signs"; - private static final String FILE_SIGN_ENTRY = "file-sign-entry"; + private static final String SIGN = "sign"; + private static final String FILE = "file"; + private static final String FILE_NAME = "file-path"; + private static final String FILE_SIGNS = "file-signs"; + private static final String FILE_SIGN_ENTRY = "file-sign-entry"; - @NotNull - static Set<PdbSignatureIndexEntry> read(@NotNull final InputStream inputStream) throws JDOMException, IOException { - final SAXBuilder builder = new SAXBuilder(); - final Document document = builder.build(inputStream); - final Set<PdbSignatureIndexEntry> result = new HashSet<PdbSignatureIndexEntry>(); - for (Object signElementObject : document.getRootElement().getChildren()){ - final Element signElement = (Element) signElementObject; - result.add(new PdbSignatureIndexEntry(extractGuid(signElement.getAttributeValue(SIGN)), signElement.getAttributeValue(FILE))); - } - return result; + @NotNull + static Set<PdbSignatureIndexEntry> read(@NotNull final InputStream inputStream) throws JDOMException, IOException { + final SAXBuilder builder = new SAXBuilder(); + final Document document = builder.build(inputStream); + final Set<PdbSignatureIndexEntry> result = new HashSet<PdbSignatureIndexEntry>(); + for (Object signElementObject : document.getRootElement().getChildren()){ + final Element signElement = (Element) signElementObject; + result.add(new PdbSignatureIndexEntry(extractGuid(signElement.getAttributeValue(SIGN)), signElement.getAttributeValue(FILE), signElement.getAttributeValue(FILE_NAME))); } + return result; + } - static void write(@NotNull final OutputStream outputStream, @NotNull final Set<PdbSignatureIndexEntry> indexData) throws IOException { - final Element root = new Element(FILE_SIGNS); - for (final PdbSignatureIndexEntry indexEntry : indexData){ - final Element entry = new Element(FILE_SIGN_ENTRY); - entry.setAttribute(SIGN, indexEntry.getGuid()); - entry.setAttribute(FILE, indexEntry.getArtifactPath()); - root.addContent(root); - } - XmlUtil.saveDocument(new Document(root), outputStream); + static void write(@NotNull final OutputStream outputStream, @NotNull final Set<PdbSignatureIndexEntry> indexData) throws IOException { + final Element root = new Element(FILE_SIGNS); + for (final PdbSignatureIndexEntry indexEntry : indexData){ + final Element entry = new Element(FILE_SIGN_ENTRY); + entry.setAttribute(SIGN, indexEntry.getGuid()); + entry.setAttribute(FILE, indexEntry.getArtifactPath()); + String fileName = indexEntry.getFileName(); + if(fileName != null){ + entry.setAttribute(FILE_NAME, fileName); + } + root.addContent(entry); } + XmlUtil.saveDocument(new Document(root), outputStream); + } - private static String extractGuid(String sign) { - return sign.substring(0, sign.length() - 1).toLowerCase(); //last symbol is PEDebugType - } + private static String extractGuid(String sign) { + return sign.substring(0, sign.length() - 1).toLowerCase(); //last symbol is PEDebugType + } }
--- a/server-tests/src/jetbrains/buildServer/symbols/DownloadSymbolsControllerTest.java Tue May 17 16:51:36 2016 +0300 +++ b/server-tests/src/jetbrains/buildServer/symbols/DownloadSymbolsControllerTest.java Wed May 18 17:34:21 2016 +0300 @@ -119,8 +119,9 @@ final String fileSignature = "8EF4E863187C45E78F4632152CC82FEB"; final String guid = "8EF4E863187C45E78F4632152CC82FE"; final String fileName = "secur32.pdb"; + final String filePath = "foo/secur32.pdb"; - myBuildMetadataStorage.addEntry(build.getBuildId(), fileName, guid.toLowerCase()); + myBuildMetadataStorage.addEntry(build.getBuildId(), filePath, guid.toLowerCase()); myRequest.setRequestURI("mock", String.format("/app/symbols/%s/%s/%s", fileName, fileSignature, fileName)); doGet();
--- a/server-tests/src/jetbrains/buildServer/symbols/MetadataStorageMock.java Tue May 17 16:51:36 2016 +0300 +++ b/server-tests/src/jetbrains/buildServer/symbols/MetadataStorageMock.java Wed May 18 17:34:21 2016 +0300 @@ -13,7 +13,7 @@ private List<BuildMetadataEntry> myEntries = new ArrayList<BuildMetadataEntry>(); - public void addEntry(final long buildId, final String fileName, final String fileSignature) { + public void addEntry(final long buildId, final String filePath, final String fileSignature) { myEntries.add(new BuildMetadataEntry() { public long getBuildId() { return buildId; @@ -27,8 +27,7 @@ @NotNull public Map<String, String> getMetadata() { HashMap<String, String> map = new HashMap<String, String>(); - map.put(BuildSymbolsIndexProvider.ARTIFACT_PATH_KEY, "foo"); - map.put(BuildSymbolsIndexProvider.FILE_NAME_KEY, fileName); + map.put(BuildSymbolsIndexProvider.ARTIFACT_PATH_KEY, filePath); return map; } });
--- a/server/src/jetbrains/buildServer/symbols/BuildSymbolsIndexProvider.java Tue May 17 16:51:36 2016 +0300 +++ b/server/src/jetbrains/buildServer/symbols/BuildSymbolsIndexProvider.java Wed May 18 17:34:21 2016 +0300 @@ -2,7 +2,6 @@ import jetbrains.buildServer.serverSide.SBuild; import jetbrains.buildServer.serverSide.artifacts.BuildArtifact; -import jetbrains.buildServer.serverSide.artifacts.BuildArtifacts; import jetbrains.buildServer.serverSide.artifacts.BuildArtifactsViewMode; import jetbrains.buildServer.serverSide.metadata.BuildMetadataProvider; import jetbrains.buildServer.serverSide.metadata.MetadataStorageWriter; @@ -11,13 +10,11 @@ import org.apache.log4j.Logger; import org.jdom.JDOMException; import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; import java.io.IOException; import java.util.Collections; import java.util.HashMap; import java.util.Set; -import java.util.concurrent.atomic.AtomicReference; /** * @author Evgeniy.Koshkin @@ -62,37 +59,13 @@ for (final PdbSignatureIndexEntry indexEntry : indexEntries) { final String signature = indexEntry.getGuid(); - final String artifactPathOrName = indexEntry.getArtifactPath(); - final String artifactPath = locateArtifact(sBuild, artifactPathOrName); - if (artifactPath == null) { - LOG.debug(String.format("Failed to find artifact by name %s and build id %d.", artifactPathOrName, buildId)); - continue; - } + final String fileName = indexEntry.getFileName(); + final String artifactPath = indexEntry.getArtifactPath(); final HashMap<String, String> data = new HashMap<String, String>(); + data.put(FILE_NAME_KEY, fileName); data.put(ARTIFACT_PATH_KEY, artifactPath); - data.put(FILE_NAME_KEY, artifactPathOrName); metadataStorageWriter.addParameters(signature, data); - LOG.debug("Stored symbol file signature " + signature + " for file name " + artifactPathOrName + " build id " + buildId); + LOG.debug("Stored symbol file signature " + signature + " for file name " + fileName + " build id " + buildId); } } - - @Nullable - private String locateArtifact(@NotNull SBuild build, final @NotNull String artifactPathOrName) { - final BuildArtifacts artifacts = build.getArtifacts(BuildArtifactsViewMode.VIEW_DEFAULT_WITH_ARCHIVES_CONTENT); - final BuildArtifact artifact = artifacts.getArtifact(artifactPathOrName); - if(artifact != null) return artifactPathOrName; - - final AtomicReference<String> locatedArtifactPath = new AtomicReference<String>(null); - artifacts.iterateArtifacts(new BuildArtifacts.BuildArtifactsProcessor() { - @NotNull - public Continuation processBuildArtifact(@NotNull BuildArtifact artifact) { - if(artifact.getName().equals(artifactPathOrName)){ - locatedArtifactPath.set(artifact.getRelativePath()); - return Continuation.BREAK; - } - else return Continuation.CONTINUE; - } - }); - return locatedArtifactPath.get(); - } }
--- a/server/src/jetbrains/buildServer/symbols/DownloadSymbolsController.java Tue May 17 16:51:36 2016 +0300 +++ b/server/src/jetbrains/buildServer/symbols/DownloadSymbolsController.java Wed May 18 17:34:21 2016 +0300 @@ -139,9 +139,9 @@ return null; } final Map<String,String> metadata = entry.getMetadata(); + final String storedArtifactPath = metadata.get(BuildSymbolsIndexProvider.ARTIFACT_PATH_KEY); final String storedFileName = metadata.get(BuildSymbolsIndexProvider.FILE_NAME_KEY); - final String artifactPath = metadata.get(BuildSymbolsIndexProvider.ARTIFACT_PATH_KEY); - if(storedFileName == null || artifactPath == null){ + if(storedFileName == null || storedArtifactPath == null){ LOG.debug(String.format("Metadata stored for guid '%s' is invalid.", guid)); return null; } @@ -149,15 +149,16 @@ LOG.debug(String.format("File name '%s' stored for guid '%s' differs from requested '%s'.", storedFileName, guid, fileName)); return null; } + final long buildId = entry.getBuildId(); final SBuild build = myServer.findBuildInstanceById(buildId); if(build == null){ LOG.debug(String.format("Build not found by id %d.", buildId)); return null; } - final BuildArtifact buildArtifact = build.getArtifacts(BuildArtifactsViewMode.VIEW_DEFAULT_WITH_ARCHIVES_CONTENT).getArtifact(artifactPath); + final BuildArtifact buildArtifact = build.getArtifacts(BuildArtifactsViewMode.VIEW_DEFAULT_WITH_ARCHIVES_CONTENT).getArtifact(storedArtifactPath); if(buildArtifact == null){ - LOG.debug(String.format("Artifact not found by path %s for build with id %d.", artifactPath, buildId)); + LOG.debug(String.format("Artifact not found by path %s for build with id %d.", storedArtifactPath, buildId)); } return buildArtifact; }