private async Task DownloadArtifactAsync( IExecutionContext executionContext, ServerBuildArtifact buildArtifact, ArtifactDefinition artifactDefinition, string localFolderPath) { var downloadFolderPath = Path.Combine(localFolderPath, buildArtifact.Name); var buildArtifactDetails = artifactDefinition.Details as BuildArtifactDetails; if ((buildArtifact.Resource.Type == null && buildArtifact.Id == 0) || // bug on build API Bug 378900 string.Equals(buildArtifact.Resource.Type, ArtifactResourceTypes.FilePath, StringComparison.OrdinalIgnoreCase)) { executionContext.Output(StringUtil.Loc("RMArtifactTypeFileShare")); if (!PlatformUtil.RunningOnWindows) { throw new NotSupportedException(StringUtil.Loc("RMFileShareArtifactErrorOnNonWindowsAgent")); } string fileShare; if (buildArtifact.Id == 0) { fileShare = new Uri(buildArtifact.Resource.DownloadUrl).LocalPath; } else { fileShare = new Uri(Path.Combine(buildArtifact.Resource.DownloadUrl, buildArtifact.Name)).LocalPath; if (!Directory.Exists(fileShare)) { // download path does not exist, log and fall back var parenthPath = new Uri(buildArtifact.Resource.DownloadUrl).LocalPath; executionContext.Output(StringUtil.Loc("RMArtifactNameDirectoryNotFound", fileShare, parenthPath)); fileShare = parenthPath; } } if (!Directory.Exists(fileShare)) { // download path does not exist, raise exception throw new ArtifactDownloadException(StringUtil.Loc("RMArtifactDirectoryNotFoundError", fileShare, WindowsIdentity.GetCurrent().Name)); } executionContext.Output(StringUtil.Loc("RMDownloadingArtifactFromFileShare", fileShare, downloadFolderPath)); var fileShareArtifact = new FileShareArtifact(); await fileShareArtifact.DownloadArtifactAsync(executionContext, HostContext, artifactDefinition, fileShare, downloadFolderPath); } else if (buildArtifactDetails != null && string.Equals(buildArtifact.Resource.Type, ArtifactResourceTypes.Container, StringComparison.OrdinalIgnoreCase)) { executionContext.Output(StringUtil.Loc("RMArtifactTypeServerDrop")); // Get containerId and rootLocation for the artifact #/922702/drop string containerUrl = buildArtifact.Resource.Data; string[] parts = containerUrl.Split(new[] { '/' }, 3); if (parts.Length < 3) { throw new ArtifactDownloadException(StringUtil.Loc("RMArtifactContainerDetailsNotFoundError", buildArtifact.Name)); } int containerId; string rootLocation = parts[2]; if (!int.TryParse(parts[1], out containerId)) { throw new ArtifactDownloadException(StringUtil.Loc("RMArtifactContainerDetailsInvalidError", buildArtifact.Name)); } string rootDestinationDir = Path.Combine(localFolderPath, rootLocation); executionContext.Output(StringUtil.Loc("RMDownloadingArtifactFromFileContainer", containerUrl, rootDestinationDir)); var containerFetchEngineOptions = new ContainerFetchEngineOptions { ParallelDownloadLimit = executionContext.Variables.Release_Parallel_Download_Limit ?? ContainerFetchEngineDefaultOptions.ParallelDownloadLimit, DownloadBufferSize = executionContext.Variables.Release_Download_BufferSize ?? ContainerFetchEngineDefaultOptions.DownloadBufferSize }; executionContext.Output(StringUtil.Loc("RMParallelDownloadLimit", containerFetchEngineOptions.ParallelDownloadLimit)); executionContext.Output(StringUtil.Loc("RMDownloadBufferSize", containerFetchEngineOptions.DownloadBufferSize)); using (var containerProviderFactory = new ContainerProviderFactory(buildArtifactDetails, rootLocation, containerId, executionContext)) { var containerProvider = containerProviderFactory.GetContainerProvider(ArtifactResourceTypes.Container); using (var engine = new ContainerFetchEngine.ContainerFetchEngine(containerProvider, rootLocation, rootDestinationDir)) { engine.ContainerFetchEngineOptions = containerFetchEngineOptions; engine.ExecutionLogger = new ExecutionLogger(executionContext); await engine.FetchAsync(executionContext.CancellationToken); } } } else { executionContext.Warning(StringUtil.Loc("RMArtifactTypeNotSupported", buildArtifact.Resource.Type)); } }