From 0b913968b67bb4c2b4f05766b6839193bd3a0ae7 Mon Sep 17 00:00:00 2001 From: Wes Haggard Date: Fri, 8 Apr 2016 08:57:24 -0700 Subject: [PATCH] Update PullNupkgFilesFromBlob to find the latest Azure blob drop that contains all the runtime packages --- scripts/dotnet-cli-build/PublishTargets.cs | 83 ++++++++++++++++++- .../Publishing/AzurePublisher.cs | 13 ++- scripts/dotnet-cli-build/Utils/Dirs.cs | 1 + 3 files changed, 93 insertions(+), 4 deletions(-) diff --git a/scripts/dotnet-cli-build/PublishTargets.cs b/scripts/dotnet-cli-build/PublishTargets.cs index 7b7d24f8d..56267603c 100644 --- a/scripts/dotnet-cli-build/PublishTargets.cs +++ b/scripts/dotnet-cli-build/PublishTargets.cs @@ -1,7 +1,9 @@ using System; +using System.Collections.Generic; using System.IO; using System.Net.Http; using System.Text; +using System.Text.RegularExpressions; using Microsoft.DotNet.Cli.Build.Framework; using Microsoft.WindowsAzure.Storage; using Microsoft.WindowsAzure.Storage.Blob; @@ -326,12 +328,87 @@ namespace Microsoft.DotNet.Cli.Build [Target(nameof(PrepareTargets.Init), nameof(InitPublish))] public static BuildTargetResult PullNupkgFilesFromBlob(BuildTargetContext c) { - var hostBlob = $"{Channel}/Binaries/{CliNuGetVersion}/"; + var pathToPublish = Environment.GetEnvironmentVariable("BLOB_VIRTUAL_PATH_TO_PUBLISH"); + if (string.IsNullOrEmpty(pathToPublish)) + pathToPublish = FindLatestCompleteBuild(); - Directory.CreateDirectory(Dirs.Packages); - AzurePublisherTool.DownloadFiles(hostBlob, ".nupkg", Dirs.Packages); + if (string.IsNullOrEmpty(pathToPublish)) + { + Console.WriteLine("Didn't find a directory with all the necessary runtime packages!"); + return c.Failed(); + } + + Directory.CreateDirectory(Dirs.PackagesNoRID); + AzurePublisherTool.DownloadFiles(pathToPublish, ".nupkg", Dirs.PackagesNoRID); return c.Success(); } + + private static string FindLatestCompleteBuild() + { + var hostBlob = $"{Channel}/Binaries/"; + + Regex buildVersionRegex = new Regex(@"Binaries/(?\d+\.\d+\.\d+-[^-]+-\d{6})/$"); + + List buildVersions = new List(); + foreach (string file in AzurePublisherTool.ListBlobs(hostBlob)) + { + var match = buildVersionRegex.Match(file); + if (match.Success) + { + buildVersions.Add(match.Groups["version"].Value); + } + } + + buildVersions.Sort(); + buildVersions.Reverse(); + + Dictionary runtimes = new Dictionary() + { + {"win7", false }, + {"osx.10.10", false }, + {"rhel.7", false }, + {"ubuntu.14.04", false }, + + }; + + foreach (var bv in buildVersions) + { + Console.WriteLine($"Version: {bv}"); + + var buildFiles = AzurePublisherTool.ListBlobs(hostBlob + bv); + + foreach (var bf in buildFiles) + { + string buildFile = Path.GetFileName(bf); + + foreach (var runtime in runtimes.Keys) + { + if (buildFile.StartsWith($"runtime.{runtime}")) + { + runtimes[runtime] = true; + break; + } + } + } + + bool missingRuntime = false; + foreach (var runtime in runtimes) + { + if (!runtime.Value) + { + missingRuntime = true; + Console.WriteLine($"Version {bv} is missing packages for runtime {runtime.Key}"); + } + } + + if (!missingRuntime) + { + return hostBlob + bv; + } + } + + return null; + } } } diff --git a/scripts/dotnet-cli-build/Publishing/AzurePublisher.cs b/scripts/dotnet-cli-build/Publishing/AzurePublisher.cs index d0e2b7c5b..e5b6a86e9 100644 --- a/scripts/dotnet-cli-build/Publishing/AzurePublisher.cs +++ b/scripts/dotnet-cli-build/Publishing/AzurePublisher.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Generic; using System.IO; using System.Linq; using System.Net.Http; @@ -94,7 +95,7 @@ namespace Microsoft.DotNet.Cli.Build return $"{channel}/Binaries/{version}/{Path.GetFileName(archiveFile)}"; } - public async void DownloadFiles(string blobVirtualDirectory, string fileExtension, string downloadPath) + public void DownloadFiles(string blobVirtualDirectory, string fileExtension, string downloadPath) { CloudBlobDirectory blobDir = _blobContainer.GetDirectoryReference(blobVirtualDirectory); BlobContinuationToken continuationToken = new BlobContinuationToken(); @@ -111,5 +112,15 @@ namespace Microsoft.DotNet.Cli.Build } } } + + public IEnumerable ListBlobs(string blobVirtualDirectory) + { + CloudBlobDirectory blobDir = _blobContainer.GetDirectoryReference(blobVirtualDirectory); + BlobContinuationToken continuationToken = new BlobContinuationToken(); + + var blobFiles = blobDir.ListBlobsSegmentedAsync(continuationToken).Result; + + return blobFiles.Results.Select(bf => bf.Uri.AbsoluteUri); + } } } diff --git a/scripts/dotnet-cli-build/Utils/Dirs.cs b/scripts/dotnet-cli-build/Utils/Dirs.cs index cec5db1cb..2b6e89d19 100644 --- a/scripts/dotnet-cli-build/Utils/Dirs.cs +++ b/scripts/dotnet-cli-build/Utils/Dirs.cs @@ -14,6 +14,7 @@ namespace Microsoft.DotNet.Cli.Build PlatformServices.Default.Runtime.GetRuntimeIdentifier()); public static readonly string PackagesIntermediate = Path.Combine(Output, "packages/intermediate"); + public static readonly string PackagesNoRID = Path.Combine(RepoRoot, "artifacts", "packages"); public static readonly string Packages = Path.Combine(Output, "packages"); public static readonly string Stage1 = Path.Combine(Output, "stage1"); public static readonly string Stage1Compilation = Path.Combine(Output, "stage1compilation");