From d6c1aac3d90d26f7e71af7cae69b8847f495d704 Mon Sep 17 00:00:00 2001 From: Davis Goodin Date: Wed, 24 Jan 2018 18:41:40 -0600 Subject: [PATCH 1/3] Push manifest summary/readme along with manifest --- .../PushOrchestratedBuildManifest.cs | 26 +++- ...eOrchestratedBuildManifestSummaryToFile.cs | 134 ++++++++++++++++++ .../Microsoft.DotNet.Build.Tasks.Feed.csproj | 1 + .../Microsoft.DotNet.Build.Tasks.Feed.targets | 12 +- 4 files changed, 171 insertions(+), 2 deletions(-) create mode 100644 src/Microsoft.DotNet.Build.Tasks.Feed/BuildManifest/WriteOrchestratedBuildManifestSummaryToFile.cs diff --git a/src/Microsoft.DotNet.Build.Tasks.Feed/BuildManifest/PushOrchestratedBuildManifest.cs b/src/Microsoft.DotNet.Build.Tasks.Feed/BuildManifest/PushOrchestratedBuildManifest.cs index 1813aabde9..639c31fd7e 100644 --- a/src/Microsoft.DotNet.Build.Tasks.Feed/BuildManifest/PushOrchestratedBuildManifest.cs +++ b/src/Microsoft.DotNet.Build.Tasks.Feed/BuildManifest/PushOrchestratedBuildManifest.cs @@ -8,6 +8,8 @@ using Microsoft.DotNet.VersionTools.Automation.GitHubApi; using Microsoft.DotNet.VersionTools.BuildManifest; using Microsoft.DotNet.VersionTools.BuildManifest.Model; +using System.IO; +using System.Linq; using System.Xml.Linq; namespace Microsoft.DotNet.Build.Tasks.Feed.BuildManifest @@ -32,6 +34,12 @@ public class PushOrchestratedBuildManifest : Task public string CommitMessage { get; set; } + /// + /// %(Identity): A file to upload to the versions repo. + /// %(RelativePath): Optional path to upload the file to, relative to VersionsRepoPath. + /// + public ITaskItem[] SupplementaryFiles { get; set; } + public override bool Execute() { string contents = System.IO.File.ReadAllText(ManifestFile); @@ -47,12 +55,28 @@ public override bool Execute() { var client = new BuildManifestClient(gitHubClient); + SupplementaryUploadRequest[] supplementaryUploads = SupplementaryFiles + ?.Select(i => + { + string path = i.GetMetadata("RelativePath"); + if (string.IsNullOrEmpty(path)) + { + path = Path.GetFileName(i.ItemSpec); + } + return new SupplementaryUploadRequest + { + Contents = File.ReadAllText(i.ItemSpec), + Path = path + }; + }) + .ToArray(); + var pushTask = client.PushNewBuildAsync( new GitHubProject(VersionsRepo, VersionsRepoOwner), $"heads/{VersionsRepoBranch}", VersionsRepoPath, model, - null, + supplementaryUploads, CommitMessage); pushTask.Wait(); diff --git a/src/Microsoft.DotNet.Build.Tasks.Feed/BuildManifest/WriteOrchestratedBuildManifestSummaryToFile.cs b/src/Microsoft.DotNet.Build.Tasks.Feed/BuildManifest/WriteOrchestratedBuildManifestSummaryToFile.cs new file mode 100644 index 0000000000..86f4394e47 --- /dev/null +++ b/src/Microsoft.DotNet.Build.Tasks.Feed/BuildManifest/WriteOrchestratedBuildManifestSummaryToFile.cs @@ -0,0 +1,134 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using Microsoft.Build.Framework; +using Microsoft.Build.Utilities; +using Microsoft.DotNet.VersionTools.BuildManifest.Model; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Xml.Linq; + +namespace Microsoft.DotNet.Build.Tasks.Feed.BuildManifest +{ + public class WriteOrchestratedBuildManifestSummaryToFile : Task + { + private static readonly Dictionary SdkFileEndingLinks = new Dictionary + { + ["alpine.3.6-x64.tar.gz"] = "alpine-3.6-targz", + ["linux-x64.tar.gz"] = "linux-targz", + ["osx-x64.pkg"] = "osx-installer", + ["osx-x64.tar.gz"] = "osx-targz", + ["rhel-x64.rpm"] = "rhel-7-installer", + ["rhel.6-x64.tar.gz"] = "rhel-6-targz", + ["win-x64.exe"] = "win-x64-installer", + ["win-x64.zip"] = "win-x64-zip", + ["win-x86.exe"] = "win-x86-installer", + ["win-x86.zip"] = "win-x86-zip", + ["x64.deb"] = "linux-DEB-installer" + }; + + private const string SdkTableText = @" +| Platform | Build | +| -------- | :-------------------------------------: | +| **Windows x64** | [Installer][win-x64-installer] - [Checksum][win-x64-installer-checksum]
[zip][win-x64-zip] - [Checksum][win-x64-zip-checksum] | +| **Windows x86** | [Installer][win-x86-installer] - [Checksum][win-x86-installer-checksum]
[zip][win-x86-zip] - [Checksum][win-x86-zip-checksum] | +| **macOS** | [Installer][osx-installer] - [Checksum][osx-installer-checksum]
[tar.gz][osx-targz] - [Checksum][osx-targz-checksum] | +| **Linux x64** | [DEB Installer][linux-DEB-installer] - [Checksum][linux-DEB-installer-checksum]
[tar.gz][linux-targz] - [Checksum][linux-targz-checksum] | +| **RHEL 7.2** | [Installer][rhel-7-installer] - [Checksum][rhel-7-installer-checksum]
[tar.gz][linux-targz] - [Checksum][linux-targz-checksum] | +| **RHEL 6** | [tar.gz][rhel-6-targz] - [Checksum][rhel-6-targz-checksum] | +| **Alpine 3.6** | [tar.gz][alpine-3.6-targz] - [Checksum][alpine-3.6-targz-checksum] |"; + + [Required] + public string File { get; set; } + + [Required] + public string ManifestFile { get; set; } + + public override bool Execute() + { + string contents = System.IO.File.ReadAllText(ManifestFile); + OrchestratedBuildModel model = OrchestratedBuildModel.Parse(XElement.Parse(contents)); + + var builder = new StringBuilder(); + + builder.Append("## Product build: "); + builder.AppendLine(model.Identity.ToString()); + + builder.AppendLine(); + builder.AppendLine("### SDK Installers and Binaries"); + builder.AppendLine(SdkTableText); + + builder.AppendLine(); + EndpointModel blobFeed = model.Endpoints.First(e => e.IsOrchestratedBlobFeed); + foreach (var link in blobFeed.Artifacts.Blobs + .Select(b => new + { + b.Id, + Description = GetSdkInstallerDescription(b) + }) + .Where(d => d.Description != null)) + { + builder.Append("["); + builder.Append(link.Description); + builder.Append("]: "); + builder.Append(blobFeed.Url.Replace("/index.json", "/assets/")); + builder.AppendLine(link.Id); + } + + builder.AppendLine(); + builder.AppendLine("### Built Repositories"); + + foreach (BuildIdentity build in model.Builds + .Where(b => b.Name != "anonymous") + .OrderBy(b => b.Name)) + { + builder.Append(" * "); + builder.AppendLine(build.ToString()); + } + + System.IO.File.WriteAllText(File, builder.ToString()); + + return !Log.HasLoggedErrors; + } + + private static string GetSdkInstallerDescription(BlobArtifactModel blob) + { + string shipInstaller; + + if (blob.Attributes.TryGetValue("ShipInstaller", out shipInstaller)) + { + string[] blobPathParts = blob.Id.Split('/'); + + if (blobPathParts.Length == 3 && blobPathParts[0] == "Sdk") + { + string version = blobPathParts[1]; + string[] fileParts = blobPathParts[2].Split( + new[] {$"-{version}-"}, + StringSplitOptions.None); + + if (fileParts.Length == 2 && fileParts[0] == "dotnet-sdk") + { + string linkText; + + if (shipInstaller == "dotnetcli" && + SdkFileEndingLinks.TryGetValue(fileParts[1], out linkText)) + { + return linkText; + } + + if (shipInstaller == "dotnetclichecksums" && + SdkFileEndingLinks.TryGetValue(fileParts[1].Replace(".sha", ""), out linkText)) + { + return $"{linkText}-checksum"; + } + } + } + } + + return null; + } + } +} diff --git a/src/Microsoft.DotNet.Build.Tasks.Feed/Microsoft.DotNet.Build.Tasks.Feed.csproj b/src/Microsoft.DotNet.Build.Tasks.Feed/Microsoft.DotNet.Build.Tasks.Feed.csproj index e530dd169b..b499ac2d54 100644 --- a/src/Microsoft.DotNet.Build.Tasks.Feed/Microsoft.DotNet.Build.Tasks.Feed.csproj +++ b/src/Microsoft.DotNet.Build.Tasks.Feed/Microsoft.DotNet.Build.Tasks.Feed.csproj @@ -45,6 +45,7 @@ + diff --git a/src/Microsoft.DotNet.Build.Tasks.Feed/PackageFiles/Microsoft.DotNet.Build.Tasks.Feed.targets b/src/Microsoft.DotNet.Build.Tasks.Feed/PackageFiles/Microsoft.DotNet.Build.Tasks.Feed.targets index 42c60e0773..df10b4e58b 100644 --- a/src/Microsoft.DotNet.Build.Tasks.Feed/PackageFiles/Microsoft.DotNet.Build.Tasks.Feed.targets +++ b/src/Microsoft.DotNet.Build.Tasks.Feed/PackageFiles/Microsoft.DotNet.Build.Tasks.Feed.targets @@ -52,6 +52,7 @@ + false @@ -131,6 +132,7 @@ $(BaseIntermediateOutputPath)manifest-temp/ $(ManifestTempDir)downloads/ $(ManifestTempDir)build.xml + $(ManifestTempDir)README.md @@ -154,6 +156,13 @@ BuildManifestFiles="@(BuildManifests)" ManifestName="$(ManifestName)" ManifestBuildId="$(ManifestBuildId)" /> + + + + + +