From c7cc7de692ec881cf67c03050ba58c0a6ecf80ee Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Mon, 12 Apr 2021 13:36:56 +0000 Subject: [PATCH 001/699] [main] Update dependencies from dotnet/arcade mono/linker dotnet/xliff-tasks (#7216) [main] Update dependencies from dotnet/arcade mono/linker dotnet/xliff-tasks --- eng/Version.Details.xml | 28 ++++++++++++++-------------- eng/Versions.props | 10 +++++----- global.json | 4 ++-- 3 files changed, 21 insertions(+), 21 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index b85592e5f2e..6027d7a5b46 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -11,25 +11,25 @@ - + https://github.com/dotnet/arcade - 86aee6d02b2fb8534b9466db0da25483d7c399a9 + 28d9452d7e2ae4e98a1df735b90b03d3cac1f4e7 - + https://github.com/dotnet/arcade - 86aee6d02b2fb8534b9466db0da25483d7c399a9 + 28d9452d7e2ae4e98a1df735b90b03d3cac1f4e7 - + https://github.com/dotnet/arcade - 86aee6d02b2fb8534b9466db0da25483d7c399a9 + 28d9452d7e2ae4e98a1df735b90b03d3cac1f4e7 - + https://github.com/dotnet/arcade - 86aee6d02b2fb8534b9466db0da25483d7c399a9 + 28d9452d7e2ae4e98a1df735b90b03d3cac1f4e7 - + https://github.com/dotnet/arcade - 86aee6d02b2fb8534b9466db0da25483d7c399a9 + 28d9452d7e2ae4e98a1df735b90b03d3cac1f4e7 https://github.com/dotnet/arcade-services @@ -47,9 +47,9 @@ https://github.com/dotnet/roslyn 59eedc33d35754759994155ea2f4e1012a9951e3 - + https://github.com/mono/linker - 55bd0ebd00ddbf2cd817314b1cf6824003cfb463 + 6944b7c146a7149c108acad19b237a29fd2eed15 https://github.com/dotnet/sourcelink @@ -68,9 +68,9 @@ https://github.com/dotnet/symreader-converter c5ba7c88f92e2dde156c324a8c8edc04d9fa4fe0 - + https://github.com/dotnet/xliff-tasks - 0da469fe1c2714d0e25cad1143632562fb528425 + aa77a885dbf30ecdb14fa2f20d4e50432ee36db5 diff --git a/eng/Versions.props b/eng/Versions.props index eb7b34152b4..317c811c866 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -36,7 +36,7 @@ 2.1.1 2.1.0 3.9.0-6.21160.10 - 6.0.100-preview.2.21207.1 + 6.0.100-preview.2.21209.2 16.7.1 4.8.3 5.3.0.1 @@ -66,8 +66,8 @@ 2.4.1 2.0.3 2.4.1 - 6.0.0-beta.21207.4 - 6.0.0-beta.21207.4 + 6.0.0-beta.21209.17 + 6.0.0-beta.21209.17 1.22.0 1.1.2 2.0.0 @@ -80,8 +80,8 @@ 1.1.0-beta.20258.6 1.1.0-beta-21201-01 1.1.0-beta-21201-01 - 6.0.0-beta.21207.4 - 1.0.0-beta.21169.2 + 6.0.0-beta.21209.17 + 1.0.0-beta.21210.2 1.1.0-beta.20570.1 1.0.0-prerelease.21201.1 1.1.156402 diff --git a/global.json b/global.json index 859af09036f..61ed316d890 100644 --- a/global.json +++ b/global.json @@ -3,7 +3,7 @@ "dotnet": "6.0.100-preview.2.21155.3" }, "msbuild-sdks": { - "Microsoft.DotNet.Arcade.Sdk": "6.0.0-beta.21207.4", - "Microsoft.DotNet.Helix.Sdk": "6.0.0-beta.21207.4" + "Microsoft.DotNet.Arcade.Sdk": "6.0.0-beta.21209.17", + "Microsoft.DotNet.Helix.Sdk": "6.0.0-beta.21209.17" } } From 353ee1f9389490a507673838f1225906b632d7ca Mon Sep 17 00:00:00 2001 From: Gleb Balykov Date: Mon, 12 Apr 2021 17:35:31 +0300 Subject: [PATCH 002/699] Fix arm64 tizen rootfs setup (#7217) --- eng/common/cross/arm64/tizen-fetch.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/eng/common/cross/arm64/tizen-fetch.sh b/eng/common/cross/arm64/tizen-fetch.sh index a48a6f51c49..16d1301f21e 100755 --- a/eng/common/cross/arm64/tizen-fetch.sh +++ b/eng/common/cross/arm64/tizen-fetch.sh @@ -157,7 +157,7 @@ fetch_tizen_pkgs() Inform "Initialize arm base" fetch_tizen_pkgs_init standard base Inform "fetch common packages" -fetch_tizen_pkgs aarch64 gcc glibc glibc-devel libicu libicu-devel libatomic linux-glibc-devel +fetch_tizen_pkgs aarch64 gcc glibc glibc-devel libicu libicu-devel libatomic linux-glibc-devel keyutils keyutils-devel libkeyutils Inform "fetch coreclr packages" fetch_tizen_pkgs aarch64 lldb lldb-devel libgcc libstdc++ libstdc++-devel libunwind libunwind-devel lttng-ust-devel lttng-ust userspace-rcu-devel userspace-rcu Inform "fetch corefx packages" From 343efc294651d9c5565ee83db9ec5e02435125c1 Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Mon, 12 Apr 2021 15:02:07 +0000 Subject: [PATCH 003/699] [main] Update dependencies from dotnet/roslyn dotnet/xharness mono/linker (#7218) [main] Update dependencies from dotnet/roslyn dotnet/xharness mono/linker --- eng/Version.Details.xml | 12 ++++++------ eng/Versions.props | 6 +++--- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index 6027d7a5b46..70d9bfdda60 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -39,17 +39,17 @@ https://github.com/dotnet/arcade-services cac955fe259cb611f6a29d09209bd717deb69037 - + https://github.com/dotnet/xharness - c2c34bf7fdeb5a89e83817ced9a1a2c3c4cfc15c + b2297d610df1ae15fc7ba8bd8c9bc0a7192aaefa - + https://github.com/dotnet/roslyn - 59eedc33d35754759994155ea2f4e1012a9951e3 + 5f00f4d6ffb242a337e21a196aab0593891e430e - + https://github.com/mono/linker - 6944b7c146a7149c108acad19b237a29fd2eed15 + 6bfa2c0657d2dcfd6dce684ab34b470ce567631a https://github.com/dotnet/sourcelink diff --git a/eng/Versions.props b/eng/Versions.props index 317c811c866..d6a2ab0c888 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -35,8 +35,8 @@ 2.0.0 2.1.1 2.1.0 - 3.9.0-6.21160.10 - 6.0.100-preview.2.21209.2 + 3.10.0-2.21203.6 + 6.0.100-preview.2.21212.1 16.7.1 4.8.3 5.3.0.1 @@ -83,7 +83,7 @@ 6.0.0-beta.21209.17 1.0.0-beta.21210.2 1.1.0-beta.20570.1 - 1.0.0-prerelease.21201.1 + 1.0.0-prerelease.21209.2 1.1.156402 1.1.152002 6.0.100-preview.3.21175.4 From 23b4c4538445633be764e8a06094235537a511e6 Mon Sep 17 00:00:00 2001 From: Epsitha Ananth <47157394+epananth@users.noreply.github.com> Date: Mon, 12 Apr 2021 10:21:17 -0700 Subject: [PATCH 004/699] Publish artifacts and symbols one file at a time (#7086) * Improve publishing performance --- eng/publishing/v3/publish-assets.yml | 13 +- eng/publishing/v3/setup-maestro-vars.yml | 2 + .../SdkTasks/PublishArtifactsInManifest.proj | 15 +- .../PublishToSymbolServerTest.cs | 16 +- .../src/BlobFeedAction.cs | 108 +- .../src/PublishArtifactsInManifest.cs | 23 +- .../src/PublishArtifactsInManifestBase.cs | 1013 +++++++++++++++-- .../src/PublishArtifactsInManifestV3.cs | 96 +- .../src/common/GeneralUtils.cs | 4 +- .../src/model/BuildArtifacts.cs | 35 + 10 files changed, 1104 insertions(+), 221 deletions(-) create mode 100644 src/Microsoft.DotNet.Build.Tasks.Feed/src/model/BuildArtifacts.cs diff --git a/eng/publishing/v3/publish-assets.yml b/eng/publishing/v3/publish-assets.yml index beb11af49f1..af61f8bcf80 100644 --- a/eng/publishing/v3/publish-assets.yml +++ b/eng/publishing/v3/publish-assets.yml @@ -22,12 +22,15 @@ jobs: value: $[ dependencies.setupMaestroVars.outputs['setReleaseVars.AzDOPipelineId'] ] - name: AzDOBuildId value: $[ dependencies.setupMaestroVars.outputs['setReleaseVars.AzDOBuildId'] ] + - name: AzDOAccount + value: $[ dependencies.setupMaestroVars.outputs['setReleaseVars.AzDOBuildAccount'] ] pool: vmImage: 'windows-2019' steps: - task: DownloadBuildArtifacts@0 displayName: Download Build Assets continueOnError: true + enabled: true inputs: buildType: specific buildVersionToDownload: specific @@ -36,12 +39,9 @@ jobs: buildId: $(AzDOBuildId) downloadType: 'specific' itemPattern: | - PackageArtifacts/** - BlobArtifacts/** AssetManifests/** PdbArtifacts/** downloadPath: '$(Build.ArtifactStagingDirectory)' - checkDownloadedFiles: true - task: NuGetToolInstaller@1 displayName: 'Install NuGet.exe' @@ -87,7 +87,12 @@ jobs: /p:MsdlToken=$(microsoft-symbol-server-pat) /p:SymWebToken=$(symweb-symbol-server-pat) /p:BuildQuality='${{ parameters.buildQuality }}' - + /p:AzdoApiToken='$(dn-bot-all-orgs-build-rw-code-rw)' + /p:ArtifactsBasePath='$(Build.ArtifactStagingDirectory)/' + /p:BuildId='$(AzDOBuildId)' + /p:AzureDevOpsOrg='$(AzDOAccount)' + /p:AzureProject='$(AzDOProjectName)' + /p:UseStreamingPublishing='true' - template: /eng/common/templates/steps/publish-logs.yml parameters: StageLabel: '${{ parameters.stageName }}' diff --git a/eng/publishing/v3/setup-maestro-vars.yml b/eng/publishing/v3/setup-maestro-vars.yml index 804e9faee96..ae2e65527b6 100644 --- a/eng/publishing/v3/setup-maestro-vars.yml +++ b/eng/publishing/v3/setup-maestro-vars.yml @@ -38,6 +38,7 @@ jobs: $AzureDevOpsProject = $buildInfo.azureDevOpsProject $AzureDevOpsBuildDefinitionId = $buildInfo.azureDevOpsBuildDefinitionId $AzureDevOpsBuildId = $buildInfo.azureDevOpsBuildId + $AzureDevOpsAccount = $buildInfo.azureDevOpsAccount Write-Host "##vso[task.setvariable variable=BARBuildId;isOutput=true]$BarId" Write-Host "##vso[task.setvariable variable=TargetChannels;isOutput=true]$Channels" @@ -46,6 +47,7 @@ jobs: Write-Host "##vso[task.setvariable variable=AzDOProjectName;isOutput=true]$AzureDevOpsProject" Write-Host "##vso[task.setvariable variable=AzDOPipelineId;isOutput=true]$AzureDevOpsBuildDefinitionId" Write-Host "##vso[task.setvariable variable=AzDOBuildId;isOutput=true]$AzureDevOpsBuildId" + Write-Host "##vso[task.setvariable variable=AzDOBuildAccount;isOutput=true]$AzureDevOpsAccount" } catch { Write-Host $_ diff --git a/src/Microsoft.DotNet.Arcade.Sdk/tools/SdkTasks/PublishArtifactsInManifest.proj b/src/Microsoft.DotNet.Arcade.Sdk/tools/SdkTasks/PublishArtifactsInManifest.proj index 8f24fd48158..28d23ef95c2 100644 --- a/src/Microsoft.DotNet.Arcade.Sdk/tools/SdkTasks/PublishArtifactsInManifest.proj +++ b/src/Microsoft.DotNet.Arcade.Sdk/tools/SdkTasks/PublishArtifactsInManifest.proj @@ -23,6 +23,10 @@ - SymWebToken : Token used to publish symbol blobs, dll and pdb to Symweb - SymbolPublishingExclusionsFile : Files that have to be excluded from symbol publishing - PdbArtifactsBasePath : Path to dlls and pdbs + - AzdoApiToken : Token used to call the Azure Api to download artifacts and symbols + - ArtifactsBasePath : Staging directory + - UseStreamingPublishing : When set to true it will use Azure Api to download the artifacts and symbols using streaming, + else all the artifacts and symbols are downloaded before publishing. Optional aka.ms link generation parameters: - AkaMSClientId : Client ID for the aka.ms AD application @@ -103,6 +107,8 @@ $(ChecksumsAzureAccountKey) $(InternalChecksumsAzureAccountKey) false + false + $(BlobBasePath) + SymbolsFeedOverride="$(SymbolsFeedOverride)" + AzdoApiToken="$(AzdoApiToken)" + ArtifactsBasePath="$(ArtifactsBasePath)" + BuildId="$(BuildId)" + AzureDevOpsOrg="$(AzureDevOpsOrg)" + AzureProject="$(AzureProject)" + UseStreamingPublishing="$(UseStreamingPublishing)"/> + diff --git a/src/Microsoft.DotNet.Build.Tasks.Feed.Tests/PublishToSymbolServerTest.cs b/src/Microsoft.DotNet.Build.Tasks.Feed.Tests/PublishToSymbolServerTest.cs index 3216cf23dba..926fa188d10 100644 --- a/src/Microsoft.DotNet.Build.Tasks.Feed.Tests/PublishToSymbolServerTest.cs +++ b/src/Microsoft.DotNet.Build.Tasks.Feed.Tests/PublishToSymbolServerTest.cs @@ -1,8 +1,8 @@ using System.Collections.Generic; using System.IO; -using Castle.DynamicProxy.Generators.Emitters.SimpleAST; using Microsoft.Arcade.Test.Common; using Microsoft.DotNet.Build.Tasks.Feed.Model; +using Microsoft.DotNet.Maestro.Client.Models; using Xunit; namespace Microsoft.DotNet.Build.Tasks.Feed.Tests @@ -85,18 +85,23 @@ public void TemporarySymbolDirectoryDoesNotExists() BuildEngine = buildEngine, }; var path = TestInputs.GetFullPath("Symbol"); - var publish = task.HandleSymbolPublishingAsync(path, MsdlToken, SymWebToken, "", path, false); + var buildAsset = new Dictionary>(); + var publish = task.HandleSymbolPublishingAsync(path, MsdlToken, SymWebToken, "", false, buildAsset, path); Assert.True(task.Log.HasLoggedErrors); } [Fact] public void TemporarySymbolsDirectoryTest() { - var publishTask = new PublishArtifactsInManifestV3(); + var buildEngine = new MockBuildEngine(); + var publishTask = new PublishArtifactsInManifestV3() + { + BuildEngine = buildEngine, + }; var path = TestInputs.GetFullPath("Test"); - publishTask.EnsureTemporarySymbolDirectoryExists(path); + publishTask.EnsureTemporaryDirectoryExists(path); Assert.True(Directory.Exists(path)); - publishTask.DeleteSymbolTemporaryDirectory(path); + publishTask.DeleteTemporaryDirectory(path); Assert.False(Directory.Exists(path)); } @@ -134,6 +139,5 @@ public void PublishSymbolApiIsCalledTest() false, false).IsCompleted); } - } } diff --git a/src/Microsoft.DotNet.Build.Tasks.Feed/src/BlobFeedAction.cs b/src/Microsoft.DotNet.Build.Tasks.Feed/src/BlobFeedAction.cs index 77d64e62215..791b440ece5 100644 --- a/src/Microsoft.DotNet.Build.Tasks.Feed/src/BlobFeedAction.cs +++ b/src/Microsoft.DotNet.Build.Tasks.Feed/src/BlobFeedAction.cs @@ -1,23 +1,21 @@ // Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text.RegularExpressions; +using System.Threading; +using System.Threading.Tasks; using Microsoft.Build.Framework; using Microsoft.DotNet.Build.CloudTestTasks; using Microsoft.WindowsAzure.Storage; using Newtonsoft.Json; using Newtonsoft.Json.Linq; using Newtonsoft.Json.Serialization; -using NuGet.Packaging; using NuGet.Packaging.Core; using Sleet; -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.IO; -using System.Linq; -using System.Text.RegularExpressions; -using System.Threading; -using System.Threading.Tasks; using MSBuild = Microsoft.Build.Utilities; namespace Microsoft.DotNet.Build.Tasks.Feed @@ -124,17 +122,15 @@ public async Task PushItemsToFeedAsync( return !Log.HasLoggedErrors; } - public async Task PublishToFlatContainerAsync(IEnumerable taskItems, int maxClients, PushOptions pushOptions) + public async Task PublishToFlatContainerAsync(IEnumerable taskItems, int maxClients, + PushOptions pushOptions) { if (taskItems.Any()) { using (var clientThrottle = new SemaphoreSlim(maxClients, maxClients)) { await System.Threading.Tasks.Task.WhenAll(taskItems.Select( - item => - { - return UploadAssetAsync(item, clientThrottle, pushOptions); - } + item => { return UploadAssetAsync(item, pushOptions, clientThrottle); } )); } } @@ -142,8 +138,8 @@ await System.Threading.Tasks.Task.WhenAll(taskItems.Select( public async Task UploadAssetAsync( ITaskItem item, - SemaphoreSlim clientThrottle, - PushOptions options) + PushOptions options, + SemaphoreSlim clientThrottle = null) { string relativeBlobPath = item.GetMetadata("RelativeBlobPath"); @@ -154,58 +150,72 @@ public async Task UploadAssetAsync( relativeBlobPath = $"{recursiveDir}{fileName}"; } - relativeBlobPath = $"{RelativePath}{relativeBlobPath}".Replace("\\", "/"); - - if (relativeBlobPath.Contains("//")) + if (!string.IsNullOrEmpty(relativeBlobPath)) { - Log.LogError( - $"Item '{item.ItemSpec}' RelativeBlobPath contains virtual directory " + - $"without name (double forward slash): '{relativeBlobPath}'"); - return; - } + relativeBlobPath = $"{RelativePath}{relativeBlobPath}".Replace("\\", "/"); - Log.LogMessage($"Uploading {relativeBlobPath}"); + if (relativeBlobPath.StartsWith("//")) + { + Log.LogError( + $"Item '{item.ItemSpec}' RelativeBlobPath contains virtual directory " + + $"without name (double forward slash): '{relativeBlobPath}'"); + return; + } - await clientThrottle.WaitAsync(); + Log.LogMessage($"Uploading {relativeBlobPath}"); - try - { - AzureStorageUtils blobUtils = new AzureStorageUtils(AccountName, AccountKey, ContainerName); + if (clientThrottle != null) + { + await clientThrottle.WaitAsync(); + } - if (!options.AllowOverwrite && await blobUtils.CheckIfBlobExistsAsync(relativeBlobPath)) + try { - if (options.PassIfExistingItemIdentical) + AzureStorageUtils blobUtils = new AzureStorageUtils(AccountName, AccountKey, ContainerName); + + if (!options.AllowOverwrite && await blobUtils.CheckIfBlobExistsAsync(relativeBlobPath)) { - if (!await blobUtils.IsFileIdenticalToBlobAsync(item.ItemSpec, relativeBlobPath)) + if (options.PassIfExistingItemIdentical) { - Log.LogError( - $"Item '{item}' already exists with different contents " + - $"at '{relativeBlobPath}'"); + if (!await blobUtils.IsFileIdenticalToBlobAsync(item.ItemSpec, relativeBlobPath)) + { + Log.LogError( + $"Item '{item}' already exists with different contents " + + $"at '{relativeBlobPath}'"); + } + } + else + { + Log.LogError($"Item '{item}' already exists at '{relativeBlobPath}'"); } } else { - Log.LogError($"Item '{item}' already exists at '{relativeBlobPath}'"); + using (FileStream stream = + new FileStream(item.ItemSpec, FileMode.Open, FileAccess.Read, FileShare.Read)) + { + Log.LogMessage($"Uploading {item} to {relativeBlobPath}."); + await blobUtils.UploadBlockBlobAsync(item.ItemSpec, relativeBlobPath, stream); + } } } - else + catch (Exception exc) { - using (FileStream stream = - new FileStream(item.ItemSpec, FileMode.Open, FileAccess.Read, FileShare.Read)) + Log.LogError( + $"Unable to upload to {relativeBlobPath} in Azure Storage account {AccountName}/{ContainerName} due to {exc}."); + throw; + } + finally + { + if (clientThrottle != null) { - Log.LogMessage($"Uploading {item} to {relativeBlobPath}."); - await blobUtils.UploadBlockBlobAsync(item.ItemSpec, relativeBlobPath, stream); + clientThrottle.Release(); } } } - catch (Exception exc) - { - Log.LogError($"Unable to upload to {relativeBlobPath} in Azure Storage account {AccountName}/{ContainerName} due to {exc}."); - throw; - } - finally + else { - clientThrottle.Release(); + Log.LogError($"Relative blob path is empty."); } } @@ -332,7 +342,7 @@ private ISleetFileSystem GetAzureFileSystem(LocalCache fileCache) } } - private async Task PushAsync(IEnumerable items, PushOptions options) + public async Task PushAsync(IEnumerable items, PushOptions options) { LocalSettings settings = GetSettings(); SleetLogger log = new SleetLogger(Log, NuGet.Common.LogLevel.Verbose); diff --git a/src/Microsoft.DotNet.Build.Tasks.Feed/src/PublishArtifactsInManifest.cs b/src/Microsoft.DotNet.Build.Tasks.Feed/src/PublishArtifactsInManifest.cs index fef9005240e..0f5be881c36 100644 --- a/src/Microsoft.DotNet.Build.Tasks.Feed/src/PublishArtifactsInManifest.cs +++ b/src/Microsoft.DotNet.Build.Tasks.Feed/src/PublishArtifactsInManifest.cs @@ -183,6 +183,21 @@ public string BuildQuality get { return _buildQuality.GetDescription(); } set { Enum.TryParse(value, true, out _buildQuality); } } + public string AzdoApiToken {get; set;} + + public string ArtifactsBasePath { get; set;} + + public string BuildId { get; set; } + + public string AzureProject { get; set; } + + public string AzureDevOpsOrg { get; set; } + + /// + /// If true, uses Azdo Api to download artifacts and symbols files one file at a time during publishing process. + /// If it is set to false, then artifacts and symbols are downloaded in PackageArtifacts and BlobArtifacts directory before publishing. + /// + public bool UseStreamingPublishing { get; set; } = false; /// /// Just an internal flag to keep track whether we published assets via a V3 manifest or not. @@ -372,7 +387,13 @@ internal PublishArtifactsInManifestBase ConstructPublishingV3Task(BuildModel bui ChecksumsFeedOverride = this.ChecksumsFeedOverride, ShippingFeedOverride = this.ShippingFeedOverride, TransportFeedOverride = this.TransportFeedOverride, - SymbolsFeedOverride = this.SymbolsFeedOverride + SymbolsFeedOverride = this.SymbolsFeedOverride, + ArtifactsBasePath = this.ArtifactsBasePath, + AzdoApiToken = this.AzdoApiToken, + BuildId = this.BuildId, + AzureProject = this.AzureProject, + AzureDevOpsOrg = this.AzureDevOpsOrg, + UseStreamingPublishing = this.UseStreamingPublishing }; } } diff --git a/src/Microsoft.DotNet.Build.Tasks.Feed/src/PublishArtifactsInManifestBase.cs b/src/Microsoft.DotNet.Build.Tasks.Feed/src/PublishArtifactsInManifestBase.cs index 722e9e011f7..2655601a893 100644 --- a/src/Microsoft.DotNet.Build.Tasks.Feed/src/PublishArtifactsInManifestBase.cs +++ b/src/Microsoft.DotNet.Build.Tasks.Feed/src/PublishArtifactsInManifestBase.cs @@ -5,8 +5,10 @@ using System.Collections.Concurrent; using System.Collections.Generic; using System.Collections.Immutable; +using System.ComponentModel; using System.IO; using System.Linq; +using System.Net; using System.Net.Http; using System.Net.Http.Headers; using System.Reflection; @@ -14,11 +16,14 @@ using System.Text.RegularExpressions; using System.Threading; using System.Threading.Tasks; +using Microsoft.Arcade.Common; using Microsoft.Build.Framework; using Microsoft.DotNet.Build.Tasks.Feed.Model; using Microsoft.DotNet.Maestro.Client; using Microsoft.DotNet.Maestro.Client.Models; using Microsoft.DotNet.VersionTools.BuildManifest.Model; +using Newtonsoft.Json; +using NuGet.Packaging; using NuGet.Packaging.Core; using NuGet.Versioning; using static Microsoft.DotNet.Build.Tasks.Feed.GeneralUtils; @@ -103,6 +108,24 @@ public abstract class PublishArtifactsInManifestBase : Microsoft.Build.Utilities public string BuildQuality { get; set; } + public string AzdoApiToken { get; set; } + + public string ArtifactsBasePath { get; set; } + + public string AzureDevOpsFeedsApiVersion { get; set; } = "6.0"; + + public string AzureApiVersionForFileDownload { get; set; } = "4.1-preview.4"; + + public string AzureProject { get; set; } + + public string BuildId { get; set; } + + public string AzureDevOpsOrg { get; set; } + + private readonly string AzureDevOpsBaseUrl = $"https://dev.azure.com"; + + public bool UseStreamingPublishing { get; set; } + public readonly Dictionary> FeedConfigs = new Dictionary>(); @@ -126,6 +149,8 @@ public abstract class PublishArtifactsInManifestBase : Microsoft.Build.Utilities private const int ExpirationInDays = 3650; + public int TimeoutInMinutes { get; set; } = 5; + protected LatestLinksManager LinkManager { get; set; } = null; /// @@ -138,6 +163,23 @@ public abstract class PublishArtifactsInManifestBase : Microsoft.Build.Utilities /// public int RetryDelayMilliseconds { get; set; } = 5000; + public readonly ExponentialRetry RetryHandler = new ExponentialRetry + { + MaxAttempts = 5, + DelayBase = 2.5 // 2.5 ^ 5 = ~1.5 minutes max wait between retries + }; + + private enum ArtifactName + { + [Description("PackageArtifacts")] + PackageArtifacts, + + [Description("BlobArtifacts")] + BlobArtifacts + } + + private int TimeoutInSeconds = 180; + public override bool Execute() { return ExecuteAsync().GetAwaiter().GetResult(); @@ -246,7 +288,6 @@ protected Task PersistPendingAssetLocationAsync(IMaestroApi client) /// /// Protect against accidental publishing of internal assets to non-internal feeds. /// - /// protected void CheckForInternalBuildsOnPublicFeeds(TargetFeedConfig feedConfig) { // If separated out for clarity. @@ -317,7 +358,157 @@ public void CheckForStableAssetsInNonIsolatedFeeds() } /// - /// Publishes symbol, dll and pdb files to symbol server. + /// Publishes files to symbol server(s) one by one using Azure api to download files + /// + /// Path to dll and pdb files + /// Token to authenticate msdl + /// Token to authenticate symweb + /// Right now we do not add any files to this, so this is going to be null + /// If true, the special coreclr module indexed files like DBI, DAC and SOS are published + /// Task + public async Task PublishSymbolsUsingStreamingAsync( + string pdbArtifactsBasePath, + string msdlToken, + string symWebToken, + string symbolPublishingExclusionsFile, + bool publishSpecialClrFiles, + Dictionary> buildAssets) + { + StringBuilder symbolLog = new StringBuilder(); + symbolLog.AppendLine("Publishing Symbols to Symbol server: "); + var symbolCategory = TargetFeedContentType.Symbols; + string containerId = await GetContainerIdAsync(ArtifactName.BlobArtifacts); + + if (Log.HasLoggedErrors) + { + return; + } + HashSet symbolsToPublish = new HashSet(); + + //Get all the symbol file names + foreach (var asset in buildAssets) + { + var name = asset.Key; + if (name.Contains(".symbols.nupkg")) + { + symbolsToPublish.Add(Path.GetFileName(name)); + } + } + + HashSet feedConfigsForSymbols = FeedConfigs[symbolCategory]; + Dictionary serversToPublish = + GetTargetSymbolServers(feedConfigsForSymbols, msdlToken, symWebToken); + + using (HttpClient client = CreateAzdoClient(AzureDevOpsOrg, true)) + { + foreach (var symbol in symbolsToPublish) + { + string temporarySymbolsDirectory = CreateTemporaryDirectory(); + string localSymbolPath = Path.Combine(temporarySymbolsDirectory, symbol); + symbolLog.AppendLine($"Downloading symbol : {symbol} to {localSymbolPath}"); + + await DownloadFileAsync(client, ArtifactName.BlobArtifacts, containerId, symbol, localSymbolPath); + symbolLog.AppendLine($"Successfully downloaded symbol : {symbol} to {localSymbolPath}"); + List symbolFiles = new List(); + symbolFiles.ToList().Add(localSymbolPath); + + foreach (var server in serversToPublish) + { + var serverPath = server.Key; + var token = server.Value; + symbolLog.AppendLine($"Publishing symbol file {symbol} to {serverPath}:"); + + try + { + await PublishSymbolsHelper.PublishAsync( + Log, + serverPath, + token, + symbolFiles, + null, + null, + ExpirationInDays, + false, + publishSpecialClrFiles, + null, + false, + false, + true); + } + catch (Exception ex) + { + Log.LogError(ex.Message); + } + } + + DeleteTemporaryDirectory(temporarySymbolsDirectory); + } + symbolLog.AppendLine( + $"Performing symbol publishing... \nExpirationInDays : {ExpirationInDays} \nConvertPortablePdbsToWindowsPdb : false \ndryRun: false "); + symbolLog.AppendLine($"Total number of symbol files : {symbolsToPublish.Count}"); + symbolLog.AppendLine("Successfully published to Symbol Server."); + symbolLog.AppendLine(); + Log.LogMessage(MessageImportance.High, symbolLog.ToString()); + symbolLog.Clear(); + } + + // publishing pdb artifacts + IEnumerable filesToSymbolServer = null; + if (Directory.Exists(pdbArtifactsBasePath)) + { + var pdbEntries = System.IO.Directory.EnumerateFiles( + pdbArtifactsBasePath, + "*.pdb", + System.IO.SearchOption.AllDirectories); + var dllEntries = System.IO.Directory.EnumerateFiles( + pdbArtifactsBasePath, + "*.dll", + System.IO.SearchOption.AllDirectories); + filesToSymbolServer = pdbEntries.Concat(dllEntries); + } + + if (filesToSymbolServer != null && filesToSymbolServer.Any()) + { + foreach (var server in serversToPublish) + { + var serverPath = server.Key; + var token = server.Value; + symbolLog.AppendLine($"Publishing pdbFiles to {serverPath}:"); + + try + { + await PublishSymbolsHelper.PublishAsync( + Log, + serverPath, + token, + null, + filesToSymbolServer, + null, + ExpirationInDays, + false, + publishSpecialClrFiles, + null, + false, + false, + true); + } + catch (Exception ex) + { + Log.LogError(ex.Message); + } + } + + Log.LogMessage(MessageImportance.High, $"Successfully published pdb files"); + } + + else + { + Log.LogMessage(MessageImportance.Low, $"No pdb files to upload to symbol server."); + } + } + + /// + /// Decides how to publish the symbol, dll and pdb files /// /// Path to dll and pdb files /// Token to authenticate msdl @@ -325,20 +516,58 @@ public void CheckForStableAssetsInNonIsolatedFeeds() /// Right now we do not add any files to this, so this is going to be null /// Path to Symbol.nupkgs /// If true, the special coreclr module indexed files like DBI, DAC and SOS are published - /// public async Task HandleSymbolPublishingAsync ( string pdbArtifactsBasePath, string msdlToken, string symWebToken, string symbolPublishingExclusionsFile, - string temporarySymbolsLocation, - bool publishSpecialClrFiles) + bool publishSpecialClrFiles, + Dictionary> buildAssets, + string temporarySymbolsLocation = null) { - StringBuilder symbolLog = new StringBuilder(); - symbolLog.AppendLine("Publishing Symbols to Symbol server: "); + if (UseStreamingPublishing) + { + await PublishSymbolsUsingStreamingAsync( + pdbArtifactsBasePath, + msdlToken, + symWebToken, + symbolPublishingExclusionsFile, + publishSpecialClrFiles, + buildAssets); + } + else + { + await PublishSymbolsfromBlobArtifactsAsync( + pdbArtifactsBasePath, + msdlToken, + symWebToken, + symbolPublishingExclusionsFile, + publishSpecialClrFiles, + temporarySymbolsLocation); + } + } + /// + /// Publishes symbol, dll and pdb files to symbol server. + /// + /// Path to dll and pdb files + /// Token to authenticate msdl + /// Token to authenticate symweb + /// Right now we do not add any files to this, so this is going to be null + /// Path to Symbol.nupkgs + /// If true, the special coreclr module indexed files like DBI, DAC and SOS are published + public async Task PublishSymbolsfromBlobArtifactsAsync( + string pdbArtifactsBasePath, + string msdlToken, + string symWebToken, + string symbolPublishingExclusionsFile, + bool publishSpecialClrFiles, + string temporarySymbolsLocation = null) + { if (Directory.Exists(temporarySymbolsLocation)) { + StringBuilder symbolLog = new StringBuilder(); + symbolLog.AppendLine("Publishing Symbols to Symbol server: "); string[] fileEntries = Directory.GetFiles(temporarySymbolsLocation); var category = TargetFeedContentType.Symbols; @@ -349,10 +578,17 @@ public async Task HandleSymbolPublishingAsync ( GetTargetSymbolServers(feedConfigsForSymbols, msdlToken, symWebToken); IEnumerable filesToSymbolServer = null; + if (Directory.Exists(pdbArtifactsBasePath)) { - var pdbEntries = System.IO.Directory.EnumerateFiles(pdbArtifactsBasePath, "*.pdb", System.IO.SearchOption.AllDirectories); - var dllEntries = System.IO.Directory.EnumerateFiles(pdbArtifactsBasePath, "*.dll", System.IO.SearchOption.AllDirectories); + var pdbEntries = System.IO.Directory.EnumerateFiles( + pdbArtifactsBasePath, + "*.pdb", + System.IO.SearchOption.AllDirectories); + var dllEntries = System.IO.Directory.EnumerateFiles( + pdbArtifactsBasePath, + "*.dll", + System.IO.SearchOption.AllDirectories); filesToSymbolServer = pdbEntries.Concat(dllEntries); } @@ -363,20 +599,29 @@ public async Task HandleSymbolPublishingAsync ( symbolLog.AppendLine($"Publishing symbol packages to {serverPath}:"); symbolLog.AppendLine( $"Performing symbol publishing...\nSymbolServerPath : ${serverPath} \nExpirationInDays : {ExpirationInDays} \nConvertPortablePdbsToWindowsPdb : false \ndryRun: false \nTotal number of symbol files : {fileEntries.Length} "); - await PublishSymbolsHelper.PublishAsync( - Log, - serverPath, - token, - fileEntries, - filesToSymbolServer, - null, - ExpirationInDays, - false, - publishSpecialClrFiles, - null, - false, - false, - true); + + try + { + await PublishSymbolsHelper.PublishAsync( + Log, + serverPath, + token, + fileEntries, + filesToSymbolServer, + null, + ExpirationInDays, + false, + publishSpecialClrFiles, + null, + false, + false, + true); + } + catch (Exception ex) + { + Log.LogError(ex.Message); + } + symbolLog.AppendLine("Successfully published to Symbol Server."); symbolLog.AppendLine(); Log.LogMessage(MessageImportance.High, symbolLog.ToString()); @@ -385,7 +630,7 @@ await PublishSymbolsHelper.PublishAsync( } else { - Log.LogError($"Temporary symbols directory {temporarySymbolsLocation} does not exists."); + Log.LogError("Temporary symbols directory does not exists."); } } @@ -395,7 +640,7 @@ await PublishSymbolsHelper.PublishAsync( /// /// /// - /// + /// A map of symbol server path => token to the symbol server public Dictionary GetTargetSymbolServers(HashSet feedConfigsForSymbols, string msdlToken, string symWebToken) { Dictionary serversToPublish = new Dictionary(); @@ -439,19 +684,25 @@ protected async Task HandlePackagePublishingAsync(Dictionary FilterPackages(HashSet + /// Creates Azdo client + /// + /// Name of the org + /// If client is used for downloading the artifact then AutomaticDecompression has to be set, else it is not required + /// Azure devOps project name + /// Default version is 6.0 + /// HttpClient + public HttpClient CreateAzdoClient( + string accountName, + bool setAutomaticDecompression, + string projectName = null, + string versionOverride = null) + { + HttpClientHandler handler = new HttpClientHandler {CheckCertificateRevocationList = true}; + if (setAutomaticDecompression) + { + handler.AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate; + } + + string address = $"https://dev.azure.com/{accountName}/"; + + if (!string.IsNullOrEmpty(projectName)) + { + address += $"{projectName}/"; + } + + var client = new HttpClient(handler) + { + BaseAddress = new Uri(address) + }; + client.Timeout = TimeSpan.FromSeconds(TimeoutInSeconds); + client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue( + "Basic", + Convert.ToBase64String(Encoding.ASCII.GetBytes(string.Format("{0}:{1}", "", + AzdoApiToken)))); + client.DefaultRequestHeaders.Add( + "Accept", + $"application/xml;api-version={versionOverride ?? AzureDevOpsFeedsApiVersion}"); + return client; + } + + /// + /// Gets the container Id, that is going to be used in another API call to download the assets + /// ContainerId is the same for PackageArtifacts and BlobArtifacts + /// + /// If it is PackageArtifacts or BlobArtifacts + /// ContainerId + private async Task GetContainerIdAsync(ArtifactName artifactName) + { + string uri = + $"{AzureDevOpsBaseUrl}/{AzureDevOpsOrg}/{AzureProject}/_apis/build/builds/{BuildId}/artifacts?api-version={AzureDevOpsFeedsApiVersion}"; + Exception mostRecentlyCaughtException = null; + string containerId = ""; + bool success = await RetryHandler.RunAsync(async attempt => + { + try + { + CancellationTokenSource timeoutTokenSource = + new CancellationTokenSource(TimeSpan.FromMinutes(TimeoutInMinutes)); + + using HttpClient client = CreateAzdoClient(AzureDevOpsOrg, false, AzureProject); + using HttpRequestMessage getMessage = new HttpRequestMessage(HttpMethod.Get, uri); + using HttpResponseMessage response = await client.GetAsync(uri, timeoutTokenSource.Token); + + response.EnsureSuccessStatusCode(); + string responseBody = await response.Content.ReadAsStringAsync(); + BuildArtifacts buildArtifacts = JsonConvert.DeserializeObject(responseBody); + + foreach (var artifact in buildArtifacts.value) + { + ArtifactName name; + if (Enum.TryParse(artifact.name, out name) && name == artifactName) + { + string[] segment = artifact.resource.data.Split('/'); + containerId = segment[1]; + return true; + } + } + return false; + } + catch (HttpRequestException toStore) + { + mostRecentlyCaughtException = toStore; + return false; + } + }).ConfigureAwait(false); + + if (string.IsNullOrEmpty(containerId)) + { + Log.LogError("Container Id does not exists"); + } + + if (!success) + { + throw new Exception( + $"Failed to get container id after {RetryHandler.MaxAttempts} attempts. See inner exception for details, {mostRecentlyCaughtException}"); + } + + return containerId; + } + + /// + /// Download artifact file using Azure API + /// + /// Azdo client + /// If it is PackageArtifacts or BlobArtifacts + /// ContainerId where the packageArtifact and BlobArtifacts are stored + /// Name the file we are trying to download + /// Path where the file is being downloaded + private async Task DownloadFileAsync( + HttpClient client, + ArtifactName artifactName, + string containerId, + string fileName, + string path) + { + string uri = + $"{AzureDevOpsBaseUrl}/{AzureDevOpsOrg}/_apis/resources/Containers/{containerId}?itemPath=/{artifactName}/{fileName}&isShallow=true&api-version={AzureApiVersionForFileDownload}"; + Log.LogMessage(MessageImportance.Low, $"Download file uri = {uri}"); + Exception mostRecentlyCaughtException = null; + bool success = await RetryHandler.RunAsync(async attempt => + { + try + { + CancellationTokenSource timeoutTokenSource = + new CancellationTokenSource(TimeSpan.FromMinutes(TimeoutInMinutes)); + + using HttpRequestMessage getMessage = new HttpRequestMessage(HttpMethod.Get, uri); + using HttpResponseMessage response = await client.GetAsync(uri, timeoutTokenSource.Token); + + response.EnsureSuccessStatusCode(); + + using var fs = new FileStream( + path, + FileMode.Create, + FileAccess.ReadWrite, + FileShare.ReadWrite); + using var stream = await response.Content.ReadAsStreamAsync(); + + try + { + await stream.CopyToAsync(fs); + } + finally + { + stream.Close(); + fs.Close(); + } + + return true; + } + catch (HttpRequestException toStore) + { + mostRecentlyCaughtException = toStore; + return false; + } + }).ConfigureAwait(false); + + if (!success) + { + throw new Exception( + $"Failed to download local file '{path}' after {RetryHandler.MaxAttempts} attempts. See inner exception for details, {mostRecentlyCaughtException}"); + } + } + protected async Task HandleBlobPublishingAsync(Dictionary> buildAssets) { List publishTasks = new List(); @@ -502,19 +919,29 @@ protected async Task HandleBlobPublishingAsync(Dictionary string isolatedString = feedConfig.Isolated ? "Isolated" : "Non-Isolated"; string internalString = feedConfig.Internal ? $", Internal" : ", Public"; string shippingString = blob.NonShipping ? "NonShipping" : "Shipping"; - Log.LogMessage(MessageImportance.High, $"Blob {blob.Id} ({shippingString}) should go to {feedConfig.TargetURL} ({isolatedString}{internalString})"); + Log.LogMessage(MessageImportance.High, + $"Blob {blob.Id} ({shippingString}) should go to {feedConfig.TargetURL} ({isolatedString}{internalString})"); } switch (feedConfig.Type) { case FeedType.AzDoNugetFeed: - publishTasks.Add(PublishBlobsToAzDoNugetFeedAsync(filteredBlobs, buildAssets, feedConfig)); + publishTasks.Add( + PublishBlobsToAzDoNugetFeedAsync( + filteredBlobs, + buildAssets, + feedConfig)); break; case FeedType.AzureStorageFeed: - publishTasks.Add(PublishBlobsToAzureStorageNugetFeedAsync(filteredBlobs, buildAssets, feedConfig)); + publishTasks.Add( + PublishBlobsToAzureStorageNugetFeedAsync( + filteredBlobs, + buildAssets, + feedConfig)); break; default: - Log.LogError($"Unknown target feed type for category '{category}': '{feedConfig.Type}'."); + Log.LogError( + $"Unknown target feed type for category '{category}': '{feedConfig.Type}'."); break; } } @@ -581,7 +1008,7 @@ public void SplitArtifactsInCategories(BuildModel buildModel) } else { - PackagesByCategory[categoryKey] = new HashSet() { packageAsset }; + PackagesByCategory[categoryKey] = new HashSet() {packageAsset}; } } } @@ -608,13 +1035,13 @@ public void SplitArtifactsInCategories(BuildModel buildModel) } else { - BlobsByCategory[categoryKey] = new HashSet() { blobAsset }; + BlobsByCategory[categoryKey] = new HashSet() {blobAsset}; } } } } - private async Task PublishPackagesToAzDoNugetFeedAsync( + private async Task PublishPackagesFromPackageArtifactsToAzDoNugetFeedAsync( HashSet packagesToPublish, Dictionary> buildAssets, TargetFeedConfig feedConfig) @@ -622,17 +1049,108 @@ private async Task PublishPackagesToAzDoNugetFeedAsync( await PushNugetPackagesAsync(packagesToPublish, feedConfig, maxClients: MaxClients, async (feed, httpClient, package, feedAccount, feedVisibility, feedName) => { - string localPackagePath = Path.Combine(PackageAssetsBasePath, $"{package.Id}.{package.Version}.nupkg"); + string localPackagePath = + Path.Combine(PackageAssetsBasePath, $"{package.Id}.{package.Version}.nupkg"); if (!File.Exists(localPackagePath)) { Log.LogError($"Could not locate '{package.Id}.{package.Version}' at '{localPackagePath}'"); return; } - TryAddAssetLocation(package.Id, package.Version, buildAssets, feedConfig, AddAssetLocationToAssetAssetLocationType.NugetFeed); + TryAddAssetLocation( + package.Id, + package.Version, + buildAssets, + feedConfig, + AddAssetLocationToAssetAssetLocationType.NugetFeed); + + await PushNugetPackageAsync( + feed, + httpClient, + localPackagePath, + package.Id, + package.Version, + feedAccount, + feedVisibility, + feedName); + }); + } + + private async Task PublishPackagesUsingStreamingToAzdoNugetAsync( + HashSet packagesToPublish, + Dictionary> buildAssets, + TargetFeedConfig feedConfig) + { + string containerId = await GetContainerIdAsync(ArtifactName.PackageArtifacts); + + if (Log.HasLoggedErrors) + { + return; + } + + using HttpClient client = CreateAzdoClient(AzureDevOpsOrg, true); + + foreach (var package in packagesToPublish) + { + var packageFilename = $"{package.Id}.{package.Version}.nupkg"; + string temporaryPackageDirectory = + Path.GetFullPath(Path.Combine(ArtifactsBasePath, Guid.NewGuid().ToString())); + EnsureTemporaryDirectoryExists(temporaryPackageDirectory); + string localPackagePath = Path.Combine(temporaryPackageDirectory, packageFilename); + Log.LogMessage(MessageImportance.Low, $"Downloading package : {packageFilename} to {localPackagePath}"); + + await DownloadFileAsync( + client, + ArtifactName.PackageArtifacts, + containerId, + packageFilename, + localPackagePath); + + if (!File.Exists(localPackagePath)) + { + Log.LogError( + $"Could not locate '{package.Id}.{package.Version}' at '{localPackagePath}'"); + return; + } + Log.LogMessage(MessageImportance.Low, $"Successfully downloaded package : {packageFilename} to {localPackagePath}"); + + TryAddAssetLocation( + package.Id, + package.Version, + buildAssets, + feedConfig, + AddAssetLocationToAssetAssetLocationType.NugetFeed); - await PushNugetPackageAsync(feed, httpClient, localPackagePath, package.Id, package.Version, feedAccount, feedVisibility, feedName); + using HttpClient httpClient = new HttpClient(new HttpClientHandler + { + CheckCertificateRevocationList = true }); + + httpClient.Timeout = TimeSpan.FromSeconds(TimeoutInSeconds); + httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue( + "Basic", + Convert.ToBase64String( + Encoding.ASCII.GetBytes(string.Format("{0}:{1}", "", feedConfig.Token)))); + + await PushPackageToNugetFeed(httpClient, feedConfig, localPackagePath, package.Id, package.Version); + + DeleteTemporaryDirectory(localPackagePath); + } + } + + private async Task PublishPackagesToAzDoNugetFeedAsync( + HashSet packagesToPublish, + Dictionary> buildAssets, + TargetFeedConfig feedConfig) + { + if (UseStreamingPublishing) + { + await PublishPackagesUsingStreamingToAzdoNugetAsync(packagesToPublish, buildAssets, feedConfig); + } + else + { + await PublishPackagesFromPackageArtifactsToAzDoNugetFeedAsync(packagesToPublish, buildAssets, feedConfig); + } } /// @@ -640,7 +1158,10 @@ await PushNugetPackagesAsync(packagesToPublish, feedConfig, maxClients: MaxClien /// /// List of packages to publish /// Information about feed to publish to - public async Task PushNugetPackagesAsync(HashSet packagesToPublish, TargetFeedConfig feedConfig, int maxClients, + public async Task PushNugetPackagesAsync( + HashSet packagesToPublish, + TargetFeedConfig feedConfig, + int maxClients, Func packagePublishAction) { if (!packagesToPublish.Any()) @@ -651,36 +1172,44 @@ public async Task PushNugetPackagesAsync(HashSet packagesToPublish, Target var parsedUri = Regex.Match(feedConfig.TargetURL, PublishingConstants.AzDoNuGetFeedPattern); if (!parsedUri.Success) { - Log.LogError($"Azure DevOps NuGetFeed was not in the expected format '{PublishingConstants.AzDoNuGetFeedPattern}'"); + Log.LogError( + $"Azure DevOps NuGetFeed was not in the expected format '{PublishingConstants.AzDoNuGetFeedPattern}'"); return; } + string feedAccount = parsedUri.Groups["account"].Value; string feedVisibility = parsedUri.Groups["visibility"].Value; string feedName = parsedUri.Groups["feed"].Value; - using (var clientThrottle = new SemaphoreSlim(maxClients, maxClients)) + using var clientThrottle = new SemaphoreSlim(maxClients, maxClients); + + using (HttpClient httpClient = new HttpClient(new HttpClientHandler + {CheckCertificateRevocationList = true})) { - using (HttpClient httpClient = new HttpClient(new HttpClientHandler { CheckCertificateRevocationList = true })) - { - httpClient.Timeout = TimeSpan.FromSeconds(180); - httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue( - "Basic", - Convert.ToBase64String(Encoding.ASCII.GetBytes(string.Format("{0}:{1}", "", feedConfig.Token)))); + httpClient.Timeout = TimeSpan.FromSeconds(180); + httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue( + "Basic", + Convert.ToBase64String(Encoding.ASCII.GetBytes(string.Format("{0}:{1}", "", feedConfig.Token)))); - await Task.WhenAll(packagesToPublish.Select(async packageToPublish => + await Task.WhenAll(packagesToPublish.Select(async packageToPublish => + { + try { - try - { - // Wait to avoid starting too many processes. - await clientThrottle.WaitAsync(); - await packagePublishAction(feedConfig, httpClient, packageToPublish, feedAccount, feedVisibility, feedName); - } - finally - { - clientThrottle.Release(); - } - })); - } + // Wait to avoid starting too many processes. + await clientThrottle.WaitAsync(); + await packagePublishAction( + feedConfig, + httpClient, + packageToPublish, + feedAccount, + feedVisibility, + feedName); + } + finally + { + clientThrottle.Release(); + } + })); } } @@ -787,7 +1316,7 @@ public async Task PushNugetPackageAsync( } else { - Log.LogMessage(MessageImportance.High, $"Succeeded publishing package '{localPackageLocation}' to feed {feedConfig.TargetURL}"); + Log.LogMessage($"Succeeded publishing package '{localPackageLocation}' to feed {feedConfig.TargetURL}"); } } catch (Exception e) @@ -817,14 +1346,38 @@ private async Task PublishBlobsToAzDoNugetFeedAsync( } else { - Log.LogWarning($"AzDO feed publishing not available for blobs. Blob '{blob.Id}' was not published."); + Log.LogWarning( + $"AzDO feed publishing not available for blobs. Blob '{blob.Id}' was not published."); } } - await PushNugetPackagesAsync(packagesToPublish, feedConfig, maxClients: MaxClients, + if (UseStreamingPublishing) + { + await PublishBlobsUsingStreamingToAzDoNugetAsync(packagesToPublish, buildAssets, feedConfig); + } + else + { + await PublishBlobsFromBlobArtifactsToAzDoNugetAsync(packagesToPublish, buildAssets, feedConfig); + } + } + + private async Task PublishBlobsFromBlobArtifactsToAzDoNugetAsync( + HashSet blobsToPublish, + Dictionary> buildAssets, + TargetFeedConfig feedConfig) + { + await PushNugetPackagesAsync( + blobsToPublish, + feedConfig, + maxClients: MaxClients, async (feed, httpClient, blob, feedAccount, feedVisibility, feedName) => { - if (TryAddAssetLocation(blob.Id, assetVersion: null, buildAssets, feedConfig, AddAssetLocationToAssetAssetLocationType.Container)) + if (TryAddAssetLocation( + blob.Id, + assetVersion: null, + buildAssets, + feedConfig, + AddAssetLocationToAssetAssetLocationType.Container)) { // Determine the local path to the blob string fileName = Path.GetFileName(blob.Id); @@ -838,54 +1391,229 @@ await PushNugetPackagesAsync(packagesToPublish, feedConfig, m string id; string version; // Determine package ID and version by asking the nuget libraries - using (var packageReader = new NuGet.Packaging.PackageArchiveReader(localBlobPath)) + using (var packageReader = new PackageArchiveReader(localBlobPath)) { PackageIdentity packageIdentity = packageReader.GetIdentity(); id = packageIdentity.Id; version = packageIdentity.Version.ToString(); } - await PushNugetPackageAsync(feed, httpClient, localBlobPath, id, version, feedAccount, feedVisibility, feedName); + await PushNugetPackageAsync( + feed, + httpClient, + localBlobPath, + id, + version, + feedAccount, + feedVisibility, + feedName); } }); } - private async Task PublishPackagesToAzureStorageNugetFeedAsync( - HashSet packagesToPublish, + private async Task PublishBlobsUsingStreamingToAzDoNugetAsync( + HashSet blobsToPublish, Dictionary> buildAssets, TargetFeedConfig feedConfig) { - var packages = packagesToPublish.Select(p => + string containerId = await GetContainerIdAsync(ArtifactName.BlobArtifacts); + + if (Log.HasLoggedErrors) { - var localPackagePath = Path.Combine(PackageAssetsBasePath, $"{p.Id}.{p.Version}.nupkg"); - if (!File.Exists(localPackagePath)) + return; + } + using HttpClient client = CreateAzdoClient(AzureDevOpsOrg, true, AzureProject); + + foreach (var blob in blobsToPublish) + { + if (TryAddAssetLocation( + blob.Id, + assetVersion: null, + buildAssets, + feedConfig, + AddAssetLocationToAssetAssetLocationType.Container)) { - Log.LogError($"Could not locate '{p.Id}.{p.Version}' at '{localPackagePath}'"); + string temporaryBlobDirectory = CreateTemporaryDirectory(); + string fileName = Path.GetFileName(blob.Id); + string localBlobPath = Path.Combine(temporaryBlobDirectory, fileName); + Log.LogMessage(MessageImportance.Low, $"Downloading blob : {fileName} to {localBlobPath}"); + + await DownloadFileAsync( + client, + ArtifactName.BlobArtifacts, + containerId, + fileName, + localBlobPath); + + if (!File.Exists(localBlobPath)) + { + Log.LogError($"Could not locate '{blob.Id} at '{localBlobPath}'"); + } + Log.LogMessage(MessageImportance.Low, $"Successfully downloaded blob : {fileName} to {localBlobPath}"); + + string id; + string version; + using (var packageReader = new PackageArchiveReader(localBlobPath)) + { + PackageIdentity packageIdentity = packageReader.GetIdentity(); + id = packageIdentity.Id; + version = packageIdentity.Version.ToString(); + } + + await PushBlobToNugetFeed( + feedConfig, + localBlobPath, + id, + version); + + DeleteTemporaryDirectory(temporaryBlobDirectory); } - return localPackagePath; - }); + } + } - if (Log.HasLoggedErrors) + private async Task PushBlobToNugetFeed(TargetFeedConfig feedConfig, string localBlobPath, string id, + string version) + { + var parsedUri = Regex.Match(feedConfig.TargetURL, PublishingConstants.AzDoNuGetFeedPattern); + if (!parsedUri.Success) { + Log.LogError( + $"Azure DevOps NuGetFeed was not in the expected format '{PublishingConstants.AzDoNuGetFeedPattern}'"); return; } + string feedAccount = parsedUri.Groups["account"].Value; + string feedVisibility = parsedUri.Groups["visibility"].Value; + string feedName = parsedUri.Groups["feed"].Value; + + using HttpClient httpClient = new HttpClient(new HttpClientHandler + {CheckCertificateRevocationList = true}); + httpClient.Timeout = TimeSpan.FromSeconds(180); + httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue( + "Basic", + Convert.ToBase64String( + Encoding.ASCII.GetBytes(string.Format("{0}:{1}", "", + feedConfig.Token)))); + try + { + await PushNugetPackageAsync( + feedConfig, + httpClient, + localBlobPath, + id, + version, + feedAccount, + feedVisibility, + feedName); + } + catch (Exception e) + { + Log.LogErrorFromException(e); + } + } - var blobFeedAction = CreateBlobFeedAction(feedConfig); + /// + /// Creates a temporary directory + /// + /// Path to the directory created + public string CreateTemporaryDirectory() + { + string temporaryDirectory = + Path.GetFullPath(Path.Combine(ArtifactsBasePath, Guid.NewGuid().ToString())); + EnsureTemporaryDirectoryExists(temporaryDirectory); + return temporaryDirectory; + } + + private async Task PublishBlobsToAzureStorageNugetFeedAsync( + HashSet blobsToPublish, + Dictionary> buildAssets, + TargetFeedConfig feedConfig) + { + if (UseStreamingPublishing) + { + await PublishBlobsToAzureStorageNugetUsingStreamingPublishingAsync(blobsToPublish, buildAssets, feedConfig); + } + else + { + await PublishBlobsToAzureStorageNugetAsync(blobsToPublish, buildAssets, feedConfig); + } + + if (LinkManager == null) + { + LinkManager = new LatestLinksManager( + AkaMSClientId, + AkaMSClientSecret, + AkaMSTenant, + AkaMSGroupOwner, + AkaMSCreatedBy, + AkaMsOwners, + Log); + } + // The latest links should be updated only after the publishing is complete, to avoid + // dead links in the interim. + await LinkManager.CreateOrUpdateLatestLinksAsync( + blobsToPublish, + feedConfig, + PublishingConstants.ExpectedFeedUrlSuffix.Length); + } + private async Task PublishBlobsToAzureStorageNugetUsingStreamingPublishingAsync( + HashSet blobsToPublish, + Dictionary> buildAssets, + TargetFeedConfig feedConfig) + { + string containerId = await GetContainerIdAsync(ArtifactName.BlobArtifacts); + + if (Log.HasLoggedErrors) + { + return; + } + var blobFeedAction = CreateBlobFeedAction(feedConfig); var pushOptions = new PushOptions { AllowOverwrite = feedConfig.AllowOverwrite, PassIfExistingItemIdentical = true }; + using HttpClient client = CreateAzdoClient(AzureDevOpsOrg, true, AzureProject); - packagesToPublish - .ToList() - .ForEach(package => TryAddAssetLocation(package.Id, package.Version, buildAssets, feedConfig, AddAssetLocationToAssetAssetLocationType.NugetFeed)); + foreach (var blob in blobsToPublish) + { + string temporaryBlobDirectory = CreateTemporaryDirectory(); + var fileName = Path.GetFileName(blob.Id); + var localBlobPath = Path.Combine(temporaryBlobDirectory, fileName); + Log.LogMessage(MessageImportance.Low, $"Downloading blob : {fileName} to {localBlobPath}"); + + await DownloadFileAsync( + client, + ArtifactName.BlobArtifacts, + containerId, + fileName, + localBlobPath); + + if (!File.Exists(localBlobPath)) + { + Log.LogError($"Could not locate '{blob.Id} at '{localBlobPath}'"); + } + Log.LogMessage(MessageImportance.Low, $"Successfully downloaded blob : {fileName} to {localBlobPath}"); - await blobFeedAction.PushToFeedAsync(packages, pushOptions); + var item = new Microsoft.Build.Utilities.TaskItem(localBlobPath, + new Dictionary + { + {"RelativeBlobPath", blob.Id} + }); + + TryAddAssetLocation( + blob.Id, + assetVersion: null, + buildAssets, + feedConfig, + AddAssetLocationToAssetAssetLocationType.Container); + + await blobFeedAction.UploadAssetAsync(item, pushOptions, null); + DeleteTemporaryDirectory(temporaryBlobDirectory); + } } - private async Task PublishBlobsToAzureStorageNugetFeedAsync( + private async Task PublishBlobsToAzureStorageNugetAsync( HashSet blobsToPublish, Dictionary> buildAssets, TargetFeedConfig feedConfig) @@ -921,18 +1649,14 @@ private async Task PublishBlobsToAzureStorageNugetFeedAsync( blobsToPublish .ToList() - .ForEach(blob => TryAddAssetLocation(blob.Id, assetVersion: null, buildAssets, feedConfig, AddAssetLocationToAssetAssetLocationType.Container)); + .ForEach(blob => TryAddAssetLocation( + blob.Id, + assetVersion: null, + buildAssets, + feedConfig, + AddAssetLocationToAssetAssetLocationType.Container)); await blobFeedAction.PublishToFlatContainerAsync(blobs, maxClients: MaxClients, pushOptions); - - if (LinkManager == null) - { - LinkManager = new LatestLinksManager(AkaMSClientId, AkaMSClientSecret, AkaMSTenant, AkaMSGroupOwner, AkaMSCreatedBy, AkaMsOwners, Log); - } - - // The latest links should be updated only after the publishing is complete, to avoid - // dead links in the interim. - await LinkManager.CreateOrUpdateLatestLinksAsync(blobsToPublish, feedConfig, PublishingConstants.ExpectedFeedUrlSuffix.Length); } private BlobFeedAction CreateBlobFeedAction(TargetFeedConfig feedConfig) @@ -974,6 +1698,102 @@ private BlobFeedAction CreateBlobFeedAction(TargetFeedConfig feedConfig) } } + private async Task PushPackageToNugetFeed( + HttpClient httpClient, + TargetFeedConfig feedConfig, + string localPackagePath, + string id, + string version) + { + var parsedUri = Regex.Match(feedConfig.TargetURL, PublishingConstants.AzDoNuGetFeedPattern); + + if (!parsedUri.Success) + { + Log.LogError( + $"Azure DevOps NuGetFeed was not in the expected format '{PublishingConstants.AzDoNuGetFeedPattern}'"); + return; + } + + string feedAccount = parsedUri.Groups["account"].Value; + string feedVisibility = parsedUri.Groups["visibility"].Value; + string feedName = parsedUri.Groups["feed"].Value; + + await PushNugetPackageAsync( + feedConfig, + httpClient, + localPackagePath, + id, + version, + feedAccount, + feedVisibility, + feedName); + } + + /// + /// Create Temporary directory if it does not exists. + /// + /// + public void EnsureTemporaryDirectoryExists(string temporaryLocation) + { + if (!Directory.Exists(temporaryLocation)) + { + Directory.CreateDirectory(temporaryLocation); + } + } + + /// + /// Delete the files after publishing, this is part of cleanup + /// + /// + public void DeleteTemporaryFiles(string temporaryLocation) + { + try + { + if (Directory.Exists(temporaryLocation)) + { + string[] fileEntries = Directory.GetFiles(temporaryLocation); + foreach (var file in fileEntries) + { + File.Delete(file); + } + } + } + catch (Exception ex) + { + Log.LogWarning(ex.Message); + } + } + + /// + /// Deletes the temporary folder, this is part of clean up + /// + /// + public void DeleteTemporaryDirectory(string temporaryLocation) + { + var attempts = 0; + if (Directory.Exists(temporaryLocation)) + { + do + { + try + { + attempts++; + Log.LogMessage(MessageImportance.Low, $"Deleting directory : {temporaryLocation}"); + Directory.Delete(temporaryLocation, true); + break; + } + catch (Exception ex) + { + if (attempts == MaxRetryCount) + Log.LogMessage(MessageImportance.Low, $"Unable to delete the directory because of {ex.Message} after {attempts} attempts."); + } + Log.LogMessage(MessageImportance.Low, $"Retrying to delete {temporaryLocation}, attempt number {attempts}"); + Task.Delay(RetryDelayMilliseconds).Wait(); + } + while (true); + } + } + protected bool AnyMissingRequiredProperty() { foreach (PropertyInfo prop in this.GetType().GetProperties()) @@ -1024,6 +1844,15 @@ protected bool AnyMissingRequiredBaseProperties() Log.LogError($"The property {nameof(BuildAssetRegistryToken)} is required but doesn't have a value set."); } + if (string.IsNullOrEmpty(AzdoApiToken)) + { + Log.LogError($"The property {nameof(AzdoApiToken)} is required but doesn't have a value set."); + } + + if (string.IsNullOrEmpty(ArtifactsBasePath)) + { + Log.LogError($"The property {nameof(ArtifactsBasePath)} is required but doesn't have a value set."); + } return Log.HasLoggedErrors; } } diff --git a/src/Microsoft.DotNet.Build.Tasks.Feed/src/PublishArtifactsInManifestV3.cs b/src/Microsoft.DotNet.Build.Tasks.Feed/src/PublishArtifactsInManifestV3.cs index 1aa5bb834ed..4228c42d701 100644 --- a/src/Microsoft.DotNet.Build.Tasks.Feed/src/PublishArtifactsInManifestV3.cs +++ b/src/Microsoft.DotNet.Build.Tasks.Feed/src/PublishArtifactsInManifestV3.cs @@ -1,16 +1,16 @@ // Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. -using Microsoft.Build.Framework; -using Microsoft.DotNet.Build.Tasks.Feed.Model; -using Microsoft.DotNet.Maestro.Client; -using Microsoft.DotNet.Maestro.Client.Models; -using Microsoft.DotNet.VersionTools.BuildManifest.Model; using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Threading.Tasks; +using Microsoft.Build.Framework; +using Microsoft.DotNet.Build.Tasks.Feed.Model; +using Microsoft.DotNet.Maestro.Client; +using Microsoft.DotNet.Maestro.Client.Models; +using Microsoft.DotNet.VersionTools.BuildManifest.Model; namespace Microsoft.DotNet.Build.Tasks.Feed { @@ -98,17 +98,7 @@ public override async Task ExecuteAsync() return false; } - string temporarySymbolsLocation = - Path.GetFullPath(Path.Combine(BlobAssetsBasePath, @"..\", "tempSymbols")); - - EnsureTemporarySymbolDirectoryExists(temporarySymbolsLocation); - SplitArtifactsInCategories(BuildModel); - DeleteSymbolTemporaryFiles(temporarySymbolsLocation); - - //Copying symbol files to temporary location is required because the symUploader API needs read/write access to the files, - //since we publish blobs and symbols in parallel this will cause IO exceptions. - CopySymbolFilesToTemporaryLocation(BuildModel, temporarySymbolsLocation); if (Log.HasLoggedErrors) { @@ -199,16 +189,36 @@ public override async Task ExecuteAsync() return false; } + string temporarySymbolsLocation = ""; + if (!UseStreamingPublishing) + { + temporarySymbolsLocation = + Path.GetFullPath(Path.Combine(BlobAssetsBasePath, @"..\", "tempSymbols")); + + EnsureTemporaryDirectoryExists(temporarySymbolsLocation); + DeleteTemporaryFiles(temporarySymbolsLocation); + + // Copying symbol files to temporary location is required because the symUploader API needs read/write access to the files, + // since we publish blobs and symbols in parallel this will cause IO exceptions. + CopySymbolFilesToTemporaryLocation(BuildModel, temporarySymbolsLocation); + } + await Task.WhenAll(new Task[] { HandlePackagePublishingAsync(buildAssets), HandleBlobPublishingAsync(buildAssets), - HandleSymbolPublishingAsync(PdbArtifactsBasePath, MsdlToken, - SymWebToken, SymbolPublishingExclusionsFile, temporarySymbolsLocation, PublishSpecialClrFiles) + HandleSymbolPublishingAsync( + PdbArtifactsBasePath, + MsdlToken, + SymWebToken, + SymbolPublishingExclusionsFile, + PublishSpecialClrFiles, + buildAssets, + temporarySymbolsLocation) }); - DeleteSymbolTemporaryFiles(temporarySymbolsLocation); - DeleteSymbolTemporaryDirectory(temporarySymbolsLocation); - Log.LogMessage(MessageImportance.High, "Successfully deleted the temporary symbols directory."); + DeleteTemporaryFiles(temporarySymbolsLocation); + DeleteTemporaryDirectory(temporarySymbolsLocation); + await PersistPendingAssetLocationAsync(client); } catch (Exception e) @@ -245,52 +255,6 @@ private void CopySymbolFilesToTemporaryLocation(BuildModel buildModel, string sy } } - /// - /// Create Temporary Symbols directory if it does not exists. - /// - /// - public void EnsureTemporarySymbolDirectoryExists(string temporarySymbolsLocation) - { - if (!Directory.Exists(temporarySymbolsLocation)) - { - Directory.CreateDirectory(temporarySymbolsLocation); - } - } - /// - /// Delete the symbols files after publishing to Symbol server(s), this is part of cleanup - /// - /// - public void DeleteSymbolTemporaryFiles(string temporarySymbolsLocation) - { - try - { - if (Directory.Exists(temporarySymbolsLocation)) - { - string[] fileEntries = Directory.GetFiles(temporarySymbolsLocation); - foreach (var file in fileEntries) - { - File.Delete(file); - } - } - } - catch (Exception ex) - { - Log.LogWarning(ex.Message); - } - } - - /// - /// Deletes the temporary symbol folder, this is part of clean up - /// - /// - public void DeleteSymbolTemporaryDirectory(string temporarySymbolLocation) - { - if (Directory.Exists(temporarySymbolLocation)) - { - Directory.Delete(temporarySymbolLocation); - } - } - public string GetFeed(string feed, string feedOverride) { return (AllowFeedOverrides && !string.IsNullOrEmpty(feedOverride)) ? feedOverride : feed; diff --git a/src/Microsoft.DotNet.Build.Tasks.Feed/src/common/GeneralUtils.cs b/src/Microsoft.DotNet.Build.Tasks.Feed/src/common/GeneralUtils.cs index 90b58e851a3..3e039ac74b8 100644 --- a/src/Microsoft.DotNet.Build.Tasks.Feed/src/common/GeneralUtils.cs +++ b/src/Microsoft.DotNet.Build.Tasks.Feed/src/common/GeneralUtils.cs @@ -134,13 +134,13 @@ public static async Task CompareStreamsAsync(Stream localFileStream, Strea /// the streams make no guarantee that they will return a full block each time when read operations are performed, so we /// must be sure to only compare the minimum number of bytes returned. /// - public static Task CompareLocalPackageToFeedPackage( + public static async Task CompareLocalPackageToFeedPackage( string localPackageFullPath, string packageContentUrl, HttpClient client, TaskLoggingHelper log) { - return CompareLocalPackageToFeedPackage( + return await CompareLocalPackageToFeedPackage( localPackageFullPath, packageContentUrl, client, diff --git a/src/Microsoft.DotNet.Build.Tasks.Feed/src/model/BuildArtifacts.cs b/src/Microsoft.DotNet.Build.Tasks.Feed/src/model/BuildArtifacts.cs new file mode 100644 index 00000000000..16df412ab49 --- /dev/null +++ b/src/Microsoft.DotNet.Build.Tasks.Feed/src/model/BuildArtifacts.cs @@ -0,0 +1,35 @@ +using System.Collections.Generic; +using Newtonsoft.Json; + +namespace Microsoft.DotNet.Build.Tasks.Feed +{ + public class Properties + { + public string artifactsize { get; set; } + public string RootId { get; set; } + public string localpath { get; set; } + } + + public class Resource + { + public string type { get; set; } + public string data { get; set; } + public Properties properties { get; set; } + public string url { get; set; } + public string downloadUrl { get; set; } + } + + public class Value + { + public int id { get; set; } + public string name { get; set; } + public string source { get; set; } + public Resource resource { get; set; } + } + + public class BuildArtifacts + { + public int count { get; set; } + public IList value { get; set; } + } +} From 210a81e3f5413c88c335e78efb7ca207b00892db Mon Sep 17 00:00:00 2001 From: Matt Galbraith Date: Mon, 12 Apr 2021 11:47:05 -0700 Subject: [PATCH 005/699] Re-enabling tests that use the XHarness Helix SDK as 30 new machines have been added and we expect this can now succeed. (#7222) This reverts commit 1c7f0c60c9201ac9a7a5c639cb72cb412a46b0e4. --- azure-pipelines.yml | 30 ++++++++++++++---------------- 1 file changed, 14 insertions(+), 16 deletions(-) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 806213964f0..1c7b143688d 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -132,22 +132,20 @@ stages: env: SYSTEM_ACCESSTOKEN: $(System.AccessToken) HelixAccessToken: '' - # We don't have enough hardware to run these tests on Arcade PR given the Arcade XHarness SDK changes infrequently. (https://github.com/dotnet/core-eng/issues/12238) - # Until the above issue is resolved, if you are editing the Xharness SDK's Windows side, please exercise this manually. Contact dnceng for assistance. - # - powershell: eng\common\build.ps1 - # -configuration $(_BuildConfig) - # -prepareMachine - # -ci - # -restore - # -test - # -projects $(Build.SourcesDirectory)\tests\UnitTests.XHarness.Android.WindowsQueues.proj - # /bl:$(Build.SourcesDirectory)\artifacts\log\$(_BuildConfig)\Helix.XHarness.Android.WindowsQueues.binlog - # /p:RestoreUsingNuGetTargets=false - # /p:XharnessTestARM64_V8A=true - # displayName: XHarness Android Helix Testing (Windows) - # env: - # SYSTEM_ACCESSTOKEN: $(System.AccessToken) - # HelixAccessToken: '' + - powershell: eng\common\build.ps1 + -configuration $(_BuildConfig) + -prepareMachine + -ci + -restore + -test + -projects $(Build.SourcesDirectory)\tests\UnitTests.XHarness.Android.WindowsQueues.proj + /bl:$(Build.SourcesDirectory)\artifacts\log\$(_BuildConfig)\Helix.XHarness.Android.WindowsQueues.binlog + /p:RestoreUsingNuGetTargets=false + /p:XharnessTestARM64_V8A=true + displayName: XHarness Android Helix Testing (Windows) + env: + SYSTEM_ACCESSTOKEN: $(System.AccessToken) + HelixAccessToken: '' - job: Linux container: LinuxContainer pool: From db49d790a4bfa977a9ed7436bf2aa242cefae45e Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Mon, 12 Apr 2021 21:28:20 +0000 Subject: [PATCH 006/699] Update dependencies from https://github.com/dotnet/arcade build 20210412.4 (#7224) [main] Update dependencies from dotnet/arcade --- eng/Version.Details.xml | 20 ++++++++++---------- eng/Versions.props | 6 +++--- global.json | 4 ++-- 3 files changed, 15 insertions(+), 15 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index 70d9bfdda60..dece525bcc1 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -11,25 +11,25 @@ - + https://github.com/dotnet/arcade - 28d9452d7e2ae4e98a1df735b90b03d3cac1f4e7 + 23b4c4538445633be764e8a06094235537a511e6 - + https://github.com/dotnet/arcade - 28d9452d7e2ae4e98a1df735b90b03d3cac1f4e7 + 23b4c4538445633be764e8a06094235537a511e6 - + https://github.com/dotnet/arcade - 28d9452d7e2ae4e98a1df735b90b03d3cac1f4e7 + 23b4c4538445633be764e8a06094235537a511e6 - + https://github.com/dotnet/arcade - 28d9452d7e2ae4e98a1df735b90b03d3cac1f4e7 + 23b4c4538445633be764e8a06094235537a511e6 - + https://github.com/dotnet/arcade - 28d9452d7e2ae4e98a1df735b90b03d3cac1f4e7 + 23b4c4538445633be764e8a06094235537a511e6 https://github.com/dotnet/arcade-services diff --git a/eng/Versions.props b/eng/Versions.props index d6a2ab0c888..135d06567a1 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -66,8 +66,8 @@ 2.4.1 2.0.3 2.4.1 - 6.0.0-beta.21209.17 - 6.0.0-beta.21209.17 + 6.0.0-beta.21212.4 + 6.0.0-beta.21212.4 1.22.0 1.1.2 2.0.0 @@ -80,7 +80,7 @@ 1.1.0-beta.20258.6 1.1.0-beta-21201-01 1.1.0-beta-21201-01 - 6.0.0-beta.21209.17 + 6.0.0-beta.21212.4 1.0.0-beta.21210.2 1.1.0-beta.20570.1 1.0.0-prerelease.21209.2 diff --git a/global.json b/global.json index 61ed316d890..e3632d2f738 100644 --- a/global.json +++ b/global.json @@ -3,7 +3,7 @@ "dotnet": "6.0.100-preview.2.21155.3" }, "msbuild-sdks": { - "Microsoft.DotNet.Arcade.Sdk": "6.0.0-beta.21209.17", - "Microsoft.DotNet.Helix.Sdk": "6.0.0-beta.21209.17" + "Microsoft.DotNet.Arcade.Sdk": "6.0.0-beta.21212.4", + "Microsoft.DotNet.Helix.Sdk": "6.0.0-beta.21212.4" } } From 04e32d778d4dd32980c09017a43be5df25e02714 Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Tue, 13 Apr 2021 15:02:14 +0000 Subject: [PATCH 007/699] [main] Update dependencies from dotnet/arcade mono/linker (#7229) [main] Update dependencies from dotnet/arcade mono/linker --- eng/Version.Details.xml | 24 ++++++++++++------------ eng/Versions.props | 8 ++++---- global.json | 4 ++-- 3 files changed, 18 insertions(+), 18 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index dece525bcc1..0e2ab250105 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -11,25 +11,25 @@ - + https://github.com/dotnet/arcade - 23b4c4538445633be764e8a06094235537a511e6 + db49d790a4bfa977a9ed7436bf2aa242cefae45e - + https://github.com/dotnet/arcade - 23b4c4538445633be764e8a06094235537a511e6 + db49d790a4bfa977a9ed7436bf2aa242cefae45e - + https://github.com/dotnet/arcade - 23b4c4538445633be764e8a06094235537a511e6 + db49d790a4bfa977a9ed7436bf2aa242cefae45e - + https://github.com/dotnet/arcade - 23b4c4538445633be764e8a06094235537a511e6 + db49d790a4bfa977a9ed7436bf2aa242cefae45e - + https://github.com/dotnet/arcade - 23b4c4538445633be764e8a06094235537a511e6 + db49d790a4bfa977a9ed7436bf2aa242cefae45e https://github.com/dotnet/arcade-services @@ -47,9 +47,9 @@ https://github.com/dotnet/roslyn 5f00f4d6ffb242a337e21a196aab0593891e430e - + https://github.com/mono/linker - 6bfa2c0657d2dcfd6dce684ab34b470ce567631a + 7f7eb298a1ea6a144b2fb795ca10feb138e3988a https://github.com/dotnet/sourcelink diff --git a/eng/Versions.props b/eng/Versions.props index 135d06567a1..46c404a0e3f 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -36,7 +36,7 @@ 2.1.1 2.1.0 3.10.0-2.21203.6 - 6.0.100-preview.2.21212.1 + 6.0.100-preview.2.21212.5 16.7.1 4.8.3 5.3.0.1 @@ -66,8 +66,8 @@ 2.4.1 2.0.3 2.4.1 - 6.0.0-beta.21212.4 - 6.0.0-beta.21212.4 + 6.0.0-beta.21212.6 + 6.0.0-beta.21212.6 1.22.0 1.1.2 2.0.0 @@ -80,7 +80,7 @@ 1.1.0-beta.20258.6 1.1.0-beta-21201-01 1.1.0-beta-21201-01 - 6.0.0-beta.21212.4 + 6.0.0-beta.21212.6 1.0.0-beta.21210.2 1.1.0-beta.20570.1 1.0.0-prerelease.21209.2 diff --git a/global.json b/global.json index e3632d2f738..f03ee2c6764 100644 --- a/global.json +++ b/global.json @@ -3,7 +3,7 @@ "dotnet": "6.0.100-preview.2.21155.3" }, "msbuild-sdks": { - "Microsoft.DotNet.Arcade.Sdk": "6.0.0-beta.21212.4", - "Microsoft.DotNet.Helix.Sdk": "6.0.0-beta.21212.4" + "Microsoft.DotNet.Arcade.Sdk": "6.0.0-beta.21212.6", + "Microsoft.DotNet.Helix.Sdk": "6.0.0-beta.21212.6" } } From 3dd26504b456b68c2e3edd18ebf159d0b5486135 Mon Sep 17 00:00:00 2001 From: Epsitha Ananth <47157394+epananth@users.noreply.github.com> Date: Tue, 13 Apr 2021 21:29:59 -0700 Subject: [PATCH 008/699] Download merged manifest (#7234) --- eng/publishing/v3/publish-assets.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/eng/publishing/v3/publish-assets.yml b/eng/publishing/v3/publish-assets.yml index af61f8bcf80..17c85fba28b 100644 --- a/eng/publishing/v3/publish-assets.yml +++ b/eng/publishing/v3/publish-assets.yml @@ -40,6 +40,7 @@ jobs: downloadType: 'specific' itemPattern: | AssetManifests/** + BlobArtifacts/MergedManifest.xml PdbArtifacts/** downloadPath: '$(Build.ArtifactStagingDirectory)' From 69b0cf80bc08bf30c4a6beed4f8c7d41a353e948 Mon Sep 17 00:00:00 2001 From: Jon Fortescue Date: Wed, 14 Apr 2021 08:59:59 -0700 Subject: [PATCH 009/699] Add autocomplete PR flag for OneLocBuild template (#7228) --- Documentation/OneLocBuild.md | 1 + eng/common/templates/job/onelocbuild.yml | 3 +++ 2 files changed, 4 insertions(+) diff --git a/Documentation/OneLocBuild.md b/Documentation/OneLocBuild.md index 28f854e0a31..784c5159890 100644 --- a/Documentation/OneLocBuild.md +++ b/Documentation/OneLocBuild.md @@ -72,6 +72,7 @@ The parameters that can be passed to the template are as follows: | `RepoType` | `'gitHub'` | Should be set to `'gitHub'` for GitHub-based repositories and `'azureDevOps'` for Azure DevOps-based ones. | | `SourcesDirectory` | `$(Build.SourcesDirectory)` | This is the root directory for your repository source code. | | `CreatePr` | `true` | When set to `true`, instructs the OneLocBuild task to make a PR back to the source repository containing the localized files. | +| `AutoCompletePr` | `false` | When set to `true`, instructs the OneLocBuild task to autocomplete the created PR. Requires permissions to bypass any checks on the main branch. | | `UseCheckedInLocProjectJson` | `false` | When set to `true`, instructs the LocProject.json generation script to use build-time validation rather than build-time generation, as described above. | | `LanguageSet` | `VS_Main_Languages` | This defines the `LanguageSet` of the LocProject.json as described in the [OneLocBuild task documentation](https://ceapex.visualstudio.com/CEINTL/_wiki/wikis/CEINTL.wiki/107/Localization-with-OneLocBuild-Task?anchor=languageset%2C-languages-(required)). | | `LclSource` | `LclFilesInRepo` | This passes the `LclSource` input to the OneLocBuild task as described in [its documentation](https://ceapex.visualstudio.com/CEINTL/_wiki/wikis/CEINTL.wiki/107/Localization-with-OneLocBuild-Task?anchor=languageset%2C-languages-(required)). For most repos, this should be set to `LclFilesfromPackage`. | diff --git a/eng/common/templates/job/onelocbuild.yml b/eng/common/templates/job/onelocbuild.yml index 928a70cda2c..d2b271ec1ac 100644 --- a/eng/common/templates/job/onelocbuild.yml +++ b/eng/common/templates/job/onelocbuild.yml @@ -11,6 +11,7 @@ parameters: SourcesDirectory: $(Build.SourcesDirectory) CreatePr: true + AutoCompletePr: false UseCheckedInLocProjectJson: false LanguageSet: VS_Main_Languages LclSource: lclFilesInRepo @@ -54,6 +55,8 @@ jobs: lclSource: ${{ parameters.LclSource }} lclPackageId: ${{ parameters.LclPackageId }} isCreatePrSelected: ${{ parameters.CreatePr }} + ${{ if eq(parameters.CreatePr, true) }}: + isAutoCompletePrSelected: ${{ parameters.AutoCompletePr }} packageSourceAuth: patAuth patVariable: ${{ parameters.CeapexPat }} ${{ if eq(parameters.RepoType, 'gitHub') }}: From 93a6389f406e5e900da46ab643c608578f143851 Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Wed, 14 Apr 2021 17:45:34 +0000 Subject: [PATCH 010/699] Update dependencies from https://github.com/dotnet/xliff-tasks build 20210413.1 (#7236) [main] Update dependencies from dotnet/xliff-tasks --- eng/Version.Details.xml | 4 ++-- eng/Versions.props | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index 0e2ab250105..bff588aaa4d 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -68,9 +68,9 @@ https://github.com/dotnet/symreader-converter c5ba7c88f92e2dde156c324a8c8edc04d9fa4fe0 - + https://github.com/dotnet/xliff-tasks - aa77a885dbf30ecdb14fa2f20d4e50432ee36db5 + 910c7fc666698f9c99ea0ff0e2727b328b2dded5 diff --git a/eng/Versions.props b/eng/Versions.props index 46c404a0e3f..85e64895433 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -81,7 +81,7 @@ 1.1.0-beta-21201-01 1.1.0-beta-21201-01 6.0.0-beta.21212.6 - 1.0.0-beta.21210.2 + 1.0.0-beta.21213.1 1.1.0-beta.20570.1 1.0.0-prerelease.21209.2 1.1.156402 From 4fdee21a636fca58ba9a3028a33d398f5bfd7178 Mon Sep 17 00:00:00 2001 From: Jeremy Koritzinsky Date: Thu, 15 Apr 2021 08:08:04 -0700 Subject: [PATCH 011/699] Pass down AdditionalProperties for NativeProjectReferences. Precalculate if the generator is multi-config so the CopyNativeProjectBinaries target doesn't need to call into the CMake project (#7237) --- .../build/Microsoft.DotNet.CMake.Sdk.targets | 5 ++++- .../sdk/ProjectReference.targets | 18 ++++++++---------- 2 files changed, 12 insertions(+), 11 deletions(-) diff --git a/src/Microsoft.DotNet.CMake.Sdk/build/Microsoft.DotNet.CMake.Sdk.targets b/src/Microsoft.DotNet.CMake.Sdk/build/Microsoft.DotNet.CMake.Sdk.targets index 7ae90ea3044..f8b6cc87f79 100644 --- a/src/Microsoft.DotNet.CMake.Sdk/build/Microsoft.DotNet.CMake.Sdk.targets +++ b/src/Microsoft.DotNet.CMake.Sdk/build/Microsoft.DotNet.CMake.Sdk.targets @@ -67,7 +67,7 @@ - + <_NormalizedReferencedCMakeListsDirectory>$([System.IO.Path]::GetDirectoryName($(ReferencedCMakeLists))) @@ -83,6 +83,9 @@ <_CMakeProjectReferenceFilesLocation Condition="'$(_CMakeMultiConfigurationGenerator)' == 'true'">$([MSBuild]::NormalizePath('$(_CMakeProjectReferenceFilesLocation)','$(Configuration)')) + + <_CMakeProjectReferenceFilesLocationItem Include="$(_CMakeProjectReferenceFilesLocation)" IsMultiConfigurationGenerator="_CMakeMultiConfigurationGenerator" /> + - - - - - + - + @@ -122,12 +117,14 @@ + Properties="ReferencedCMakeLists=%(NativeProjectReferenceNormalized.Identity);%(NativeProjectReferenceNormalized.AdditionalProperties)"> - <_NativeProjectReferenceToBuild Include="%(NativeProjectReferenceNormalized.CMakeProject)" Condition="'%(NativeProjectReferenceNormalized.BuildNative)' == 'true'" /> + <_NativeProjectReferenceToBuild Include="%(NativeProjectReferenceNormalized.CMakeProject)" + Condition="'%(NativeProjectReferenceNormalized.BuildNative)' == 'true'" + AdditionalProperties="%(NativeProjectReferenceNormalized.AdditionalProperties)" /> @@ -142,7 +139,8 @@ From d3f18dd9292de6b1c50d231536b0fb9e670dd898 Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Thu, 15 Apr 2021 15:11:53 +0000 Subject: [PATCH 012/699] [main] Update dependencies from dotnet/arcade mono/linker (#7244) [main] Update dependencies from dotnet/arcade mono/linker --- eng/Version.Details.xml | 24 ++++++++++++------------ eng/Versions.props | 8 ++++---- global.json | 4 ++-- 3 files changed, 18 insertions(+), 18 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index bff588aaa4d..987d636921e 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -11,25 +11,25 @@ - + https://github.com/dotnet/arcade - db49d790a4bfa977a9ed7436bf2aa242cefae45e + 93a6389f406e5e900da46ab643c608578f143851 - + https://github.com/dotnet/arcade - db49d790a4bfa977a9ed7436bf2aa242cefae45e + 93a6389f406e5e900da46ab643c608578f143851 - + https://github.com/dotnet/arcade - db49d790a4bfa977a9ed7436bf2aa242cefae45e + 93a6389f406e5e900da46ab643c608578f143851 - + https://github.com/dotnet/arcade - db49d790a4bfa977a9ed7436bf2aa242cefae45e + 93a6389f406e5e900da46ab643c608578f143851 - + https://github.com/dotnet/arcade - db49d790a4bfa977a9ed7436bf2aa242cefae45e + 93a6389f406e5e900da46ab643c608578f143851 https://github.com/dotnet/arcade-services @@ -47,9 +47,9 @@ https://github.com/dotnet/roslyn 5f00f4d6ffb242a337e21a196aab0593891e430e - + https://github.com/mono/linker - 7f7eb298a1ea6a144b2fb795ca10feb138e3988a + da34fef0021be0e60182075f2cc92d9e73339890 https://github.com/dotnet/sourcelink diff --git a/eng/Versions.props b/eng/Versions.props index 85e64895433..6538059a543 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -36,7 +36,7 @@ 2.1.1 2.1.0 3.10.0-2.21203.6 - 6.0.100-preview.2.21212.5 + 6.0.100-preview.2.21215.1 16.7.1 4.8.3 5.3.0.1 @@ -66,8 +66,8 @@ 2.4.1 2.0.3 2.4.1 - 6.0.0-beta.21212.6 - 6.0.0-beta.21212.6 + 6.0.0-beta.21214.5 + 6.0.0-beta.21214.5 1.22.0 1.1.2 2.0.0 @@ -80,7 +80,7 @@ 1.1.0-beta.20258.6 1.1.0-beta-21201-01 1.1.0-beta-21201-01 - 6.0.0-beta.21212.6 + 6.0.0-beta.21214.5 1.0.0-beta.21213.1 1.1.0-beta.20570.1 1.0.0-prerelease.21209.2 diff --git a/global.json b/global.json index f03ee2c6764..509c007adbc 100644 --- a/global.json +++ b/global.json @@ -3,7 +3,7 @@ "dotnet": "6.0.100-preview.2.21155.3" }, "msbuild-sdks": { - "Microsoft.DotNet.Arcade.Sdk": "6.0.0-beta.21212.6", - "Microsoft.DotNet.Helix.Sdk": "6.0.0-beta.21212.6" + "Microsoft.DotNet.Arcade.Sdk": "6.0.0-beta.21214.5", + "Microsoft.DotNet.Helix.Sdk": "6.0.0-beta.21214.5" } } From 40ecdb3f4b01f4997eab208436402c69919192a3 Mon Sep 17 00:00:00 2001 From: Christopher Costa Date: Thu, 15 Apr 2021 08:47:59 -0700 Subject: [PATCH 013/699] Run signcheck in single threaded apartment (#7241) --- .../Microsoft.SignCheck/Verification/AuthentiCode.cs | 2 +- .../SignCheck/Microsoft.DotNet.SignCheck.csproj | 4 ++++ src/SignCheck/SignCheck/SignCheckTask.cs | 9 ++++++++- 3 files changed, 13 insertions(+), 2 deletions(-) diff --git a/src/SignCheck/Microsoft.SignCheck/Verification/AuthentiCode.cs b/src/SignCheck/Microsoft.SignCheck/Verification/AuthentiCode.cs index 4c80e48c148..1a8e0086634 100644 --- a/src/SignCheck/Microsoft.SignCheck/Verification/AuthentiCode.cs +++ b/src/SignCheck/Microsoft.SignCheck/Verification/AuthentiCode.cs @@ -29,7 +29,7 @@ public static uint IsSigned(string path) WinTrustData data = new WinTrustData() { cbStruct = (uint)Marshal.SizeOf(typeof(WinTrustData)), - dwProvFlags = Convert.ToUInt32(Provider.WTD_SAFER_FLAG), + dwProvFlags = 0, dwStateAction = Convert.ToUInt32(StateAction.WTD_STATEACTION_IGNORE), dwUIChoice = Convert.ToUInt32(UIChoice.WTD_UI_NONE), dwUIContext = 0, diff --git a/src/SignCheck/SignCheck/Microsoft.DotNet.SignCheck.csproj b/src/SignCheck/SignCheck/Microsoft.DotNet.SignCheck.csproj index f23cb7d7794..6c7b257e95b 100644 --- a/src/SignCheck/SignCheck/Microsoft.DotNet.SignCheck.csproj +++ b/src/SignCheck/SignCheck/Microsoft.DotNet.SignCheck.csproj @@ -30,6 +30,10 @@ + + + + diff --git a/src/SignCheck/SignCheck/SignCheckTask.cs b/src/SignCheck/SignCheck/SignCheckTask.cs index 99a4d7776a9..1b40fd98456 100644 --- a/src/SignCheck/SignCheck/SignCheckTask.cs +++ b/src/SignCheck/SignCheck/SignCheckTask.cs @@ -2,6 +2,7 @@ // The .NET Foundation licenses this file to you under the MIT license. using Microsoft.Build.Framework; +using Microsoft.Build.Utilities; using Microsoft.SignCheck.Logging; using System; using System.Collections.Generic; @@ -10,8 +11,12 @@ namespace SignCheck { - public class SignCheckTask : Microsoft.Build.Utilities.Task + [Microsoft.Build.Framework.LoadInSeparateAppDomain] + [RunInSTA] + public class SignCheckTask : AppDomainIsolatedTask { + static SignCheckTask() => Microsoft.DotNet.AssemblyResolution.Initialize(); + public bool EnableJarSignatureVerification { get; @@ -85,6 +90,7 @@ public string ArtifactFolder public override bool Execute() { + Microsoft.DotNet.AssemblyResolution.Log = Log; Options options = new Options(); options.EnableJarSignatureVerification = EnableJarSignatureVerification; options.EnableXmlSignatureVerification = EnableXmlSignatureVerification; @@ -143,6 +149,7 @@ public override bool Execute() var sc = new SignCheck(options); int result = sc.Run(); + Microsoft.DotNet.AssemblyResolution.Log = null; return (result == 0 && !Log.HasLoggedErrors); } } From 47ea6a3a6444a285d59b9d9355fbc4b2e0955885 Mon Sep 17 00:00:00 2001 From: Matt Mitchell Date: Thu, 15 Apr 2021 09:34:21 -0700 Subject: [PATCH 014/699] Revert "Remove tooling->preview flow (#7149)" (#7249) This reverts commit 8e9f54a9e41e20c38bd5ae034d58455eacc3b377. --- scripts/create-net6-preview-flow.ps1 | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/scripts/create-net6-preview-flow.ps1 b/scripts/create-net6-preview-flow.ps1 index 27ee35328a0..eab6cd8d50d 100644 --- a/scripts/create-net6-preview-flow.ps1 +++ b/scripts/create-net6-preview-flow.ps1 @@ -85,5 +85,11 @@ AddFlow https://github.com/dotnet/sdk $SdkChannel https://github.com/dotnet/inst AddFlow https://github.com/dotnet/roslyn-analyzers $SdkChannel https://github.com/dotnet/sdk $SdkBranch EveryBuild AddFlow https://github.com/dotnet/templating $SdkChannel https://github.com/dotnet/sdk $SdkBranch EveryBuild +Write-Host "Add tooling->sdk flow" +AddFlow https://github.com/nuget/nuget.client $VSChannel https://github.com/dotnet/sdk $SdkBranch EveryBuild +AddFlow https://github.com/dotnet/roslyn "VS Master" https://github.com/dotnet/sdk $SdkBranch EveryBuild +AddFlow https://github.com/dotnet/fsharp $VSChannel https://github.com/dotnet/sdk $SdkBranch EveryBuild +AddFlow https://github.com/dotnet/msbuild $VSChannel https://github.com/dotnet/sdk $SdkBranch EveryBuild + From 8d1fc2c0e8bc1c3c076794732695134e626407e0 Mon Sep 17 00:00:00 2001 From: Matt Mitchell Date: Thu, 15 Apr 2021 09:34:28 -0700 Subject: [PATCH 015/699] Add VS 16.11 channel (#7247) --- .../src/model/PublishingConstants.cs | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/src/Microsoft.DotNet.Build.Tasks.Feed/src/model/PublishingConstants.cs b/src/Microsoft.DotNet.Build.Tasks.Feed/src/model/PublishingConstants.cs index 8b4c277988e..982e2a08056 100644 --- a/src/Microsoft.DotNet.Build.Tasks.Feed/src/model/PublishingConstants.cs +++ b/src/Microsoft.DotNet.Build.Tasks.Feed/src/model/PublishingConstants.cs @@ -870,6 +870,21 @@ public enum BuildQuality filenamesToExclude: FilenamesToExclude, flatten: false), + // "VS 16.11", + new TargetChannelConfig( + 1926, + false, + PublishingInfraVersion.All, + string.Empty, + FeedDotNetToolsShipping, + FeedDotNetToolsTransport, + FeedDotNetToolsSymbols, + FeedForChecksums, + FeedForInstallers, + PublicAndInternalSymbolTargets, + filenamesToExclude: FilenamesToExclude, + flatten: false), + // "VS 17.0", new TargetChannelConfig( 1853, From e76fe48d5eb894e58fe7841f3a2c0bcfa654ee80 Mon Sep 17 00:00:00 2001 From: Jeremy Koritzinsky Date: Thu, 15 Apr 2021 09:52:02 -0700 Subject: [PATCH 016/699] Emit the hostArchitectures attribute when building the macOS bundle. (#7232) --- .../src/GenerateMacOSDistributionFile.cs | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/src/Microsoft.DotNet.Build.Tasks.Installers/src/GenerateMacOSDistributionFile.cs b/src/Microsoft.DotNet.Build.Tasks.Installers/src/GenerateMacOSDistributionFile.cs index 434a522218b..54f0bfe3cff 100644 --- a/src/Microsoft.DotNet.Build.Tasks.Installers/src/GenerateMacOSDistributionFile.cs +++ b/src/Microsoft.DotNet.Build.Tasks.Installers/src/GenerateMacOSDistributionFile.cs @@ -53,7 +53,29 @@ public override bool Execute() .Select(component => new XElement("pkg-ref", new XAttribute("id", component.GetMetadata("FileNameWithExtension")), component.GetMetadata("FileNameWithExtension"))); + + var optionsElement = document.Root.Element("options"); + bool templateHasOptions = optionsElement is not null; + if (!templateHasOptions) + { + optionsElement = new XElement("options"); + } + if (optionsElement.Attribute("hostArchitectures") is null) + { + string hostArchitecture = TargetArchitecture; + if (hostArchitecture == "x64") + { + hostArchitecture = "x86_64"; + } + optionsElement.Add(new XAttribute("hostArchitectures", hostArchitecture)); + } + + if (!templateHasOptions) + { + document.Root.Add(optionsElement); + } + document.Root.Add(titleElement); document.Root.Add(new XElement("choices-outline", choiceLineElements)); document.Root.Add(choiceElements); document.Root.Add(pkgRefElements); From 89ebfff12dfb892f951087cf96f3c79b9ae5c178 Mon Sep 17 00:00:00 2001 From: Jon Fortescue Date: Thu, 15 Apr 2021 14:07:02 -0700 Subject: [PATCH 017/699] Add ASP.NET Core runtime version test (#7227) --- .../Sdk/tools/dotnet-cli/DotNetCli.props | 3 +- .../xharness-runner/XHarnessRunner.targets | 3 +- .../aspnet-versioncheck.ps1 | 29 +++++++++++++++++++ tests/UnitTests.proj | 7 +++++ 4 files changed, 39 insertions(+), 3 deletions(-) create mode 100644 tests/AspNetVersionCheck/aspnet-versioncheck.ps1 diff --git a/src/Microsoft.DotNet.Helix/Sdk/tools/dotnet-cli/DotNetCli.props b/src/Microsoft.DotNet.Helix/Sdk/tools/dotnet-cli/DotNetCli.props index 0746d3586c4..f8e0924acdb 100644 --- a/src/Microsoft.DotNet.Helix/Sdk/tools/dotnet-cli/DotNetCli.props +++ b/src/Microsoft.DotNet.Helix/Sdk/tools/dotnet-cli/DotNetCli.props @@ -1,10 +1,11 @@ false + 6.0.0-preview.2.21154.6 runtime $(BundledNETCoreAppPackageVersion) - 6.0.0-preview.2.21154.6 + $(AspNetCoreRuntimeVersion) $(NETCoreSdkVersion) Current dotnet-cli diff --git a/src/Microsoft.DotNet.Helix/Sdk/tools/xharness-runner/XHarnessRunner.targets b/src/Microsoft.DotNet.Helix/Sdk/tools/xharness-runner/XHarnessRunner.targets index 0e31001124d..cd38f7766b3 100644 --- a/src/Microsoft.DotNet.Helix/Sdk/tools/xharness-runner/XHarnessRunner.targets +++ b/src/Microsoft.DotNet.Helix/Sdk/tools/xharness-runner/XHarnessRunner.targets @@ -1,12 +1,11 @@ - true true aspnetcore-runtime 6.0.100-preview.2.21155.3 - 6.0.0-preview.2.21154.6 + $(AspNetCoreRuntimeVersion) --> + + + + powershell %HELIX_WORKITEM_PAYLOAD%\aspnet-versioncheck.ps1 -aspNetCoreVersion $(AspNetCoreRuntimeVersion) + $(MSBuildThisFileDirectory)\AspNetVersionCheck + + From 2a7c531de77bb3a32b27698876a768225a9f0294 Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Fri, 16 Apr 2021 14:37:11 +0000 Subject: [PATCH 018/699] [main] Update dependencies from dotnet/xliff-tasks dotnet/arcade mono/linker (#7257) [main] Update dependencies from dotnet/xliff-tasks dotnet/arcade mono/linker --- eng/Version.Details.xml | 28 ++++++++++++++-------------- eng/Versions.props | 10 +++++----- global.json | 4 ++-- 3 files changed, 21 insertions(+), 21 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index 987d636921e..99082ebf00f 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -11,25 +11,25 @@ - + https://github.com/dotnet/arcade - 93a6389f406e5e900da46ab643c608578f143851 + e76fe48d5eb894e58fe7841f3a2c0bcfa654ee80 - + https://github.com/dotnet/arcade - 93a6389f406e5e900da46ab643c608578f143851 + e76fe48d5eb894e58fe7841f3a2c0bcfa654ee80 - + https://github.com/dotnet/arcade - 93a6389f406e5e900da46ab643c608578f143851 + e76fe48d5eb894e58fe7841f3a2c0bcfa654ee80 - + https://github.com/dotnet/arcade - 93a6389f406e5e900da46ab643c608578f143851 + e76fe48d5eb894e58fe7841f3a2c0bcfa654ee80 - + https://github.com/dotnet/arcade - 93a6389f406e5e900da46ab643c608578f143851 + e76fe48d5eb894e58fe7841f3a2c0bcfa654ee80 https://github.com/dotnet/arcade-services @@ -47,9 +47,9 @@ https://github.com/dotnet/roslyn 5f00f4d6ffb242a337e21a196aab0593891e430e - + https://github.com/mono/linker - da34fef0021be0e60182075f2cc92d9e73339890 + 1ed6f39a6e716b42fa5e478dcfd30a59f1c8f25e https://github.com/dotnet/sourcelink @@ -68,9 +68,9 @@ https://github.com/dotnet/symreader-converter c5ba7c88f92e2dde156c324a8c8edc04d9fa4fe0 - + https://github.com/dotnet/xliff-tasks - 910c7fc666698f9c99ea0ff0e2727b328b2dded5 + 3d9b37d56a7ca805f4e361092bf699dd2428e895 diff --git a/eng/Versions.props b/eng/Versions.props index 6538059a543..6b640bacd1a 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -36,7 +36,7 @@ 2.1.1 2.1.0 3.10.0-2.21203.6 - 6.0.100-preview.2.21215.1 + 6.0.100-preview.2.21215.2 16.7.1 4.8.3 5.3.0.1 @@ -66,8 +66,8 @@ 2.4.1 2.0.3 2.4.1 - 6.0.0-beta.21214.5 - 6.0.0-beta.21214.5 + 6.0.0-beta.21215.5 + 6.0.0-beta.21215.5 1.22.0 1.1.2 2.0.0 @@ -80,8 +80,8 @@ 1.1.0-beta.20258.6 1.1.0-beta-21201-01 1.1.0-beta-21201-01 - 6.0.0-beta.21214.5 - 1.0.0-beta.21213.1 + 6.0.0-beta.21215.5 + 1.0.0-beta.21215.1 1.1.0-beta.20570.1 1.0.0-prerelease.21209.2 1.1.156402 diff --git a/global.json b/global.json index 509c007adbc..c6e28228b48 100644 --- a/global.json +++ b/global.json @@ -3,7 +3,7 @@ "dotnet": "6.0.100-preview.2.21155.3" }, "msbuild-sdks": { - "Microsoft.DotNet.Arcade.Sdk": "6.0.0-beta.21214.5", - "Microsoft.DotNet.Helix.Sdk": "6.0.0-beta.21214.5" + "Microsoft.DotNet.Arcade.Sdk": "6.0.0-beta.21215.5", + "Microsoft.DotNet.Helix.Sdk": "6.0.0-beta.21215.5" } } From 53fe29e220fc0db05eafd5c6bc6c8fb9ee7cec7c Mon Sep 17 00:00:00 2001 From: Jo Shields Date: Fri, 16 Apr 2021 11:34:30 -0400 Subject: [PATCH 019/699] Disable remote executor on Mac Catalyst (#7258) --- src/Microsoft.DotNet.RemoteExecutor/src/RemoteExecutor.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Microsoft.DotNet.RemoteExecutor/src/RemoteExecutor.cs b/src/Microsoft.DotNet.RemoteExecutor/src/RemoteExecutor.cs index 0674423d61d..ae6ab0db014 100644 --- a/src/Microsoft.DotNet.RemoteExecutor/src/RemoteExecutor.cs +++ b/src/Microsoft.DotNet.RemoteExecutor/src/RemoteExecutor.cs @@ -72,6 +72,7 @@ private static bool IsNetCore() => !RuntimeInformation.IsOSPlatform(OSPlatform.Create("IOS")) && !RuntimeInformation.IsOSPlatform(OSPlatform.Create("ANDROID")) && !RuntimeInformation.IsOSPlatform(OSPlatform.Create("TVOS")) && + !RuntimeInformation.IsOSPlatform(OSPlatform.Create("MACCATALYST")) && !RuntimeInformation.IsOSPlatform(OSPlatform.Create("WATCHOS")) && !RuntimeInformation.IsOSPlatform(OSPlatform.Create("BROWSER")) && // The current RemoteExecutor design is not compatible with single file From d5ccecba0b5b6cc33766b701d3e6788bae2e40ed Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Mon, 19 Apr 2021 14:13:07 +0000 Subject: [PATCH 020/699] [main] Update dependencies from dotnet/xliff-tasks dotnet/arcade mono/linker dotnet/xharness (#7261) [main] Update dependencies from dotnet/xliff-tasks dotnet/arcade mono/linker dotnet/xharness --- eng/Version.Details.xml | 32 ++++++++++++++++---------------- eng/Versions.props | 12 ++++++------ global.json | 4 ++-- 3 files changed, 24 insertions(+), 24 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index 99082ebf00f..5919b7d6197 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -11,25 +11,25 @@ - + https://github.com/dotnet/arcade - e76fe48d5eb894e58fe7841f3a2c0bcfa654ee80 + 53fe29e220fc0db05eafd5c6bc6c8fb9ee7cec7c - + https://github.com/dotnet/arcade - e76fe48d5eb894e58fe7841f3a2c0bcfa654ee80 + 53fe29e220fc0db05eafd5c6bc6c8fb9ee7cec7c - + https://github.com/dotnet/arcade - e76fe48d5eb894e58fe7841f3a2c0bcfa654ee80 + 53fe29e220fc0db05eafd5c6bc6c8fb9ee7cec7c - + https://github.com/dotnet/arcade - e76fe48d5eb894e58fe7841f3a2c0bcfa654ee80 + 53fe29e220fc0db05eafd5c6bc6c8fb9ee7cec7c - + https://github.com/dotnet/arcade - e76fe48d5eb894e58fe7841f3a2c0bcfa654ee80 + 53fe29e220fc0db05eafd5c6bc6c8fb9ee7cec7c https://github.com/dotnet/arcade-services @@ -39,17 +39,17 @@ https://github.com/dotnet/arcade-services cac955fe259cb611f6a29d09209bd717deb69037 - + https://github.com/dotnet/xharness - b2297d610df1ae15fc7ba8bd8c9bc0a7192aaefa + 21d923ff91ab416edd01ab35981f48c390ffe67d https://github.com/dotnet/roslyn 5f00f4d6ffb242a337e21a196aab0593891e430e - + https://github.com/mono/linker - 1ed6f39a6e716b42fa5e478dcfd30a59f1c8f25e + 0e2e95e9db92cd41f620f96dda84171cbf34fa6c https://github.com/dotnet/sourcelink @@ -68,9 +68,9 @@ https://github.com/dotnet/symreader-converter c5ba7c88f92e2dde156c324a8c8edc04d9fa4fe0 - + https://github.com/dotnet/xliff-tasks - 3d9b37d56a7ca805f4e361092bf699dd2428e895 + 6251f8148102088975a685bea7f44800954a9a48 diff --git a/eng/Versions.props b/eng/Versions.props index 6b640bacd1a..f4f1f33858d 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -36,7 +36,7 @@ 2.1.1 2.1.0 3.10.0-2.21203.6 - 6.0.100-preview.2.21215.2 + 6.0.100-preview.2.21217.1 16.7.1 4.8.3 5.3.0.1 @@ -66,8 +66,8 @@ 2.4.1 2.0.3 2.4.1 - 6.0.0-beta.21215.5 - 6.0.0-beta.21215.5 + 6.0.0-beta.21216.2 + 6.0.0-beta.21216.2 1.22.0 1.1.2 2.0.0 @@ -80,10 +80,10 @@ 1.1.0-beta.20258.6 1.1.0-beta-21201-01 1.1.0-beta-21201-01 - 6.0.0-beta.21215.5 - 1.0.0-beta.21215.1 + 6.0.0-beta.21216.2 + 1.0.0-beta.21217.1 1.1.0-beta.20570.1 - 1.0.0-prerelease.21209.2 + 1.0.0-prerelease.21216.1 1.1.156402 1.1.152002 6.0.100-preview.3.21175.4 diff --git a/global.json b/global.json index c6e28228b48..7dcfdc8faf6 100644 --- a/global.json +++ b/global.json @@ -3,7 +3,7 @@ "dotnet": "6.0.100-preview.2.21155.3" }, "msbuild-sdks": { - "Microsoft.DotNet.Arcade.Sdk": "6.0.0-beta.21215.5", - "Microsoft.DotNet.Helix.Sdk": "6.0.0-beta.21215.5" + "Microsoft.DotNet.Arcade.Sdk": "6.0.0-beta.21216.2", + "Microsoft.DotNet.Helix.Sdk": "6.0.0-beta.21216.2" } } From 1d951297eb7bdd29a31dff3149606152717ed6b4 Mon Sep 17 00:00:00 2001 From: Jon Fortescue Date: Mon, 19 Apr 2021 14:53:28 -0700 Subject: [PATCH 021/699] Add support for LangIDOnPath templates (#7187) --- eng/common/generate-locproject.ps1 | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/eng/common/generate-locproject.ps1 b/eng/common/generate-locproject.ps1 index 7225ddc6669..24c00b5be98 100644 --- a/eng/common/generate-locproject.ps1 +++ b/eng/common/generate-locproject.ps1 @@ -66,10 +66,19 @@ $locJson = @{ } if ($continue) { - return @{ - SourceFile = $sourceFile - CopyOption = "LangIDOnName" - OutputPath = $outputPath + if ($_.Directory.Name -eq 'en' -and $_.Extension -eq '.json') { + return @{ + SourceFile = $sourceFile + CopyOption = "LangIDOnPath" + OutputPath = "$($_.Directory.Parent.FullName | Resolve-Path -Relative)\" + } + } + else { + return @{ + SourceFile = $sourceFile + CopyOption = "LangIDOnName" + OutputPath = $outputPath + } } } } From e4a7a067ffd96fc8fb8dddda80838533524e482a Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Tue, 20 Apr 2021 14:42:22 +0000 Subject: [PATCH 022/699] [main] Update dependencies from dotnet/arcade mono/linker dotnet/xharness (#7264) [main] Update dependencies from dotnet/arcade mono/linker dotnet/xharness --- eng/Version.Details.xml | 28 ++++++++++++++-------------- eng/Versions.props | 10 +++++----- global.json | 4 ++-- 3 files changed, 21 insertions(+), 21 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index 5919b7d6197..ec91302136b 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -11,25 +11,25 @@ - + https://github.com/dotnet/arcade - 53fe29e220fc0db05eafd5c6bc6c8fb9ee7cec7c + 1d951297eb7bdd29a31dff3149606152717ed6b4 - + https://github.com/dotnet/arcade - 53fe29e220fc0db05eafd5c6bc6c8fb9ee7cec7c + 1d951297eb7bdd29a31dff3149606152717ed6b4 - + https://github.com/dotnet/arcade - 53fe29e220fc0db05eafd5c6bc6c8fb9ee7cec7c + 1d951297eb7bdd29a31dff3149606152717ed6b4 - + https://github.com/dotnet/arcade - 53fe29e220fc0db05eafd5c6bc6c8fb9ee7cec7c + 1d951297eb7bdd29a31dff3149606152717ed6b4 - + https://github.com/dotnet/arcade - 53fe29e220fc0db05eafd5c6bc6c8fb9ee7cec7c + 1d951297eb7bdd29a31dff3149606152717ed6b4 https://github.com/dotnet/arcade-services @@ -39,17 +39,17 @@ https://github.com/dotnet/arcade-services cac955fe259cb611f6a29d09209bd717deb69037 - + https://github.com/dotnet/xharness - 21d923ff91ab416edd01ab35981f48c390ffe67d + 82f7a4f004353d534033c82ff53e1634667a57f8 https://github.com/dotnet/roslyn 5f00f4d6ffb242a337e21a196aab0593891e430e - + https://github.com/mono/linker - 0e2e95e9db92cd41f620f96dda84171cbf34fa6c + f6ccab59b40c959c10a28f696b3ec8ba0569fe25 https://github.com/dotnet/sourcelink diff --git a/eng/Versions.props b/eng/Versions.props index f4f1f33858d..c8a35a161fb 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -36,7 +36,7 @@ 2.1.1 2.1.0 3.10.0-2.21203.6 - 6.0.100-preview.2.21217.1 + 6.0.100-preview.2.21219.2 16.7.1 4.8.3 5.3.0.1 @@ -66,8 +66,8 @@ 2.4.1 2.0.3 2.4.1 - 6.0.0-beta.21216.2 - 6.0.0-beta.21216.2 + 6.0.0-beta.21219.2 + 6.0.0-beta.21219.2 1.22.0 1.1.2 2.0.0 @@ -80,10 +80,10 @@ 1.1.0-beta.20258.6 1.1.0-beta-21201-01 1.1.0-beta-21201-01 - 6.0.0-beta.21216.2 + 6.0.0-beta.21219.2 1.0.0-beta.21217.1 1.1.0-beta.20570.1 - 1.0.0-prerelease.21216.1 + 1.0.0-prerelease.21220.1 1.1.156402 1.1.152002 6.0.100-preview.3.21175.4 diff --git a/global.json b/global.json index 7dcfdc8faf6..abcaa647e5e 100644 --- a/global.json +++ b/global.json @@ -3,7 +3,7 @@ "dotnet": "6.0.100-preview.2.21155.3" }, "msbuild-sdks": { - "Microsoft.DotNet.Arcade.Sdk": "6.0.0-beta.21216.2", - "Microsoft.DotNet.Helix.Sdk": "6.0.0-beta.21216.2" + "Microsoft.DotNet.Arcade.Sdk": "6.0.0-beta.21219.2", + "Microsoft.DotNet.Helix.Sdk": "6.0.0-beta.21219.2" } } From 2803c841d5e5f5cdc3d3ea42d532d51ec96fcadb Mon Sep 17 00:00:00 2001 From: Matt Galbraith Date: Tue, 20 Apr 2021 13:52:29 -0700 Subject: [PATCH 023/699] Update Maestro.Tasks to understand devdiv naming (#7266) Pick up changes from https://github.com/dotnet/arcade-services/pull/1518 --- eng/Versions.props | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/eng/Versions.props b/eng/Versions.props index c8a35a161fb..974d807367e 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -82,7 +82,7 @@ 1.1.0-beta-21201-01 6.0.0-beta.21219.2 1.0.0-beta.21217.1 - 1.1.0-beta.20570.1 + 1.1.0-beta.21117.3 1.0.0-prerelease.21220.1 1.1.156402 1.1.152002 From f7e58cfb0f6c93980cbb664cc9e62d9ef2df0c2f Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Wed, 21 Apr 2021 14:30:52 +0000 Subject: [PATCH 024/699] [main] Update dependencies from dotnet/xliff-tasks dotnet/arcade (#7269) [main] Update dependencies from dotnet/xliff-tasks dotnet/arcade --- eng/Version.Details.xml | 24 ++++++++++++------------ eng/Versions.props | 8 ++++---- global.json | 4 ++-- 3 files changed, 18 insertions(+), 18 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index ec91302136b..286d260a06a 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -11,25 +11,25 @@ - + https://github.com/dotnet/arcade - 1d951297eb7bdd29a31dff3149606152717ed6b4 + 2803c841d5e5f5cdc3d3ea42d532d51ec96fcadb - + https://github.com/dotnet/arcade - 1d951297eb7bdd29a31dff3149606152717ed6b4 + 2803c841d5e5f5cdc3d3ea42d532d51ec96fcadb - + https://github.com/dotnet/arcade - 1d951297eb7bdd29a31dff3149606152717ed6b4 + 2803c841d5e5f5cdc3d3ea42d532d51ec96fcadb - + https://github.com/dotnet/arcade - 1d951297eb7bdd29a31dff3149606152717ed6b4 + 2803c841d5e5f5cdc3d3ea42d532d51ec96fcadb - + https://github.com/dotnet/arcade - 1d951297eb7bdd29a31dff3149606152717ed6b4 + 2803c841d5e5f5cdc3d3ea42d532d51ec96fcadb https://github.com/dotnet/arcade-services @@ -68,9 +68,9 @@ https://github.com/dotnet/symreader-converter c5ba7c88f92e2dde156c324a8c8edc04d9fa4fe0 - + https://github.com/dotnet/xliff-tasks - 6251f8148102088975a685bea7f44800954a9a48 + 1a4eec88c754f024962ab4a974898c8d6d087f57 diff --git a/eng/Versions.props b/eng/Versions.props index 974d807367e..b559eeca2e5 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -66,8 +66,8 @@ 2.4.1 2.0.3 2.4.1 - 6.0.0-beta.21219.2 - 6.0.0-beta.21219.2 + 6.0.0-beta.21220.2 + 6.0.0-beta.21220.2 1.22.0 1.1.2 2.0.0 @@ -80,8 +80,8 @@ 1.1.0-beta.20258.6 1.1.0-beta-21201-01 1.1.0-beta-21201-01 - 6.0.0-beta.21219.2 - 1.0.0-beta.21217.1 + 6.0.0-beta.21220.2 + 1.0.0-beta.21220.1 1.1.0-beta.21117.3 1.0.0-prerelease.21220.1 1.1.156402 diff --git a/global.json b/global.json index abcaa647e5e..a21d1bf474b 100644 --- a/global.json +++ b/global.json @@ -3,7 +3,7 @@ "dotnet": "6.0.100-preview.2.21155.3" }, "msbuild-sdks": { - "Microsoft.DotNet.Arcade.Sdk": "6.0.0-beta.21219.2", - "Microsoft.DotNet.Helix.Sdk": "6.0.0-beta.21219.2" + "Microsoft.DotNet.Arcade.Sdk": "6.0.0-beta.21220.2", + "Microsoft.DotNet.Helix.Sdk": "6.0.0-beta.21220.2" } } From 511052c7e0cae90ba257a338023552f545e7dab3 Mon Sep 17 00:00:00 2001 From: Eric StJohn Date: Wed, 21 Apr 2021 11:42:25 -0700 Subject: [PATCH 025/699] Delete GenerateRuntimeGraph task (#7271) --- .../src/GenerateRuntimeGraph.cs | 678 ------------------ ...rosoft.DotNet.Build.Tasks.Packaging.csproj | 1 - .../src/build/Packaging.common.targets | 1 - 3 files changed, 680 deletions(-) delete mode 100644 src/Microsoft.DotNet.Build.Tasks.Packaging/src/GenerateRuntimeGraph.cs diff --git a/src/Microsoft.DotNet.Build.Tasks.Packaging/src/GenerateRuntimeGraph.cs b/src/Microsoft.DotNet.Build.Tasks.Packaging/src/GenerateRuntimeGraph.cs deleted file mode 100644 index 7948abe8db1..00000000000 --- a/src/Microsoft.DotNet.Build.Tasks.Packaging/src/GenerateRuntimeGraph.cs +++ /dev/null @@ -1,678 +0,0 @@ -// Licensed to the .NET Foundation under one or more agreements. -// The .NET Foundation licenses this file to you under the MIT license. - -using Microsoft.Build.Framework; -using Newtonsoft.Json; -using NuGet.RuntimeModel; -using NuGet.Versioning; -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Text; -using System.Xml.Linq; - -namespace Microsoft.DotNet.Build.Tasks.Packaging -{ - public class GenerateRuntimeGraph : BuildTask - { - - /// - /// A set of RuntimeGroups that can be used to generate a runtime graph - /// Identity: the base string for the RID, without version architecture, or qualifiers. - /// Parent: the base string for the parent of this RID. This RID will be imported by the baseRID, architecture-specific, - /// and qualifier-specific RIDs (with the latter two appending appropriate architecture and qualifiers). - /// Versions: A list of strings delimited by semi-colons that represent the versions for this RID. - /// TreatVersionsAsCompatible: Default is true. When true, version-specific RIDs will import the previous - /// version-specific RID in the Versions list, with the first version importing the version-less RID. - /// When false all version-specific RIDs will import the version-less RID (bypassing previous version-specific RIDs) - /// OmitVersionDelimiter: Default is false. When true no characters will separate the base RID and version (EG: win7). - /// When false a '.' will separate the base RID and version (EG: osx.10.12). - /// ApplyVersionsToParent: Default is false. When true, version-specific RIDs will import version-specific Parent RIDs - /// similar to is done for architecture and qualifier (see Parent above). - /// Architectures: A list of strings delimited by semi-colons that represent the architectures for this RID. - /// AdditionalQualifiers: A list of strings delimited by semi-colons that represent the additional qualifiers for this RID. - /// Additional qualifers do not stack, each only applies to the qualifier-less RIDs (so as not to cause combinatorial - /// exponential growth of RIDs). - /// - /// The following options can be used under special circumstances but break the normal precedence rules we try to establish - /// by generating the RID graph from common logic. These options make it possible to create a RID fallback chain that doesn't - /// match the rest of the RIDs and therefore is hard for developers/package authors to reason about. - /// Only use these options for cases where you know what you are doing and have carefully reviewed the resulting RID fallbacks - /// using the CompatibliltyMap. - /// OmitRIDs: A list of strings delimited by semi-colons that represent RIDs calculated from this RuntimeGroup that should - /// be omitted from the RuntimeGraph. These RIDs will not be referenced nor defined. - /// OmitRIDDefinitions: A list of strings delimited by semi-colons that represent RIDs calculated from this RuntimeGroup - /// that should be omitted from the RuntimeGraph. These RIDs will not be defined by this RuntimeGroup, but will be - /// referenced: useful in case some other RuntimeGroup (or runtime.json template) defines them. - /// OmitRIDReferences: A list of strings delimited by semi-colons that represent RIDs calculated from this RuntimeGroup - /// that should be omitted from the RuntimeGraph. These RIDs will be defined but not referenced by this RuntimeGroup. - /// - public ITaskItem[] RuntimeGroups - { - get; - set; - } - - /// - /// Optional source Runtime.json to use as a starting point when merging additional RuntimeGroups - /// - public string SourceRuntimeJson - { - get; - set; - } - - /// - /// Where to write the final runtime.json - /// - public string RuntimeJson - { - get; - set; - } - - /// - /// Optionally, other runtime.jsons which may contain imported RIDs - /// - public string[] ExternalRuntimeJsons - { - get; - set; - } - - /// - /// When defined, specifies the file to write compatibility precedence for each RID in the graph. - /// - public string CompatibilityMap - { - get; - set; - } - - - /// - /// True to write the generated runtime.json to RuntimeJson and compatibility map to CompatibilityMap, otherwise files are read and diffed - /// with generated versions and an error is emitted if they differ. - /// Setting UpdateRuntimeFiles will overwrite files even when the file is marked ReadOnly. - /// - public bool UpdateRuntimeFiles - { - get; - set; - } - - /// - /// When defined, specifies the file to write a DGML representation of the runtime graph. - /// - public string RuntimeDirectedGraph - { - get; - set; - } - - public override bool Execute() - { - if (RuntimeGroups != null && RuntimeGroups.Any() && RuntimeJson == null) - { - Log.LogError($"{nameof(RuntimeJson)} argument must be specified when {nameof(RuntimeGroups)} is specified."); - return false; - } - - RuntimeGraph runtimeGraph; - if (!String.IsNullOrEmpty(SourceRuntimeJson)) - { - if (!File.Exists(SourceRuntimeJson)) - { - Log.LogError($"{nameof(SourceRuntimeJson)} did not exist at {SourceRuntimeJson}."); - return false; - } - - runtimeGraph = JsonRuntimeFormat.ReadRuntimeGraph(SourceRuntimeJson); - } - else - { - runtimeGraph = new RuntimeGraph(); - } - - foreach (var runtimeGroup in RuntimeGroups.NullAsEmpty().Select(i => new RuntimeGroup(i))) - { - runtimeGraph = SafeMerge(runtimeGraph, runtimeGroup); - } - - Dictionary externalRids = new Dictionary(); - if (ExternalRuntimeJsons != null) - { - foreach(var externalRuntimeJson in ExternalRuntimeJsons) - { - RuntimeGraph externalRuntimeGraph = JsonRuntimeFormat.ReadRuntimeGraph(externalRuntimeJson); - - foreach (var runtime in externalRuntimeGraph.Runtimes.Keys) - { - // don't check for duplicates, we merely care what is external - externalRids.Add(runtime, externalRuntimeJson); - } - } - } - - ValidateImports(runtimeGraph, externalRids); - - if (!String.IsNullOrEmpty(RuntimeJson)) - { - if (UpdateRuntimeFiles) - { - EnsureWritable(RuntimeJson); - NuGetUtility.WriteRuntimeGraph(RuntimeJson, runtimeGraph); - } - else - { - // validate that existing file matches generated file - if (!File.Exists(RuntimeJson)) - { - Log.LogError($"{nameof(RuntimeJson)} did not exist at {RuntimeJson} and {nameof(UpdateRuntimeFiles)} was not specified."); - } - else - { - var existingRuntimeGraph = JsonRuntimeFormat.ReadRuntimeGraph(RuntimeJson); - - if (!existingRuntimeGraph.Equals(runtimeGraph)) - { - Log.LogError($"The generated {nameof(RuntimeJson)} differs from {RuntimeJson} and {nameof(UpdateRuntimeFiles)} was not specified. Please specify {nameof(UpdateRuntimeFiles)}=true to commit the changes."); - } - } - } - } - - if (!String.IsNullOrEmpty(CompatibilityMap)) - { - var compatibilityMap = GetCompatibilityMap(runtimeGraph); - if (UpdateRuntimeFiles) - { - EnsureWritable(CompatibilityMap); - WriteCompatibilityMap(compatibilityMap, CompatibilityMap); - } - else - { - // validate that existing file matches generated file - if (!File.Exists(CompatibilityMap)) - { - Log.LogError($"{nameof(CompatibilityMap)} did not exist at {CompatibilityMap} and {nameof(UpdateRuntimeFiles)} was not specified."); - } - else - { - var existingCompatibilityMap = ReadCompatibilityMap(CompatibilityMap); - - if (!CompatibilityMapEquals(existingCompatibilityMap, compatibilityMap)) - { - Log.LogError($"The generated {nameof(CompatibilityMap)} differs from {CompatibilityMap} and {nameof(UpdateRuntimeFiles)} was not specified. Please specify {nameof(UpdateRuntimeFiles)}=true to commit the changes."); - } - } - } - } - - if (!String.IsNullOrEmpty(RuntimeDirectedGraph)) - { - WriteRuntimeGraph(runtimeGraph, RuntimeDirectedGraph); - } - - return !Log.HasLoggedErrors; - } - - private void EnsureWritable(string file) - { - if (File.Exists(file)) - { - var existingAttributes = File.GetAttributes(file); - - if ((existingAttributes & FileAttributes.ReadOnly) != 0) - { - File.SetAttributes(file, existingAttributes &= ~FileAttributes.ReadOnly); - } - } - } - - private RuntimeGraph SafeMerge(RuntimeGraph existingGraph, RuntimeGroup runtimeGroup) - { - var runtimeGraph = runtimeGroup.GetRuntimeGraph(); - - foreach (var existingRuntimeDescription in existingGraph.Runtimes.Values) - { - RuntimeDescription newRuntimeDescription; - - if (runtimeGraph.Runtimes.TryGetValue(existingRuntimeDescription.RuntimeIdentifier, out newRuntimeDescription)) - { - // overlapping RID, ensure that the imports match (same ordering and content) - if (!existingRuntimeDescription.InheritedRuntimes.SequenceEqual(newRuntimeDescription.InheritedRuntimes)) - { - Log.LogError($"RuntimeGroup {runtimeGroup.BaseRID} defines RID {newRuntimeDescription.RuntimeIdentifier} with imports {String.Join(";", newRuntimeDescription.InheritedRuntimes)} which differ from existing imports {String.Join(";", existingRuntimeDescription.InheritedRuntimes)}. You may avoid this by specifying {nameof(RuntimeGroup.OmitRIDDefinitions)} metadata with {newRuntimeDescription.RuntimeIdentifier}."); - } - } - } - - return RuntimeGraph.Merge(existingGraph, runtimeGraph); - } - - private void ValidateImports(RuntimeGraph runtimeGraph, IDictionary externalRIDs) - { - foreach (var runtimeDescription in runtimeGraph.Runtimes.Values) - { - string externalRuntimeJson; - - if (externalRIDs.TryGetValue(runtimeDescription.RuntimeIdentifier, out externalRuntimeJson)) - { - Log.LogError($"Runtime {runtimeDescription.RuntimeIdentifier} is defined in both this RuntimeGraph and {externalRuntimeJson}."); - } - - foreach (var import in runtimeDescription.InheritedRuntimes) - { - if (!runtimeGraph.Runtimes.ContainsKey(import) && !externalRIDs.ContainsKey(import)) - { - Log.LogError($"Runtime {runtimeDescription.RuntimeIdentifier} imports {import} which is not defined."); - } - } - } - } - - class RuntimeGroup - { - private const string rootRID = "any"; - private const char VersionDelimiter = '.'; - private const char ArchitectureDelimiter = '-'; - private const char QualifierDelimiter = '-'; - - public RuntimeGroup(ITaskItem item) - { - BaseRID = item.ItemSpec; - Parent = item.GetString(nameof(Parent)); - Versions = item.GetStrings(nameof(Versions)); - TreatVersionsAsCompatible = item.GetBoolean(nameof(TreatVersionsAsCompatible), true); - OmitVersionDelimiter = item.GetBoolean(nameof(OmitVersionDelimiter)); - ApplyVersionsToParent = item.GetBoolean(nameof(ApplyVersionsToParent)); - Architectures = item.GetStrings(nameof(Architectures)); - AdditionalQualifiers = item.GetStrings(nameof(AdditionalQualifiers)); - OmitRIDs = new HashSet(item.GetStrings(nameof(OmitRIDs))); - OmitRIDDefinitions = new HashSet(item.GetStrings(nameof(OmitRIDDefinitions))); - OmitRIDReferences = new HashSet(item.GetStrings(nameof(OmitRIDReferences))); - } - - public string BaseRID { get; } - public string Parent { get; } - public IEnumerable Versions { get; } - public bool TreatVersionsAsCompatible { get; } - public bool OmitVersionDelimiter { get; } - public bool ApplyVersionsToParent { get; } - public IEnumerable Architectures { get; } - public IEnumerable AdditionalQualifiers { get; } - public ICollection OmitRIDs { get; } - public ICollection OmitRIDDefinitions { get; } - public ICollection OmitRIDReferences { get; } - - private class RIDMapping - { - public RIDMapping(RID runtimeIdentifier) - { - RuntimeIdentifier = runtimeIdentifier; - Imports = Enumerable.Empty(); - } - - public RIDMapping(RID runtimeIdentifier, IEnumerable imports) - { - RuntimeIdentifier = runtimeIdentifier; - Imports = imports; - } - - public RID RuntimeIdentifier { get; } - - public IEnumerable Imports { get; } - } - - private class RID - { - public string BaseRID { get; set; } - public string VersionDelimiter { get; set; } - public string Version { get; set; } - public string ArchitectureDelimiter { get; set; } - public string Architecture { get; set; } - public string QualifierDelimiter { get; set; } - public string Qualifier { get; set; } - - public override string ToString() - { - StringBuilder builder = new StringBuilder(BaseRID); - - if (HasVersion()) - { - builder.Append(VersionDelimiter); - builder.Append(Version); - } - - if (HasArchitecture()) - { - builder.Append(ArchitectureDelimiter); - builder.Append(Architecture); - } - - if (HasQualifier()) - { - builder.Append(QualifierDelimiter); - builder.Append(Qualifier); - } - - return builder.ToString(); - } - - public bool HasVersion() - { - return Version != null; - } - - public bool HasArchitecture() - { - return Architecture != null; - } - - public bool HasQualifier() - { - return Qualifier != null; - } - } - - private RID CreateRuntime(string baseRid, string version = null, string architecture = null, string qualifier = null) - { - return new RID() - { - BaseRID = baseRid, - VersionDelimiter = OmitVersionDelimiter ? String.Empty : VersionDelimiter.ToString(), - Version = version, - ArchitectureDelimiter = ArchitectureDelimiter.ToString(), - Architecture = architecture, - QualifierDelimiter = QualifierDelimiter.ToString(), - Qualifier = qualifier - }; - } - - private IEnumerable GetRIDMappings() - { - // base => - // Parent - yield return Parent == null ? - new RIDMapping(CreateRuntime(BaseRID)) : - new RIDMapping(CreateRuntime(BaseRID), new[] { CreateRuntime(Parent) }); - - foreach (var architecture in Architectures) - { - // base + arch => - // base, - // parent + arch - var imports = new List() - { - CreateRuntime(BaseRID) - }; - - if (!IsNullOrRoot(Parent)) - { - imports.Add(CreateRuntime(Parent, architecture: architecture)); - } - - yield return new RIDMapping(CreateRuntime(BaseRID, architecture: architecture), imports); - } - - string lastVersion = null; - foreach (var version in Versions) - { - // base + version => - // base + lastVersion, - // parent + version (optionally) - var imports = new List() - { - CreateRuntime(BaseRID, version: lastVersion) - }; - - if (ApplyVersionsToParent) - { - imports.Add(CreateRuntime(Parent, version: version)); - } - - yield return new RIDMapping(CreateRuntime(BaseRID, version: version), imports); - - foreach (var architecture in Architectures) - { - // base + version + architecture => - // base + version, - // base + lastVersion + architecture, - // parent + version + architecture (optionally) - var archImports = new List() - { - CreateRuntime(BaseRID, version: version), - CreateRuntime(BaseRID, version: lastVersion, architecture: architecture) - }; - - if (ApplyVersionsToParent) - { - archImports.Add(CreateRuntime(Parent, version: version, architecture: architecture)); - } - - yield return new RIDMapping(CreateRuntime(BaseRID, version: version, architecture: architecture), archImports); - } - - if (TreatVersionsAsCompatible) - { - lastVersion = version; - } - } - - foreach (var qualifier in AdditionalQualifiers) - { - // base + qual => - // base, - // parent + qual - yield return new RIDMapping(CreateRuntime(BaseRID, qualifier: qualifier), - new[] - { - CreateRuntime(BaseRID), - IsNullOrRoot(Parent) ? CreateRuntime(qualifier) : CreateRuntime(Parent, qualifier:qualifier) - }); - - foreach (var architecture in Architectures) - { - // base + arch + qualifier => - // base + qualifier, - // base + arch - // parent + arch + qualifier - var imports = new List() - { - CreateRuntime(BaseRID, qualifier: qualifier), - CreateRuntime(BaseRID, architecture: architecture) - }; - - if (!IsNullOrRoot(Parent)) - { - imports.Add(CreateRuntime(Parent, architecture: architecture, qualifier: qualifier)); - } - - yield return new RIDMapping(CreateRuntime(BaseRID, architecture: architecture, qualifier: qualifier), imports); - } - - lastVersion = null; - foreach (var version in Versions) - { - // base + version + qualifier => - // base + version, - // base + lastVersion + qualifier - // parent + version + qualifier (optionally) - var imports = new List() - { - CreateRuntime(BaseRID, version: version), - CreateRuntime(BaseRID, version: lastVersion, qualifier: qualifier) - }; - - if (ApplyVersionsToParent) - { - imports.Add(CreateRuntime(Parent, version: version, qualifier: qualifier)); - } - - yield return new RIDMapping(CreateRuntime(BaseRID, version: version, qualifier: qualifier), imports); - - foreach (var architecture in Architectures) - { - // base + version + architecture + qualifier => - // base + version + qualifier, - // base + version + architecture, - // base + version, - // base + lastVersion + architecture + qualifier, - // parent + version + architecture + qualifier (optionally) - var archImports = new List() - { - CreateRuntime(BaseRID, version: version, qualifier: qualifier), - CreateRuntime(BaseRID, version: version, architecture: architecture), - CreateRuntime(BaseRID, version: version), - CreateRuntime(BaseRID, version: lastVersion, architecture: architecture, qualifier: qualifier) - }; - - if (ApplyVersionsToParent) - { - imports.Add(CreateRuntime(Parent, version: version, architecture: architecture, qualifier: qualifier)); - } - - yield return new RIDMapping(CreateRuntime(BaseRID, version: version, architecture: architecture, qualifier: qualifier), archImports); - } - - if (TreatVersionsAsCompatible) - { - lastVersion = version; - } - } - } - } - - private bool IsNullOrRoot(string rid) - { - return rid == null || rid == rootRID; - } - - - public IEnumerable GetRuntimeDescriptions() - { - foreach (var mapping in GetRIDMappings()) - { - var rid = mapping.RuntimeIdentifier.ToString(); - - if (OmitRIDs.Contains(rid) || OmitRIDDefinitions.Contains(rid)) - { - continue; - } - - var imports = mapping.Imports - .Select(i => i.ToString()) - .Where(i => !OmitRIDs.Contains(i) && !OmitRIDReferences.Contains(i)) - .ToArray(); - - yield return new RuntimeDescription(rid, imports); - } - } - - public RuntimeGraph GetRuntimeGraph() - { - return new RuntimeGraph(GetRuntimeDescriptions()); - } - } - - private static IDictionary> GetCompatibilityMap(RuntimeGraph graph) - { - Dictionary> compatibilityMap = new Dictionary>(); - - foreach (var rid in graph.Runtimes.Keys.OrderBy(rid => rid, StringComparer.Ordinal)) - { - compatibilityMap.Add(rid, graph.ExpandRuntime(rid)); - } - - return compatibilityMap; - } - - private static IDictionary> ReadCompatibilityMap(string mapFile) - { - var serializer = new JsonSerializer(); - using (var file = File.OpenText(mapFile)) - using (var jsonTextReader = new JsonTextReader(file)) - { - return serializer.Deserialize>>(jsonTextReader); - } - } - - private static void WriteCompatibilityMap(IDictionary> compatibilityMap, string mapFile) - { - var serializer = new JsonSerializer() - { - Formatting = Formatting.Indented, - StringEscapeHandling = StringEscapeHandling.EscapeNonAscii - }; - - string directory = Path.GetDirectoryName(mapFile); - if (!String.IsNullOrEmpty(directory) && !Directory.Exists(directory)) - { - Directory.CreateDirectory(directory); - } - - using (var file = File.CreateText(mapFile)) - { - serializer.Serialize(file, compatibilityMap); - } - } - - private static bool CompatibilityMapEquals(IDictionary> left, IDictionary> right) - { - if (left.Count != right.Count) - { - return false; - } - - foreach (var leftPair in left) - { - IEnumerable rightValue; - - if (!right.TryGetValue(leftPair.Key, out rightValue)) - { - return false; - } - - if (!rightValue.SequenceEqual(leftPair.Value)) - { - return false; - } - } - - return true; - } - - private static XNamespace s_dgmlns = @"http://schemas.microsoft.com/vs/2009/dgml"; - private static void WriteRuntimeGraph(RuntimeGraph graph, string dependencyGraphFilePath) - { - - var doc = new XDocument(new XElement(s_dgmlns + "DirectedGraph")); - var nodesElement = new XElement(s_dgmlns + "Nodes"); - var linksElement = new XElement(s_dgmlns + "Links"); - doc.Root.Add(nodesElement); - doc.Root.Add(linksElement); - - var nodeIds = new HashSet(StringComparer.OrdinalIgnoreCase); - - foreach (var runtimeDescription in graph.Runtimes.Values) - { - nodesElement.Add(new XElement(s_dgmlns + "Node", - new XAttribute("Id", runtimeDescription.RuntimeIdentifier))); - - foreach (var import in runtimeDescription.InheritedRuntimes) - { - linksElement.Add(new XElement(s_dgmlns + "Link", - new XAttribute("Source", runtimeDescription.RuntimeIdentifier), - new XAttribute("Target", import))); - } - } - - using (var file = File.Create(dependencyGraphFilePath)) - { - doc.Save(file); - } - } - } -} diff --git a/src/Microsoft.DotNet.Build.Tasks.Packaging/src/Microsoft.DotNet.Build.Tasks.Packaging.csproj b/src/Microsoft.DotNet.Build.Tasks.Packaging/src/Microsoft.DotNet.Build.Tasks.Packaging.csproj index 1148b8a5ac7..df9cabb3d5d 100644 --- a/src/Microsoft.DotNet.Build.Tasks.Packaging/src/Microsoft.DotNet.Build.Tasks.Packaging.csproj +++ b/src/Microsoft.DotNet.Build.Tasks.Packaging/src/Microsoft.DotNet.Build.Tasks.Packaging.csproj @@ -21,7 +21,6 @@ - GenerateNetStandardSupportTable - GeneratePackageReport - GenerateRuntimeDependencies -- GenerateRuntimeGraph - GetApplicableAssetsFromPackageReports - GetApplicableAssetsFromPackages - GetAssemblyReferences diff --git a/src/Microsoft.DotNet.Build.Tasks.Packaging/src/build/Packaging.common.targets b/src/Microsoft.DotNet.Build.Tasks.Packaging/src/build/Packaging.common.targets index d10bcf46e6e..71ea8500609 100644 --- a/src/Microsoft.DotNet.Build.Tasks.Packaging/src/build/Packaging.common.targets +++ b/src/Microsoft.DotNet.Build.Tasks.Packaging/src/build/Packaging.common.targets @@ -25,7 +25,6 @@ - From 0b3253328f63b3f2460965dd807f3b3281273ece Mon Sep 17 00:00:00 2001 From: Viktor Hofer Date: Wed, 21 Apr 2021 23:05:23 +0200 Subject: [PATCH 026/699] Bump Linux leg timeout to 90min (#7277) --- azure-pipelines.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 1c7b143688d..1d2e91d1fe7 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -147,6 +147,7 @@ stages: SYSTEM_ACCESSTOKEN: $(System.AccessToken) HelixAccessToken: '' - job: Linux + timeoutInMinutes: 90 container: LinuxContainer pool: vmimage: ubuntu-latest From 136e98b38b4b408e8c2790f4d73b28a02ce637f8 Mon Sep 17 00:00:00 2001 From: Viktor Hofer Date: Wed, 21 Apr 2021 23:06:53 +0200 Subject: [PATCH 027/699] Add hook to exclude harvested supported frameworks (#7272) For packages which drop assets intentionally, there's currently no hook to remove supported frameworks that are determined by the harvested package. Adding that to be able to drop assets in the packages without disabling the whole support validation. --- .../src/build/Packaging.targets | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Microsoft.DotNet.Build.Tasks.Packaging/src/build/Packaging.targets b/src/Microsoft.DotNet.Build.Tasks.Packaging/src/build/Packaging.targets index a78c5cd91cb..ccdfb455ffa 100644 --- a/src/Microsoft.DotNet.Build.Tasks.Packaging/src/build/Packaging.targets +++ b/src/Microsoft.DotNet.Build.Tasks.Packaging/src/build/Packaging.targets @@ -433,7 +433,7 @@ - + From f6a518ede095d6a92c4939b0efbf9d9fd5185817 Mon Sep 17 00:00:00 2001 From: Epsitha Ananth <47157394+epananth@users.noreply.github.com> Date: Wed, 21 Apr 2021 17:47:22 -0700 Subject: [PATCH 028/699] Fix symbol upload (#7275) * fix symbol upload * Updated log plus null check * remove line chopping --- .../src/PublishArtifactsInManifestBase.cs | 95 ++++++++++--------- 1 file changed, 52 insertions(+), 43 deletions(-) diff --git a/src/Microsoft.DotNet.Build.Tasks.Feed/src/PublishArtifactsInManifestBase.cs b/src/Microsoft.DotNet.Build.Tasks.Feed/src/PublishArtifactsInManifestBase.cs index 2655601a893..1a31455e0ee 100644 --- a/src/Microsoft.DotNet.Build.Tasks.Feed/src/PublishArtifactsInManifestBase.cs +++ b/src/Microsoft.DotNet.Build.Tasks.Feed/src/PublishArtifactsInManifestBase.cs @@ -399,57 +399,66 @@ public async Task PublishSymbolsUsingStreamingAsync( Dictionary serversToPublish = GetTargetSymbolServers(feedConfigsForSymbols, msdlToken, symWebToken); - using (HttpClient client = CreateAzdoClient(AzureDevOpsOrg, true)) + if (symbolsToPublish != null && symbolsToPublish.Any()) { - foreach (var symbol in symbolsToPublish) + using (HttpClient client = CreateAzdoClient(AzureDevOpsOrg, true)) { - string temporarySymbolsDirectory = CreateTemporaryDirectory(); - string localSymbolPath = Path.Combine(temporarySymbolsDirectory, symbol); - symbolLog.AppendLine($"Downloading symbol : {symbol} to {localSymbolPath}"); - - await DownloadFileAsync(client, ArtifactName.BlobArtifacts, containerId, symbol, localSymbolPath); - symbolLog.AppendLine($"Successfully downloaded symbol : {symbol} to {localSymbolPath}"); - List symbolFiles = new List(); - symbolFiles.ToList().Add(localSymbolPath); - - foreach (var server in serversToPublish) + foreach (var symbol in symbolsToPublish) { - var serverPath = server.Key; - var token = server.Value; - symbolLog.AppendLine($"Publishing symbol file {symbol} to {serverPath}:"); - - try - { - await PublishSymbolsHelper.PublishAsync( - Log, - serverPath, - token, - symbolFiles, - null, - null, - ExpirationInDays, - false, - publishSpecialClrFiles, - null, - false, - false, - true); - } - catch (Exception ex) + string temporarySymbolsDirectory = CreateTemporaryDirectory(); + string localSymbolPath = Path.Combine(temporarySymbolsDirectory, symbol); + symbolLog.AppendLine($"Downloading symbol : {symbol} to {localSymbolPath}"); + + await DownloadFileAsync(client, ArtifactName.BlobArtifacts, containerId, symbol, localSymbolPath); + symbolLog.AppendLine($"Successfully downloaded symbol : {symbol} to {localSymbolPath}"); + List symbolFiles = new List(); + symbolFiles.Add(localSymbolPath); + symbolLog.AppendLine($"Uploading symbol file '{string.Join(",", symbolFiles)}'"); + + foreach (var server in serversToPublish) { - Log.LogError(ex.Message); + var serverPath = server.Key; + var token = server.Value; + symbolLog.AppendLine($"Publishing symbol file {symbol} to {serverPath}:"); + + try + { + await PublishSymbolsHelper.PublishAsync( + Log, + serverPath, + token, + symbolFiles, + null, + null, + ExpirationInDays, + false, + publishSpecialClrFiles, + null, + false, + false, + true); + } + catch (Exception ex) + { + Log.LogError(ex.Message); + } } + + DeleteTemporaryDirectory(temporarySymbolsDirectory); } - DeleteTemporaryDirectory(temporarySymbolsDirectory); + symbolLog.AppendLine( + $"Performing symbol publishing... \nExpirationInDays : {ExpirationInDays} \nConvertPortablePdbsToWindowsPdb : false \ndryRun: false "); + symbolLog.AppendLine($"Total number of symbol files : {symbolsToPublish.Count}"); + symbolLog.AppendLine("Successfully published to Symbol Server."); + symbolLog.AppendLine(); + Log.LogMessage(MessageImportance.High, symbolLog.ToString()); + symbolLog.Clear(); } - symbolLog.AppendLine( - $"Performing symbol publishing... \nExpirationInDays : {ExpirationInDays} \nConvertPortablePdbsToWindowsPdb : false \ndryRun: false "); - symbolLog.AppendLine($"Total number of symbol files : {symbolsToPublish.Count}"); - symbolLog.AppendLine("Successfully published to Symbol Server."); - symbolLog.AppendLine(); - Log.LogMessage(MessageImportance.High, symbolLog.ToString()); - symbolLog.Clear(); + } + else + { + Log.LogMessage(MessageImportance.High, $"No symbol files to upload."); } // publishing pdb artifacts From 90af68df86e2c126c1804f962284581f482becb9 Mon Sep 17 00:00:00 2001 From: Alex Perovich Date: Wed, 21 Apr 2021 18:24:43 -0700 Subject: [PATCH 029/699] Update sourceIndexPackageVersion (#7274) --- eng/common/templates/job/source-index-stage1.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/eng/common/templates/job/source-index-stage1.yml b/eng/common/templates/job/source-index-stage1.yml index c002a2b1b0a..a649d2b5990 100644 --- a/eng/common/templates/job/source-index-stage1.yml +++ b/eng/common/templates/job/source-index-stage1.yml @@ -1,6 +1,6 @@ parameters: runAsPublic: false - sourceIndexPackageVersion: 1.0.1-20210225.1 + sourceIndexPackageVersion: 1.0.1-20210421.1 sourceIndexPackageSource: https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-tools/nuget/v3/index.json sourceIndexBuildCommand: powershell -NoLogo -NoProfile -ExecutionPolicy Bypass -Command "eng/common/build.ps1 -restore -build -binarylog -ci" preSteps: [] From b7279bb45342c948ab46fea2d08ec17ae2f2a1bf Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Thu, 22 Apr 2021 08:30:39 -0700 Subject: [PATCH 030/699] [main] Update dependencies from dotnet/xliff-tasks mono/linker dotnet/arcade (#7279) * Update dependencies from https://github.com/dotnet/xliff-tasks build 20210421.1 XliffTasks From Version 1.0.0-beta.21220.1 -> To Version 1.0.0-beta.21221.1 * Update dependencies from https://github.com/dotnet/arcade build 20210421.1 Microsoft.DotNet.Build.Tasks.Feed , Microsoft.DotNet.Arcade.Sdk , Microsoft.DotNet.SwaggerGenerator.MSBuild , Microsoft.DotNet.SignTool , Microsoft.DotNet.Helix.Sdk From Version 6.0.0-beta.21220.2 -> To Version 6.0.0-beta.21221.1 * Update dependencies from https://github.com/mono/linker build 20210422.1 Microsoft.NET.ILLink.Tasks From Version 6.0.100-preview.2.21219.2 -> To Version 6.0.100-preview.2.21222.1 Co-authored-by: dotnet-maestro[bot] --- eng/Version.Details.xml | 28 ++++++++++++++-------------- eng/Versions.props | 10 +++++----- global.json | 4 ++-- 3 files changed, 21 insertions(+), 21 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index 286d260a06a..d09a8ff0dd1 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -11,25 +11,25 @@ - + https://github.com/dotnet/arcade - 2803c841d5e5f5cdc3d3ea42d532d51ec96fcadb + f7e58cfb0f6c93980cbb664cc9e62d9ef2df0c2f - + https://github.com/dotnet/arcade - 2803c841d5e5f5cdc3d3ea42d532d51ec96fcadb + f7e58cfb0f6c93980cbb664cc9e62d9ef2df0c2f - + https://github.com/dotnet/arcade - 2803c841d5e5f5cdc3d3ea42d532d51ec96fcadb + f7e58cfb0f6c93980cbb664cc9e62d9ef2df0c2f - + https://github.com/dotnet/arcade - 2803c841d5e5f5cdc3d3ea42d532d51ec96fcadb + f7e58cfb0f6c93980cbb664cc9e62d9ef2df0c2f - + https://github.com/dotnet/arcade - 2803c841d5e5f5cdc3d3ea42d532d51ec96fcadb + f7e58cfb0f6c93980cbb664cc9e62d9ef2df0c2f https://github.com/dotnet/arcade-services @@ -47,9 +47,9 @@ https://github.com/dotnet/roslyn 5f00f4d6ffb242a337e21a196aab0593891e430e - + https://github.com/mono/linker - f6ccab59b40c959c10a28f696b3ec8ba0569fe25 + 012efef292663aa38f9047896942cdcc8765b8e0 https://github.com/dotnet/sourcelink @@ -68,9 +68,9 @@ https://github.com/dotnet/symreader-converter c5ba7c88f92e2dde156c324a8c8edc04d9fa4fe0 - + https://github.com/dotnet/xliff-tasks - 1a4eec88c754f024962ab4a974898c8d6d087f57 + e92cb4fc57ecfa244930cdd6d98270f185650462 diff --git a/eng/Versions.props b/eng/Versions.props index b559eeca2e5..373b45e30ed 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -36,7 +36,7 @@ 2.1.1 2.1.0 3.10.0-2.21203.6 - 6.0.100-preview.2.21219.2 + 6.0.100-preview.2.21222.1 16.7.1 4.8.3 5.3.0.1 @@ -66,8 +66,8 @@ 2.4.1 2.0.3 2.4.1 - 6.0.0-beta.21220.2 - 6.0.0-beta.21220.2 + 6.0.0-beta.21221.1 + 6.0.0-beta.21221.1 1.22.0 1.1.2 2.0.0 @@ -80,8 +80,8 @@ 1.1.0-beta.20258.6 1.1.0-beta-21201-01 1.1.0-beta-21201-01 - 6.0.0-beta.21220.2 - 1.0.0-beta.21220.1 + 6.0.0-beta.21221.1 + 1.0.0-beta.21221.1 1.1.0-beta.21117.3 1.0.0-prerelease.21220.1 1.1.156402 diff --git a/global.json b/global.json index a21d1bf474b..ad52c0300c1 100644 --- a/global.json +++ b/global.json @@ -3,7 +3,7 @@ "dotnet": "6.0.100-preview.2.21155.3" }, "msbuild-sdks": { - "Microsoft.DotNet.Arcade.Sdk": "6.0.0-beta.21220.2", - "Microsoft.DotNet.Helix.Sdk": "6.0.0-beta.21220.2" + "Microsoft.DotNet.Arcade.Sdk": "6.0.0-beta.21221.1", + "Microsoft.DotNet.Helix.Sdk": "6.0.0-beta.21221.1" } } From c336c9622eafce2b9bf3c4c164a4c0b57703aa5e Mon Sep 17 00:00:00 2001 From: Matt Mitchell Date: Thu, 22 Apr 2021 08:38:28 -0700 Subject: [PATCH 031/699] Update SDK to preview 3 (#7254) * Update SDK to preview 3 * Update aspnet runtime version * Resolve conflicts --- global.json | 2 +- src/Microsoft.DotNet.Helix/Sdk/tools/dotnet-cli/DotNetCli.props | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/global.json b/global.json index ad52c0300c1..29638e797f8 100644 --- a/global.json +++ b/global.json @@ -1,6 +1,6 @@ { "tools": { - "dotnet": "6.0.100-preview.2.21155.3" + "dotnet": "6.0.100-preview.3.21202.5" }, "msbuild-sdks": { "Microsoft.DotNet.Arcade.Sdk": "6.0.0-beta.21221.1", diff --git a/src/Microsoft.DotNet.Helix/Sdk/tools/dotnet-cli/DotNetCli.props b/src/Microsoft.DotNet.Helix/Sdk/tools/dotnet-cli/DotNetCli.props index f8e0924acdb..4df8bcd3955 100644 --- a/src/Microsoft.DotNet.Helix/Sdk/tools/dotnet-cli/DotNetCli.props +++ b/src/Microsoft.DotNet.Helix/Sdk/tools/dotnet-cli/DotNetCli.props @@ -1,7 +1,7 @@ false - 6.0.0-preview.2.21154.6 + 6.0.0-preview.3.21201.13 runtime $(BundledNETCoreAppPackageVersion) From 8f38c4b47fa7d6c3cee96df03c3fc1ce2e77d68e Mon Sep 17 00:00:00 2001 From: Jon Fortescue Date: Thu, 22 Apr 2021 13:14:35 -0700 Subject: [PATCH 032/699] Add condition parameter to OneLocBuild (#7263) --- Documentation/OneLocBuild.md | 1 + eng/common/templates/job/onelocbuild.yml | 8 +++++--- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/Documentation/OneLocBuild.md b/Documentation/OneLocBuild.md index 784c5159890..646f4f9cc45 100644 --- a/Documentation/OneLocBuild.md +++ b/Documentation/OneLocBuild.md @@ -77,5 +77,6 @@ The parameters that can be passed to the template are as follows: | `LanguageSet` | `VS_Main_Languages` | This defines the `LanguageSet` of the LocProject.json as described in the [OneLocBuild task documentation](https://ceapex.visualstudio.com/CEINTL/_wiki/wikis/CEINTL.wiki/107/Localization-with-OneLocBuild-Task?anchor=languageset%2C-languages-(required)). | | `LclSource` | `LclFilesInRepo` | This passes the `LclSource` input to the OneLocBuild task as described in [its documentation](https://ceapex.visualstudio.com/CEINTL/_wiki/wikis/CEINTL.wiki/107/Localization-with-OneLocBuild-Task?anchor=languageset%2C-languages-(required)). For most repos, this should be set to `LclFilesfromPackage`. | | `LclPackageId` | `''` | When `LclSource` is set to `LclFilesfromPackage`, this passes in the package ID as described in the [OneLocBuild task documentation](https://ceapex.visualstudio.com/CEINTL/_wiki/wikis/CEINTL.wiki/107/Localization-with-OneLocBuild-Task?anchor=scenario-2%3A-lcl-files-from-a-package). | +| `condition` | `''` | Allows for conditionalizing the template's steps on build-time variables. | It is recommended that you set `LclSource` and `LclPackageId` as shown in the example above. \ No newline at end of file diff --git a/eng/common/templates/job/onelocbuild.yml b/eng/common/templates/job/onelocbuild.yml index d2b271ec1ac..b27d6faf303 100644 --- a/eng/common/templates/job/onelocbuild.yml +++ b/eng/common/templates/job/onelocbuild.yml @@ -17,6 +17,7 @@ parameters: LclSource: lclFilesInRepo LclPackageId: '' RepoType: gitHub + condition: '' jobs: - job: OneLocBuild @@ -44,6 +45,7 @@ jobs: filePath: $(Build.SourcesDirectory)/eng/common/generate-locproject.ps1 arguments: $(_GenerateLocProjectArguments) displayName: Generate LocProject.json + condition: ${{ parameters.condition }} - task: OneLocBuild@2 displayName: OneLocBuild @@ -62,7 +64,7 @@ jobs: ${{ if eq(parameters.RepoType, 'gitHub') }}: repoType: ${{ parameters.RepoType }} gitHubPatVariable: "${{ parameters.GithubPat }}" - condition: always() + condition: ${{ parameters.condition }} - task: PublishBuildArtifacts@1 displayName: Publish Localization Files @@ -70,7 +72,7 @@ jobs: PathtoPublish: '$(Build.ArtifactStagingDirectory)/loc' PublishLocation: Container ArtifactName: Loc - condition: always() + condition: ${{ parameters.condition }} - task: PublishBuildArtifacts@1 displayName: Publish LocProject.json @@ -78,4 +80,4 @@ jobs: PathtoPublish: '$(Build.SourcesDirectory)/Localize/' PublishLocation: Container ArtifactName: Loc - condition: always() \ No newline at end of file + condition: ${{ parameters.condition }} \ No newline at end of file From 1b17d7c9f0c2100bac5766b154c99fb31ab20eb4 Mon Sep 17 00:00:00 2001 From: Alex Perovich Date: Fri, 23 Apr 2021 15:52:48 -0700 Subject: [PATCH 033/699] Set DOTNET_CLI_HOME and NUGET_PACKAGES for helix work items (#7292) --- .../Sdk/tools/dotnet-cli/DotNetCli.targets | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/Microsoft.DotNet.Helix/Sdk/tools/dotnet-cli/DotNetCli.targets b/src/Microsoft.DotNet.Helix/Sdk/tools/dotnet-cli/DotNetCli.targets index 54e87951858..50a93f39490 100644 --- a/src/Microsoft.DotNet.Helix/Sdk/tools/dotnet-cli/DotNetCli.targets +++ b/src/Microsoft.DotNet.Helix/Sdk/tools/dotnet-cli/DotNetCli.targets @@ -16,6 +16,10 @@ $(HelixPreCommands);set PATH=%HELIX_CORRELATION_PAYLOAD%\$(DotNetCliDestination)%3B%PATH% $(HelixPreCommands);export DOTNET_ROOT=$HELIX_CORRELATION_PAYLOAD/$(DotNetCliDestination);export DOTNET_CLI_TELEMETRY_OPTOUT=1 $(HelixPreCommands);set DOTNET_ROOT=%HELIX_CORRELATION_PAYLOAD%\$(DotNetCliDestination);set DOTNET_CLI_TELEMETRY_OPTOUT=1 + $(HelixPreCommands);export DOTNET_CLI_HOME=$HELIX_WORKITEM_ROOT/.dotnet + $(HelixPreCommands);set DOTNET_CLI_HOME=%HELIX_WORKITEM_ROOT%\.dotnet + $(HelixPreCommands);export NUGET_PACKAGES=$HELIX_WORKITEM_ROOT/.nuget + $(HelixPreCommands);set NUGET_PACKAGES=%HELIX_WORKITEM_ROOT%\.nuget From e75fdd1e1862d0ad31c4a1be844ddf811ad89990 Mon Sep 17 00:00:00 2001 From: Eric StJohn Date: Sun, 25 Apr 2021 08:53:46 -0700 Subject: [PATCH 034/699] Dead code cleanup (#7276) * Removing dead code from packaging tasks * mend --- .../src/Extensions.cs | 21 -- .../src/Framework.cs | 305 ------------------ .../src/GenerateNetStandardSupportTable.cs | 188 ----------- .../src/GeneratePackageReport.cs | 15 - .../src/Generations.cs | 27 -- ...rosoft.DotNet.Build.Tasks.Packaging.csproj | 1 - 6 files changed, 557 deletions(-) delete mode 100644 src/Microsoft.DotNet.Build.Tasks.Packaging/src/Framework.cs delete mode 100644 src/Microsoft.DotNet.Build.Tasks.Packaging/src/GenerateNetStandardSupportTable.cs delete mode 100644 src/Microsoft.DotNet.Build.Tasks.Packaging/src/Generations.cs diff --git a/src/Microsoft.DotNet.Build.Tasks.Packaging/src/Extensions.cs b/src/Microsoft.DotNet.Build.Tasks.Packaging/src/Extensions.cs index b8ef9dd78a1..e045027df13 100644 --- a/src/Microsoft.DotNet.Build.Tasks.Packaging/src/Extensions.cs +++ b/src/Microsoft.DotNet.Build.Tasks.Packaging/src/Extensions.cs @@ -17,8 +17,6 @@ namespace Microsoft.DotNet.Build.Tasks.Packaging { public static class Extensions { - private static readonly NuGetFramework NullFramework = new NuGetFramework("Null,Version=v1.0"); - public static string GetString(this ITaskItem taskItem, string metadataName) { var metadataValue = taskItem.GetMetadata(metadataName)?.Trim(); @@ -187,22 +185,3 @@ public static void AddRangeToMember(this T target, Expression s_frameworkSetCache = new Dictionary(); - private static object s_frameworkSetCacheLock = new object(); - - public FrameworkSet() - { - Frameworks = new Dictionary>(); - LastNonSemanticVersions = new Dictionary(); - } - - public static FrameworkSet Load(string frameworkListsPath) - { - FrameworkSet result; - if (s_frameworkSetCache.TryGetValue(frameworkListsPath, out result)) - return result; - - result = new FrameworkSet(); - - foreach (string fxDir in Directory.EnumerateDirectories(frameworkListsPath)) - { - string targetName = Path.GetFileName(fxDir); - Framework framework = new Framework(targetName); - foreach (string frameworkListPath in Directory.EnumerateFiles(fxDir, "*.xml")) - { - AddAssembliesFromFrameworkList(framework.Assemblies, frameworkListPath); - } - - SortedSet frameworkVersions = null; - string fxId = framework.FrameworkName.Identifier; - - if (fxId == FrameworkConstants.FrameworkIdentifiers.Portable) - { - // portable doesn't have version relationships, use the entire TFM - fxId = framework.FrameworkName.ToString(); - } - - if (!result.Frameworks.TryGetValue(fxId, out frameworkVersions)) - { - frameworkVersions = new SortedSet(); - } - - frameworkVersions.Add(framework); - - result.Frameworks[fxId] = frameworkVersions; - } - - string lastNonSemanticVersionsListPath = Path.Combine(frameworkListsPath, LastNonSemanticVersionsFileName); - AddAssembliesFromFrameworkList(result.LastNonSemanticVersions, lastNonSemanticVersionsListPath); - - lock (s_frameworkSetCacheLock) - { - s_frameworkSetCache[frameworkListsPath] = result; - } - return result; - } - - private static void AddAssembliesFromFrameworkList(IDictionary assemblies, string frameworkListPath) - { - XDocument frameworkList = XDocument.Load(frameworkListPath); - foreach (var file in frameworkList.Element("FileList").Elements("File")) - { - string assemblyName = file.Attribute("AssemblyName").Value; - var versionAttribute = file.Attribute("Version"); - Version supportedVersion = null; - - if (versionAttribute != null) - { - supportedVersion = new Version(versionAttribute.Value); - } - - // Use a file entry with no version to indicate any version, - // this is how Xamarin wishes us to support them - assemblies.Add(assemblyName, - supportedVersion ?? - new Version(int.MaxValue, int.MaxValue, int.MaxValue, int.MaxValue)); - } - } - - public Dictionary> Frameworks { get; private set; } - - public Dictionary LastNonSemanticVersions { get; private set; } - - /// - /// Determines the significant API version given an assembly version. - /// - /// Name of assembly - /// Version of assembly - /// Lowest version with the same API surface as assemblyVersion - public Version GetApiVersion(string assemblyName, Version assemblyVersion) - { - if (assemblyVersion == null) - { - return null; - } - - if (assemblyVersion.Build == 0 && assemblyVersion.Revision == 0) - { - // fast path for X.Y.0.0 - return assemblyVersion; - } - - Version latestLegacyVersion = null; - LastNonSemanticVersions.TryGetValue(assemblyName, out latestLegacyVersion); - - if (latestLegacyVersion == null) - { - return new Version(assemblyVersion.Major, assemblyVersion.Minor, 0, 0); - } - else if (assemblyVersion.Major <= latestLegacyVersion.Major && assemblyVersion.Minor <= latestLegacyVersion.Minor) - { - // legacy version round build to nearest 10 - return new Version(assemblyVersion.Major, assemblyVersion.Minor, assemblyVersion.Build - assemblyVersion.Build % 10, 0); - } - else - { - // new version - return new Version(assemblyVersion.Major, assemblyVersion.Minor, 0, 0); - } - } - } - - public class Framework : IComparable - { - public Framework(string targetName) - { - Assemblies = new Dictionary(); - FrameworkName = new FrameworkName(targetName); - var nugetFramework = new NuGetFramework(FrameworkName.Identifier, FrameworkName.Version, FrameworkName.Profile); - ShortName = nugetFramework.GetShortFolderName(); - - if (ShortName.EndsWith(nugetFramework.Version.Major.ToString()) && nugetFramework.Version.Minor == 0) - { - // prefer a trailing zero - ShortName += "0"; - } - - if (ShortName == "win" || ShortName == "netcore45") - { - // prefer the versioned short name - ShortName = "win8"; - } - - if (ShortName == "netcore451") - { - ShortName = "win81"; - } - } - - public IDictionary Assemblies { get; private set; } - public FrameworkName FrameworkName { get; private set; } - public string ShortName { get; private set; } - - - public int CompareTo(Framework other) - { - if (this.FrameworkName.Identifier != other.FrameworkName.Identifier) - { - throw new ArgumentException("Frameworks with different IDs are not comparable.", "other"); - } - - return this.FrameworkName.Version.CompareTo(other.FrameworkName.Version); - } - } - public class Frameworks - { - private static FrameworkSet s_inboxFrameworks; - private static FrameworkSet GetInboxFrameworks(string frameworkListsPath) - { - if (s_inboxFrameworks == null) - s_inboxFrameworks = FrameworkSet.Load(frameworkListsPath); - return s_inboxFrameworks; - } - public static string[] GetInboxFrameworksList(string frameworkListsPath, string assemblyName, string assemblyVersion, ILog log) - { - // if no version is specified just use 0.0.0.0 to evaluate for any version of the contract - Version version = String.IsNullOrEmpty(assemblyVersion) ? new Version(0, 0, 0, 0) : new Version(assemblyVersion); - - FrameworkSet fxs = GetInboxFrameworks(frameworkListsPath); - - Version latestLegacyVersion = null; - fxs.LastNonSemanticVersions.TryGetValue(assemblyName, out latestLegacyVersion); - - List inboxIds = new List(); - - foreach (var fxVersions in fxs.Frameworks.Values) - { - // find the first version (if any) that supports this contract - foreach (var fxVersion in fxVersions) - { - Version supportedVersion; - if (fxVersion.Assemblies.TryGetValue(assemblyName, out supportedVersion)) - { - if (supportedVersion >= version) - { - if (log != null) - log.LogMessage(LogImportance.Low, "inbox on {0}", fxVersion.ShortName); - inboxIds.Add(fxVersion.ShortName); - break; - } - - // new versions represent API surface via major.minor only, so consider - // a contract as supported so long as the latest legacy version is supported - // and this contract's major.minor match the latest legacy version. - if (supportedVersion == latestLegacyVersion && - version.Major == latestLegacyVersion.Major && version.Minor == latestLegacyVersion.Minor) - { - if (log != null) - log.LogMessage(LogImportance.Low, "Considering {0},Version={1} inbox on {2}, since it only differs in revsion.build from {3}", assemblyName, assemblyVersion, fxVersion.ShortName, latestLegacyVersion); - inboxIds.Add(fxVersion.ShortName); - break; - } - } - } - } - return inboxIds.ToArray(); - } - - public static bool IsInbox(string frameworkListsPath, string framework, string assemblyName, string assemblyVersion) - { - NuGetFramework fx = NuGetFramework.Parse(framework); - return IsInbox(frameworkListsPath, fx, assemblyName, assemblyVersion); - } - - public static bool IsInbox(string frameworkListsPath, NuGetFramework framework, string assemblyName, string assemblyVersion) - { - if (framework.Framework == FrameworkConstants.FrameworkIdentifiers.UAP || - (framework.Framework == FrameworkConstants.FrameworkIdentifiers.NetCore && framework.Version >= FrameworkConstants.CommonFrameworks.NetCore50.Version)) - { - // UAP & netcore50 or higher are completely OOB, despite being compatible with netcore4x which has inbox assemblies - return false; - } - - // if no version is specified just use 0.0.0.0 to evaluate for any version of the contract - Version version = FrameworkUtilities.Ensure4PartVersion(assemblyVersion); - FrameworkSet fxs = GetInboxFrameworks(frameworkListsPath); - - Version latestLegacyVersion = null; - fxs.LastNonSemanticVersions.TryGetValue(assemblyName, out latestLegacyVersion); - - foreach (var fxVersions in fxs.Frameworks.Values) - { - // Get the nearest compatible framework from this set of frameworks. - var nearest = FrameworkUtilities.GetNearest(framework, fxVersions.Select(fx => NuGetFramework.Parse(fx.ShortName)).ToArray()); - // If there are not compatible frameworks in the current framework set, there is not going to be a match. - if (nearest == null) - { - continue; - } - - // don't allow PCL to specify inbox for non-PCL framework. - if (nearest.IsPCL != framework.IsPCL) - { - continue; - } - - // find the first version (if any) that supports this contract - foreach (var fxVersion in fxVersions) - { - Version supportedVersion; - if (fxVersion.Assemblies.TryGetValue(assemblyName, out supportedVersion)) - { - if (supportedVersion >= version) - { - return true; - } - - // new versions represent API surface via major.minor only, so consider - // a contract as supported so long as the latest legacy version is supported - // and this contract's major.minor match the latest legacy version. - if (supportedVersion == latestLegacyVersion && - version.Major == latestLegacyVersion.Major && version.Minor == latestLegacyVersion.Minor) - { - return true; - } - } - } - } - return false; - } - - - internal static IEnumerable GetAlllInboxFrameworks(string frameworkListsPath) - { - FrameworkSet fxs = FrameworkSet.Load(frameworkListsPath); - return fxs.Frameworks.SelectMany(fxList => fxList.Value).Select(fx => NuGetFramework.Parse(fx.ShortName)); - } - } -} diff --git a/src/Microsoft.DotNet.Build.Tasks.Packaging/src/GenerateNetStandardSupportTable.cs b/src/Microsoft.DotNet.Build.Tasks.Packaging/src/GenerateNetStandardSupportTable.cs deleted file mode 100644 index b6fbc00962c..00000000000 --- a/src/Microsoft.DotNet.Build.Tasks.Packaging/src/GenerateNetStandardSupportTable.cs +++ /dev/null @@ -1,188 +0,0 @@ -// Licensed to the .NET Foundation under one or more agreements. -// The .NET Foundation licenses this file to you under the MIT license. - -using Microsoft.Arcade.Common; -using Microsoft.Build.Framework; -using Newtonsoft.Json; -using Newtonsoft.Json.Linq; -using NuGet.Frameworks; -using System; -using System.Collections.Generic; -using System.Diagnostics; -using System.IO; -using System.Linq; -using System.Text; - -namespace Microsoft.DotNet.Build.Tasks.Packaging -{ - public class GenerateNetStandardSupportTable : BuildTask - { - const string startMarker = ""; - const string endMarker = ""; - - [Required] - public ITaskItem[] Reports - { - get; - set; - } - - [Required] - public string DocFilePath - { - get; - set; - } - - public bool InsertIntoFile - { - get; - set; - } - - /// - /// Generates a table in markdown that lists the API version supported by - /// various packages at all levels of NETStandard. - /// - /// - public override bool Execute() - { - if (Reports == null || Reports.Length == 0) - { - Log.LogError("Reports argument must be specified"); - return false; - } - - if (String.IsNullOrEmpty(DocFilePath)) - { - Log.LogError("DocFilePath argument must be specified"); - return false; - } - - string docDir = Path.GetDirectoryName(DocFilePath); - if (!Directory.Exists(docDir)) - { - Directory.CreateDirectory(docDir); - } - - SortedSet knownNetStandardVersions = new SortedSet(); - List rows = new List(Reports.Length); - - foreach (var reportPath in Reports.Select(r => r.GetMetadata("FullPath"))) - { - SupportRow row = new SupportRow(); - row.Name = Path.GetFileNameWithoutExtension(reportPath); - row.SuportedVersions = new SortedSet(); - - var report = PackageReport.Load(reportPath); - - foreach(var supportedFramework in report.SupportedFrameworks) - { - var fx = NuGetFramework.Parse(supportedFramework.Key); - - if (fx.Framework == FrameworkConstants.FrameworkIdentifiers.NetStandard) - { - row.SuportedVersions.Add(new NETStandardApiVersion(fx.Version, new Version(supportedFramework.Value.ToString()))); - knownNetStandardVersions.Add(fx.Version); - } - } - rows.Add(row); - } - - StringBuilder table = new StringBuilder(); - table.AppendLine($"| Contract | {String.Join(" | ", knownNetStandardVersions.Select(v => v.ToString(2)))} |"); - table.AppendLine($"| -------- | {String.Join(" | ", Enumerable.Repeat("---", knownNetStandardVersions.Count))}"); - - foreach(var row in rows.OrderBy(r => r.Name)) - { - if (row.SuportedVersions.Count == 0) - { - Log.LogMessage($"Skipping {row.Name} since it has no supported NETStandard versions"); - continue; - } - - table.Append($"| {row.Name} |"); - - foreach (var netStandardVersion in knownNetStandardVersions) - { - var apiVersion = row.SuportedVersions.LastOrDefault(a => a.NETStandardVersion <= netStandardVersion); - - table.Append(" "); - if (apiVersion != null) - { - table.Append(apiVersion.APIVersion.ToString(3)); - } - table.Append(" |"); - } - table.AppendLine(); - } - - if (!InsertIntoFile) - { - File.WriteAllText(DocFilePath, table.ToString()); - } - else - { - if (!File.Exists(DocFilePath)) - { - Log.LogError($"InsertIntoFile was specified as true but {DocFilePath} did not exist."); - return false; - } - - string originalText = File.ReadAllText(DocFilePath); - int startIndex = originalText.IndexOf(startMarker); - - if (startIndex < 0) - { - Log.LogError($"InsertIntoFile was specified as true but could not locate insertion start text \"{startMarker}\"."); - return false; - } - startIndex += startMarker.Length; - // skip any white-space / new line - while(startIndex < originalText.Length && Char.IsWhiteSpace(originalText[startIndex])) - { - startIndex++; - } - - int endIndex = originalText.IndexOf(endMarker, startIndex); - - if (endIndex < 0) - { - Log.LogError($"InsertIntoFile was specified as true but could not locate insertion end text \"{endMarker}\"."); - return false; - } - var docText = new StringBuilder(originalText); - docText.Remove(startIndex, endIndex - startIndex); - docText.Insert(startIndex, table.ToString()); - - File.WriteAllText(DocFilePath, docText.ToString(), Encoding.UTF8); - } - - - return !Log.HasLoggedErrors; - } - - private class SupportRow - { - public string Name { get; set; } - public SortedSet SuportedVersions { get; set; } - } - - private class NETStandardApiVersion : IComparable - { - public NETStandardApiVersion(Version netStandardVersion, Version apiVersion) - { - NETStandardVersion = netStandardVersion; - APIVersion = apiVersion; - } - - public Version NETStandardVersion { get; } - public Version APIVersion {get;} - - public int CompareTo(NETStandardApiVersion other) - { - return NETStandardVersion.CompareTo(other.NETStandardVersion); - } - } - } -} diff --git a/src/Microsoft.DotNet.Build.Tasks.Packaging/src/GeneratePackageReport.cs b/src/Microsoft.DotNet.Build.Tasks.Packaging/src/GeneratePackageReport.cs index 37fc39111f3..1ebaaffdec3 100644 --- a/src/Microsoft.DotNet.Build.Tasks.Packaging/src/GeneratePackageReport.cs +++ b/src/Microsoft.DotNet.Build.Tasks.Packaging/src/GeneratePackageReport.cs @@ -387,20 +387,5 @@ private void MarkUsed(IEnumerable targetPaths) _unusedTargetPaths.Remove(targetPath); } } - - private class SupportFramework - { - private static readonly string[] s_nullRidList = new string[] { null }; - public SupportFramework(NuGetFramework framework) - { - Framework = framework; - RuntimeIds = s_nullRidList; - } - - public NuGetFramework Framework { get; } - public string[] RuntimeIds { get; set; } - - public string ShortName { get { return Framework.GetShortFolderName(); } } - } } } diff --git a/src/Microsoft.DotNet.Build.Tasks.Packaging/src/Generations.cs b/src/Microsoft.DotNet.Build.Tasks.Packaging/src/Generations.cs deleted file mode 100644 index 36133a2e474..00000000000 --- a/src/Microsoft.DotNet.Build.Tasks.Packaging/src/Generations.cs +++ /dev/null @@ -1,27 +0,0 @@ -// Licensed to the .NET Foundation under one or more agreements. -// The .NET Foundation licenses this file to you under the MIT license. - -using Newtonsoft.Json; -using Newtonsoft.Json.Linq; -using NuGet.Frameworks; -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Reflection.Metadata; -using System.Reflection.PortableExecutable; - -namespace Microsoft.DotNet.Build.Tasks.Packaging -{ - public class Generations - { - public static Version DetermineGenerationForFramework(NuGetFramework framework, bool useNetPlatform) - { - FrameworkExpander expander = new FrameworkExpander(); - var generationFramework = useNetPlatform ? FrameworkConstants.FrameworkIdentifiers.NetPlatform : FrameworkConstants.FrameworkIdentifiers.NetStandard; - var generationFxs = expander.Expand(framework).Where(fx => fx.Framework == generationFramework).Select(fx => fx.Version); - - return generationFxs.Max(); - } - } -} diff --git a/src/Microsoft.DotNet.Build.Tasks.Packaging/src/Microsoft.DotNet.Build.Tasks.Packaging.csproj b/src/Microsoft.DotNet.Build.Tasks.Packaging/src/Microsoft.DotNet.Build.Tasks.Packaging.csproj index df9cabb3d5d..31562d59343 100644 --- a/src/Microsoft.DotNet.Build.Tasks.Packaging/src/Microsoft.DotNet.Build.Tasks.Packaging.csproj +++ b/src/Microsoft.DotNet.Build.Tasks.Packaging/src/Microsoft.DotNet.Build.Tasks.Packaging.csproj @@ -18,7 +18,6 @@ - ApplyPreReleaseSuffix - CreateTrimDependencyGroups - FilterUnknownPackages -- GenerateNetStandardSupportTable - GeneratePackageReport - GenerateRuntimeDependencies - GetApplicableAssetsFromPackageReports From 68bead891ae70df1e8c00b18adc62fcd5eb894c1 Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Mon, 26 Apr 2021 14:53:46 +0000 Subject: [PATCH 035/699] [main] Update dependencies from dotnet/xharness dotnet/xliff-tasks dotnet/arcade mono/linker (#7290) [main] Update dependencies from dotnet/xharness dotnet/xliff-tasks dotnet/arcade mono/linker --- eng/Version.Details.xml | 32 ++++++++++++++++---------------- eng/Versions.props | 12 ++++++------ global.json | 4 ++-- 3 files changed, 24 insertions(+), 24 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index d09a8ff0dd1..dbaa47f8485 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -11,25 +11,25 @@ - + https://github.com/dotnet/arcade - f7e58cfb0f6c93980cbb664cc9e62d9ef2df0c2f + b7279bb45342c948ab46fea2d08ec17ae2f2a1bf - + https://github.com/dotnet/arcade - f7e58cfb0f6c93980cbb664cc9e62d9ef2df0c2f + b7279bb45342c948ab46fea2d08ec17ae2f2a1bf - + https://github.com/dotnet/arcade - f7e58cfb0f6c93980cbb664cc9e62d9ef2df0c2f + b7279bb45342c948ab46fea2d08ec17ae2f2a1bf - + https://github.com/dotnet/arcade - f7e58cfb0f6c93980cbb664cc9e62d9ef2df0c2f + b7279bb45342c948ab46fea2d08ec17ae2f2a1bf - + https://github.com/dotnet/arcade - f7e58cfb0f6c93980cbb664cc9e62d9ef2df0c2f + b7279bb45342c948ab46fea2d08ec17ae2f2a1bf https://github.com/dotnet/arcade-services @@ -39,17 +39,17 @@ https://github.com/dotnet/arcade-services cac955fe259cb611f6a29d09209bd717deb69037 - + https://github.com/dotnet/xharness - 82f7a4f004353d534033c82ff53e1634667a57f8 + 5716225d8681204165df5ec713fe5a45a934c28d https://github.com/dotnet/roslyn 5f00f4d6ffb242a337e21a196aab0593891e430e - + https://github.com/mono/linker - 012efef292663aa38f9047896942cdcc8765b8e0 + 1dfcf3077aca1ea77850f409d95c3192f03507b3 https://github.com/dotnet/sourcelink @@ -68,9 +68,9 @@ https://github.com/dotnet/symreader-converter c5ba7c88f92e2dde156c324a8c8edc04d9fa4fe0 - + https://github.com/dotnet/xliff-tasks - e92cb4fc57ecfa244930cdd6d98270f185650462 + 37099419d3170cb788fd6bc3de4f7364bc586195 diff --git a/eng/Versions.props b/eng/Versions.props index 373b45e30ed..6b9835e943b 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -36,7 +36,7 @@ 2.1.1 2.1.0 3.10.0-2.21203.6 - 6.0.100-preview.2.21222.1 + 6.0.100-preview.2.21226.1 16.7.1 4.8.3 5.3.0.1 @@ -66,8 +66,8 @@ 2.4.1 2.0.3 2.4.1 - 6.0.0-beta.21221.1 - 6.0.0-beta.21221.1 + 6.0.0-beta.21222.1 + 6.0.0-beta.21222.1 1.22.0 1.1.2 2.0.0 @@ -80,10 +80,10 @@ 1.1.0-beta.20258.6 1.1.0-beta-21201-01 1.1.0-beta-21201-01 - 6.0.0-beta.21221.1 - 1.0.0-beta.21221.1 + 6.0.0-beta.21222.1 + 1.0.0-beta.21224.1 1.1.0-beta.21117.3 - 1.0.0-prerelease.21220.1 + 1.0.0-prerelease.21226.1 1.1.156402 1.1.152002 6.0.100-preview.3.21175.4 diff --git a/global.json b/global.json index 29638e797f8..096061b91a3 100644 --- a/global.json +++ b/global.json @@ -3,7 +3,7 @@ "dotnet": "6.0.100-preview.3.21202.5" }, "msbuild-sdks": { - "Microsoft.DotNet.Arcade.Sdk": "6.0.0-beta.21221.1", - "Microsoft.DotNet.Helix.Sdk": "6.0.0-beta.21221.1" + "Microsoft.DotNet.Arcade.Sdk": "6.0.0-beta.21222.1", + "Microsoft.DotNet.Helix.Sdk": "6.0.0-beta.21222.1" } } From bfd2d598fb91f8e21fa1dbe9ced70df203fe7eda Mon Sep 17 00:00:00 2001 From: Lukas Lansky Date: Mon, 26 Apr 2021 21:18:14 +0200 Subject: [PATCH 036/699] We should retry in the TaskCanceledException (timeout) case too (#7293) --- .../src/PublishArtifactsInManifestBase.cs | 4 ++-- .../src/common/GeneralUtils.cs | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Microsoft.DotNet.Build.Tasks.Feed/src/PublishArtifactsInManifestBase.cs b/src/Microsoft.DotNet.Build.Tasks.Feed/src/PublishArtifactsInManifestBase.cs index 1a31455e0ee..8cf716cf8c0 100644 --- a/src/Microsoft.DotNet.Build.Tasks.Feed/src/PublishArtifactsInManifestBase.cs +++ b/src/Microsoft.DotNet.Build.Tasks.Feed/src/PublishArtifactsInManifestBase.cs @@ -820,7 +820,7 @@ private async Task GetContainerIdAsync(ArtifactName artifactName) } return false; } - catch (HttpRequestException toStore) + catch (Exception toStore) when (toStore is HttpRequestException || toStore is TaskCanceledException) { mostRecentlyCaughtException = toStore; return false; @@ -891,7 +891,7 @@ private async Task DownloadFileAsync( return true; } - catch (HttpRequestException toStore) + catch (Exception toStore) when (toStore is HttpRequestException || toStore is TaskCanceledException) { mostRecentlyCaughtException = toStore; return false; diff --git a/src/Microsoft.DotNet.Build.Tasks.Feed/src/common/GeneralUtils.cs b/src/Microsoft.DotNet.Build.Tasks.Feed/src/common/GeneralUtils.cs index 3e039ac74b8..7654ac66c39 100644 --- a/src/Microsoft.DotNet.Build.Tasks.Feed/src/common/GeneralUtils.cs +++ b/src/Microsoft.DotNet.Build.Tasks.Feed/src/common/GeneralUtils.cs @@ -220,7 +220,7 @@ public static async Task CompareLocalPackageToFeedPackage( } // String based comparison because the status code isn't exposed in HttpRequestException // see here: https://github.com/dotnet/runtime/issues/23648 - catch (HttpRequestException e) + catch (Exception e) when (e is HttpRequestException || e is TaskCanceledException) { if (e.Message.Contains("404 (Not Found)")) { From cca78ffe3eefdc217e43c2421f2f23355f16da2d Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Tue, 27 Apr 2021 14:13:31 +0000 Subject: [PATCH 037/699] Update dependencies from https://github.com/mono/linker build 20210427.1 (#7294) [main] Update dependencies from mono/linker --- eng/Version.Details.xml | 4 ++-- eng/Versions.props | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index dbaa47f8485..fa44003ec87 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -47,9 +47,9 @@ https://github.com/dotnet/roslyn 5f00f4d6ffb242a337e21a196aab0593891e430e - + https://github.com/mono/linker - 1dfcf3077aca1ea77850f409d95c3192f03507b3 + bf37b2909bbfb2942173e7b383642c9b32ae0e79 https://github.com/dotnet/sourcelink diff --git a/eng/Versions.props b/eng/Versions.props index 6b9835e943b..ebbd8e08192 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -36,7 +36,7 @@ 2.1.1 2.1.0 3.10.0-2.21203.6 - 6.0.100-preview.2.21226.1 + 6.0.100-preview.5.21227.1 16.7.1 4.8.3 5.3.0.1 From 39e694a74bc2e7a65c12b210dfa026e6a6a388a0 Mon Sep 17 00:00:00 2001 From: Matt Mitchell Date: Tue, 27 Apr 2021 10:26:07 -0700 Subject: [PATCH 038/699] Attempt roundtrip update to unblock promotion (#7297) --- eng/Version.Details.xml | 20 ++++++++++---------- eng/Versions.props | 6 +++--- global.json | 4 ++-- 3 files changed, 15 insertions(+), 15 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index fa44003ec87..e1a469d6ef7 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -11,25 +11,25 @@ - + https://github.com/dotnet/arcade - b7279bb45342c948ab46fea2d08ec17ae2f2a1bf + cca78ffe3eefdc217e43c2421f2f23355f16da2d - + https://github.com/dotnet/arcade - b7279bb45342c948ab46fea2d08ec17ae2f2a1bf + cca78ffe3eefdc217e43c2421f2f23355f16da2d - + https://github.com/dotnet/arcade - b7279bb45342c948ab46fea2d08ec17ae2f2a1bf + cca78ffe3eefdc217e43c2421f2f23355f16da2d - + https://github.com/dotnet/arcade - b7279bb45342c948ab46fea2d08ec17ae2f2a1bf + cca78ffe3eefdc217e43c2421f2f23355f16da2d - + https://github.com/dotnet/arcade - b7279bb45342c948ab46fea2d08ec17ae2f2a1bf + cca78ffe3eefdc217e43c2421f2f23355f16da2d https://github.com/dotnet/arcade-services diff --git a/eng/Versions.props b/eng/Versions.props index ebbd8e08192..11cd9740259 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -66,8 +66,8 @@ 2.4.1 2.0.3 2.4.1 - 6.0.0-beta.21222.1 - 6.0.0-beta.21222.1 + 6.0.0-beta.21227.1 + 6.0.0-beta.21227.1 1.22.0 1.1.2 2.0.0 @@ -80,7 +80,7 @@ 1.1.0-beta.20258.6 1.1.0-beta-21201-01 1.1.0-beta-21201-01 - 6.0.0-beta.21222.1 + 6.0.0-beta.21227.1 1.0.0-beta.21224.1 1.1.0-beta.21117.3 1.0.0-prerelease.21226.1 diff --git a/global.json b/global.json index 096061b91a3..ea696a66179 100644 --- a/global.json +++ b/global.json @@ -3,7 +3,7 @@ "dotnet": "6.0.100-preview.3.21202.5" }, "msbuild-sdks": { - "Microsoft.DotNet.Arcade.Sdk": "6.0.0-beta.21222.1", - "Microsoft.DotNet.Helix.Sdk": "6.0.0-beta.21222.1" + "Microsoft.DotNet.Arcade.Sdk": "6.0.0-beta.21227.1", + "Microsoft.DotNet.Helix.Sdk": "6.0.0-beta.21227.1" } } From 67737ae294375c867bea72de19a66149785881e5 Mon Sep 17 00:00:00 2001 From: Matt Galbraith Date: Tue, 27 Apr 2021 18:36:24 -0700 Subject: [PATCH 039/699] Add devdiv.visualstudio URL to the regex used for SourceLink translation (#7304) --- .../tools/RepositoryInfo.targets | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/Microsoft.DotNet.Arcade.Sdk/tools/RepositoryInfo.targets b/src/Microsoft.DotNet.Arcade.Sdk/tools/RepositoryInfo.targets index bdb872e1f66..5d426527496 100644 --- a/src/Microsoft.DotNet.Arcade.Sdk/tools/RepositoryInfo.targets +++ b/src/Microsoft.DotNet.Arcade.Sdk/tools/RepositoryInfo.targets @@ -42,18 +42,20 @@ false - <_TranslateUrlPattern>(https://dnceng%40dev\.azure\.com/dnceng/internal/_git|https://dev\.azure\.com/dnceng/internal/_git|https://dnceng\.visualstudio\.com/internal/_git|dnceng%40vs-ssh\.visualstudio\.com:v3/dnceng/internal|git%40ssh\.dev\.azure\.com:v3/dnceng/internal)/([^/-]+)-(.+) + <_TranslateUrlPattern>(https://dnceng%40dev\.azure\.com/dnceng/internal/_git|https://dev\.azure\.com/dnceng/internal/_git|https://dnceng\.visualstudio\.com/internal/_git|dnceng%40vs-ssh\.visualstudio\.com:v3/dnceng/internal|git%40ssh\.dev\.azure\.com:v3/dnceng/internal|https://devdiv\.visualstudio\.com/devdiv/_git)/([^/-]+)-(.+) <_TranslateUrlReplacement>https://github.com/$2/$3 @@ -63,6 +65,9 @@ BeforeTargets="SourceControlManagerPublishTranslatedUrls"> + + $(ScmRepositoryUrl.ToLower().Replace(`-trusted`,``)) $([System.Text.RegularExpressions.Regex]::Replace($(ScmRepositoryUrl), $(_TranslateUrlPattern), $(_TranslateUrlReplacement))) From 7736546488278778dde535b0bf0b9f30fab53f7c Mon Sep 17 00:00:00 2001 From: Matt Mitchell Date: Wed, 28 Apr 2021 11:38:34 -0700 Subject: [PATCH 040/699] Don't fail if AzdoApiToken or ArtifactsBasePath are empty if UseStreamingPublishing is false (#7308) These are not required if not using streaming publishing, as is the case when publishing post-build signed assets --- .../src/PublishArtifactsInManifestBase.cs | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/src/Microsoft.DotNet.Build.Tasks.Feed/src/PublishArtifactsInManifestBase.cs b/src/Microsoft.DotNet.Build.Tasks.Feed/src/PublishArtifactsInManifestBase.cs index 8cf716cf8c0..8991ca8b081 100644 --- a/src/Microsoft.DotNet.Build.Tasks.Feed/src/PublishArtifactsInManifestBase.cs +++ b/src/Microsoft.DotNet.Build.Tasks.Feed/src/PublishArtifactsInManifestBase.cs @@ -124,6 +124,14 @@ public abstract class PublishArtifactsInManifestBase : Microsoft.Build.Utilities private readonly string AzureDevOpsBaseUrl = $"https://dev.azure.com"; + /// + /// Instead of relying on pre-downloaded artifacts, 'stream' artifacts in from the input build. + /// Artifacts are downloaded one by one from the input build, and then immediately published and deleted. + /// This allows for faster publishing by utilizing both upload and download pipes at the same time, + /// and reduces maximum disk usage. + /// This is not appplicable if the input build does not contain the artifacts for publishing + /// (e.g. when publishing post-build signed assets) + /// public bool UseStreamingPublishing { get; set; } public readonly Dictionary> FeedConfigs = @@ -1853,14 +1861,14 @@ protected bool AnyMissingRequiredBaseProperties() Log.LogError($"The property {nameof(BuildAssetRegistryToken)} is required but doesn't have a value set."); } - if (string.IsNullOrEmpty(AzdoApiToken)) + if (UseStreamingPublishing && string.IsNullOrEmpty(AzdoApiToken)) { - Log.LogError($"The property {nameof(AzdoApiToken)} is required but doesn't have a value set."); + Log.LogError($"The property {nameof(AzdoApiToken)} is required when using streaming publishing, but doesn't have a value set."); } - if (string.IsNullOrEmpty(ArtifactsBasePath)) + if (UseStreamingPublishing && string.IsNullOrEmpty(ArtifactsBasePath)) { - Log.LogError($"The property {nameof(ArtifactsBasePath)} is required but doesn't have a value set."); + Log.LogError($"The property {nameof(ArtifactsBasePath)} is required when using streaming publishing, but doesn't have a value set."); } return Log.HasLoggedErrors; } From e1044f09e18638a98a9f0448086a7295f3d16834 Mon Sep 17 00:00:00 2001 From: Rainer Sigwald Date: Wed, 28 Apr 2021 14:14:22 -0500 Subject: [PATCH 041/699] OneLocBuild: how it fits in (#7309) --- Documentation/OneLocBuild.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Documentation/OneLocBuild.md b/Documentation/OneLocBuild.md index 646f4f9cc45..8b9b2f0247d 100644 --- a/Documentation/OneLocBuild.md +++ b/Documentation/OneLocBuild.md @@ -3,7 +3,8 @@ As of April 1, 2021, all .NET repositories will be using OneLocBuild for localization. Documentation on this system can be found [here](https://ceapex.visualstudio.com/CEINTL/_wiki/wikis/CEINTL.wiki/107/Localization-with-OneLocBuild-Task). This system is **not a replacement for Xliff-Tasks**; rather, it is replacing the localization team's old system called -Simple Loc. Xliff-Tasks will continue to be used in addition to OneLocBuild. +Simple Loc. OneLocBuild coordinates getting translations for new and updated strings and merging them back into the +repo. Xliff-Tasks will continue to be used in addition to OneLocBuild. To make OneLocBuild easier to use, we have integrated the task into Arcade. This integration is a job template ([here](/eng/common/templates/job/onelocbuild.yml)) that is described in this document. @@ -79,4 +80,4 @@ The parameters that can be passed to the template are as follows: | `LclPackageId` | `''` | When `LclSource` is set to `LclFilesfromPackage`, this passes in the package ID as described in the [OneLocBuild task documentation](https://ceapex.visualstudio.com/CEINTL/_wiki/wikis/CEINTL.wiki/107/Localization-with-OneLocBuild-Task?anchor=scenario-2%3A-lcl-files-from-a-package). | | `condition` | `''` | Allows for conditionalizing the template's steps on build-time variables. | -It is recommended that you set `LclSource` and `LclPackageId` as shown in the example above. \ No newline at end of file +It is recommended that you set `LclSource` and `LclPackageId` as shown in the example above. From 62ba47652d8fd049089abf20355408c32b226243 Mon Sep 17 00:00:00 2001 From: Matt Galbraith Date: Wed, 28 Apr 2021 16:16:19 -0700 Subject: [PATCH 042/699] Update Maestro.Tasks package version (#7311) Update Maestro.Tasks version to pick up changes for https://github.com/dotnet/core-eng/issues/12911 --- eng/Versions.props | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/eng/Versions.props b/eng/Versions.props index 11cd9740259..938a86c8f42 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -82,7 +82,7 @@ 1.1.0-beta-21201-01 6.0.0-beta.21227.1 1.0.0-beta.21224.1 - 1.1.0-beta.21117.3 + 1.1.0-beta.21228.1 1.0.0-prerelease.21226.1 1.1.156402 1.1.152002 From d8c3fb69cef401e0fc59cd5fcc766e8c042fa043 Mon Sep 17 00:00:00 2001 From: Matt Mitchell Date: Wed, 28 Apr 2021 17:10:29 -0700 Subject: [PATCH 043/699] Disable windows pdb verification by default (#7315) * Disable windows pdb verification by default When we publish symbols, they are published without windows pdb conversion. This happens on release day Avoid checking for windows PDBs by default. Still available via switch. * Fix some formatting --- eng/common/post-build/symbols-validation.ps1 | 94 +++++++++++--------- 1 file changed, 51 insertions(+), 43 deletions(-) diff --git a/eng/common/post-build/symbols-validation.ps1 b/eng/common/post-build/symbols-validation.ps1 index 99bf28cd5c1..e6d5d2fd054 100644 --- a/eng/common/post-build/symbols-validation.ps1 +++ b/eng/common/post-build/symbols-validation.ps1 @@ -1,9 +1,10 @@ param( - [Parameter(Mandatory=$true)][string] $InputPath, # Full path to directory where NuGet packages to be checked are stored - [Parameter(Mandatory=$true)][string] $ExtractPath, # Full path to directory where the packages will be extracted during validation - [Parameter(Mandatory=$true)][string] $DotnetSymbolVersion, # Version of dotnet symbol to use - [Parameter(Mandatory=$false)][switch] $ContinueOnError, # If we should keep checking symbols after an error - [Parameter(Mandatory=$false)][switch] $Clean # Clean extracted symbols directory after checking symbols + [Parameter(Mandatory = $true)][string] $InputPath, # Full path to directory where NuGet packages to be checked are stored + [Parameter(Mandatory = $true)][string] $ExtractPath, # Full path to directory where the packages will be extracted during validation + [Parameter(Mandatory = $true)][string] $DotnetSymbolVersion, # Version of dotnet symbol to use + [Parameter(Mandatory = $false)][switch] $CheckForWindowsPdbs, # If we should check for the existence of windows pdbs in addition to portable PDBs + [Parameter(Mandatory = $false)][switch] $ContinueOnError, # If we should keep checking symbols after an error + [Parameter(Mandatory = $false)][switch] $Clean # Clean extracted symbols directory after checking symbols ) # Maximum number of jobs to run in parallel @@ -19,9 +20,15 @@ $SecondsBetweenLoadChecks = 10 Set-Variable -Name "ERROR_BADEXTRACT" -Option Constant -Value -1 Set-Variable -Name "ERROR_FILEDOESNOTEXIST" -Option Constant -Value -2 +$WindowsPdbVerificationParam = "" +if ($CheckForWindowsPdbs) { + $WindowsPdbVerificationParam = "--windows-pdbs" +} + $CountMissingSymbols = { param( - [string] $PackagePath # Path to a NuGet package + [string] $PackagePath, # Path to a NuGet package + [string] $WindowsPdbVerificationParam # If we should check for the existence of windows pdbs in addition to portable PDBs ) . $using:PSScriptRoot\..\tools.ps1 @@ -34,7 +41,7 @@ $CountMissingSymbols = { if (!(Test-Path $PackagePath)) { Write-PipelineTaskError "Input file does not exist: $PackagePath" return [pscustomobject]@{ - result = $using:ERROR_FILEDOESNOTEXIST + result = $using:ERROR_FILEDOESNOTEXIST packagePath = $PackagePath } } @@ -57,24 +64,25 @@ $CountMissingSymbols = { Write-Host "Something went wrong extracting $PackagePath" Write-Host $_ return [pscustomobject]@{ - result = $using:ERROR_BADEXTRACT + result = $using:ERROR_BADEXTRACT packagePath = $PackagePath } } Get-ChildItem -Recurse $ExtractPath | - Where-Object {$RelevantExtensions -contains $_.Extension} | - ForEach-Object { - $FileName = $_.FullName - if ($FileName -Match '\\ref\\') { - Write-Host "`t Ignoring reference assembly file " $FileName - return - } + Where-Object { $RelevantExtensions -contains $_.Extension } | + ForEach-Object { + $FileName = $_.FullName + if ($FileName -Match '\\ref\\') { + Write-Host "`t Ignoring reference assembly file " $FileName + return + } - $FirstMatchingSymbolDescriptionOrDefault = { + $FirstMatchingSymbolDescriptionOrDefault = { param( - [string] $FullPath, # Full path to the module that has to be checked - [string] $TargetServerParam, # Parameter to pass to `Symbol Tool` indicating the server to lookup for symbols + [string] $FullPath, # Full path to the module that has to be checked + [string] $TargetServerParam, # Parameter to pass to `Symbol Tool` indicating the server to lookup for symbols + [string] $WindowsPdbVerificationParam, # Parameter to pass to potential check for windows-pdbs. [string] $SymbolsPath ) @@ -99,7 +107,7 @@ $CountMissingSymbols = { # DWARF file for a .dylib $DylibDwarf = $SymbolPath.Replace($Extension, '.dylib.dwarf') - + $dotnetSymbolExe = "$env:USERPROFILE\.dotnet\tools" $dotnetSymbolExe = Resolve-Path "$dotnetSymbolExe\dotnet-symbol.exe" @@ -107,7 +115,7 @@ $CountMissingSymbols = { while ($totalRetries -lt $using:MaxRetry) { # Save the output and get diagnostic output - $output = & $dotnetSymbolExe --symbols --modules --windows-pdbs $TargetServerParam $FullPath -o $SymbolsPath --diagnostics | Out-String + $output = & $dotnetSymbolExe --symbols --modules $WindowsPdbVerificationParam $TargetServerParam $FullPath -o $SymbolsPath --diagnostics | Out-String if (Test-Path $PdbPath) { return 'PDB' @@ -136,30 +144,30 @@ $CountMissingSymbols = { return $null } - $SymbolsOnMSDL = & $FirstMatchingSymbolDescriptionOrDefault $FileName '--microsoft-symbol-server' $SymbolsPath - $SymbolsOnSymWeb = & $FirstMatchingSymbolDescriptionOrDefault $FileName '--internal-server' $SymbolsPath + $SymbolsOnMSDL = & $FirstMatchingSymbolDescriptionOrDefault $FileName '--microsoft-symbol-server' $SymbolsPath $WindowsPdbVerificationParam + $SymbolsOnSymWeb = & $FirstMatchingSymbolDescriptionOrDefault $FileName '--internal-server' $SymbolsPath $WindowsPdbVerificationParam - Write-Host -NoNewLine "`t Checking file " $FileName "... " + Write-Host -NoNewLine "`t Checking file " $FileName "... " - if ($SymbolsOnMSDL -ne $null -and $SymbolsOnSymWeb -ne $null) { - Write-Host "Symbols found on MSDL ($SymbolsOnMSDL) and SymWeb ($SymbolsOnSymWeb)" + if ($SymbolsOnMSDL -ne $null -and $SymbolsOnSymWeb -ne $null) { + Write-Host "Symbols found on MSDL ($SymbolsOnMSDL) and SymWeb ($SymbolsOnSymWeb)" + } + else { + $MissingSymbols++ + + if ($SymbolsOnMSDL -eq $null -and $SymbolsOnSymWeb -eq $null) { + Write-Host 'No symbols found on MSDL or SymWeb!' } else { - $MissingSymbols++ - - if ($SymbolsOnMSDL -eq $null -and $SymbolsOnSymWeb -eq $null) { - Write-Host 'No symbols found on MSDL or SymWeb!' + if ($SymbolsOnMSDL -eq $null) { + Write-Host 'No symbols found on MSDL!' } else { - if ($SymbolsOnMSDL -eq $null) { - Write-Host 'No symbols found on MSDL!' - } - else { - Write-Host 'No symbols found on SymWeb!' - } + Write-Host 'No symbols found on SymWeb!' } } } + } if ($using:Clean) { Remove-Item $ExtractPath -Recurse -Force @@ -168,16 +176,16 @@ $CountMissingSymbols = { Pop-Location return [pscustomobject]@{ - result = $MissingSymbols - packagePath = $PackagePath - } + result = $MissingSymbols + packagePath = $PackagePath + } } function CheckJobResult( - $result, - $packagePath, - [ref]$DupedSymbols, - [ref]$TotalFailures) { + $result, + $packagePath, + [ref]$DupedSymbols, + [ref]$TotalFailures) { if ($result -eq $ERROR_BADEXTRACT) { Write-PipelineTelemetryError -Category 'CheckSymbols' -Message "$packagePath has duplicated symbol files" $DupedSymbols.Value++ @@ -222,7 +230,7 @@ function CheckSymbolsAvailable { return } - Start-Job -ScriptBlock $CountMissingSymbols -ArgumentList $FullName | Out-Null + Start-Job -ScriptBlock $CountMissingSymbols -ArgumentList @($FullName,$WindowsPdbVerificationParam) | Out-Null $NumJobs = @(Get-Job -State 'Running').Count From 67f4230b38092d53d8f8d3a37301feb997adf26c Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Thu, 29 Apr 2021 15:00:59 +0000 Subject: [PATCH 044/699] [main] Update dependencies from dotnet/arcade dotnet/sourcelink mono/linker (#7305) [main] Update dependencies from dotnet/arcade dotnet/sourcelink mono/linker --- eng/Version.Details.xml | 28 ++++++++++++++-------------- eng/Versions.props | 12 ++++++------ global.json | 4 ++-- 3 files changed, 22 insertions(+), 22 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index e1a469d6ef7..aa5de6c2887 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -11,25 +11,25 @@ - + https://github.com/dotnet/arcade - cca78ffe3eefdc217e43c2421f2f23355f16da2d + e1044f09e18638a98a9f0448086a7295f3d16834 - + https://github.com/dotnet/arcade - cca78ffe3eefdc217e43c2421f2f23355f16da2d + e1044f09e18638a98a9f0448086a7295f3d16834 - + https://github.com/dotnet/arcade - cca78ffe3eefdc217e43c2421f2f23355f16da2d + e1044f09e18638a98a9f0448086a7295f3d16834 - + https://github.com/dotnet/arcade - cca78ffe3eefdc217e43c2421f2f23355f16da2d + e1044f09e18638a98a9f0448086a7295f3d16834 - + https://github.com/dotnet/arcade - cca78ffe3eefdc217e43c2421f2f23355f16da2d + e1044f09e18638a98a9f0448086a7295f3d16834 https://github.com/dotnet/arcade-services @@ -47,16 +47,16 @@ https://github.com/dotnet/roslyn 5f00f4d6ffb242a337e21a196aab0593891e430e - + https://github.com/mono/linker - bf37b2909bbfb2942173e7b383642c9b32ae0e79 + e48f540b753d2aa5f5d4c22f4bbc41aba130345b - + https://github.com/dotnet/sourcelink 4b584dbc392bb1aad49c2eb1ab84d8b489b6dccc - + https://github.com/dotnet/sourcelink 4b584dbc392bb1aad49c2eb1ab84d8b489b6dccc diff --git a/eng/Versions.props b/eng/Versions.props index 938a86c8f42..5847dca551e 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -36,7 +36,7 @@ 2.1.1 2.1.0 3.10.0-2.21203.6 - 6.0.100-preview.5.21227.1 + 6.0.100-preview.5.21228.2 16.7.1 4.8.3 5.3.0.1 @@ -66,8 +66,8 @@ 2.4.1 2.0.3 2.4.1 - 6.0.0-beta.21227.1 - 6.0.0-beta.21227.1 + 6.0.0-beta.21228.3 + 6.0.0-beta.21228.3 1.22.0 1.1.2 2.0.0 @@ -78,9 +78,9 @@ 1.1.0-beta2-19575-01 1.7.0 1.1.0-beta.20258.6 - 1.1.0-beta-21201-01 - 1.1.0-beta-21201-01 - 6.0.0-beta.21227.1 + 1.1.0-beta-21228-01 + 1.1.0-beta-21228-01 + 6.0.0-beta.21228.3 1.0.0-beta.21224.1 1.1.0-beta.21228.1 1.0.0-prerelease.21226.1 diff --git a/global.json b/global.json index ea696a66179..bd5143f420c 100644 --- a/global.json +++ b/global.json @@ -3,7 +3,7 @@ "dotnet": "6.0.100-preview.3.21202.5" }, "msbuild-sdks": { - "Microsoft.DotNet.Arcade.Sdk": "6.0.0-beta.21227.1", - "Microsoft.DotNet.Helix.Sdk": "6.0.0-beta.21227.1" + "Microsoft.DotNet.Arcade.Sdk": "6.0.0-beta.21228.3", + "Microsoft.DotNet.Helix.Sdk": "6.0.0-beta.21228.3" } } From 197aa6b39097a93f79fb304f910f10936160b69e Mon Sep 17 00:00:00 2001 From: Alex Perovich Date: Thu, 29 Apr 2021 13:11:59 -0700 Subject: [PATCH 045/699] Fail the work item when the azure pipelines upload fails (#7310) * Fail the work item when the azure pipelines upload fails * global --- .../AzurePipelines.MonoQueue.targets | 4 ++-- .../Sdk/tools/azure-pipelines/reporter/run.bat | 2 ++ .../Sdk/tools/azure-pipelines/reporter/run.py | 13 ++++++++++++- .../Sdk/tools/azure-pipelines/reporter/run.sh | 4 +++- 4 files changed, 19 insertions(+), 4 deletions(-) diff --git a/src/Microsoft.DotNet.Helix/Sdk/tools/azure-pipelines/AzurePipelines.MonoQueue.targets b/src/Microsoft.DotNet.Helix/Sdk/tools/azure-pipelines/AzurePipelines.MonoQueue.targets index 335fac7897f..9dc488962f1 100644 --- a/src/Microsoft.DotNet.Helix/Sdk/tools/azure-pipelines/AzurePipelines.MonoQueue.targets +++ b/src/Microsoft.DotNet.Helix/Sdk/tools/azure-pipelines/AzurePipelines.MonoQueue.targets @@ -7,11 +7,11 @@ $(HelixPostCommands); - /bin/sh $HELIX_CORRELATION_PAYLOAD/reporter/run.sh $(SYSTEM_TEAMFOUNDATIONCOLLECTIONURI) $(SYSTEM_TEAMPROJECT) $(TestRunId) $(SYSTEM_ACCESSTOKEN) + /bin/sh $HELIX_CORRELATION_PAYLOAD/reporter/run.sh $(SYSTEM_TEAMFOUNDATIONCOLLECTIONURI) $(SYSTEM_TEAMPROJECT) $(TestRunId) $(SYSTEM_ACCESSTOKEN) || exit $? $(HelixPostCommands); - call %HELIX_CORRELATION_PAYLOAD%\reporter\run.bat $(SYSTEM_TEAMFOUNDATIONCOLLECTIONURI) $(SYSTEM_TEAMPROJECT) $(TestRunId) $(SYSTEM_ACCESSTOKEN) + call %HELIX_CORRELATION_PAYLOAD%\reporter\run.bat $(SYSTEM_TEAMFOUNDATIONCOLLECTIONURI) $(SYSTEM_TEAMPROJECT) $(TestRunId) $(SYSTEM_ACCESSTOKEN) || exit /b diff --git a/src/Microsoft.DotNet.Helix/Sdk/tools/azure-pipelines/reporter/run.bat b/src/Microsoft.DotNet.Helix/Sdk/tools/azure-pipelines/reporter/run.bat index 6522f803bc9..3a3c0f9d1ba 100644 --- a/src/Microsoft.DotNet.Helix/Sdk/tools/azure-pipelines/reporter/run.bat +++ b/src/Microsoft.DotNet.Helix/Sdk/tools/azure-pipelines/reporter/run.bat @@ -33,6 +33,8 @@ GOTO :retryloop echo %date%-%time% %ENV_PATH%\Scripts\python.exe -B %~dp0run.py %* +set _uploaderExitCode=%ERRORLEVEL% echo %date%-%time% set PYTHONPATH=%_OLD_PYTHONPATH% +exit /b %_uploaderExitCode% diff --git a/src/Microsoft.DotNet.Helix/Sdk/tools/azure-pipelines/reporter/run.py b/src/Microsoft.DotNet.Helix/Sdk/tools/azure-pipelines/reporter/run.py index dcfd343dd98..bde3200f8f4 100644 --- a/src/Microsoft.DotNet.Helix/Sdk/tools/azure-pipelines/reporter/run.py +++ b/src/Microsoft.DotNet.Helix/Sdk/tools/azure-pipelines/reporter/run.py @@ -3,13 +3,16 @@ import traceback import logging from queue import Queue -from threading import Thread +from threading import Thread, Lock from typing import Tuple, Optional from test_results_reader import read_results from helpers import batch, get_env from azure_devops_result_publisher import AzureDevOpsTestResultPublisher +workerFailedLock = Lock() +workerFailed = False + class UploadWorker(Thread): def __init__(self, queue, idx, collection_uri, team_project, test_run_id, access_token): super(UploadWorker, self).__init__() @@ -33,6 +36,7 @@ def __process(self, batch): self.__print('uploaded {} results'.format(self.total_uploaded)) def run(self): + global workerFailed, workerFailedLock self.__print("starting...") while True: try: @@ -40,6 +44,8 @@ def run(self): self.__process(item) except: self.__print("got error: {}".format(traceback.format_exc())) + with workerFailedLock: + workerFailed = True finally: self.queue.task_done() @@ -65,6 +71,7 @@ def process_args() -> Tuple[str, str, str, Optional[str]]: def main(): + global workerFailed, workerFailedLock logging.basicConfig( format='%(asctime)s: %(levelname)s: %(thread)d: %(module)s(%(lineno)d): %(funcName)s: %(message)s', level=logging.INFO, @@ -105,6 +112,10 @@ def main(): q.join() log.info("Main thread exiting") + + with workerFailedLock: + if workerFailed: + sys.exit(1337) if __name__ == '__main__': main() diff --git a/src/Microsoft.DotNet.Helix/Sdk/tools/azure-pipelines/reporter/run.sh b/src/Microsoft.DotNet.Helix/Sdk/tools/azure-pipelines/reporter/run.sh index 2f082175508..c3f8ee86708 100755 --- a/src/Microsoft.DotNet.Helix/Sdk/tools/azure-pipelines/reporter/run.sh +++ b/src/Microsoft.DotNet.Helix/Sdk/tools/azure-pipelines/reporter/run.sh @@ -35,6 +35,8 @@ fi date -u +"%FT%TZ" $ENV_PATH/bin/python -B $script_path/run.py "$@" +export _uploaderExitCode=$? date -u +"%FT%TZ" -export PYTHONPATH=$_OLD_PYTHONPATH \ No newline at end of file +export PYTHONPATH=$_OLD_PYTHONPATH +exit $_uploaderExitCode From 8d5c0ee0ab9b6517eabadee9800cb407a2674534 Mon Sep 17 00:00:00 2001 From: Chad Nedzlek Date: Fri, 30 Apr 2021 13:24:39 -0700 Subject: [PATCH 046/699] Remove attachments because we overflowed Azure DevOps (#7322) --- .../CreateFailedTestsForFailedWorkItems.cs | 48 +------------------ 1 file changed, 1 insertion(+), 47 deletions(-) diff --git a/src/Microsoft.DotNet.Helix/Sdk/CreateFailedTestsForFailedWorkItems.cs b/src/Microsoft.DotNet.Helix/Sdk/CreateFailedTestsForFailedWorkItems.cs index 18f7e01736c..5a42a54e4ab 100644 --- a/src/Microsoft.DotNet.Helix/Sdk/CreateFailedTestsForFailedWorkItems.cs +++ b/src/Microsoft.DotNet.Helix/Sdk/CreateFailedTestsForFailedWorkItems.cs @@ -26,56 +26,10 @@ protected override async Task ExecuteCoreAsync(HttpClient client) var testRunId = workItem.GetMetadata("TestRunId"); var failed = workItem.GetMetadata("Failed") == "true"; - var testResultId = await CreateFakeTestResultAsync(client, testRunId, jobName, workItemName, failed); - - if (failed) - { - try - { - var uploadedFiles = JsonConvert.DeserializeObject>(workItem.GetMetadata("UploadedFiles")); - var text = string.Join(Environment.NewLine, uploadedFiles.Select(f => $"{f.Name}:{Environment.NewLine} {f.Link}{Environment.NewLine}")); - await AttachResultFileToTestResultAsync(client, testRunId, testResultId, text); - } - catch (Exception ex) - { - Log.LogWarningFromException(ex); - } - } + await CreateFakeTestResultAsync(client, testRunId, jobName, workItemName, failed); } } - private async Task AttachResultFileToTestResultAsync(HttpClient client, string testRunId, int testResultId, string text) - { - var b64Stream = Convert.ToBase64String(Encoding.UTF8.GetBytes(text)); - await RetryAsync( - async () => - { - var req = - new HttpRequestMessage( - HttpMethod.Post, - $"{CollectionUri}{TeamProject}/_apis/test/Runs/{testRunId}/Results/{testResultId}/attachments?api-version=5.1-preview.1") - { - Content = new StringContent( - JsonConvert.SerializeObject( - new JObject - { - ["attachmentType"] = "GeneralAttachment", - ["fileName"] = "UploadFileResults.txt", - ["stream"] = b64Stream, - }), - Encoding.UTF8, - "application/json"), - }; - using (req) - { - using (var res = await client.SendAsync(req)) - { - res.EnsureSuccessStatusCode(); - } - } - }); - } - private async Task CreateFakeTestResultAsync(HttpClient client, string testRunId, string jobName, string workItemFriendlyName, bool failed) { var testResultData = await RetryAsync( From 46ad27d3cc557f2b84ce30b2c4e27438526dc91d Mon Sep 17 00:00:00 2001 From: Chad Nedzlek Date: Fri, 30 Apr 2021 15:56:22 -0700 Subject: [PATCH 047/699] Unescape the XmlEscape method from XUnit (#7323) XUnit applies some custom escaping to this particular field. This code is the closest we can come to correctly reversing it so that it can render normally. It will produce incorrect results if a control character is followed by valid hex digits, but there is no way to avoid that, and it should be relatively rare for raw control characters to appear in error messages. --- .../azure-pipelines/reporter/formats/xunit.py | 26 ++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/src/Microsoft.DotNet.Helix/Sdk/tools/azure-pipelines/reporter/formats/xunit.py b/src/Microsoft.DotNet.Helix/Sdk/tools/azure-pipelines/reporter/formats/xunit.py index d0d3f4025fc..0a5d09da677 100644 --- a/src/Microsoft.DotNet.Helix/Sdk/tools/azure-pipelines/reporter/formats/xunit.py +++ b/src/Microsoft.DotNet.Helix/Sdk/tools/azure-pipelines/reporter/formats/xunit.py @@ -1,7 +1,31 @@ +import re import xml.etree.ElementTree + from .result_format import ResultFormat from defs import TestResult, TestResultAttachment +_unescape_char_map = { + 'r': '\r', + 'n': '\n', + 't': '\t', + '0': '\0', + 'a': '\a', + 'b': '\b', + 'v': '\v', + 'f': '\f', +} + +def _unescape_xunit_message(value): + # xunit does some escaping on the error message we need to do our + # best to turn back into something resembling the original message + # It only uses \x**, \x**** (indistinguishably), and then the items from __unescape_char_map + def bs(match): + grp = match.group(0) + sym = grp[1] + if sym == 'x': + return chr(int(grp[2:], 16)) + return _unescape_char_map.get(match[0][1]) or sym + return re.sub(r'\\x[0-9a-fA-F][0-9a-fA-F][0-9a-fA-F]?[0-9a-fA-F]?|\\[^x]', bs, value) class XUnitFormat(ResultFormat): @@ -38,7 +62,7 @@ def read_results(self, path): exception_type = failure_element.get("exception-type") message_element = failure_element.find("message") if message_element is not None: - failure_message = message_element.text + failure_message = _unescape_xunit_message(message_element.text) stack_trace_element = failure_element.find("stack-trace") if stack_trace_element is not None: stack_trace = stack_trace_element.text From f3dbc5e7289362971ae434f66cd5791065b0857d Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Mon, 3 May 2021 14:55:23 +0000 Subject: [PATCH 048/699] [main] Update dependencies from dotnet/roslyn dotnet/xliff-tasks dotnet/xharness dotnet/arcade mono/linker (#7325) [main] Update dependencies from dotnet/roslyn dotnet/xliff-tasks dotnet/xharness dotnet/arcade mono/linker --- eng/Version.Details.xml | 36 ++++++++++++++++++------------------ eng/Versions.props | 14 +++++++------- global.json | 4 ++-- 3 files changed, 27 insertions(+), 27 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index aa5de6c2887..7a9d9181708 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -11,25 +11,25 @@ - + https://github.com/dotnet/arcade - e1044f09e18638a98a9f0448086a7295f3d16834 + 46ad27d3cc557f2b84ce30b2c4e27438526dc91d - + https://github.com/dotnet/arcade - e1044f09e18638a98a9f0448086a7295f3d16834 + 46ad27d3cc557f2b84ce30b2c4e27438526dc91d - + https://github.com/dotnet/arcade - e1044f09e18638a98a9f0448086a7295f3d16834 + 46ad27d3cc557f2b84ce30b2c4e27438526dc91d - + https://github.com/dotnet/arcade - e1044f09e18638a98a9f0448086a7295f3d16834 + 46ad27d3cc557f2b84ce30b2c4e27438526dc91d - + https://github.com/dotnet/arcade - e1044f09e18638a98a9f0448086a7295f3d16834 + 46ad27d3cc557f2b84ce30b2c4e27438526dc91d https://github.com/dotnet/arcade-services @@ -39,17 +39,17 @@ https://github.com/dotnet/arcade-services cac955fe259cb611f6a29d09209bd717deb69037 - + https://github.com/dotnet/xharness - 5716225d8681204165df5ec713fe5a45a934c28d + d78c6aaaa73bbfad500e06a1aec9385fde5bfc4a - + https://github.com/dotnet/roslyn - 5f00f4d6ffb242a337e21a196aab0593891e430e + 4c32f5e4e9c0828a94fd4d1c9c0994082c85aaf3 - + https://github.com/mono/linker - e48f540b753d2aa5f5d4c22f4bbc41aba130345b + 307f6b0afd2fea639fffa97e67155bafe6aa8461 https://github.com/dotnet/sourcelink @@ -68,9 +68,9 @@ https://github.com/dotnet/symreader-converter c5ba7c88f92e2dde156c324a8c8edc04d9fa4fe0 - + https://github.com/dotnet/xliff-tasks - 37099419d3170cb788fd6bc3de4f7364bc586195 + 59ce967675b3600c2de41443483949d86305de93 diff --git a/eng/Versions.props b/eng/Versions.props index 5847dca551e..e22c071e4f8 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -35,8 +35,8 @@ 2.0.0 2.1.1 2.1.0 - 3.10.0-2.21203.6 - 6.0.100-preview.5.21228.2 + 3.10.0-3.21251.8 + 6.0.100-preview.5.21229.1 16.7.1 4.8.3 5.3.0.1 @@ -66,8 +66,8 @@ 2.4.1 2.0.3 2.4.1 - 6.0.0-beta.21228.3 - 6.0.0-beta.21228.3 + 6.0.0-beta.21230.2 + 6.0.0-beta.21230.2 1.22.0 1.1.2 2.0.0 @@ -80,10 +80,10 @@ 1.1.0-beta.20258.6 1.1.0-beta-21228-01 1.1.0-beta-21228-01 - 6.0.0-beta.21228.3 - 1.0.0-beta.21224.1 + 6.0.0-beta.21230.2 + 1.0.0-beta.21251.1 1.1.0-beta.21228.1 - 1.0.0-prerelease.21226.1 + 1.0.0-prerelease.21230.4 1.1.156402 1.1.152002 6.0.100-preview.3.21175.4 diff --git a/global.json b/global.json index bd5143f420c..b91ca77ca82 100644 --- a/global.json +++ b/global.json @@ -3,7 +3,7 @@ "dotnet": "6.0.100-preview.3.21202.5" }, "msbuild-sdks": { - "Microsoft.DotNet.Arcade.Sdk": "6.0.0-beta.21228.3", - "Microsoft.DotNet.Helix.Sdk": "6.0.0-beta.21228.3" + "Microsoft.DotNet.Arcade.Sdk": "6.0.0-beta.21230.2", + "Microsoft.DotNet.Helix.Sdk": "6.0.0-beta.21230.2" } } From e9fd640e1ec1890489ea66ad0f59e733448056da Mon Sep 17 00:00:00 2001 From: Michelle McDaniel Date: Mon, 3 May 2021 10:19:49 -0700 Subject: [PATCH 049/699] Increase parallelism in sourceline and symbols validation (#7330) These two powershell scripts allowed for 6 parallel jobs. Going up to 16 significantly improves the performance of these jobs in the release pipeline (from 1.5hrs to 1 hr for symbols validation and 4.9hrs to 1.9hrs for sourcelink validation). --- eng/common/post-build/sourcelink-validation.ps1 | 2 +- eng/common/post-build/symbols-validation.ps1 | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/eng/common/post-build/sourcelink-validation.ps1 b/eng/common/post-build/sourcelink-validation.ps1 index 1c46f7b6341..8c554729b61 100644 --- a/eng/common/post-build/sourcelink-validation.ps1 +++ b/eng/common/post-build/sourcelink-validation.ps1 @@ -14,7 +14,7 @@ param( $global:RepoFiles = @{} # Maximum number of jobs to run in parallel -$MaxParallelJobs = 6 +$MaxParallelJobs = 16 # Wait time between check for system load $SecondsBetweenLoadChecks = 10 diff --git a/eng/common/post-build/symbols-validation.ps1 b/eng/common/post-build/symbols-validation.ps1 index e6d5d2fd054..788321d773d 100644 --- a/eng/common/post-build/symbols-validation.ps1 +++ b/eng/common/post-build/symbols-validation.ps1 @@ -8,7 +8,7 @@ param( ) # Maximum number of jobs to run in parallel -$MaxParallelJobs = 6 +$MaxParallelJobs = 16 # Max number of retries $MaxRetry = 5 From a7291d7dde35f707757d2b4e6d91c91885a7e860 Mon Sep 17 00:00:00 2001 From: Alex Perovich Date: Mon, 3 May 2021 11:53:30 -0700 Subject: [PATCH 050/699] Skip the remote executor tests (#7321) --- .../tests/RemoteExecutorTests.cs | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/src/Microsoft.DotNet.RemoteExecutor/tests/RemoteExecutorTests.cs b/src/Microsoft.DotNet.RemoteExecutor/tests/RemoteExecutorTests.cs index d2237d1c2b9..cba294ebbfe 100644 --- a/src/Microsoft.DotNet.RemoteExecutor/tests/RemoteExecutorTests.cs +++ b/src/Microsoft.DotNet.RemoteExecutor/tests/RemoteExecutorTests.cs @@ -1,18 +1,16 @@ // Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. -using Microsoft.DotNet.RemoteExecutor; +using System.Diagnostics; using System.Threading.Tasks; - using Xunit; -using Xunit.Abstractions; using Xunit.Sdk; namespace Microsoft.DotNet.RemoteExecutor.Tests { public class RemoteExecutorTests { - [Fact] + [Fact(Skip = "Remote executor is broken in VS test explorer")] public void AsyncAction_ThrowException() { Assert.Throws(() => @@ -24,7 +22,7 @@ public void AsyncAction_ThrowException() ); } - [Fact] + [Fact(Skip = "Remote executor is broken in VS test explorer")] public void AsyncAction() { RemoteExecutor.Invoke(async () => @@ -33,7 +31,7 @@ public void AsyncAction() }, new RemoteInvokeOptions { RollForward = "Major" }).Dispose(); } - [Fact] + [Fact(Skip = "Remote executor is broken in VS test explorer")] public void AsyncFunc_ThrowException() { Assert.Throws(() => @@ -46,7 +44,7 @@ public void AsyncFunc_ThrowException() ); } - [Fact] + [Fact(Skip = "Remote executor is broken in VS test explorer")] public void AsyncFunc_InvalidReturnCode() { Assert.Throws(() => @@ -58,7 +56,7 @@ public void AsyncFunc_InvalidReturnCode() ); } - [Fact] + [Fact(Skip = "Remote executor is broken in VS test explorer")] public void AsyncFunc_NoThrow_ValidReturnCode() { RemoteExecutor.Invoke(async () => From 60da6418083a4109443890472eb9e20ed65598c6 Mon Sep 17 00:00:00 2001 From: Levi Broderick Date: Mon, 3 May 2021 11:59:06 -0700 Subject: [PATCH 051/699] Add property & event support to NotSupportedAssemblyGenerator (#7320) --- .../NotSupportedAssemblyGenerator.cs | 22 ++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/src/Microsoft.DotNet.GenFacades/NotSupportedAssemblyGenerator.cs b/src/Microsoft.DotNet.GenFacades/NotSupportedAssemblyGenerator.cs index a79c72099b9..ed8a9a24bef 100644 --- a/src/Microsoft.DotNet.GenFacades/NotSupportedAssemblyGenerator.cs +++ b/src/Microsoft.DotNet.GenFacades/NotSupportedAssemblyGenerator.cs @@ -127,6 +127,22 @@ public override SyntaxNode VisitMethodDeclaration(MethodDeclarationSyntax node) return node.WithBody(block); } + public override SyntaxNode VisitPropertyDeclaration(PropertyDeclarationSyntax node) + { + if (_exclusionApis != null && _exclusionApis.Contains(GetPropertyDefinition(node))) + return null; + + return base.VisitPropertyDeclaration(node); + } + + public override SyntaxNode VisitEventDeclaration(EventDeclarationSyntax node) + { + if (_exclusionApis != null && _exclusionApis.Contains(GetEventDefinition(node))) + return null; + + return base.VisitEventDeclaration(node); + } + public override SyntaxNode VisitClassDeclaration(ClassDeclarationSyntax node) { if (_exclusionApis != null && _exclusionApis.Contains(GetFullyQualifiedName(node))) @@ -194,7 +210,11 @@ private string GetFullyQualifiedName(TypeDeclarationSyntax node) private string GetFullyQualifiedName(NamespaceDeclarationSyntax node) => node.Name.ToFullString().Trim(); private string GetMethodDefinition(MethodDeclarationSyntax node) => GetFullyQualifiedName((TypeDeclarationSyntax)node.Parent) + "." + node.Identifier.ValueText; - + + private string GetPropertyDefinition(PropertyDeclarationSyntax node) => GetFullyQualifiedName((TypeDeclarationSyntax)node.Parent) + "." + node.Identifier.ValueText; + + private string GetEventDefinition(EventDeclarationSyntax node) => GetFullyQualifiedName((TypeDeclarationSyntax)node.Parent) + "." + node.Identifier.ValueText; + private string GetDefaultMessage() => "{ throw new System.PlatformNotSupportedException(" + $"{ _message }); " + " }\n"; } } From 4bf515fa2c384e1c3d042e05909a569e5dee1a06 Mon Sep 17 00:00:00 2001 From: Jon Fortescue Date: Mon, 3 May 2021 13:07:53 -0700 Subject: [PATCH 052/699] Add option for LF line endings to OneLocBuild task (#7334) --- Documentation/OneLocBuild.md | 1 + eng/common/templates/job/onelocbuild.yml | 2 ++ 2 files changed, 3 insertions(+) diff --git a/Documentation/OneLocBuild.md b/Documentation/OneLocBuild.md index 8b9b2f0247d..50cfc2845db 100644 --- a/Documentation/OneLocBuild.md +++ b/Documentation/OneLocBuild.md @@ -74,6 +74,7 @@ The parameters that can be passed to the template are as follows: | `SourcesDirectory` | `$(Build.SourcesDirectory)` | This is the root directory for your repository source code. | | `CreatePr` | `true` | When set to `true`, instructs the OneLocBuild task to make a PR back to the source repository containing the localized files. | | `AutoCompletePr` | `false` | When set to `true`, instructs the OneLocBuild task to autocomplete the created PR. Requires permissions to bypass any checks on the main branch. | +| `UseLfLineEndings` | `true` | When set to `true`, instructs the OneLocBuild task to use LF line endings during check-in rather than CRLF. | | `UseCheckedInLocProjectJson` | `false` | When set to `true`, instructs the LocProject.json generation script to use build-time validation rather than build-time generation, as described above. | | `LanguageSet` | `VS_Main_Languages` | This defines the `LanguageSet` of the LocProject.json as described in the [OneLocBuild task documentation](https://ceapex.visualstudio.com/CEINTL/_wiki/wikis/CEINTL.wiki/107/Localization-with-OneLocBuild-Task?anchor=languageset%2C-languages-(required)). | | `LclSource` | `LclFilesInRepo` | This passes the `LclSource` input to the OneLocBuild task as described in [its documentation](https://ceapex.visualstudio.com/CEINTL/_wiki/wikis/CEINTL.wiki/107/Localization-with-OneLocBuild-Task?anchor=languageset%2C-languages-(required)). For most repos, this should be set to `LclFilesfromPackage`. | diff --git a/eng/common/templates/job/onelocbuild.yml b/eng/common/templates/job/onelocbuild.yml index b27d6faf303..958db4064cf 100644 --- a/eng/common/templates/job/onelocbuild.yml +++ b/eng/common/templates/job/onelocbuild.yml @@ -12,6 +12,7 @@ parameters: SourcesDirectory: $(Build.SourcesDirectory) CreatePr: true AutoCompletePr: false + UseLfLineEndings: true UseCheckedInLocProjectJson: false LanguageSet: VS_Main_Languages LclSource: lclFilesInRepo @@ -59,6 +60,7 @@ jobs: isCreatePrSelected: ${{ parameters.CreatePr }} ${{ if eq(parameters.CreatePr, true) }}: isAutoCompletePrSelected: ${{ parameters.AutoCompletePr }} + isUseLfLineEndingsSelected: ${{ parameters.UseLfLineEndings }} packageSourceAuth: patAuth patVariable: ${{ parameters.CeapexPat }} ${{ if eq(parameters.RepoType, 'gitHub') }}: From 9cb437fc1c37ffe03bc4597acb6604ff80501f90 Mon Sep 17 00:00:00 2001 From: Epsitha Ananth <47157394+epananth@users.noreply.github.com> Date: Mon, 3 May 2021 14:11:13 -0700 Subject: [PATCH 053/699] Add parallelism to publishing (#7317) Add parallelism to streaming publishing. The maximal parallelism is 20 for all publishing tasks (symbols, blobs, and packages). Non-streaming publishing remains unchanged. This reduces publishing time by > 50% in many cases. --- .../PublishToSymbolServerTest.cs | 2 +- .../src/PublishArtifactsInManifest.cs | 7 - .../src/PublishArtifactsInManifestBase.cs | 396 ++++++++++-------- .../src/PublishArtifactsInManifestV3.cs | 28 +- 4 files changed, 249 insertions(+), 184 deletions(-) diff --git a/src/Microsoft.DotNet.Build.Tasks.Feed.Tests/PublishToSymbolServerTest.cs b/src/Microsoft.DotNet.Build.Tasks.Feed.Tests/PublishToSymbolServerTest.cs index 926fa188d10..4b2784921bb 100644 --- a/src/Microsoft.DotNet.Build.Tasks.Feed.Tests/PublishToSymbolServerTest.cs +++ b/src/Microsoft.DotNet.Build.Tasks.Feed.Tests/PublishToSymbolServerTest.cs @@ -86,7 +86,7 @@ public void TemporarySymbolDirectoryDoesNotExists() }; var path = TestInputs.GetFullPath("Symbol"); var buildAsset = new Dictionary>(); - var publish = task.HandleSymbolPublishingAsync(path, MsdlToken, SymWebToken, "", false, buildAsset, path); + var publish = task.HandleSymbolPublishingAsync(path, MsdlToken, SymWebToken, "", false, buildAsset, null, path); Assert.True(task.Log.HasLoggedErrors); } diff --git a/src/Microsoft.DotNet.Build.Tasks.Feed/src/PublishArtifactsInManifest.cs b/src/Microsoft.DotNet.Build.Tasks.Feed/src/PublishArtifactsInManifest.cs index 0f5be881c36..ee706c1efc0 100644 --- a/src/Microsoft.DotNet.Build.Tasks.Feed/src/PublishArtifactsInManifest.cs +++ b/src/Microsoft.DotNet.Build.Tasks.Feed/src/PublishArtifactsInManifest.cs @@ -91,11 +91,6 @@ public class PublishArtifactsInManifest : MSBuildTaskBase [Required] public string BuildAssetRegistryToken { get; set; } - /// - /// Maximum number of parallel uploads for the upload tasks - /// - public int MaxClients { get; set; } = 16; - /// /// Directory where "nuget.exe" is installed. This will be used to publish packages. /// @@ -331,7 +326,6 @@ internal PublishArtifactsInManifestBase ConstructPublishingV2Task(BuildModel bui BARBuildId = this.BARBuildId, MaestroApiEndpoint = this.MaestroApiEndpoint, BuildAssetRegistryToken = this.BuildAssetRegistryToken, - MaxClients = this.MaxClients, NugetPath = this.NugetPath, InternalBuild = this.InternalBuild, SkipSafetyChecks = this.SkipSafetyChecks, @@ -359,7 +353,6 @@ internal PublishArtifactsInManifestBase ConstructPublishingV3Task(BuildModel bui BARBuildId = this.BARBuildId, MaestroApiEndpoint = this.MaestroApiEndpoint, BuildAssetRegistryToken = this.BuildAssetRegistryToken, - MaxClients = this.MaxClients, NugetPath = this.NugetPath, InternalBuild = this.InternalBuild, SkipSafetyChecks = this.SkipSafetyChecks, diff --git a/src/Microsoft.DotNet.Build.Tasks.Feed/src/PublishArtifactsInManifestBase.cs b/src/Microsoft.DotNet.Build.Tasks.Feed/src/PublishArtifactsInManifestBase.cs index 8991ca8b081..c1c17f0c057 100644 --- a/src/Microsoft.DotNet.Build.Tasks.Feed/src/PublishArtifactsInManifestBase.cs +++ b/src/Microsoft.DotNet.Build.Tasks.Feed/src/PublishArtifactsInManifestBase.cs @@ -69,10 +69,15 @@ public abstract class PublishArtifactsInManifestBase : Microsoft.Build.Utilities [Required] public string NugetPath { get; set; } + private const int StreamingPublishingMaxClients = 20; + private const int NonStreamingPublishingMaxClients = 16; + /// - /// Maximum number of parallel uploads for the upload tasks + /// Maximum number of parallel uploads for the upload tasks. + /// For streaming publishing, 20 is used as the most optimal. + /// For non-streaming publishing, 16 is used (there are multiple sets of 16-parallel uploads) /// - public int MaxClients { get; set; } = 16; + public int MaxClients { get { return UseStreamingPublishing ? StreamingPublishingMaxClients : NonStreamingPublishingMaxClients; } } /// /// Whether this build is internal or not. If true, extra checks are done to avoid accidental @@ -373,6 +378,7 @@ public void CheckForStableAssetsInNonIsolatedFeeds() /// Token to authenticate symweb /// Right now we do not add any files to this, so this is going to be null /// If true, the special coreclr module indexed files like DBI, DAC and SOS are published + /// To avoid starting too many processes /// Task public async Task PublishSymbolsUsingStreamingAsync( string pdbArtifactsBasePath, @@ -380,7 +386,8 @@ public async Task PublishSymbolsUsingStreamingAsync( string symWebToken, string symbolPublishingExclusionsFile, bool publishSpecialClrFiles, - Dictionary> buildAssets) + Dictionary> buildAssets, + SemaphoreSlim clientThrottle) { StringBuilder symbolLog = new StringBuilder(); symbolLog.AppendLine("Publishing Symbols to Symbol server: "); @@ -411,49 +418,62 @@ public async Task PublishSymbolsUsingStreamingAsync( { using (HttpClient client = CreateAzdoClient(AzureDevOpsOrg, true)) { - foreach (var symbol in symbolsToPublish) + await Task.WhenAll(symbolsToPublish.Select(async symbol => { - string temporarySymbolsDirectory = CreateTemporaryDirectory(); - string localSymbolPath = Path.Combine(temporarySymbolsDirectory, symbol); - symbolLog.AppendLine($"Downloading symbol : {symbol} to {localSymbolPath}"); - - await DownloadFileAsync(client, ArtifactName.BlobArtifacts, containerId, symbol, localSymbolPath); - symbolLog.AppendLine($"Successfully downloaded symbol : {symbol} to {localSymbolPath}"); - List symbolFiles = new List(); - symbolFiles.Add(localSymbolPath); - symbolLog.AppendLine($"Uploading symbol file '{string.Join(",", symbolFiles)}'"); - - foreach (var server in serversToPublish) + try { - var serverPath = server.Key; - var token = server.Value; - symbolLog.AppendLine($"Publishing symbol file {symbol} to {serverPath}:"); - - try + await clientThrottle.WaitAsync(); + string temporarySymbolsDirectory = CreateTemporaryDirectory(); + string localSymbolPath = Path.Combine(temporarySymbolsDirectory, symbol); + symbolLog.AppendLine($"Downloading symbol : {symbol} to {localSymbolPath}"); + + await DownloadFileAsync( + client, + ArtifactName.BlobArtifacts, + containerId, + symbol, + localSymbolPath); + symbolLog.AppendLine($"Successfully downloaded symbol : {symbol} to {localSymbolPath}"); + List symbolFiles = new List(); + symbolFiles.Add(localSymbolPath); + symbolLog.AppendLine($"Uploading symbol file '{string.Join(",", symbolFiles)}'"); + + foreach (var server in serversToPublish) { - await PublishSymbolsHelper.PublishAsync( - Log, - serverPath, - token, - symbolFiles, - null, - null, - ExpirationInDays, - false, - publishSpecialClrFiles, - null, - false, - false, - true); + var serverPath = server.Key; + var token = server.Value; + symbolLog.AppendLine($"Publishing symbol file {symbol} to {serverPath}:"); + + try + { + await PublishSymbolsHelper.PublishAsync( + Log, + serverPath, + token, + symbolFiles, + null, + null, + ExpirationInDays, + false, + publishSpecialClrFiles, + null, + false, + false, + true); + } + catch (Exception ex) + { + Log.LogError(ex.Message); + } } - catch (Exception ex) - { - Log.LogError(ex.Message); - } - } - DeleteTemporaryDirectory(temporarySymbolsDirectory); - } + DeleteTemporaryDirectory(temporarySymbolsDirectory); + } + finally + { + clientThrottle.Release(); + } + })); symbolLog.AppendLine( $"Performing symbol publishing... \nExpirationInDays : {ExpirationInDays} \nConvertPortablePdbsToWindowsPdb : false \ndryRun: false "); @@ -532,6 +552,7 @@ await PublishSymbolsHelper.PublishAsync( /// Token to authenticate symweb /// Right now we do not add any files to this, so this is going to be null /// Path to Symbol.nupkgs + /// To avoid starting too many processes /// If true, the special coreclr module indexed files like DBI, DAC and SOS are published public async Task HandleSymbolPublishingAsync ( string pdbArtifactsBasePath, @@ -540,6 +561,7 @@ public async Task HandleSymbolPublishingAsync ( string symbolPublishingExclusionsFile, bool publishSpecialClrFiles, Dictionary> buildAssets, + SemaphoreSlim clientThrottle = null, string temporarySymbolsLocation = null) { if (UseStreamingPublishing) @@ -550,7 +572,8 @@ await PublishSymbolsUsingStreamingAsync( symWebToken, symbolPublishingExclusionsFile, publishSpecialClrFiles, - buildAssets); + buildAssets, + clientThrottle); } else { @@ -677,8 +700,9 @@ public Dictionary GetTargetSymbolServers(HashSet /// Maestro API client /// Assets information about build being published. + /// To avoid starting too many processes /// Task - protected async Task HandlePackagePublishingAsync(Dictionary> buildAssets) + protected async Task HandlePackagePublishingAsync(Dictionary> buildAssets, SemaphoreSlim clientThrottle =null) { List publishTasks = new List(); @@ -712,7 +736,8 @@ protected async Task HandlePackagePublishingAsync(Dictionary> buildAssets) + protected async Task HandleBlobPublishingAsync(Dictionary> buildAssets, SemaphoreSlim clientThrottle= null) { List publishTasks = new List(); @@ -947,14 +972,16 @@ protected async Task HandleBlobPublishingAsync(Dictionary PublishBlobsToAzDoNugetFeedAsync( filteredBlobs, buildAssets, - feedConfig)); + feedConfig, + clientThrottle)); break; case FeedType.AzureStorageFeed: publishTasks.Add( PublishBlobsToAzureStorageNugetFeedAsync( filteredBlobs, buildAssets, - feedConfig)); + feedConfig, + clientThrottle)); break; default: Log.LogError( @@ -1096,7 +1123,8 @@ await PushNugetPackageAsync( private async Task PublishPackagesUsingStreamingToAzdoNugetAsync( HashSet packagesToPublish, Dictionary> buildAssets, - TargetFeedConfig feedConfig) + TargetFeedConfig feedConfig, + SemaphoreSlim clientThrottle) { string containerId = await GetContainerIdAsync(ArtifactName.PackageArtifacts); @@ -1107,62 +1135,74 @@ private async Task PublishPackagesUsingStreamingToAzdoNugetAsync( using HttpClient client = CreateAzdoClient(AzureDevOpsOrg, true); - foreach (var package in packagesToPublish) + await Task.WhenAll(packagesToPublish.Select(async package => { - var packageFilename = $"{package.Id}.{package.Version}.nupkg"; - string temporaryPackageDirectory = - Path.GetFullPath(Path.Combine(ArtifactsBasePath, Guid.NewGuid().ToString())); - EnsureTemporaryDirectoryExists(temporaryPackageDirectory); - string localPackagePath = Path.Combine(temporaryPackageDirectory, packageFilename); - Log.LogMessage(MessageImportance.Low, $"Downloading package : {packageFilename} to {localPackagePath}"); + try + { + await clientThrottle.WaitAsync(); + var packageFilename = $"{package.Id}.{package.Version}.nupkg"; + string temporaryPackageDirectory = + Path.GetFullPath(Path.Combine(ArtifactsBasePath, Guid.NewGuid().ToString())); + EnsureTemporaryDirectoryExists(temporaryPackageDirectory); + string localPackagePath = Path.Combine(temporaryPackageDirectory, packageFilename); + Log.LogMessage(MessageImportance.Low, + $"Downloading package : {packageFilename} to {localPackagePath}"); - await DownloadFileAsync( - client, - ArtifactName.PackageArtifacts, - containerId, - packageFilename, - localPackagePath); + await DownloadFileAsync( + client, + ArtifactName.PackageArtifacts, + containerId, + packageFilename, + localPackagePath); - if (!File.Exists(localPackagePath)) - { - Log.LogError( - $"Could not locate '{package.Id}.{package.Version}' at '{localPackagePath}'"); - return; - } - Log.LogMessage(MessageImportance.Low, $"Successfully downloaded package : {packageFilename} to {localPackagePath}"); + if (!File.Exists(localPackagePath)) + { + Log.LogError( + $"Could not locate '{package.Id}.{package.Version}' at '{localPackagePath}'"); + return; + } - TryAddAssetLocation( - package.Id, - package.Version, - buildAssets, - feedConfig, - AddAssetLocationToAssetAssetLocationType.NugetFeed); + Log.LogMessage(MessageImportance.Low, + $"Successfully downloaded package : {packageFilename} to {localPackagePath}"); - using HttpClient httpClient = new HttpClient(new HttpClientHandler - { - CheckCertificateRevocationList = true - }); + TryAddAssetLocation( + package.Id, + package.Version, + buildAssets, + feedConfig, + AddAssetLocationToAssetAssetLocationType.NugetFeed); - httpClient.Timeout = TimeSpan.FromSeconds(TimeoutInSeconds); - httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue( - "Basic", - Convert.ToBase64String( - Encoding.ASCII.GetBytes(string.Format("{0}:{1}", "", feedConfig.Token)))); + using HttpClient httpClient = new HttpClient(new HttpClientHandler + { + CheckCertificateRevocationList = true + }); - await PushPackageToNugetFeed(httpClient, feedConfig, localPackagePath, package.Id, package.Version); + httpClient.Timeout = TimeSpan.FromSeconds(TimeoutInSeconds); + httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue( + "Basic", + Convert.ToBase64String( + Encoding.ASCII.GetBytes(string.Format("{0}:{1}", "", feedConfig.Token)))); - DeleteTemporaryDirectory(localPackagePath); - } + await PushPackageToNugetFeed(httpClient, feedConfig, localPackagePath, package.Id, package.Version); + + DeleteTemporaryDirectory(localPackagePath); + } + finally + { + clientThrottle.Release(); + } + })); } private async Task PublishPackagesToAzDoNugetFeedAsync( HashSet packagesToPublish, Dictionary> buildAssets, - TargetFeedConfig feedConfig) + TargetFeedConfig feedConfig, + SemaphoreSlim clientThrottle) { if (UseStreamingPublishing) { - await PublishPackagesUsingStreamingToAzdoNugetAsync(packagesToPublish, buildAssets, feedConfig); + await PublishPackagesUsingStreamingToAzdoNugetAsync(packagesToPublish, buildAssets, feedConfig, clientThrottle); } else { @@ -1350,7 +1390,8 @@ public async Task PushNugetPackageAsync( private async Task PublishBlobsToAzDoNugetFeedAsync( HashSet blobsToPublish, Dictionary> buildAssets, - TargetFeedConfig feedConfig) + TargetFeedConfig feedConfig, + SemaphoreSlim clientThrottle) { HashSet packagesToPublish = new HashSet(); @@ -1370,7 +1411,7 @@ private async Task PublishBlobsToAzDoNugetFeedAsync( if (UseStreamingPublishing) { - await PublishBlobsUsingStreamingToAzDoNugetAsync(packagesToPublish, buildAssets, feedConfig); + await PublishBlobsUsingStreamingToAzDoNugetAsync(packagesToPublish, buildAssets, feedConfig, clientThrottle); } else { @@ -1431,7 +1472,8 @@ await PushNugetPackageAsync( private async Task PublishBlobsUsingStreamingToAzDoNugetAsync( HashSet blobsToPublish, Dictionary> buildAssets, - TargetFeedConfig feedConfig) + TargetFeedConfig feedConfig, + SemaphoreSlim clientThrottle) { string containerId = await GetContainerIdAsync(ArtifactName.BlobArtifacts); @@ -1440,52 +1482,62 @@ private async Task PublishBlobsUsingStreamingToAzDoNugetAsync( return; } using HttpClient client = CreateAzdoClient(AzureDevOpsOrg, true, AzureProject); - - foreach (var blob in blobsToPublish) + + await Task.WhenAll(blobsToPublish.Select(async blob => { - if (TryAddAssetLocation( - blob.Id, - assetVersion: null, - buildAssets, - feedConfig, - AddAssetLocationToAssetAssetLocationType.Container)) + try { - string temporaryBlobDirectory = CreateTemporaryDirectory(); - string fileName = Path.GetFileName(blob.Id); - string localBlobPath = Path.Combine(temporaryBlobDirectory, fileName); - Log.LogMessage(MessageImportance.Low, $"Downloading blob : {fileName} to {localBlobPath}"); - - await DownloadFileAsync( - client, - ArtifactName.BlobArtifacts, - containerId, - fileName, - localBlobPath); - - if (!File.Exists(localBlobPath)) + await clientThrottle.WaitAsync(); + if (TryAddAssetLocation( + blob.Id, + assetVersion: null, + buildAssets, + feedConfig, + AddAssetLocationToAssetAssetLocationType.Container)) { - Log.LogError($"Could not locate '{blob.Id} at '{localBlobPath}'"); - } - Log.LogMessage(MessageImportance.Low, $"Successfully downloaded blob : {fileName} to {localBlobPath}"); + string temporaryBlobDirectory = CreateTemporaryDirectory(); + string fileName = Path.GetFileName(blob.Id); + string localBlobPath = Path.Combine(temporaryBlobDirectory, fileName); + Log.LogMessage(MessageImportance.Low, $"Downloading blob : {fileName} to {localBlobPath}"); - string id; - string version; - using (var packageReader = new PackageArchiveReader(localBlobPath)) - { - PackageIdentity packageIdentity = packageReader.GetIdentity(); - id = packageIdentity.Id; - version = packageIdentity.Version.ToString(); - } + await DownloadFileAsync( + client, + ArtifactName.BlobArtifacts, + containerId, + fileName, + localBlobPath); - await PushBlobToNugetFeed( - feedConfig, - localBlobPath, - id, - version); - - DeleteTemporaryDirectory(temporaryBlobDirectory); + if (!File.Exists(localBlobPath)) + { + Log.LogError($"Could not locate '{blob.Id} at '{localBlobPath}'"); + } + + Log.LogMessage(MessageImportance.Low, + $"Successfully downloaded blob : {fileName} to {localBlobPath}"); + + string id; + string version; + using (var packageReader = new PackageArchiveReader(localBlobPath)) + { + PackageIdentity packageIdentity = packageReader.GetIdentity(); + id = packageIdentity.Id; + version = packageIdentity.Version.ToString(); + } + + await PushBlobToNugetFeed( + feedConfig, + localBlobPath, + id, + version); + + DeleteTemporaryDirectory(temporaryBlobDirectory); + } } - } + finally + { + clientThrottle.Release(); + } + })); } private async Task PushBlobToNugetFeed(TargetFeedConfig feedConfig, string localBlobPath, string id, @@ -1543,11 +1595,12 @@ public string CreateTemporaryDirectory() private async Task PublishBlobsToAzureStorageNugetFeedAsync( HashSet blobsToPublish, Dictionary> buildAssets, - TargetFeedConfig feedConfig) + TargetFeedConfig feedConfig, + SemaphoreSlim clientThrottle) { if (UseStreamingPublishing) { - await PublishBlobsToAzureStorageNugetUsingStreamingPublishingAsync(blobsToPublish, buildAssets, feedConfig); + await PublishBlobsToAzureStorageNugetUsingStreamingPublishingAsync(blobsToPublish, buildAssets, feedConfig, clientThrottle); } else { @@ -1576,7 +1629,8 @@ await LinkManager.CreateOrUpdateLatestLinksAsync( private async Task PublishBlobsToAzureStorageNugetUsingStreamingPublishingAsync( HashSet blobsToPublish, Dictionary> buildAssets, - TargetFeedConfig feedConfig) + TargetFeedConfig feedConfig, + SemaphoreSlim clientThrottle) { string containerId = await GetContainerIdAsync(ArtifactName.BlobArtifacts); @@ -1592,42 +1646,52 @@ private async Task PublishBlobsToAzureStorageNugetUsingStreamingPublishingAsync( }; using HttpClient client = CreateAzdoClient(AzureDevOpsOrg, true, AzureProject); - foreach (var blob in blobsToPublish) + await Task.WhenAll(blobsToPublish.Select(async blob => { - string temporaryBlobDirectory = CreateTemporaryDirectory(); - var fileName = Path.GetFileName(blob.Id); - var localBlobPath = Path.Combine(temporaryBlobDirectory, fileName); - Log.LogMessage(MessageImportance.Low, $"Downloading blob : {fileName} to {localBlobPath}"); - - await DownloadFileAsync( - client, - ArtifactName.BlobArtifacts, - containerId, - fileName, - localBlobPath); - - if (!File.Exists(localBlobPath)) + try { - Log.LogError($"Could not locate '{blob.Id} at '{localBlobPath}'"); - } - Log.LogMessage(MessageImportance.Low, $"Successfully downloaded blob : {fileName} to {localBlobPath}"); + await clientThrottle.WaitAsync(); + string temporaryBlobDirectory = CreateTemporaryDirectory(); + var fileName = Path.GetFileName(blob.Id); + var localBlobPath = Path.Combine(temporaryBlobDirectory, fileName); + Log.LogMessage(MessageImportance.Low, $"Downloading blob : {fileName} to {localBlobPath}"); - var item = new Microsoft.Build.Utilities.TaskItem(localBlobPath, - new Dictionary + await DownloadFileAsync( + client, + ArtifactName.BlobArtifacts, + containerId, + fileName, + localBlobPath); + + if (!File.Exists(localBlobPath)) { - {"RelativeBlobPath", blob.Id} - }); - - TryAddAssetLocation( - blob.Id, - assetVersion: null, - buildAssets, - feedConfig, - AddAssetLocationToAssetAssetLocationType.Container); - - await blobFeedAction.UploadAssetAsync(item, pushOptions, null); - DeleteTemporaryDirectory(temporaryBlobDirectory); - } + Log.LogError($"Could not locate '{blob.Id} at '{localBlobPath}'"); + } + + Log.LogMessage(MessageImportance.Low, + $"Successfully downloaded blob : {fileName} to {localBlobPath}"); + + var item = new Microsoft.Build.Utilities.TaskItem(localBlobPath, + new Dictionary + { + {"RelativeBlobPath", blob.Id} + }); + + TryAddAssetLocation( + blob.Id, + assetVersion: null, + buildAssets, + feedConfig, + AddAssetLocationToAssetAssetLocationType.Container); + + await blobFeedAction.UploadAssetAsync(item, pushOptions, null); + DeleteTemporaryDirectory(temporaryBlobDirectory); + } + finally + { + clientThrottle.Release(); + } + })); } private async Task PublishBlobsToAzureStorageNugetAsync( diff --git a/src/Microsoft.DotNet.Build.Tasks.Feed/src/PublishArtifactsInManifestV3.cs b/src/Microsoft.DotNet.Build.Tasks.Feed/src/PublishArtifactsInManifestV3.cs index 4228c42d701..2320ba8a1d0 100644 --- a/src/Microsoft.DotNet.Build.Tasks.Feed/src/PublishArtifactsInManifestV3.cs +++ b/src/Microsoft.DotNet.Build.Tasks.Feed/src/PublishArtifactsInManifestV3.cs @@ -5,6 +5,7 @@ using System.Collections.Generic; using System.IO; using System.Linq; +using System.Threading; using System.Threading.Tasks; using Microsoft.Build.Framework; using Microsoft.DotNet.Build.Tasks.Feed.Model; @@ -85,7 +86,8 @@ public override async Task ExecuteAsync() { if (!int.TryParse(channelIdStr, out var channelId)) { - Log.LogError($"Value '{channelIdStr}' isn't recognized as a valid Maestro++ channel ID. To add a channel refer to https://github.com/dotnet/arcade/blob/master/Documentation/CorePackages/Publishing.md#how-to-add-a-new-channel-to-use-v3-publishing."); + Log.LogError( + $"Value '{channelIdStr}' isn't recognized as a valid Maestro++ channel ID. To add a channel refer to https://github.com/dotnet/arcade/blob/master/Documentation/CorePackages/Publishing.md#how-to-add-a-new-channel-to-use-v3-publishing."); continue; } @@ -94,7 +96,8 @@ public override async Task ExecuteAsync() if (Log.HasLoggedErrors) { - Log.LogError($"Could not parse the target channels list '{TargetChannels}'. It should be a comma separated list of integers."); + Log.LogError( + $"Could not parse the target channels list '{TargetChannels}'. It should be a comma separated list of integers."); return false; } @@ -135,8 +138,9 @@ public override async Task ExecuteAsync() Log.LogMessage(MessageImportance.High, $"Publishing to this target channel: {targetChannelConfig}"); - string shortLinkUrl = string.IsNullOrEmpty(targetChannelConfig.AkaMSChannelName) ? - $"dotnet/" : $"dotnet/{targetChannelConfig.AkaMSChannelName}/{BuildQuality}"; + string shortLinkUrl = string.IsNullOrEmpty(targetChannelConfig.AkaMSChannelName) + ? $"dotnet/" + : $"dotnet/{targetChannelConfig.AkaMSChannelName}/{BuildQuality}"; var targetFeedsSetup = new SetupTargetFeedConfigV3( targetChannelConfig.IsInternal, @@ -146,9 +150,9 @@ public override async Task ExecuteAsync() AzureStorageTargetFeedKey, PublishInstallersAndChecksums, GetFeed(targetChannelConfig.InstallersFeed, InstallersFeedOverride), - targetChannelConfig.IsInternal? InternalInstallersFeedKey : InstallersFeedKey, + targetChannelConfig.IsInternal ? InternalInstallersFeedKey : InstallersFeedKey, GetFeed(targetChannelConfig.ChecksumsFeed, ChecksumsFeedOverride), - targetChannelConfig.IsInternal? InternalCheckSumsFeedKey : CheckSumsFeedKey, + targetChannelConfig.IsInternal ? InternalCheckSumsFeedKey : CheckSumsFeedKey, GetFeed(targetChannelConfig.ShippingFeed, ShippingFeedOverride), GetFeed(targetChannelConfig.TransportFeed, TransportFeedOverride), GetFeed(targetChannelConfig.SymbolsFeed, SymbolsFeedOverride), @@ -203,9 +207,12 @@ public override async Task ExecuteAsync() CopySymbolFilesToTemporaryLocation(BuildModel, temporarySymbolsLocation); } - await Task.WhenAll(new Task[] { - HandlePackagePublishingAsync(buildAssets), - HandleBlobPublishingAsync(buildAssets), + using var clientThrottle = new SemaphoreSlim(MaxClients, MaxClients); + + await Task.WhenAll(new Task[] + { + HandlePackagePublishingAsync(buildAssets, clientThrottle), + HandleBlobPublishingAsync(buildAssets, clientThrottle), HandleSymbolPublishingAsync( PdbArtifactsBasePath, MsdlToken, @@ -213,12 +220,13 @@ await Task.WhenAll(new Task[] { SymbolPublishingExclusionsFile, PublishSpecialClrFiles, buildAssets, + clientThrottle, temporarySymbolsLocation) }); DeleteTemporaryFiles(temporarySymbolsLocation); DeleteTemporaryDirectory(temporarySymbolsLocation); - + await PersistPendingAssetLocationAsync(client); } catch (Exception e) From c2b964f7ff3ad9460c7762c05121b01ee627a723 Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Tue, 4 May 2021 00:04:05 +0000 Subject: [PATCH 054/699] Update dependencies from https://github.com/dotnet/arcade build 20210503.2 (#7337) [main] Update dependencies from dotnet/arcade --- eng/Version.Details.xml | 20 ++++++++++---------- eng/Versions.props | 6 +++--- global.json | 4 ++-- 3 files changed, 15 insertions(+), 15 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index 7a9d9181708..5906d045d03 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -11,25 +11,25 @@ - + https://github.com/dotnet/arcade - 46ad27d3cc557f2b84ce30b2c4e27438526dc91d + e9fd640e1ec1890489ea66ad0f59e733448056da - + https://github.com/dotnet/arcade - 46ad27d3cc557f2b84ce30b2c4e27438526dc91d + e9fd640e1ec1890489ea66ad0f59e733448056da - + https://github.com/dotnet/arcade - 46ad27d3cc557f2b84ce30b2c4e27438526dc91d + e9fd640e1ec1890489ea66ad0f59e733448056da - + https://github.com/dotnet/arcade - 46ad27d3cc557f2b84ce30b2c4e27438526dc91d + e9fd640e1ec1890489ea66ad0f59e733448056da - + https://github.com/dotnet/arcade - 46ad27d3cc557f2b84ce30b2c4e27438526dc91d + e9fd640e1ec1890489ea66ad0f59e733448056da https://github.com/dotnet/arcade-services diff --git a/eng/Versions.props b/eng/Versions.props index e22c071e4f8..2cb7b837e97 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -66,8 +66,8 @@ 2.4.1 2.0.3 2.4.1 - 6.0.0-beta.21230.2 - 6.0.0-beta.21230.2 + 6.0.0-beta.21253.2 + 6.0.0-beta.21253.2 1.22.0 1.1.2 2.0.0 @@ -80,7 +80,7 @@ 1.1.0-beta.20258.6 1.1.0-beta-21228-01 1.1.0-beta-21228-01 - 6.0.0-beta.21230.2 + 6.0.0-beta.21253.2 1.0.0-beta.21251.1 1.1.0-beta.21228.1 1.0.0-prerelease.21230.4 diff --git a/global.json b/global.json index b91ca77ca82..affca35fa7b 100644 --- a/global.json +++ b/global.json @@ -3,7 +3,7 @@ "dotnet": "6.0.100-preview.3.21202.5" }, "msbuild-sdks": { - "Microsoft.DotNet.Arcade.Sdk": "6.0.0-beta.21230.2", - "Microsoft.DotNet.Helix.Sdk": "6.0.0-beta.21230.2" + "Microsoft.DotNet.Arcade.Sdk": "6.0.0-beta.21253.2", + "Microsoft.DotNet.Helix.Sdk": "6.0.0-beta.21253.2" } } From 3d7a9cd1843a745d6cf823e7a49f76088ac2f51f Mon Sep 17 00:00:00 2001 From: Michael Sharp <51342856+michaelgsharp@users.noreply.github.com> Date: Tue, 4 May 2021 09:43:58 -0700 Subject: [PATCH 055/699] Adding in cross dependencies for ML.NET (#7338) --- eng/common/cross/build-rootfs.sh | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/eng/common/cross/build-rootfs.sh b/eng/common/cross/build-rootfs.sh index 81e641a57b5..df0dfa5781c 100755 --- a/eng/common/cross/build-rootfs.sh +++ b/eng/common/cross/build-rootfs.sh @@ -78,6 +78,10 @@ __IllumosPackages+=" openssl-1.1.1e" __IllumosPackages+=" zlib-1.2.11" __IllumosPackages+=" openldap-client-2.4.49" +# ML.NET dependencies +__UbuntuPackages+=" libomp5" +__UbuntuPackages+=" libomp-dev" + __UseMirror=0 __UnprocessedBuildArgs= From cc512d28c9368336a2893172cbd45dc27960e304 Mon Sep 17 00:00:00 2001 From: Matt Mitchell Date: Tue, 4 May 2021 10:20:08 -0700 Subject: [PATCH 056/699] Avoid attempting to publish symbols that are not actually .symbols.nupkg (#7341) If repos generated a .symbols.nupkg.sha512, it would get caught in the current code There were enough instances of this test in Microsoft.DotNet.Build.Tasks.Feed to pull it out into common code. --- .../GeneralTests.cs | 13 +++++++++++++ .../src/BuildModelFactory.cs | 3 +-- .../src/PublishArtifactsInManifestBase.cs | 2 +- .../src/PublishArtifactsInManifestV3.cs | 2 +- .../src/common/GeneralUtils.cs | 11 +++++++++++ 5 files changed, 27 insertions(+), 4 deletions(-) diff --git a/src/Microsoft.DotNet.Build.Tasks.Feed.Tests/GeneralTests.cs b/src/Microsoft.DotNet.Build.Tasks.Feed.Tests/GeneralTests.cs index 604985edbd8..2b74d7a3835 100644 --- a/src/Microsoft.DotNet.Build.Tasks.Feed.Tests/GeneralTests.cs +++ b/src/Microsoft.DotNet.Build.Tasks.Feed.Tests/GeneralTests.cs @@ -32,6 +32,19 @@ public void ChannelConfigsHaveAllConfigs() } } + [Theory] + [InlineData("foo/bar/baz/bop.symbols.nupkg", true)] + [InlineData("foo/bar/baz/bop.symbols.nupkg.sha512", false)] + [InlineData("foo/bar/baz/bip.snupkg.sha512", false)] + [InlineData("foo/bar/baz/bip.snupkg", true)] + [InlineData("foo/bar/baz/bip.SNUpkg", true)] + [InlineData("foo/bar/baz/bop.SYMBOLS.nupkg", true)] + [InlineData("foo/bar/symbols.nupkg/bop.nupkg", false)] + public void IsSymbolPackage(string package, bool isSymbolPackage) + { + GeneralUtils.IsSymbolPackage(package).Should().Be(isSymbolPackage); + } + [Theory] [InlineData(HttpStatusCode.OK, true)] [InlineData(HttpStatusCode.Accepted, true)] diff --git a/src/Microsoft.DotNet.Build.Tasks.Feed/src/BuildModelFactory.cs b/src/Microsoft.DotNet.Build.Tasks.Feed/src/BuildModelFactory.cs index c8317f7e147..f15f8442c27 100644 --- a/src/Microsoft.DotNet.Build.Tasks.Feed/src/BuildModelFactory.cs +++ b/src/Microsoft.DotNet.Build.Tasks.Feed/src/BuildModelFactory.cs @@ -149,8 +149,7 @@ public BuildModel CreateModelFromItems( continue; } - var isSymbolsPackage = artifact.ItemSpec.EndsWith(".symbols.nupkg", StringComparison.OrdinalIgnoreCase) - || artifact.ItemSpec.EndsWith(".snupkg", StringComparison.OrdinalIgnoreCase); + var isSymbolsPackage = GeneralUtils.IsSymbolPackage(artifact.ItemSpec); if (artifact.ItemSpec.EndsWith(".nupkg", StringComparison.OrdinalIgnoreCase) && !isSymbolsPackage) { diff --git a/src/Microsoft.DotNet.Build.Tasks.Feed/src/PublishArtifactsInManifestBase.cs b/src/Microsoft.DotNet.Build.Tasks.Feed/src/PublishArtifactsInManifestBase.cs index c1c17f0c057..fed9ab0bdee 100644 --- a/src/Microsoft.DotNet.Build.Tasks.Feed/src/PublishArtifactsInManifestBase.cs +++ b/src/Microsoft.DotNet.Build.Tasks.Feed/src/PublishArtifactsInManifestBase.cs @@ -404,7 +404,7 @@ public async Task PublishSymbolsUsingStreamingAsync( foreach (var asset in buildAssets) { var name = asset.Key; - if (name.Contains(".symbols.nupkg")) + if (GeneralUtils.IsSymbolPackage(name)) { symbolsToPublish.Add(Path.GetFileName(name)); } diff --git a/src/Microsoft.DotNet.Build.Tasks.Feed/src/PublishArtifactsInManifestV3.cs b/src/Microsoft.DotNet.Build.Tasks.Feed/src/PublishArtifactsInManifestV3.cs index 2320ba8a1d0..c9f2e7a0610 100644 --- a/src/Microsoft.DotNet.Build.Tasks.Feed/src/PublishArtifactsInManifestV3.cs +++ b/src/Microsoft.DotNet.Build.Tasks.Feed/src/PublishArtifactsInManifestV3.cs @@ -252,7 +252,7 @@ private void CopySymbolFilesToTemporaryLocation(BuildModel buildModel, string sy { foreach (var blobAsset in buildModel.Artifacts.Blobs) { - if (blobAsset.Id.EndsWith(".symbols.nupkg", StringComparison.OrdinalIgnoreCase)) + if (GeneralUtils.IsSymbolPackage(blobAsset.Id)) { var sourceFile = Path.Combine(BlobAssetsBasePath, Path.GetFileName(blobAsset.Id)); var destinationFile = Path.Combine(symbolTemporaryLocation, Path.GetFileName(blobAsset.Id)); diff --git a/src/Microsoft.DotNet.Build.Tasks.Feed/src/common/GeneralUtils.cs b/src/Microsoft.DotNet.Build.Tasks.Feed/src/common/GeneralUtils.cs index 7654ac66c39..f5731617b9f 100644 --- a/src/Microsoft.DotNet.Build.Tasks.Feed/src/common/GeneralUtils.cs +++ b/src/Microsoft.DotNet.Build.Tasks.Feed/src/common/GeneralUtils.cs @@ -19,6 +19,7 @@ namespace Microsoft.DotNet.Build.Tasks.Feed public static class GeneralUtils { public const string SymbolPackageSuffix = ".symbols.nupkg"; + public const string SnupkgPackageSuffix = ".snupkg"; public const string PackageSuffix = ".nupkg"; public const string PackagesCategory = "PACKAGE"; @@ -367,6 +368,16 @@ public static string InferCategory(string assetId, TaskLoggingHelper log) } } + /// + /// Determine whether a file name or path is a symbol package. + /// + /// File anme or path + /// True if the item is a symbol package, false otherwise + public static bool IsSymbolPackage(string name) + { + return name.EndsWith(SymbolPackageSuffix, StringComparison.OrdinalIgnoreCase) || + name.EndsWith(SnupkgPackageSuffix, StringComparison.OrdinalIgnoreCase); + } private static System.Threading.Tasks.Task WaitForProcessExitAsync(Process process) { From 0cfaf935894a4c98ff7445c903f1b4c32990b127 Mon Sep 17 00:00:00 2001 From: Matt Mitchell Date: Tue, 4 May 2021 14:05:09 -0700 Subject: [PATCH 057/699] Add preview 6 and 7 channels (#7336) --- .../src/model/PublishingConstants.cs | 56 +++++++++++++++++++ 1 file changed, 56 insertions(+) diff --git a/src/Microsoft.DotNet.Build.Tasks.Feed/src/model/PublishingConstants.cs b/src/Microsoft.DotNet.Build.Tasks.Feed/src/model/PublishingConstants.cs index 982e2a08056..5d45c56e00f 100644 --- a/src/Microsoft.DotNet.Build.Tasks.Feed/src/model/PublishingConstants.cs +++ b/src/Microsoft.DotNet.Build.Tasks.Feed/src/model/PublishingConstants.cs @@ -283,6 +283,62 @@ public enum BuildQuality PublicAndInternalSymbolTargets, filenamesToExclude: FilenamesToExclude), + // ".NET 6 Preview 6" , + new TargetChannelConfig( + 1963, + false, + PublishingInfraVersion.All, + "6.0-preview6", + FeedDotNet6Shipping, + FeedDotNet6Transport, + FeedDotNet6Symbols, + FeedForChecksums, + FeedForInstallers, + PublicAndInternalSymbolTargets, + filenamesToExclude: FilenamesToExclude), + + // ".NET 6.0.1xx SDK Preview 6", + new TargetChannelConfig( + 1965, + false, + PublishingInfraVersion.All, + "6.0.1xx-preview6", + FeedDotNet6Shipping, + FeedDotNet6Transport, + FeedDotNet6Symbols, + FeedForChecksums, + FeedForInstallers, + PublicAndInternalSymbolTargets, + filenamesToExclude: FilenamesToExclude), + + // ".NET 6 Preview 7" , + new TargetChannelConfig( + 1964, + false, + PublishingInfraVersion.All, + "6.0-preview7", + FeedDotNet6Shipping, + FeedDotNet6Transport, + FeedDotNet6Symbols, + FeedForChecksums, + FeedForInstallers, + PublicAndInternalSymbolTargets, + filenamesToExclude: FilenamesToExclude), + + // ".NET 6.0.1xx SDK Preview 7", + new TargetChannelConfig( + 1966, + false, + PublishingInfraVersion.All, + "6.0.1xx-preview7", + FeedDotNet6Shipping, + FeedDotNet6Transport, + FeedDotNet6Symbols, + FeedForChecksums, + FeedForInstallers, + PublicAndInternalSymbolTargets, + filenamesToExclude: FilenamesToExclude), + // ".NET 5" (public), new TargetChannelConfig( 1299, From fc8bd8316145cfd9f044f7b59dff68908ca14c49 Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Wed, 5 May 2021 07:58:33 -0700 Subject: [PATCH 058/699] [main] Update dependencies from dotnet/xliff-tasks dotnet/arcade mono/linker (#7340) * Update dependencies from https://github.com/mono/linker build 20210503.3 Microsoft.NET.ILLink.Tasks From Version 6.0.100-preview.5.21229.1 -> To Version 6.0.100-preview.5.21253.3 * Update dependencies from https://github.com/dotnet/arcade build 20210504.2 Microsoft.DotNet.Build.Tasks.Feed , Microsoft.DotNet.Arcade.Sdk , Microsoft.DotNet.SwaggerGenerator.MSBuild , Microsoft.DotNet.SignTool , Microsoft.DotNet.Helix.Sdk From Version 6.0.0-beta.21253.2 -> To Version 6.0.0-beta.21254.2 * Update dependencies from https://github.com/dotnet/xliff-tasks build 20210504.1 XliffTasks From Version 1.0.0-beta.21251.1 -> To Version 1.0.0-beta.21254.1 * Update dependencies from https://github.com/dotnet/arcade build 20210504.3 Microsoft.DotNet.Build.Tasks.Feed , Microsoft.DotNet.Arcade.Sdk , Microsoft.DotNet.SwaggerGenerator.MSBuild , Microsoft.DotNet.SignTool , Microsoft.DotNet.Helix.Sdk From Version 6.0.0-beta.21253.2 -> To Version 6.0.0-beta.21254.3 * Update dependencies from https://github.com/mono/linker build 20210504.1 Microsoft.NET.ILLink.Tasks From Version 6.0.100-preview.5.21229.1 -> To Version 6.0.100-preview.5.21254.1 Co-authored-by: dotnet-maestro[bot] --- eng/Version.Details.xml | 28 ++++++++++++++-------------- eng/Versions.props | 10 +++++----- global.json | 4 ++-- 3 files changed, 21 insertions(+), 21 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index 5906d045d03..f1f881e100f 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -11,25 +11,25 @@ - + https://github.com/dotnet/arcade - e9fd640e1ec1890489ea66ad0f59e733448056da + 0cfaf935894a4c98ff7445c903f1b4c32990b127 - + https://github.com/dotnet/arcade - e9fd640e1ec1890489ea66ad0f59e733448056da + 0cfaf935894a4c98ff7445c903f1b4c32990b127 - + https://github.com/dotnet/arcade - e9fd640e1ec1890489ea66ad0f59e733448056da + 0cfaf935894a4c98ff7445c903f1b4c32990b127 - + https://github.com/dotnet/arcade - e9fd640e1ec1890489ea66ad0f59e733448056da + 0cfaf935894a4c98ff7445c903f1b4c32990b127 - + https://github.com/dotnet/arcade - e9fd640e1ec1890489ea66ad0f59e733448056da + 0cfaf935894a4c98ff7445c903f1b4c32990b127 https://github.com/dotnet/arcade-services @@ -47,9 +47,9 @@ https://github.com/dotnet/roslyn 4c32f5e4e9c0828a94fd4d1c9c0994082c85aaf3 - + https://github.com/mono/linker - 307f6b0afd2fea639fffa97e67155bafe6aa8461 + 4afa1051f5e44560368aacb21429e956ce39cc1a https://github.com/dotnet/sourcelink @@ -68,9 +68,9 @@ https://github.com/dotnet/symreader-converter c5ba7c88f92e2dde156c324a8c8edc04d9fa4fe0 - + https://github.com/dotnet/xliff-tasks - 59ce967675b3600c2de41443483949d86305de93 + 2739f40a72dec8100f99be106ae6b7d640e6fe69 diff --git a/eng/Versions.props b/eng/Versions.props index 2cb7b837e97..e66fe7bdc3b 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -36,7 +36,7 @@ 2.1.1 2.1.0 3.10.0-3.21251.8 - 6.0.100-preview.5.21229.1 + 6.0.100-preview.5.21254.1 16.7.1 4.8.3 5.3.0.1 @@ -66,8 +66,8 @@ 2.4.1 2.0.3 2.4.1 - 6.0.0-beta.21253.2 - 6.0.0-beta.21253.2 + 6.0.0-beta.21254.3 + 6.0.0-beta.21254.3 1.22.0 1.1.2 2.0.0 @@ -80,8 +80,8 @@ 1.1.0-beta.20258.6 1.1.0-beta-21228-01 1.1.0-beta-21228-01 - 6.0.0-beta.21253.2 - 1.0.0-beta.21251.1 + 6.0.0-beta.21254.3 + 1.0.0-beta.21254.1 1.1.0-beta.21228.1 1.0.0-prerelease.21230.4 1.1.156402 diff --git a/global.json b/global.json index affca35fa7b..d7f2abb0858 100644 --- a/global.json +++ b/global.json @@ -3,7 +3,7 @@ "dotnet": "6.0.100-preview.3.21202.5" }, "msbuild-sdks": { - "Microsoft.DotNet.Arcade.Sdk": "6.0.0-beta.21253.2", - "Microsoft.DotNet.Helix.Sdk": "6.0.0-beta.21253.2" + "Microsoft.DotNet.Arcade.Sdk": "6.0.0-beta.21254.3", + "Microsoft.DotNet.Helix.Sdk": "6.0.0-beta.21254.3" } } From 0916e2d4f072d0a87db15803ce5572ff687354d4 Mon Sep 17 00:00:00 2001 From: Medeni Baykal <433724+Haplois@users.noreply.github.com> Date: Thu, 6 May 2021 00:53:16 +0200 Subject: [PATCH 059/699] An option to only use retail vs to use msbuild (#7344) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Added `excludePrereleaseVS` option to build. * Added xcludePrereleaseVS option to build. * PR fixes. --- eng/common/build.ps1 | 2 ++ eng/common/msbuild.ps1 | 1 + eng/common/tools.ps1 | 19 ++++++++++++++++--- 3 files changed, 19 insertions(+), 3 deletions(-) diff --git a/eng/common/build.ps1 b/eng/common/build.ps1 index 94a91c0817e..8943da242f6 100644 --- a/eng/common/build.ps1 +++ b/eng/common/build.ps1 @@ -25,6 +25,7 @@ Param( [switch] $prepareMachine, [string] $runtimeSourceFeed = '', [string] $runtimeSourceFeedKey = '', + [switch] $excludePrereleaseVS, [switch] $help, [Parameter(ValueFromRemainingArguments=$true)][String[]]$properties ) @@ -65,6 +66,7 @@ function Print-Usage() { Write-Host " -prepareMachine Prepare machine for CI run, clean up processes after build" Write-Host " -warnAsError Sets warnaserror msbuild parameter ('true' or 'false')" Write-Host " -msbuildEngine Msbuild engine to use to run build ('dotnet', 'vs', or unspecified)." + Write-Host " -excludePrereleaseVS Set to exclude build engines in prerelease versions of Visual Studio" Write-Host "" Write-Host "Command line arguments not listed above are passed thru to msbuild." diff --git a/eng/common/msbuild.ps1 b/eng/common/msbuild.ps1 index c6401230002..eea19cd8452 100644 --- a/eng/common/msbuild.ps1 +++ b/eng/common/msbuild.ps1 @@ -5,6 +5,7 @@ Param( [bool] $nodeReuse = $true, [switch] $ci, [switch] $prepareMachine, + [switch] $excludePrereleaseVS, [Parameter(ValueFromRemainingArguments=$true)][String[]]$extraArgs ) diff --git a/eng/common/tools.ps1 b/eng/common/tools.ps1 index d52467eea11..2d8a74f7d9e 100644 --- a/eng/common/tools.ps1 +++ b/eng/common/tools.ps1 @@ -48,6 +48,9 @@ # True to use global NuGet cache instead of restoring packages to repository-local directory. [bool]$useGlobalNuGetCache = if (Test-Path variable:useGlobalNuGetCache) { $useGlobalNuGetCache } else { !$ci } +# True to exclude prerelease versions Visual Studio during build +[bool]$excludePrereleaseVS = if (Test-Path variable:excludePrereleaseVS) { $excludePrereleaseVS } else { $false } + # An array of names of processes to stop on script exit if prepareMachine is true. $processesToStopOnExit = if (Test-Path variable:processesToStopOnExit) { $processesToStopOnExit } else { @('msbuild', 'dotnet', 'vbcscompiler') } @@ -463,7 +466,11 @@ function LocateVisualStudio([object]$vsRequirements = $null){ } if (!$vsRequirements) { $vsRequirements = $GlobalJson.tools.vs } - $args = @('-latest', '-prerelease', '-format', 'json', '-requires', 'Microsoft.Component.MSBuild', '-products', '*') + $args = @('-latest', '-format', 'json', '-requires', 'Microsoft.Component.MSBuild', '-products', '*') + + if (!$excludePrereleaseVS) { + $args += '-prerelease' + } if (Get-Member -InputObject $vsRequirements -Name 'version') { $args += '-version' @@ -489,7 +496,13 @@ function LocateVisualStudio([object]$vsRequirements = $null){ function InitializeBuildTool() { if (Test-Path variable:global:_BuildTool) { - return $global:_BuildTool + # If the requested msbuild parameters do not match, clear the cached variables. + if($global:_BuildTool.Contains('ExcludePrereleaseVS') -and $global:_BuildTool.ExcludePrereleaseVS -ne $excludePrereleaseVS) { + Remove-Item variable:global:_BuildTool + Remove-Item variable:global:_MSBuildExe + } else { + return $global:_BuildTool + } } if (-not $msbuildEngine) { @@ -517,7 +530,7 @@ function InitializeBuildTool() { ExitWithExitCode 1 } - $buildTool = @{ Path = $msbuildPath; Command = ""; Tool = "vs"; Framework = "net472" } + $buildTool = @{ Path = $msbuildPath; Command = ""; Tool = "vs"; Framework = "net472"; ExcludePrereleaseVS = $excludePrereleaseVS } } else { Write-PipelineTelemetryError -Category 'InitializeToolset' -Message "Unexpected value of -msbuildEngine: '$msbuildEngine'." ExitWithExitCode 1 From 01c1af9f5ead4962e390cfbec92396de34118492 Mon Sep 17 00:00:00 2001 From: Sergey Andreenko Date: Thu, 6 May 2021 01:04:23 -0700 Subject: [PATCH 060/699] Revert "Try to add ldap libraries to the docker images. (#7197)" (#7313) This reverts commit 44f0c7b917962689caca3202b730e3340351afeb. --- eng/common/cross/build-android-rootfs.sh | 1 - eng/common/cross/build-rootfs.sh | 4 ---- 2 files changed, 5 deletions(-) diff --git a/eng/common/cross/build-android-rootfs.sh b/eng/common/cross/build-android-rootfs.sh index c29c8267e7a..42516bbeebc 100755 --- a/eng/common/cross/build-android-rootfs.sh +++ b/eng/common/cross/build-android-rootfs.sh @@ -106,7 +106,6 @@ __AndroidPackages+=" libandroid-glob" __AndroidPackages+=" liblzma" __AndroidPackages+=" krb5" __AndroidPackages+=" openssl" -__AndroidPackages+=" openldap" for path in $(wget -qO- http://termux.net/dists/stable/main/binary-$__AndroidArch/Packages |\ grep -A15 "Package: \(${__AndroidPackages// /\\|}\)" | grep -v "static\|tool" | grep Filename); do diff --git a/eng/common/cross/build-rootfs.sh b/eng/common/cross/build-rootfs.sh index df0dfa5781c..591d8666a84 100755 --- a/eng/common/cross/build-rootfs.sh +++ b/eng/common/cross/build-rootfs.sh @@ -55,13 +55,11 @@ __UbuntuPackages+=" libcurl4-openssl-dev" __UbuntuPackages+=" libkrb5-dev" __UbuntuPackages+=" libssl-dev" __UbuntuPackages+=" zlib1g-dev" -__UbuntuPackages+=" libldap2-dev" __AlpinePackages+=" curl-dev" __AlpinePackages+=" krb5-dev" __AlpinePackages+=" openssl-dev" __AlpinePackages+=" zlib-dev" -__AlpinePackages+=" openldap-dev" __FreeBSDBase="12.1-RELEASE" __FreeBSDPkg="1.12.0" @@ -70,13 +68,11 @@ __FreeBSDPackages+=" icu" __FreeBSDPackages+=" libinotify" __FreeBSDPackages+=" lttng-ust" __FreeBSDPackages+=" krb5" -__FreeBSDPackages+=" libslapi-2.4" __IllumosPackages="icu-64.2nb2" __IllumosPackages+=" mit-krb5-1.16.2nb4" __IllumosPackages+=" openssl-1.1.1e" __IllumosPackages+=" zlib-1.2.11" -__IllumosPackages+=" openldap-client-2.4.49" # ML.NET dependencies __UbuntuPackages+=" libomp5" From 6410ba6556e65ab65a0bf0264dd68bb19583bc6e Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Thu, 6 May 2021 16:03:48 +0000 Subject: [PATCH 061/699] [main] Update dependencies from dotnet/xliff-tasks dotnet/arcade mono/linker (#7350) [main] Update dependencies from dotnet/xliff-tasks dotnet/arcade mono/linker --- eng/Version.Details.xml | 28 ++++++++++++++-------------- eng/Versions.props | 10 +++++----- global.json | 4 ++-- 3 files changed, 21 insertions(+), 21 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index f1f881e100f..1a4d8e70f7a 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -11,25 +11,25 @@ - + https://github.com/dotnet/arcade - 0cfaf935894a4c98ff7445c903f1b4c32990b127 + 01c1af9f5ead4962e390cfbec92396de34118492 - + https://github.com/dotnet/arcade - 0cfaf935894a4c98ff7445c903f1b4c32990b127 + 01c1af9f5ead4962e390cfbec92396de34118492 - + https://github.com/dotnet/arcade - 0cfaf935894a4c98ff7445c903f1b4c32990b127 + 01c1af9f5ead4962e390cfbec92396de34118492 - + https://github.com/dotnet/arcade - 0cfaf935894a4c98ff7445c903f1b4c32990b127 + 01c1af9f5ead4962e390cfbec92396de34118492 - + https://github.com/dotnet/arcade - 0cfaf935894a4c98ff7445c903f1b4c32990b127 + 01c1af9f5ead4962e390cfbec92396de34118492 https://github.com/dotnet/arcade-services @@ -47,9 +47,9 @@ https://github.com/dotnet/roslyn 4c32f5e4e9c0828a94fd4d1c9c0994082c85aaf3 - + https://github.com/mono/linker - 4afa1051f5e44560368aacb21429e956ce39cc1a + 031093e11a60c54f06348208fdf91b67f49b5f1c https://github.com/dotnet/sourcelink @@ -68,9 +68,9 @@ https://github.com/dotnet/symreader-converter c5ba7c88f92e2dde156c324a8c8edc04d9fa4fe0 - + https://github.com/dotnet/xliff-tasks - 2739f40a72dec8100f99be106ae6b7d640e6fe69 + 2c46403f55e8950ccf5f49b1c87bb89a891d7faa diff --git a/eng/Versions.props b/eng/Versions.props index e66fe7bdc3b..94138274e53 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -36,7 +36,7 @@ 2.1.1 2.1.0 3.10.0-3.21251.8 - 6.0.100-preview.5.21254.1 + 6.0.100-preview.5.21255.1 16.7.1 4.8.3 5.3.0.1 @@ -66,8 +66,8 @@ 2.4.1 2.0.3 2.4.1 - 6.0.0-beta.21254.3 - 6.0.0-beta.21254.3 + 6.0.0-beta.21256.1 + 6.0.0-beta.21256.1 1.22.0 1.1.2 2.0.0 @@ -80,8 +80,8 @@ 1.1.0-beta.20258.6 1.1.0-beta-21228-01 1.1.0-beta-21228-01 - 6.0.0-beta.21254.3 - 1.0.0-beta.21254.1 + 6.0.0-beta.21256.1 + 1.0.0-beta.21255.1 1.1.0-beta.21228.1 1.0.0-prerelease.21230.4 1.1.156402 diff --git a/global.json b/global.json index d7f2abb0858..4d486ee3772 100644 --- a/global.json +++ b/global.json @@ -3,7 +3,7 @@ "dotnet": "6.0.100-preview.3.21202.5" }, "msbuild-sdks": { - "Microsoft.DotNet.Arcade.Sdk": "6.0.0-beta.21254.3", - "Microsoft.DotNet.Helix.Sdk": "6.0.0-beta.21254.3" + "Microsoft.DotNet.Arcade.Sdk": "6.0.0-beta.21256.1", + "Microsoft.DotNet.Helix.Sdk": "6.0.0-beta.21256.1" } } From 791cbac29d29b649583ede1ddce67463e01dc33b Mon Sep 17 00:00:00 2001 From: Jacques Eloff Date: Thu, 6 May 2021 09:17:41 -0700 Subject: [PATCH 062/699] Update workload generation tasks (#7288) * Update workload generation tasks * Update manifest reader to allow unit tests in 3.1 * Add explicit reference to NuGet.Packaging in test project --- Arcade.sln | 15 ++ eng/Versions.props | 2 +- .../GenerateVisualStudioWorkloadTests.cs | 110 ++++++++++ ....DotNet.Build.Tasks.Workloads.Tests.csproj | 22 ++ .../VisualStudioComponentTests.cs | 89 ++++++++ .../testassets/WorkloadManifest.json | 66 ++++++ ...assembly.aot.6.0.0-preview.4.21209.5.nupkg | Bin 0 -> 17588 bytes .../src/GenerateMsiBase.cs | 46 +++- .../GenerateVisualStudioMsiPackageProject.cs | 18 +- .../src/GenerateVisualStudioWorkload.cs | 197 ++++++++++++++++-- .../src/GenerateWorkloadMsis.cs | 47 ++++- .../src/Metadata.cs | 19 ++ ...rosoft.DotNet.Build.Tasks.Workloads.csproj | 2 +- .../src/MsiTemplate/Product.wxs | 2 +- .../src/MsiUtils.cs | 12 +- .../src/NuGetPackage.cs | 15 +- .../src/StringExtensions.cs | 46 ++++ .../src/SwixTemplate/msi.swr | 3 +- .../src/VisualStudioComponent.cs | 88 ++++++-- 19 files changed, 732 insertions(+), 67 deletions(-) create mode 100644 src/Microsoft.DotNet.Build.Tasks.Workloads.Tests/GenerateVisualStudioWorkloadTests.cs create mode 100644 src/Microsoft.DotNet.Build.Tasks.Workloads.Tests/Microsoft.DotNet.Build.Tasks.Workloads.Tests.csproj create mode 100644 src/Microsoft.DotNet.Build.Tasks.Workloads.Tests/VisualStudioComponentTests.cs create mode 100644 src/Microsoft.DotNet.Build.Tasks.Workloads.Tests/testassets/WorkloadManifest.json create mode 100644 src/Microsoft.DotNet.Build.Tasks.Workloads.Tests/testassets/microsoft.net.sdk.blazorwebassembly.aot.6.0.0-preview.4.21209.5.nupkg create mode 100644 src/Microsoft.DotNet.Build.Tasks.Workloads/src/Metadata.cs create mode 100644 src/Microsoft.DotNet.Build.Tasks.Workloads/src/StringExtensions.cs diff --git a/Arcade.sln b/Arcade.sln index b82432eb5b4..9b303e6671c 100644 --- a/Arcade.sln +++ b/Arcade.sln @@ -137,6 +137,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Arcade.Common.Tes EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.DotNet.Build.Tasks.Workloads", "src\Microsoft.DotNet.Build.Tasks.Workloads\src\Microsoft.DotNet.Build.Tasks.Workloads.csproj", "{A7F1E9A4-5681-47A2-B278-CCC9B68C3B40}" EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.DotNet.Build.Tasks.Workloads.Tests", "src\Microsoft.DotNet.Build.Tasks.Workloads.Tests\Microsoft.DotNet.Build.Tasks.Workloads.Tests.csproj", "{0B5D3C20-EB58-4A82-A3AA-2E626A17B35D}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -863,6 +865,18 @@ Global {A7F1E9A4-5681-47A2-B278-CCC9B68C3B40}.Release|x64.Build.0 = Release|Any CPU {A7F1E9A4-5681-47A2-B278-CCC9B68C3B40}.Release|x86.ActiveCfg = Release|Any CPU {A7F1E9A4-5681-47A2-B278-CCC9B68C3B40}.Release|x86.Build.0 = Release|Any CPU + {0B5D3C20-EB58-4A82-A3AA-2E626A17B35D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {0B5D3C20-EB58-4A82-A3AA-2E626A17B35D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {0B5D3C20-EB58-4A82-A3AA-2E626A17B35D}.Debug|x64.ActiveCfg = Debug|Any CPU + {0B5D3C20-EB58-4A82-A3AA-2E626A17B35D}.Debug|x64.Build.0 = Debug|Any CPU + {0B5D3C20-EB58-4A82-A3AA-2E626A17B35D}.Debug|x86.ActiveCfg = Debug|Any CPU + {0B5D3C20-EB58-4A82-A3AA-2E626A17B35D}.Debug|x86.Build.0 = Debug|Any CPU + {0B5D3C20-EB58-4A82-A3AA-2E626A17B35D}.Release|Any CPU.ActiveCfg = Release|Any CPU + {0B5D3C20-EB58-4A82-A3AA-2E626A17B35D}.Release|Any CPU.Build.0 = Release|Any CPU + {0B5D3C20-EB58-4A82-A3AA-2E626A17B35D}.Release|x64.ActiveCfg = Release|Any CPU + {0B5D3C20-EB58-4A82-A3AA-2E626A17B35D}.Release|x64.Build.0 = Release|Any CPU + {0B5D3C20-EB58-4A82-A3AA-2E626A17B35D}.Release|x86.ActiveCfg = Release|Any CPU + {0B5D3C20-EB58-4A82-A3AA-2E626A17B35D}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -896,6 +910,7 @@ Global {E941EDE6-3FFB-4776-A4CE-750755D57817} = {C53DD924-C212-49EA-9BC4-1827421361EF} {6CA09DC9-E654-4906-A977-1279F6EDC109} = {C53DD924-C212-49EA-9BC4-1827421361EF} {B5E9D9D8-59E0-49F8-9C3C-75138A2D452C} = {C53DD924-C212-49EA-9BC4-1827421361EF} + {0B5D3C20-EB58-4A82-A3AA-2E626A17B35D} = {C53DD924-C212-49EA-9BC4-1827421361EF} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {32B9C883-432E-4FC8-A1BF-090EB033DD5B} diff --git a/eng/Versions.props b/eng/Versions.props index 94138274e53..1d4a2ef679f 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -86,6 +86,6 @@ 1.0.0-prerelease.21230.4 1.1.156402 1.1.152002 - 6.0.100-preview.3.21175.4 + 6.0.100-preview.5.21254.11 diff --git a/src/Microsoft.DotNet.Build.Tasks.Workloads.Tests/GenerateVisualStudioWorkloadTests.cs b/src/Microsoft.DotNet.Build.Tasks.Workloads.Tests/GenerateVisualStudioWorkloadTests.cs new file mode 100644 index 00000000000..6a302bc095d --- /dev/null +++ b/src/Microsoft.DotNet.Build.Tasks.Workloads.Tests/GenerateVisualStudioWorkloadTests.cs @@ -0,0 +1,110 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +using System; +using System.Collections.Generic; +using System.IO; +using Microsoft.Arcade.Test.Common; +using Microsoft.Build.Utilities; +using Xunit; + +namespace Microsoft.DotNet.Build.Tasks.Workloads.Tests +{ + public class GenerateVisualStudioWorkloadTests + { + public string IntermediateBaseOutputPath = Path.Combine(AppContext.BaseDirectory, "obj"); + + public string TestIntermediateBaseOutputPath => Path.Combine(IntermediateBaseOutputPath, Path.GetFileNameWithoutExtension(Path.GetTempFileName())); + + [Fact] + public void ItGeneratesASwixProjectFromAWorkloadManifest() + { + string workloadManifest = Path.Combine(AppContext.BaseDirectory, "testassets", "WorkloadManifest.json"); + + var buildTask = new GenerateVisualStudioWorkload() + { + WorkloadManifests = new TaskItem[] + { + new TaskItem(workloadManifest) + }, + + ComponentVersion = "6.5.38766", + GenerateMsis = false, + IntermediateBaseOutputPath = TestIntermediateBaseOutputPath, + WixToolsetPath = "", + BuildEngine = new MockBuildEngine() + }; + + buildTask.Execute(); + string outputPath = Path.GetDirectoryName(buildTask.SwixProjects[0].GetMetadata("FullPath")); + string componentSwr = File.ReadAllText(Path.Combine(outputPath, "component.swr")); + + Assert.Single(buildTask.SwixProjects); + Assert.Contains(@"package name=microsoft.net.sdk.blazorwebassembly.aot + version=6.5.38766", componentSwr); + Assert.Contains("vs.dependency id=Microsoft.NET.Runtime.MonoAOTCompiler.Task.6.0.0-preview.4.21201.1", componentSwr); + } + + [Fact] + public void ItCanShortenPackageIds() + { + string workloadManifest = Path.Combine(AppContext.BaseDirectory, "testassets", "WorkloadManifest.json"); + + var buildTask = new GenerateVisualStudioWorkload() + { + WorkloadManifests = new TaskItem[] + { + new TaskItem(workloadManifest) + }, + ShortNames = new TaskItem[] + { + new TaskItem("Microsoft.NET.Runtime", new Dictionary { {"Replacement", "MSFT"} }) + }, + ComponentVersion = "6.5.38766", + GenerateMsis = false, + IntermediateBaseOutputPath = TestIntermediateBaseOutputPath, + WixToolsetPath = "", + BuildEngine = new MockBuildEngine() + }; + + buildTask.Execute(); + string outputPath = Path.GetDirectoryName(buildTask.SwixProjects[0].GetMetadata("FullPath")); + string componentSwr = File.ReadAllText(Path.Combine(outputPath, "component.swr")); + + Assert.Single(buildTask.SwixProjects); + Assert.Contains(@"package name=microsoft.net.sdk.blazorwebassembly.aot + version=6.5.38766", componentSwr); + Assert.Contains("vs.dependency id=MSFT.MonoAOTCompiler.Task.6.0.0-preview.4.21201.1", componentSwr); + } + + [Fact] + public void ItGeneratesASwixProjectFromAWorkloadManifestPackage() + { + string workloadPackage = Path.Combine(AppContext.BaseDirectory, "testassets", + "microsoft.net.sdk.blazorwebassembly.aot.6.0.0-preview.4.21209.5.nupkg"); + + var buildTask = new GenerateVisualStudioWorkload() + { + WorkloadPackages = new TaskItem[] + { + new TaskItem(workloadPackage) + }, + + GenerateMsis = false, + IntermediateBaseOutputPath = TestIntermediateBaseOutputPath, + WixToolsetPath = "", + BuildEngine = new MockBuildEngine() + }; + + buildTask.Execute(); + string outputPath = Path.GetDirectoryName(buildTask.SwixProjects[0].GetMetadata("FullPath")); + string componentSwr = File.ReadAllText(Path.Combine(outputPath, "component.swr")); + + Assert.Single(buildTask.SwixProjects); + Assert.Contains(@"package name=microsoft.net.sdk.blazorwebassembly.aot + version=1.0", componentSwr); + Assert.Contains("vs.dependency id=Microsoft.NET.Runtime.MonoAOTCompiler.Task.6.0.0-preview.4.21201.1", componentSwr); + Assert.Contains("vs.dependency id=Microsoft.NET.Runtime.Emscripten.Python.6.0.0-preview.4.21205.1", componentSwr); + } + } +} diff --git a/src/Microsoft.DotNet.Build.Tasks.Workloads.Tests/Microsoft.DotNet.Build.Tasks.Workloads.Tests.csproj b/src/Microsoft.DotNet.Build.Tasks.Workloads.Tests/Microsoft.DotNet.Build.Tasks.Workloads.Tests.csproj new file mode 100644 index 00000000000..74c5c5e2d05 --- /dev/null +++ b/src/Microsoft.DotNet.Build.Tasks.Workloads.Tests/Microsoft.DotNet.Build.Tasks.Workloads.Tests.csproj @@ -0,0 +1,22 @@ + + + + net472;netcoreapp3.1 + + + + + + + + + + + + + + + + + + diff --git a/src/Microsoft.DotNet.Build.Tasks.Workloads.Tests/VisualStudioComponentTests.cs b/src/Microsoft.DotNet.Build.Tasks.Workloads.Tests/VisualStudioComponentTests.cs new file mode 100644 index 00000000000..26dcf22903c --- /dev/null +++ b/src/Microsoft.DotNet.Build.Tasks.Workloads.Tests/VisualStudioComponentTests.cs @@ -0,0 +1,89 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using Microsoft.Build.Framework; +using Microsoft.Build.Utilities; +using Microsoft.NET.Sdk.WorkloadManifestReader; +using Xunit; + +namespace Microsoft.DotNet.Build.Tasks.Workloads.Tests +{ + public class VisualStudioComponentTests + { + public static readonly ITaskItem[] NoItems = Array.Empty(); + + public string RandomPath => Path.Combine(AppContext.BaseDirectory, "obj", Path.GetFileNameWithoutExtension(Path.GetTempFileName())); + + [Fact] + public void ItAssignsDefaultValues() + { + WorkloadManifest manifest = Create("WorkloadManifest.json"); + WorkloadDefinition definition = manifest.Workloads.FirstOrDefault().Value; + VisualStudioComponent component = VisualStudioComponent.Create(null, manifest, definition, "1.2.3.4", NoItems, NoItems, NoItems); + + string swixProjDirectory = RandomPath; + Directory.CreateDirectory(swixProjDirectory); + component.Generate(swixProjDirectory); + + string componentResSwr = File.ReadAllText(Path.Combine(swixProjDirectory, "component.res.swr")); + + Assert.Contains(@"title=""Blazor WebAssembly AOT workload""", componentResSwr); + Assert.Contains(@"description=""Blazor WebAssembly AOT workload""", componentResSwr); + Assert.Contains(@"category="".NET""", componentResSwr); + } + + [Fact] + public void ItCanOverrideDefaultValues() + { + WorkloadManifest manifest = Create("WorkloadManifest.json"); + WorkloadDefinition definition = manifest.Workloads.FirstOrDefault().Value; + + ITaskItem[] resources = new ITaskItem[] + { + new TaskItem("microsoft-net-sdk-blazorwebassembly-aot", new Dictionary { + { "Title", "AOT" }, + { "Description", "A long wordy description." }, + { "Category", "Compilers, build tools, and runtimes" } + }) + }; + + VisualStudioComponent component = VisualStudioComponent.Create(null, manifest, definition, "1.2.3.4", NoItems, resources, NoItems); + + string swixProjDirectory = RandomPath; + Directory.CreateDirectory(swixProjDirectory); + component.Generate(swixProjDirectory); + + string componentResSwr = File.ReadAllText(Path.Combine(swixProjDirectory, "component.res.swr")); + + Assert.Contains(@"title=""AOT""", componentResSwr); + Assert.Contains(@"description=""A long wordy description.""", componentResSwr); + Assert.Contains(@"category=""Compilers, build tools, and runtimes""", componentResSwr); + } + + [Fact] + public void ItCreatesSafeComponentIds() + { + WorkloadManifest manifest = Create("WorkloadManifest.json"); + WorkloadDefinition definition = manifest.Workloads.FirstOrDefault().Value; + VisualStudioComponent component = VisualStudioComponent.Create(null, manifest, definition, "1.2.3.4", NoItems, NoItems, NoItems); + + string swixProjDirectory = RandomPath; + Directory.CreateDirectory(swixProjDirectory); + component.Generate(swixProjDirectory); + + string componentSwr = File.ReadAllText(Path.Combine(swixProjDirectory, "component.swr")); + + Assert.Contains(@"microsoft.net.sdk.blazorwebassembly.aot", componentSwr); + } + + private static WorkloadManifest Create(string filename) + { + return WorkloadManifestReader.ReadWorkloadManifest(Path.GetFileNameWithoutExtension(filename), + File.OpenRead(Path.Combine(AppContext.BaseDirectory, "testassets", filename))); + } + } +} diff --git a/src/Microsoft.DotNet.Build.Tasks.Workloads.Tests/testassets/WorkloadManifest.json b/src/Microsoft.DotNet.Build.Tasks.Workloads.Tests/testassets/WorkloadManifest.json new file mode 100644 index 00000000000..0f68fdd529f --- /dev/null +++ b/src/Microsoft.DotNet.Build.Tasks.Workloads.Tests/testassets/WorkloadManifest.json @@ -0,0 +1,66 @@ +{ + "version": 1, + "workloads": { + "microsoft-net-sdk-blazorwebassembly-aot": { + "description": "Blazor WebAssembly AOT workload", + "packs": [ + "Microsoft.NET.Runtime.MonoAOTCompiler.Task", + "Microsoft.NET.Runtime.WebAssembly.Sdk", + "Microsoft.Netcore.App.Runtime.Aot.Cross.browser-wasm", + "Microsoft.NET.Runtime.Emscripten.Node", + "Microsoft.NET.Runtime.Emscripten.Python", + "Microsoft.NET.Runtime.Emscripten.Sdk" + ] + } + }, + "packs": { + "Microsoft.NET.Runtime.MonoAOTCompiler.Task": { + "kind": "Sdk", + "version": "6.0.0-preview.4.21201.1" + }, + "Microsoft.NET.Runtime.WebAssembly.Sdk": { + "kind": "Sdk", + "version": "6.0.0-preview.4.21201.1" + }, + "Microsoft.NETCore.App.Runtime.AOT.Cross.browser-wasm": { + "kind": "Sdk", + "version": "6.0.0-preview.4.21201.1", + "alias-to": { + "win-x86": "microsoft.netcore.app.runtime.aot.win-x86.cross.browser-wasm", + "win-x64": "microsoft.netcore.app.runtime.aot.win-x64.cross.browser-wasm", + "linux-x64": "microsoft.netcore.app.runtime.aot.linux-x64.cross.browser-wasm", + "osx-x64": "microsoft.netcore.app.runtime.aot.osx-x64.cross.browser-wasm" + } + }, + "Microsoft.NET.Runtime.Emscripten.Node" : { + "kind": "Sdk", + "version": "6.0.0-preview.4.21205.1", + "alias-to": { + "win-x86": "Microsoft.NET.Runtime.Emscripten.2.0.12.Node.win-x86", + "win-x64": "Microsoft.NET.Runtime.Emscripten.2.0.12.Node.win-x64", + "linux-x64": "Microsoft.NET.Runtime.Emscripten.2.0.12.Node.linux-x64", + "osx-x64": "Microsoft.NET.Runtime.Emscripten.2.0.12.Node.osx-x64" + } + }, + "Microsoft.NET.Runtime.Emscripten.Python" : { + "kind": "Sdk", + "version": "6.0.0-preview.4.21205.1", + "alias-to": { + "win-x86": "Microsoft.NET.Runtime.Emscripten.2.0.12.Python.win-x86", + "win-x64": "Microsoft.NET.Runtime.Emscripten.2.0.12.Python.win-x64", + "linux-x64": "Microsoft.NET.Runtime.Emscripten.2.0.12.Python.linux-x64", + "osx-x64": "Microsoft.NET.Runtime.Emscripten.2.0.12.Python.osx-x64" + } + }, + "Microsoft.NET.Runtime.Emscripten.Sdk" : { + "kind": "Sdk", + "version": "6.0.0-preview.4.21205.1", + "alias-to": { + "win-x86": "Microsoft.NET.Runtime.Emscripten.2.0.12.Sdk.win-x86", + "win-x64": "Microsoft.NET.Runtime.Emscripten.2.0.12.Sdk.win-x64", + "linux-x64": "Microsoft.NET.Runtime.Emscripten.2.0.12.Sdk.linux-x64", + "osx-x64": "Microsoft.NET.Runtime.Emscripten.2.0.12.Sdk.osx-x64" + } + } + } +} diff --git a/src/Microsoft.DotNet.Build.Tasks.Workloads.Tests/testassets/microsoft.net.sdk.blazorwebassembly.aot.6.0.0-preview.4.21209.5.nupkg b/src/Microsoft.DotNet.Build.Tasks.Workloads.Tests/testassets/microsoft.net.sdk.blazorwebassembly.aot.6.0.0-preview.4.21209.5.nupkg new file mode 100644 index 0000000000000000000000000000000000000000..e480ef9406c89ff261cb5d464fcdd06ef0939167 GIT binary patch literal 17588 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 internal static readonly Guid ProductCodeNamespaceUuid = Guid.Parse("3B04DD8B-41C4-4DA3-9E49-4B69F11533A7"); + /// + /// Static RTF text for inserting a EULA into the MSI. The license URL of the NuGet package will be embedded + /// as plain text since the text control used to render the MSI UI does not render hyperlinks even though RTF supports it. + /// + internal static readonly string Eula = @"{\rtf1\ansi\ansicpg1252\deff0\nouicompat\deflang1033{\fonttbl{\f0\fnil\fcharset0 Calibri;}} +{\colortbl ;\red0\green0\blue255;} +{\*\generator Riched20 10.0.19041}\viewkind4\uc1 +\pard\sa200\sl276\slmult1\f0\fs22\lang9 This software is licensed separately as set out in its accompanying license. By continuing, you also agree to that license (__LICENSE_URL__).\par +\par +}"; + + /// + /// An item group containing information to shorten the names of packages. + /// + public ITaskItem[] ShortNames + { + get; + set; + } + /// /// The set of supported target platforms for MSIs. /// @@ -124,6 +143,9 @@ protected IEnumerable Generate(string sourcePackage, string swixPacka sourceFiles.Add(EmbeddedTemplates.Extract("Directories.wxs", msiSourcePath)); sourceFiles.Add(EmbeddedTemplates.Extract("Product.wxs", msiSourcePath)); sourceFiles.Add(EmbeddedTemplates.Extract("Registry.wxs", msiSourcePath)); + + string EulaRtfPath = Path.Combine(msiSourcePath, "eula.rtf"); + File.WriteAllText(EulaRtfPath, Eula.Replace("__LICENSE_URL__", nupkg.LicenseUrl)); EmbeddedTemplates.Extract("Variables.wxi", msiSourcePath); // Harvest the package contents and add it to the source files we need to compile. @@ -171,6 +193,7 @@ protected IEnumerable Generate(string sourcePackage, string swixPacka candle.PreprocessorDefinitions.Add($@"Platform={platform}"); candle.PreprocessorDefinitions.Add($@"SourceDir={packageContentsDirectory}"); candle.PreprocessorDefinitions.Add($@"Manufacturer={manufacturer}"); + candle.PreprocessorDefinitions.Add($@"EulaRtf={EulaRtfPath}"); // Compiler extension to process dependency provider authoring for package reference counting. candle.Extensions.Add("WixDependencyExtension"); @@ -183,9 +206,12 @@ protected IEnumerable Generate(string sourcePackage, string swixPacka // Link the MSI. The generated filename contains a the semantic version (excluding build metadata) and platform. // If the source package already contains a platform, e.g. an aliased package that has a RID, then we don't add // the platform again. + + string shortPackageName = Path.GetFileNameWithoutExtension(sourcePackage).Replace(ShortNames); + string outputFile = sourcePackage.Contains(platform) ? - Path.Combine(OutputPath, Path.GetFileNameWithoutExtension(sourcePackage) + ".msi") : - Path.Combine(OutputPath, Path.GetFileNameWithoutExtension(sourcePackage) + $"-{platform}.msi"); + Path.Combine(OutputPath, shortPackageName + ".msi") : + Path.Combine(OutputPath, shortPackageName + $"-{platform}.msi"); LinkToolTask light = new(BuildEngine, WixToolsetPath) { @@ -204,17 +230,18 @@ protected IEnumerable Generate(string sourcePackage, string swixPacka } TaskItem msi = new(light.OutputFile); - msi.SetMetadata("Platform", platform); - msi.SetMetadata("Version", nupkg.ProductVersion); + msi.SetMetadata(Metadata.Platform, platform); + msi.SetMetadata(Metadata.Version, nupkg.ProductVersion); if (GenerateSwixAuthoring) { - string swixProject = GenerateSwixPackageAuthoring(light.OutputFile, - !string.IsNullOrWhiteSpace(swixPackageId) ? swixPackageId : $"{nupkg.Id}", platform); + string swixProject = GenerateSwixPackageAuthoring(light.OutputFile, + !string.IsNullOrWhiteSpace(swixPackageId) ? swixPackageId : + $"{nupkg.Id.Replace(ShortNames)}.{nupkg.Version}", platform); if (!string.IsNullOrWhiteSpace(swixProject)) { - msi.SetMetadata("SwixProject", swixProject); + msi.SetMetadata(Metadata.SwixProject, swixProject); } } @@ -232,10 +259,9 @@ private string GenerateSwixPackageAuthoring(string msiPath, string packageId, st IntermediateBaseOutputPath = this.IntermediateBaseOutputPath, PackageName = packageId, MsiPath = msiPath, + BuildEngine = this.BuildEngine, }; - swixTask.BuildEngine = BuildEngine; - if (!swixTask.Execute()) { Log.LogError($"Failed to generate SWIX authoring for '{msiPath}'"); diff --git a/src/Microsoft.DotNet.Build.Tasks.Workloads/src/GenerateVisualStudioMsiPackageProject.cs b/src/Microsoft.DotNet.Build.Tasks.Workloads/src/GenerateVisualStudioMsiPackageProject.cs index 75d0c576eb2..e1583969a02 100644 --- a/src/Microsoft.DotNet.Build.Tasks.Workloads/src/GenerateVisualStudioMsiPackageProject.cs +++ b/src/Microsoft.DotNet.Build.Tasks.Workloads/src/GenerateVisualStudioMsiPackageProject.cs @@ -4,9 +4,8 @@ using System; using System.Collections.Generic; using System.IO; -using Microsoft.Build.Framework; -using Microsoft.Build.Utilities; using System.Text; +using Microsoft.Build.Framework; namespace Microsoft.DotNet.Build.Tasks.Workloads { @@ -82,6 +81,15 @@ internal long InstallSize set; } + /// + /// The product architecture to which the package applies, the default is neutral. + /// + internal string ProductArch + { + get; + set; + } = "neutral"; + public override bool Execute() { try @@ -98,9 +106,10 @@ public override bool Execute() string swixSourceDirectory = Path.Combine(SwixDirectory, PackageName, Chip); string msiSwr = EmbeddedTemplates.Extract("msi.swr", swixSourceDirectory); - string msiSwixProj = EmbeddedTemplates.Extract("msi.swixproj", swixSourceDirectory, $"{PackageName}.{Version.ToString(3)}.{Chip}.swixproj"); + string fullProjectName = $"{PackageName}.{Version.ToString(3)}.{Chip}"; + string msiSwixProj = EmbeddedTemplates.Extract("msi.swixproj", swixSourceDirectory, $"{Utils.GetHash(fullProjectName, "MD5")}.swixproj"); - FileInfo msiInfo = new (MsiPath); + FileInfo msiInfo = new(MsiPath); PayloadSize = msiInfo.Length; InstallSize = MsiUtils.GetInstallSize(MsiPath); Log.LogMessage($"MSI payload size: {PayloadSize}, install size (estimated): {InstallSize} "); @@ -127,6 +136,7 @@ private Dictionary GetReplacementTokens() {"__VS_PACKAGE_VERSION__", Version.ToString() }, {"__VS_PACKAGE_CHIP__", Chip }, {"__VS_PACKAGE_INSTALL_SIZE_SYSTEM_DRIVE__", $"{InstallSize}"}, + {"__VS_PACKAGE_PRODUCT_ARCH__", $"{ProductArch}" }, {"__VS_PAYLOAD_SOURCE__", MsiPath }, {"__VS_PAYLOAD_SIZE__", $"{PayloadSize}" }, }; diff --git a/src/Microsoft.DotNet.Build.Tasks.Workloads/src/GenerateVisualStudioWorkload.cs b/src/Microsoft.DotNet.Build.Tasks.Workloads/src/GenerateVisualStudioWorkload.cs index ead8941848f..e590fdfe609 100644 --- a/src/Microsoft.DotNet.Build.Tasks.Workloads/src/GenerateVisualStudioWorkload.cs +++ b/src/Microsoft.DotNet.Build.Tasks.Workloads/src/GenerateVisualStudioWorkload.cs @@ -5,12 +5,11 @@ using System.Collections.Generic; using System.IO; using System.Linq; -using System.Threading; using Microsoft.Build.Framework; using Microsoft.Build.Utilities; using Microsoft.NET.Sdk.WorkloadManifestReader; -namespace Microsoft.DotNet.Build.Tasks.Workloads.src +namespace Microsoft.DotNet.Build.Tasks.Workloads { /// /// MSBuild task for generating Visual Studio component projects representing @@ -18,6 +17,70 @@ namespace Microsoft.DotNet.Build.Tasks.Workloads.src /// public class GenerateVisualStudioWorkload : GenerateTaskBase { + /// + /// An item group used to provide a customized title, description, and category for a specific workload ID in Visual Studio. + /// Workloads only define a description. Visual Studio defines a separate title (checkbox text) and description (checkbox tooltip). + /// + public ITaskItem[] ComponentResources + { + get; + set; + } + + /// + /// The version of the component in the Visual Studio manifest. If no version is specified, + /// the manifest version is used. + /// + public string ComponentVersion + { + get; + set; + } + + /// + /// Gets or sets whether MSIs for workload packs will be generated. When set to , only + /// Visual Studio component authoring files are generated. + /// + public bool GenerateMsis + { + get; + set; + } = true; + + /// + /// Set of missing workload pack packages. + /// + [Output] + public ITaskItem[] MissingPacks + { + get; + set; + } = Array.Empty(); + + public string OutputPath + { + get; + set; + } + + /// + /// The path where the workload-pack packages referenced by the workload manifests are located. + /// + public string PackagesPath + { + get; + set; + } + + /// + /// An item group containing information to shorten the names of packages. + /// + public ITaskItem[] ShortNames + { + get; + set; + } + /// /// The workload manifest files to use for generating the Visual Studio components. /// @@ -37,7 +100,7 @@ public ITaskItem[] WorkloadPackages } /// - /// + /// The paths of the generated .swixproj files. /// [Output] public ITaskItem[] SwixProjects @@ -50,14 +113,19 @@ public override bool Execute() { try { - List swixProjects = new(); - - foreach (ITaskItem workloadPackage in WorkloadPackages) + if (WorkloadManifests != null) { - swixProjects.AddRange(ProcessWorkloadManifest(workloadPackage.GetMetadata("FullPath"))); + SwixProjects = GenerateSwixProjects(WorkloadManifests); + } + else if (WorkloadPackages != null) + { + SwixProjects = GenerateSwixProjects(GetManifestsFromManifestPackages(WorkloadPackages)); + } + else + { + Log.LogError($"Either {nameof(WorkloadPackages)} or {nameof(WorkloadManifests)} item must be non-empty"); + return false; } - - SwixProjects = swixProjects.ToArray(); } catch (Exception e) { @@ -68,13 +136,94 @@ public override bool Execute() return !Log.HasLoggedErrors; } + ITaskItem[] GenerateSwixProjects(ITaskItem[] workloadManifests) + { + List swixProjects = new(); + + // Generate the MSIs first to see if we have missing packs so we can remove + // those dependencies from the components. + if (GenerateMsis) + { + Log?.LogMessage(MessageImportance.Low, "Generating MSIs..."); + // Generate MSIs for workload packs and add their .swixproj files + swixProjects.AddRange(GenerateMsisFromManifests(workloadManifests)); + } + + foreach (ITaskItem workloadManifest in workloadManifests) + { + swixProjects.AddRange(ProcessWorkloadManifestFile(workloadManifest.GetMetadata("FullPath"))); + } + + return swixProjects.ToArray(); + } + + internal IEnumerable GenerateMsisFromManifests(ITaskItem[] workloadManifests) + { + GenerateWorkloadMsis msiTask = new() + { + BuildEngine = this.BuildEngine, + GenerateSwixAuthoring = true, + IntermediateBaseOutputPath = this.IntermediateBaseOutputPath, + OutputPath = this.OutputPath, + PackagesPath = this.PackagesPath, + ShortNames = this.ShortNames, + WixToolsetPath = this.WixToolsetPath, + WorkloadManifests = workloadManifests + }; + + if (!msiTask.Execute()) + { + Log?.LogError($"Failed to generate MSIs for workload packs."); + return Enumerable.Empty(); + } + else + { + if (msiTask.MissingPacks != null) + { + MissingPacks = msiTask.MissingPacks; + + foreach (ITaskItem item in MissingPacks) + { + Log?.LogWarning($"Unable to locate '{item.GetMetadata(Metadata.SourcePackage)}'. Short name: {item.GetMetadata(Metadata.ShortName)}, Platform: {item.GetMetadata(Metadata.Platform)}, Workload Pack: ({item.ItemSpec})."); + } + } + + return msiTask.Msis.Select(m => new TaskItem(m.GetMetadata(Metadata.SwixProject))); + } + } + + internal IEnumerable ProcessWorkloadManifestFile(string workloadManifestJsonPath) + { + WorkloadManifest manifest = WorkloadManifestReader.ReadWorkloadManifest(Path.GetFileNameWithoutExtension(workloadManifestJsonPath), File.OpenRead(workloadManifestJsonPath)); + + List swixProjects = new(); + + foreach (WorkloadDefinition workloadDefinition in manifest.Workloads.Values) + { + // Each workload maps to a Visual Studio component. + VisualStudioComponent component = VisualStudioComponent.Create(Log, manifest, workloadDefinition, + ComponentVersion, ShortNames, ComponentResources, MissingPacks); + + // If there are no dependencies, regardless of whether we are generating MSIs, we'll report an + // error as we'd produce invalid SWIX. + if (!component.HasDependencies) + { + Log?.LogError($"Visual Studio components '{component.Name}' must have at least one dependency."); + } + + swixProjects.Add(component.Generate(Path.Combine(SourceDirectory, $"{workloadDefinition.Id}.{manifest.Version}.0"))); + } + + return swixProjects; + } + /// /// Extracts the workload manifest from the manifest package and generate a SWIX project for a Visual Studio component /// matching the manifests dependencies. /// /// The path of the workload package containing the manifest. /// A set of items containing the generated SWIX projects. - internal IEnumerable ProcessWorkloadManifest(string workloadManifestPackage) + internal IEnumerable ProcessWorkloadManifestPackage(string workloadManifestPackage) { NugetPackage workloadPackage = new(workloadManifestPackage, Log); @@ -87,17 +236,31 @@ internal IEnumerable ProcessWorkloadManifest(string workloadManifestP throw new FileNotFoundException($"Unable to locate WorkloadManifest.json under '{packageContentPath}'."); } - WorkloadManifest manifest = WorkloadManifestReader.ReadWorkloadManifest(File.OpenRead(workloadManifestJsonPath)); + return ProcessWorkloadManifestFile(workloadManifestJsonPath); + } - List swixProjects = new(); - - foreach (WorkloadDefinition workloadDefinition in manifest.Workloads.Values) + internal ITaskItem[] GetManifestsFromManifestPackages(ITaskItem[] workloadPackages) + { + List manifests = new(); + + foreach (ITaskItem item in workloadPackages) { - VisualStudioComponent component = VisualStudioComponent.Create(manifest, workloadDefinition); - swixProjects.Add(component.Generate(Path.Combine(SourceDirectory, $"{workloadDefinition.Id}.{manifest.Version}.0"))); + NugetPackage workloadPackage = new(item.GetMetadata("FullPath"), Log); + string packageContentPath = Path.Combine(PackageDirectory, $"{workloadPackage.Identity}"); + workloadPackage.Extract(packageContentPath, Enumerable.Empty()); + string workloadManifestJsonPath = Directory.GetFiles(packageContentPath, "WorkloadManifest.json").FirstOrDefault(); + + if (string.IsNullOrWhiteSpace(workloadManifestJsonPath)) + { + throw new FileNotFoundException($"Unable to locate WorkloadManifest.json under '{packageContentPath}'."); + } + + Log?.LogMessage(MessageImportance.Low, $"Adding manifest: {workloadManifestJsonPath}"); + + manifests.Add(new TaskItem(workloadManifestJsonPath)); } - return swixProjects; + return manifests.ToArray(); } } } diff --git a/src/Microsoft.DotNet.Build.Tasks.Workloads/src/GenerateWorkloadMsis.cs b/src/Microsoft.DotNet.Build.Tasks.Workloads/src/GenerateWorkloadMsis.cs index 563a8bb9be3..375071c27fc 100644 --- a/src/Microsoft.DotNet.Build.Tasks.Workloads/src/GenerateWorkloadMsis.cs +++ b/src/Microsoft.DotNet.Build.Tasks.Workloads/src/GenerateWorkloadMsis.cs @@ -28,7 +28,7 @@ public ITaskItem[] WorkloadManifests } /// - /// The path where the packages referenced by the manifest files are located. + /// The path where the workload-pack packages referenced by the manifest files are located. /// public string PackagesPath { @@ -36,11 +36,22 @@ public string PackagesPath set; } + /// + /// Gets the set of missing workload packs. + /// + [Output] + public ITaskItem[] MissingPacks + { + get; + set; + } + public override bool Execute() { try { List msis = new(); + List missingPacks = new(); if (string.IsNullOrWhiteSpace(PackagesPath)) { @@ -48,18 +59,37 @@ public override bool Execute() return false; } - foreach (WorkloadPack pack in GetWorkloadPacks()) + // Each pack maps to multiple packs and different MSI packages. We considering a pack + // to be missing when none of its dependent MSIs were found/generated. + IEnumerable workloadPacks = GetWorkloadPacks(); + List missingPackIds = new(workloadPacks.Select(p => $"{p.Id}")); + + foreach (WorkloadPack pack in workloadPacks) { Log.LogMessage($"Processing workload pack: {pack.Id}, Version: {pack.Version}"); foreach ((string sourcePackage, string[] platforms) in GetSourcePackages(pack)) { - // Always select the pack ID for the VS MSI package. - msis.AddRange(Generate(sourcePackage, $"{pack.Id}", OutputPath, GetInstallDir(pack.Kind), platforms)); + if (!File.Exists(sourcePackage)) + { + Log?.LogWarning($"Workload pack package does not exist: {sourcePackage}"); + continue; + } + + missingPackIds.Remove(pack.Id.ToString()); + + // Swix package is always versioned to support upgrading SxS installs. The pack alias will be + // used for individual MSIs + string swixPackageId = $"{pack.Id.ToString().Replace(ShortNames)}.{pack.Version}"; + + // Always select the pack ID for the VS MSI package, even when aliased. + msis.AddRange(Generate(sourcePackage, swixPackageId, + OutputPath, GetInstallDir(pack.Kind), platforms)); } } Msis = msis.ToArray(); + MissingPacks = missingPackIds.Select(p => new TaskItem(p)).ToArray(); } catch (Exception e) { @@ -74,13 +104,18 @@ private IEnumerable GetWorkloadPacks() { // We need to track duplicate packs so we only generate MSIs once. We'll key off the pack ID and version. IEnumerable manifests = WorkloadManifests.Select( - w => WorkloadManifestReader.ReadWorkloadManifest(File.OpenRead(w.ItemSpec))); + w => WorkloadManifestReader.ReadWorkloadManifest(Path.GetFileNameWithoutExtension(w.ItemSpec), File.OpenRead(w.ItemSpec))); return manifests.SelectMany(m => m.Packs.Values).GroupBy(x => new { x.Id, x.Version }). Select(g => g.First()); } - private IEnumerable<(string, string[])> GetSourcePackages(WorkloadPack pack) + /// + /// Gets the packages associated with a specific workload pack. + /// + /// + /// An enumerable of tuples. Each tuple contains the full path of the NuGet package and the target platforms. + internal IEnumerable<(string, string[])> GetSourcePackages(WorkloadPack pack) { if (pack.IsAlias) { diff --git a/src/Microsoft.DotNet.Build.Tasks.Workloads/src/Metadata.cs b/src/Microsoft.DotNet.Build.Tasks.Workloads/src/Metadata.cs new file mode 100644 index 00000000000..ae45d44be14 --- /dev/null +++ b/src/Microsoft.DotNet.Build.Tasks.Workloads/src/Metadata.cs @@ -0,0 +1,19 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +namespace Microsoft.DotNet.Build.Tasks.Workloads +{ + internal class Metadata + { + public const string AliasTo = "AliasTo"; + public const string Category = "Category"; + public const string Description = "Description"; + public const string Platform = "Platform"; + public const string Replacement = "Replacement"; + public const string ShortName = "ShortName"; + public const string SourcePackage = "SourcePackage"; + public const string SwixProject = "SwixProject"; + public const string Title = "Title"; + public const string Version = "Version"; + } +} diff --git a/src/Microsoft.DotNet.Build.Tasks.Workloads/src/Microsoft.DotNet.Build.Tasks.Workloads.csproj b/src/Microsoft.DotNet.Build.Tasks.Workloads/src/Microsoft.DotNet.Build.Tasks.Workloads.csproj index 367c432da07..824ba35510e 100644 --- a/src/Microsoft.DotNet.Build.Tasks.Workloads/src/Microsoft.DotNet.Build.Tasks.Workloads.csproj +++ b/src/Microsoft.DotNet.Build.Tasks.Workloads/src/Microsoft.DotNet.Build.Tasks.Workloads.csproj @@ -1,7 +1,7 @@ - net472 + net472;netcoreapp3.1 true Latest true diff --git a/src/Microsoft.DotNet.Build.Tasks.Workloads/src/MsiTemplate/Product.wxs b/src/Microsoft.DotNet.Build.Tasks.Workloads/src/MsiTemplate/Product.wxs index 3ee2a5a7762..98d2a78515c 100644 --- a/src/Microsoft.DotNet.Build.Tasks.Workloads/src/MsiTemplate/Product.wxs +++ b/src/Microsoft.DotNet.Build.Tasks.Workloads/src/MsiTemplate/Product.wxs @@ -20,7 +20,7 @@ - + diff --git a/src/Microsoft.DotNet.Build.Tasks.Workloads/src/MsiUtils.cs b/src/Microsoft.DotNet.Build.Tasks.Workloads/src/MsiUtils.cs index 3b017d199c6..caa99c8170c 100644 --- a/src/Microsoft.DotNet.Build.Tasks.Workloads/src/MsiUtils.cs +++ b/src/Microsoft.DotNet.Build.Tasks.Workloads/src/MsiUtils.cs @@ -4,10 +4,8 @@ using System; using System.Collections.Generic; using System.Linq; -using System.Text; -using System.Threading.Tasks; -using Microsoft.Deployment.WindowsInstaller.Package; using Microsoft.Deployment.WindowsInstaller; +using Microsoft.Deployment.WindowsInstaller.Package; namespace Microsoft.DotNet.Build.Tasks.Workloads { @@ -17,10 +15,10 @@ public class MsiUtils public static IEnumerable GetAllFiles(string packagePath) { - using InstallPackage ip = new InstallPackage(packagePath, DatabaseOpenMode.ReadOnly); - using Database db = new Database(packagePath, DatabaseOpenMode.ReadOnly); + using InstallPackage ip = new(packagePath, DatabaseOpenMode.ReadOnly); + using Database db = new(packagePath, DatabaseOpenMode.ReadOnly); using View fileView = db.OpenView(_getFilesQuery); - List files = new List(); + List files = new(); fileView.Execute(); foreach (Record file in fileView) @@ -33,7 +31,7 @@ public static IEnumerable GetAllFiles(string packagePath) public static string GetProperty(string packagePath, string property) { - using InstallPackage ip = new InstallPackage(packagePath, DatabaseOpenMode.ReadOnly); + using InstallPackage ip = new(packagePath, DatabaseOpenMode.ReadOnly); return ip.Property[property]; } diff --git a/src/Microsoft.DotNet.Build.Tasks.Workloads/src/NuGetPackage.cs b/src/Microsoft.DotNet.Build.Tasks.Workloads/src/NuGetPackage.cs index 9a31a2afd26..a9b9c299425 100644 --- a/src/Microsoft.DotNet.Build.Tasks.Workloads/src/NuGetPackage.cs +++ b/src/Microsoft.DotNet.Build.Tasks.Workloads/src/NuGetPackage.cs @@ -1,17 +1,16 @@ // Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. -using System; using System.Collections.Generic; -using System.Linq; using System.IO; -using System.Text.RegularExpressions; using System.IO.Compression; +using System.Linq; +using System.Text.RegularExpressions; +using Microsoft.Build.Framework; +using Microsoft.Build.Utilities; using NuGet.Packaging; using NuGet.Packaging.Core; using NuGet.Versioning; -using Microsoft.Build.Framework; -using Microsoft.Build.Utilities; namespace Microsoft.DotNet.Build.Tasks.Workloads { @@ -41,6 +40,11 @@ public PackageIdentity Identity get; } + public string LicenseUrl + { + get; + } + public string PackagePath { get; @@ -73,6 +77,7 @@ public NugetPackage(string packagePath, TaskLoggingHelper log) Identity = nuspecReader.GetIdentity(); Title = nuspecReader.GetTitle(); Authors = nuspecReader.GetAuthors(); + LicenseUrl = nuspecReader.GetLicenseUrl(); } /// diff --git a/src/Microsoft.DotNet.Build.Tasks.Workloads/src/StringExtensions.cs b/src/Microsoft.DotNet.Build.Tasks.Workloads/src/StringExtensions.cs new file mode 100644 index 00000000000..a48d04655bb --- /dev/null +++ b/src/Microsoft.DotNet.Build.Tasks.Workloads/src/StringExtensions.cs @@ -0,0 +1,46 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Microsoft.Build.Framework; +using Microsoft.Build.Utilities; +using Microsoft.Build.Tasks; + +namespace Microsoft.DotNet.Build.Tasks.Workloads +{ + public static class StringExtensions + { + public static string TrimStart(this string str, string trimString) + { + return str.StartsWith(trimString) ? str.Remove(0, trimString.Length) : str; + } + + public static string TrimStart(this string str, string trimString, StringComparison comparisonType) + { + return str.StartsWith(trimString, comparisonType) ? str.Remove(0, trimString.Length) : str; + } + + /// + /// Replace multiple substrings using task items. + /// + /// + /// An array of task items containing substrings and replacement strings. + /// + public static string Replace(this string str, ITaskItem[] replacementStrings) + { + if ((replacementStrings is not null) && (replacementStrings.Length > 0)) + { + foreach (ITaskItem item in replacementStrings) + { + str = str.Replace(item.ItemSpec, item.GetMetadata(Metadata.Replacement)); + } + } + + return str; + } + } +} diff --git a/src/Microsoft.DotNet.Build.Tasks.Workloads/src/SwixTemplate/msi.swr b/src/Microsoft.DotNet.Build.Tasks.Workloads/src/SwixTemplate/msi.swr index f24c2f61e52..5108da84125 100644 --- a/src/Microsoft.DotNet.Build.Tasks.Workloads/src/SwixTemplate/msi.swr +++ b/src/Microsoft.DotNet.Build.Tasks.Workloads/src/SwixTemplate/msi.swr @@ -3,7 +3,8 @@ use vs package name=__VS_PACKAGE_NAME__ version=__VS_PACKAGE_VERSION__ vs.package.chip=__VS_PACKAGE_CHIP__ - vs.package.type=msi + vs.package.productArch=__VS_PACKAGE_PRODUCT_ARCH__ + vs.package.type=msi vs.installSize SystemDrive=__VS_PACKAGE_INSTALL_SIZE_SYSTEM_DRIVE__ diff --git a/src/Microsoft.DotNet.Build.Tasks.Workloads/src/VisualStudioComponent.cs b/src/Microsoft.DotNet.Build.Tasks.Workloads/src/VisualStudioComponent.cs index 2098a162816..da7a91bf17f 100644 --- a/src/Microsoft.DotNet.Build.Tasks.Workloads/src/VisualStudioComponent.cs +++ b/src/Microsoft.DotNet.Build.Tasks.Workloads/src/VisualStudioComponent.cs @@ -4,6 +4,7 @@ using System; using System.Collections.Generic; using System.IO; +using System.Linq; using System.Text; using Microsoft.Build.Framework; using Microsoft.Build.Utilities; @@ -33,6 +34,11 @@ public string Description get; } + /// + /// Gets whether this component has any dependencies. + /// + public bool HasDependencies => Dependencies.Count > 0; + /// /// The component name (ID). /// @@ -41,6 +47,15 @@ public string Name get; } + /// + /// An item group containing information to shorten the names of packages. + /// + public ITaskItem[] ShortNames + { + get; + set; + } + /// /// The title of the component to display in the installer UI, e.g. the individual component tab. /// @@ -59,12 +74,15 @@ public Version Version private ICollection Dependencies = new List(); - public VisualStudioComponent(string name, string description, string title, Version version) + public VisualStudioComponent(string name, string description, string title, Version version, ITaskItem[] shortNames, + string category) { Name = name; Description = description; Title = title; Version = version; + ShortNames = shortNames; + Category = category; } /// @@ -92,16 +110,32 @@ public void AddDependency(VisualStudioDependency dependency) /// The dependency to add to this component. public void AddDependency(ITaskItem dependency) { - AddDependency(new VisualStudioDependency(dependency.ItemSpec, new Version(dependency.GetMetadata("Version")))); + AddDependency(new VisualStudioDependency(dependency.ItemSpec.Replace(ShortNames), new Version(dependency.GetMetadata(Metadata.Version)))); } /// /// Add a dependency using the specified workload pack. /// - /// The dependency to add to this component. - public void AddDependency(WorkloadPack dependency) + /// The dependency to add to this component. + public void AddDependency(WorkloadPack pack) { - AddDependency($"{dependency.Id}", new NuGetVersion(dependency.Version).Version); + AddDependency($"{pack.Id.ToString().Replace(ShortNames)}.{pack.Version}", new NuGetVersion(pack.Version).Version); + } + + public IEnumerable GetAliasedDependencies(WorkloadPack pack) + { + foreach (var rid in pack.AliasTo.Keys) + { + switch (rid) + { + case "win-x86": + case "win-x64": + yield return new VisualStudioDependency($"{pack.AliasTo[rid].ToString().Replace(ShortNames)}.{pack.Version}", new NuGetVersion(pack.Version).Version); + break; + default: + break; + } + } } /// @@ -145,27 +179,53 @@ private Dictionary GetReplacementTokens() {"__VS_PACKAGE_VERSION__", Version.ToString() }, {"__VS_COMPONENT_TITLE__", Title }, {"__VS_COMPONENT_DESCRIPTION__", Description }, - {"__VS_COMPONENT_CATEGORY__", Category } + {"__VS_COMPONENT_CATEGORY__", Category ?? ".NET" } }; } /// /// Creates a using a workload definition. /// - /// - /// + /// + /// + /// + /// + /// + /// /// - public static VisualStudioComponent Create(WorkloadManifest manifest, WorkloadDefinition definition) + public static VisualStudioComponent Create(TaskLoggingHelper log, WorkloadManifest manifest, WorkloadDefinition workload, string componentVersion, + ITaskItem[] shortNames, ITaskItem[] componentResources, ITaskItem[] missingPacks) { - VisualStudioComponent package = new(Utils.ToSafeId(definition.Id.ToString()), definition.Description, - definition.Description, new Version($"{manifest.Version}.0")); + log?.LogMessage("Creating Visual Studio component"); + Version version = string.IsNullOrWhiteSpace(componentVersion) ? new Version($"{manifest.Version}.0") : + new Version(componentVersion); + + ITaskItem resourceItem = componentResources?.Where( + r => string.Equals(r.ItemSpec, workload.Id.ToString(), StringComparison.OrdinalIgnoreCase)).FirstOrDefault(); + + // Workload definitions do not have separate title/description fields so the only option + // is to default to the workload description for both. + string title = resourceItem?.GetMetadata(Metadata.Title) ?? workload.Description; + string description = resourceItem?.GetMetadata(Metadata.Description) ?? workload.Description; + string category = resourceItem?.GetMetadata(Metadata.Category) ?? ".NET"; + + VisualStudioComponent component = new(Utils.ToSafeId(workload.Id.ToString()), description, + title, version, shortNames, category); + + IEnumerable missingPackIds = missingPacks.Select(p => p.ItemSpec); + log?.LogMessage(MessageImportance.Low, $"Missing packs: {string.Join(", ", missingPackIds)}"); + + // Visual Studio is case-insensitive. + IEnumerable packIds = workload.Packs.Where(p => !missingPackIds.Contains($"{p}", StringComparer.OrdinalIgnoreCase)); + log?.LogMessage(MessageImportance.Low, $"Packs: {string.Join(", ", packIds.Select(p=>$"{p}"))}"); - foreach (WorkloadPackId packId in definition.Packs) + foreach (WorkloadPackId packId in packIds) { - package.AddDependency(manifest.Packs[packId]); + log?.LogMessage(MessageImportance.Low, $"Adding component dependency for {packId} "); + component.AddDependency(manifest.Packs[packId]); } - return package; + return component; } } } From 08e48f6beab7b5286b281b7924fcc891b7450500 Mon Sep 17 00:00:00 2001 From: Matt Mitchell Date: Thu, 6 May 2021 12:44:34 -0700 Subject: [PATCH 063/699] Fix positional parameter issue in symbols-validation (#7354) I added a parameter for WindowsPdbVerification to the code block, but then called the code block with the parameter in the wrong place. I am very sorry and won't do it again. Verified that the script works as expected now. --- eng/common/post-build/symbols-validation.ps1 | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/eng/common/post-build/symbols-validation.ps1 b/eng/common/post-build/symbols-validation.ps1 index 788321d773d..f26f6de81f0 100644 --- a/eng/common/post-build/symbols-validation.ps1 +++ b/eng/common/post-build/symbols-validation.ps1 @@ -114,6 +114,7 @@ $CountMissingSymbols = { $totalRetries = 0 while ($totalRetries -lt $using:MaxRetry) { + # Save the output and get diagnostic output $output = & $dotnetSymbolExe --symbols --modules $WindowsPdbVerificationParam $TargetServerParam $FullPath -o $SymbolsPath --diagnostics | Out-String @@ -144,8 +145,16 @@ $CountMissingSymbols = { return $null } - $SymbolsOnMSDL = & $FirstMatchingSymbolDescriptionOrDefault $FileName '--microsoft-symbol-server' $SymbolsPath $WindowsPdbVerificationParam - $SymbolsOnSymWeb = & $FirstMatchingSymbolDescriptionOrDefault $FileName '--internal-server' $SymbolsPath $WindowsPdbVerificationParam + $SymbolsOnMSDL = & $FirstMatchingSymbolDescriptionOrDefault ` + -FullPath $FileName ` + -TargetServerParam '--microsoft-symbol-server' ` + -SymbolsPath $SymbolsPath ` + -WindowsPdbVerificationParam $WindowsPdbVerificationParam + $SymbolsOnSymWeb = & $FirstMatchingSymbolDescriptionOrDefault ` + -FullPath $FileName ` + -TargetServerParam '--internal-server' ` + -SymbolsPath $SymbolsPath ` + -WindowsPdbVerificationParam $WindowsPdbVerificationParam Write-Host -NoNewLine "`t Checking file " $FileName "... " From 3094203c203fdbd77c2ba43578a1a8f92e1b467d Mon Sep 17 00:00:00 2001 From: Jeremy Koritzinsky Date: Thu, 6 May 2021 14:14:22 -0700 Subject: [PATCH 064/699] Limit the version range for the VS generator to versions that CMake currently understands. (#7342) --- .../build/Microsoft.DotNet.CMake.Sdk.targets | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/Microsoft.DotNet.CMake.Sdk/build/Microsoft.DotNet.CMake.Sdk.targets b/src/Microsoft.DotNet.CMake.Sdk/build/Microsoft.DotNet.CMake.Sdk.targets index f8b6cc87f79..89299a0672d 100644 --- a/src/Microsoft.DotNet.CMake.Sdk/build/Microsoft.DotNet.CMake.Sdk.targets +++ b/src/Microsoft.DotNet.CMake.Sdk/build/Microsoft.DotNet.CMake.Sdk.targets @@ -30,6 +30,8 @@ <_CMakeMultiConfigurationGenerator>true <_CMakePassArchitectureToGenerator>true + + [,17.0) Win32 @@ -37,7 +39,7 @@ From f1e67a4d97c955a1f6ff2e5e609e49faa953f516 Mon Sep 17 00:00:00 2001 From: Epsitha Ananth <47157394+epananth@users.noreply.github.com> Date: Thu, 6 May 2021 14:30:09 -0700 Subject: [PATCH 065/699] Upped timeout and added logs for downloading and publishing operation (#7351) * increased http timeout and added more logging around download and publishing operations --- .../src/PublishArtifactsInManifestBase.cs | 37 +++++++++++++++++-- 1 file changed, 34 insertions(+), 3 deletions(-) diff --git a/src/Microsoft.DotNet.Build.Tasks.Feed/src/PublishArtifactsInManifestBase.cs b/src/Microsoft.DotNet.Build.Tasks.Feed/src/PublishArtifactsInManifestBase.cs index fed9ab0bdee..7fbd6aebb18 100644 --- a/src/Microsoft.DotNet.Build.Tasks.Feed/src/PublishArtifactsInManifestBase.cs +++ b/src/Microsoft.DotNet.Build.Tasks.Feed/src/PublishArtifactsInManifestBase.cs @@ -6,6 +6,7 @@ using System.Collections.Generic; using System.Collections.Immutable; using System.ComponentModel; +using System.Diagnostics; using System.IO; using System.Linq; using System.Net; @@ -191,7 +192,7 @@ private enum ArtifactName BlobArtifacts } - private int TimeoutInSeconds = 180; + private int TimeoutInSeconds = 300; public override bool Execute() { @@ -418,6 +419,7 @@ public async Task PublishSymbolsUsingStreamingAsync( { using (HttpClient client = CreateAzdoClient(AzureDevOpsOrg, true)) { + client.Timeout = TimeSpan.FromSeconds(TimeoutInSeconds); await Task.WhenAll(symbolsToPublish.Select(async symbol => { try @@ -427,13 +429,18 @@ await Task.WhenAll(symbolsToPublish.Select(async symbol => string localSymbolPath = Path.Combine(temporarySymbolsDirectory, symbol); symbolLog.AppendLine($"Downloading symbol : {symbol} to {localSymbolPath}"); + Stopwatch gatherDownloadTime = Stopwatch.StartNew(); await DownloadFileAsync( client, ArtifactName.BlobArtifacts, containerId, symbol, localSymbolPath); + + gatherDownloadTime.Stop(); + symbolLog.AppendLine($"Time taken to download file to '{localSymbolPath}' is {gatherDownloadTime.ElapsedMilliseconds / 1000.0} (seconds)"); symbolLog.AppendLine($"Successfully downloaded symbol : {symbol} to {localSymbolPath}"); + List symbolFiles = new List(); symbolFiles.Add(localSymbolPath); symbolLog.AppendLine($"Uploading symbol file '{string.Join(",", symbolFiles)}'"); @@ -443,6 +450,7 @@ await DownloadFileAsync( var serverPath = server.Key; var token = server.Value; symbolLog.AppendLine($"Publishing symbol file {symbol} to {serverPath}:"); + Stopwatch gatherSymbolPublishingTime = Stopwatch.StartNew(); try { @@ -465,6 +473,10 @@ await PublishSymbolsHelper.PublishAsync( { Log.LogError(ex.Message); } + + gatherSymbolPublishingTime.Stop(); + symbolLog.AppendLine( + $"Symbol publishing for {symbol} took {gatherSymbolPublishingTime.ElapsedMilliseconds / 1000.0} (seconds)"); } DeleteTemporaryDirectory(temporarySymbolsDirectory); @@ -1148,6 +1160,7 @@ await Task.WhenAll(packagesToPublish.Select(async package => Log.LogMessage(MessageImportance.Low, $"Downloading package : {packageFilename} to {localPackagePath}"); + Stopwatch gatherPackageDownloadTime = Stopwatch.StartNew(); await DownloadFileAsync( client, ArtifactName.PackageArtifacts, @@ -1162,6 +1175,8 @@ await DownloadFileAsync( return; } + gatherPackageDownloadTime.Stop(); + Log.LogMessage(MessageImportance.Low, $"Time taken to download file to '{localPackagePath}' is {gatherPackageDownloadTime.ElapsedMilliseconds / 1000.0} (seconds)"); Log.LogMessage(MessageImportance.Low, $"Successfully downloaded package : {packageFilename} to {localPackagePath}"); @@ -1183,7 +1198,10 @@ await DownloadFileAsync( Convert.ToBase64String( Encoding.ASCII.GetBytes(string.Format("{0}:{1}", "", feedConfig.Token)))); + Stopwatch gatherPackagePublishingTime = Stopwatch.StartNew(); await PushPackageToNugetFeed(httpClient, feedConfig, localPackagePath, package.Id, package.Version); + gatherPackagePublishingTime.Stop(); + Log.LogMessage(MessageImportance.Low,$"Publishing package {localPackagePath} took {gatherPackagePublishingTime.ElapsedMilliseconds / 1000.0} (seconds)"); DeleteTemporaryDirectory(localPackagePath); } @@ -1243,7 +1261,7 @@ public async Task PushNugetPackagesAsync( using (HttpClient httpClient = new HttpClient(new HttpClientHandler {CheckCertificateRevocationList = true})) { - httpClient.Timeout = TimeSpan.FromSeconds(180); + httpClient.Timeout = TimeSpan.FromSeconds(TimeoutInSeconds); httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue( "Basic", Convert.ToBase64String(Encoding.ASCII.GetBytes(string.Format("{0}:{1}", "", feedConfig.Token)))); @@ -1500,6 +1518,7 @@ await Task.WhenAll(blobsToPublish.Select(async blob => string localBlobPath = Path.Combine(temporaryBlobDirectory, fileName); Log.LogMessage(MessageImportance.Low, $"Downloading blob : {fileName} to {localBlobPath}"); + Stopwatch gatherBlobDownloadTime = Stopwatch.StartNew(); await DownloadFileAsync( client, ArtifactName.BlobArtifacts, @@ -1511,6 +1530,8 @@ await DownloadFileAsync( { Log.LogError($"Could not locate '{blob.Id} at '{localBlobPath}'"); } + gatherBlobDownloadTime.Stop(); + Log.LogMessage(MessageImportance.Low, $"Time taken to download file to '{localBlobPath}' is {gatherBlobDownloadTime.ElapsedMilliseconds / 1000.0} (seconds)"); Log.LogMessage(MessageImportance.Low, $"Successfully downloaded blob : {fileName} to {localBlobPath}"); @@ -1524,11 +1545,14 @@ await DownloadFileAsync( version = packageIdentity.Version.ToString(); } + Stopwatch gatherBlobPublishingTime = Stopwatch.StartNew(); await PushBlobToNugetFeed( feedConfig, localBlobPath, id, version); + gatherBlobPublishingTime.Stop(); + Log.LogMessage(MessageImportance.Low, $"Time taken to publish blob {localBlobPath} is {gatherBlobPublishingTime.ElapsedMilliseconds / 1000.0} (seconds)"); DeleteTemporaryDirectory(temporaryBlobDirectory); } @@ -1556,7 +1580,7 @@ private async Task PushBlobToNugetFeed(TargetFeedConfig feedConfig, string local using HttpClient httpClient = new HttpClient(new HttpClientHandler {CheckCertificateRevocationList = true}); - httpClient.Timeout = TimeSpan.FromSeconds(180); + httpClient.Timeout = TimeSpan.FromSeconds(TimeoutInSeconds); httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue( "Basic", Convert.ToBase64String( @@ -1656,6 +1680,7 @@ await Task.WhenAll(blobsToPublish.Select(async blob => var localBlobPath = Path.Combine(temporaryBlobDirectory, fileName); Log.LogMessage(MessageImportance.Low, $"Downloading blob : {fileName} to {localBlobPath}"); + Stopwatch gatherBlobDownloadTime = Stopwatch.StartNew(); await DownloadFileAsync( client, ArtifactName.BlobArtifacts, @@ -1667,6 +1692,8 @@ await DownloadFileAsync( { Log.LogError($"Could not locate '{blob.Id} at '{localBlobPath}'"); } + gatherBlobDownloadTime.Stop(); + Log.LogMessage(MessageImportance.Low, $"Time taken to download file to '{localBlobPath}' is {gatherBlobDownloadTime.ElapsedMilliseconds / 1000.0} (seconds)"); Log.LogMessage(MessageImportance.Low, $"Successfully downloaded blob : {fileName} to {localBlobPath}"); @@ -1684,7 +1711,11 @@ await DownloadFileAsync( feedConfig, AddAssetLocationToAssetAssetLocationType.Container); + Stopwatch gatherBlobPublishingTime = Stopwatch.StartNew(); await blobFeedAction.UploadAssetAsync(item, pushOptions, null); + gatherBlobPublishingTime.Stop(); + Log.LogMessage(MessageImportance.Low,$"Publishing {item.ItemSpec} completed in {gatherBlobPublishingTime.ElapsedMilliseconds / 1000.0} (seconds)"); + DeleteTemporaryDirectory(temporaryBlobDirectory); } finally From 54518f24e4ea05ab97d259d5af9d57467879579d Mon Sep 17 00:00:00 2001 From: Michelle McDaniel Date: Thu, 6 May 2021 15:23:40 -0700 Subject: [PATCH 066/699] Add public symbols feed override option (#7355) * Allow for the override of the public feed for symbols Symbols nupkg feeds were either the static symbols feed provided if a build was internal, or the legacy feed otherwise. We need to be able to also override the public feed in post-signing publishing. This adds the ability to override in the public case. --- .../tools/SdkTasks/PublishArtifactsInManifest.proj | 1 + .../src/PublishArtifactsInManifest.cs | 3 +++ .../src/PublishArtifactsInManifestV3.cs | 3 +++ .../src/model/SetupTargetFeedConfigV3.cs | 10 ++++++++++ 4 files changed, 17 insertions(+) diff --git a/src/Microsoft.DotNet.Arcade.Sdk/tools/SdkTasks/PublishArtifactsInManifest.proj b/src/Microsoft.DotNet.Arcade.Sdk/tools/SdkTasks/PublishArtifactsInManifest.proj index 28d23ef95c2..fa4778f6aea 100644 --- a/src/Microsoft.DotNet.Arcade.Sdk/tools/SdkTasks/PublishArtifactsInManifest.proj +++ b/src/Microsoft.DotNet.Arcade.Sdk/tools/SdkTasks/PublishArtifactsInManifest.proj @@ -154,6 +154,7 @@ TransportFeedOverride="$(TransportFeedOverride)" ShippingFeedOverride="$(ShippingFeedOverride)" SymbolsFeedOverride="$(SymbolsFeedOverride)" + PublicSymbolsFeedOverride="$(PublicSymbolsFeedOverride)" AzdoApiToken="$(AzdoApiToken)" ArtifactsBasePath="$(ArtifactsBasePath)" BuildId="$(BuildId)" diff --git a/src/Microsoft.DotNet.Build.Tasks.Feed/src/PublishArtifactsInManifest.cs b/src/Microsoft.DotNet.Build.Tasks.Feed/src/PublishArtifactsInManifest.cs index ee706c1efc0..0cdbd667c59 100644 --- a/src/Microsoft.DotNet.Build.Tasks.Feed/src/PublishArtifactsInManifest.cs +++ b/src/Microsoft.DotNet.Build.Tasks.Feed/src/PublishArtifactsInManifest.cs @@ -129,6 +129,8 @@ public class PublishArtifactsInManifest : MSBuildTaskBase public string SymbolsFeedOverride { get; set; } + public string PublicSymbolsFeedOverride { get; set; } + /// /// Path to dll and pdb files /// @@ -381,6 +383,7 @@ internal PublishArtifactsInManifestBase ConstructPublishingV3Task(BuildModel bui ShippingFeedOverride = this.ShippingFeedOverride, TransportFeedOverride = this.TransportFeedOverride, SymbolsFeedOverride = this.SymbolsFeedOverride, + PublicSymbolsFeedOverride = this.PublicSymbolsFeedOverride, ArtifactsBasePath = this.ArtifactsBasePath, AzdoApiToken = this.AzdoApiToken, BuildId = this.BuildId, diff --git a/src/Microsoft.DotNet.Build.Tasks.Feed/src/PublishArtifactsInManifestV3.cs b/src/Microsoft.DotNet.Build.Tasks.Feed/src/PublishArtifactsInManifestV3.cs index c9f2e7a0610..1f8f61d3f2c 100644 --- a/src/Microsoft.DotNet.Build.Tasks.Feed/src/PublishArtifactsInManifestV3.cs +++ b/src/Microsoft.DotNet.Build.Tasks.Feed/src/PublishArtifactsInManifestV3.cs @@ -64,6 +64,8 @@ public class PublishArtifactsInManifestV3 : PublishArtifactsInManifestBase public string SymbolsFeedOverride { get; set; } + public string PublicSymbolsFeedOverride { get; set; } + public override bool Execute() { ExecuteAsync().GetAwaiter().GetResult(); @@ -160,6 +162,7 @@ public override async Task ExecuteAsync() AzureDevOpsFeedsKey, BuildEngine = this.BuildEngine, targetChannelConfig.SymbolTargetType, + azureDevOpsPublicStaticSymbolsFeed: GetFeed(null, PublicSymbolsFeedOverride), filesToExclude: targetChannelConfig.FilenamesToExclude, flatten: targetChannelConfig.Flatten); diff --git a/src/Microsoft.DotNet.Build.Tasks.Feed/src/model/SetupTargetFeedConfigV3.cs b/src/Microsoft.DotNet.Build.Tasks.Feed/src/model/SetupTargetFeedConfigV3.cs index 58eb22fb996..b98e91740c4 100644 --- a/src/Microsoft.DotNet.Build.Tasks.Feed/src/model/SetupTargetFeedConfigV3.cs +++ b/src/Microsoft.DotNet.Build.Tasks.Feed/src/model/SetupTargetFeedConfigV3.cs @@ -29,6 +29,8 @@ public class SetupTargetFeedConfigV3 : SetupTargetFeedConfigBase private string StableSymbolsFeed { get; set; } + private string AzureDevOpsPublicStaticSymbolsFeed { get; set; } + private SymbolTargetType SymbolTargetType { get; set; } private List FilesToExclude { get; } @@ -54,6 +56,7 @@ public SetupTargetFeedConfigV3(bool isInternalBuild, SymbolTargetType symbolTargetType, string stablePackagesFeed = null, string stableSymbolsFeed = null, + string azureDevOpsPublicStaticSymbolsFeed = null, List filesToExclude = null, bool flatten = true) : base(isInternalBuild, isStableBuild, repositoryName, commitSha, azureStorageTargetFeedPAT, publishInstallersAndChecksums, installersTargetStaticFeed, installersAzureAccountKey, checksumsTargetStaticFeed, checksumsAzureAccountKey, azureDevOpsStaticShippingFeed, azureDevOpsStaticTransportFeed, azureDevOpsStaticSymbolsFeed, latestLinkShortUrlPrefix, azureDevOpsFeedsKey) @@ -62,6 +65,7 @@ public SetupTargetFeedConfigV3(bool isInternalBuild, StableSymbolsFeed = stableSymbolsFeed; StablePackagesFeed = stablePackagesFeed; SymbolTargetType = symbolTargetType; + AzureDevOpsPublicStaticSymbolsFeed = azureDevOpsPublicStaticSymbolsFeed; FilesToExclude = filesToExclude ?? new List(); Flatten = flatten; } @@ -159,6 +163,12 @@ private List NonStableFeeds() symbolsFeedType = FeedType.AzDoNugetFeed; symbolsFeedSecret = AzureDevOpsFeedsKey; } + else if (!string.IsNullOrEmpty(AzureDevOpsPublicStaticSymbolsFeed)) + { + symbolsFeed = AzureDevOpsPublicStaticSymbolsFeed; + symbolsFeedType = FeedType.AzDoNugetFeed; + symbolsFeedSecret = AzureDevOpsFeedsKey; + } else { symbolsFeed = PublishingConstants.LegacyDotNetBlobFeedURL; From f9ce6058792211e652243db3b07fa511cf83486b Mon Sep 17 00:00:00 2001 From: Matt Mitchell Date: Thu, 6 May 2021 16:15:47 -0700 Subject: [PATCH 067/699] Add the ability to use the .NET certificate with a switch (#7347) * Add the ability to use the .NET certificate with a switch A subset of arcade repositories will ship .NET 6 using a different certificate for most executable files. This leads to a question: How to specify that this cert should be used rather than Microsoft400? There are a number of options: 1. Use certificate replacement in post-build signing to switch all uses of Microsoft400 to MicrosoftDotNet500 - This has the disadvantage that if there are any binaries that still need to ship to end-customers with Microsoft400, they would get the new cert. It's also a little hacky, and certificate replacement was only intended for limited use by internal customers in specific scenarios. 2. Update default metadata in each repo that needs to switch to specify MicrosoftDotNet500 instead of Microsoft400 - This is easy to do for explicit specifications in a repo's eng/Signing.props file, but the arcade defaults are still present. They can be replaced with something like: ``` ``` However, this bit of code isn't entirely easy to understand, would have to be inserted into every repo. 3. Change the arcade default to MicrosoftDotNet500 - This has wide-ranging implications for repos that we don't want to change, at least not now. I think this will eventually be an option, but is too risky with too many unknowns right now. 4. Introduce a new property `UseDotNetCertificate` which can be set in eng/Signing.props. This causes all existing use of Microsoft400 in the repo to switch to MicrosoftDotNet500. This is the preferable for repos repos that use arcade defaults for most things (use Sign.proj and Publish.proj). The certificate metadata update happens prior to signing or encoding of the signing metadata in the manifests. Repos should use a combination of 4 and 2 for now to update to the .NET cert --- Documentation/CorePackages/Signing.md | 24 +++++++++++++++++++ .../tools/Publish.proj | 10 ++++++++ .../tools/Sign.proj | 10 ++++++++ .../tools/Sign.props | 8 +++++++ 4 files changed, 52 insertions(+) diff --git a/Documentation/CorePackages/Signing.md b/Documentation/CorePackages/Signing.md index d65de76c097..f2e8f96cdb5 100644 --- a/Documentation/CorePackages/Signing.md +++ b/Documentation/CorePackages/Signing.md @@ -223,6 +223,30 @@ Click [here](../../src/Microsoft.DotNet.Arcade.Sdk/tools/Sign.proj) to see how t ... ``` +#### 8. How can I use the .NET specific certificate for executable files? + +By default, `Microsoft400` is the cert used by default for most executable files (e.g .dll, .js, .exe). To use the .NET specific cert (`MicrosoftDotNet500`), +use one of the following approaches: + +1. Update the existing `FileExtensionSignInfo` and `StrongNameSignInfo` metadata in [Sign.props](../../src/Microsoft.DotNet.Arcade.Sdk/tools/Sign.props) +to use `MicrosoftDotNet500`. This approach must be used if some files still need to be signed with `Microsoft400`. + ``` + + + + + + + + + ``` +2. Specify the property `UseDotNetCertificate` with value `true` in your `eng/Signing.props` file. This **replaces** all existing use of `Microsoft400` with `MicrosoftDotNet500`. + ``` + + f + + ``` + ## Logs & MicroBuild configuration files The log messages from the SignToolTask itself will be included in the log (+.binlog) of the original build process. The binary log of executing the MicroBuild signing plugin will be stored in files named `SigningX.binlog` in the `LogDir` folder. The project files used to call the MicroBuild plugin will be stored in files named `RoundX.proj` in the `TempDir` folder. In both cases the `X` in the name refers to a signing round. diff --git a/src/Microsoft.DotNet.Arcade.Sdk/tools/Publish.proj b/src/Microsoft.DotNet.Arcade.Sdk/tools/Publish.proj index 558205ec53f..ae754b76748 100644 --- a/src/Microsoft.DotNet.Arcade.Sdk/tools/Publish.proj +++ b/src/Microsoft.DotNet.Arcade.Sdk/tools/Publish.proj @@ -264,6 +264,16 @@ + + + + + + + diff --git a/src/Microsoft.DotNet.Arcade.Sdk/tools/Sign.proj b/src/Microsoft.DotNet.Arcade.Sdk/tools/Sign.proj index 399d129ea5d..8bd296befef 100644 --- a/src/Microsoft.DotNet.Arcade.Sdk/tools/Sign.proj +++ b/src/Microsoft.DotNet.Arcade.Sdk/tools/Sign.proj @@ -6,6 +6,16 @@ + + + + + + + diff --git a/src/Microsoft.DotNet.Arcade.Sdk/tools/Sign.props b/src/Microsoft.DotNet.Arcade.Sdk/tools/Sign.props index d545816a66e..908cb7a9000 100644 --- a/src/Microsoft.DotNet.Arcade.Sdk/tools/Sign.props +++ b/src/Microsoft.DotNet.Arcade.Sdk/tools/Sign.props @@ -43,6 +43,14 @@ + + + MicrosoftDotNet500 + false + + + true @@ -45,7 +45,7 @@ There are some required configuration properties that need to be set for XHarnes - + ``` @@ -123,7 +123,7 @@ The Helix machines, that have devices attached to them, already contain the sign When using the Helix SDK and targeting real devices: - You have to ideally supply a non-signed app bundle - the app will be signed for you on the Helix machine where your job gets executed - Only the basic set of app permissions are supported at the moment and we cannot re-sign an app that was already signed with a different set of permissions -- Bundle id has to start with `net.dot.` since we only support those application IDs at the moment +- App bundle identifier has to start with `net.dot.` since we only support those application IDs at the moment ### Android .apk payloads diff --git a/src/Microsoft.DotNet.Helix/Sdk/tools/xharness-runner/XHarnessRunner.targets b/src/Microsoft.DotNet.Helix/Sdk/tools/xharness-runner/XHarnessRunner.targets index cd38f7766b3..d96450e5f79 100644 --- a/src/Microsoft.DotNet.Helix/Sdk/tools/xharness-runner/XHarnessRunner.targets +++ b/src/Microsoft.DotNet.Helix/Sdk/tools/xharness-runner/XHarnessRunner.targets @@ -103,7 +103,6 @@ Condition=" '@(XHarnessAppBundleToTest)' != '' " BeforeTargets="CoreTest"> From 1c6a2d9bb8d111720e69b133bf630a38bb136509 Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Tue, 11 May 2021 13:26:10 +0000 Subject: [PATCH 075/699] Update dependencies from https://github.com/dotnet/arcade build 20210510.1 (#7366) [main] Update dependencies from dotnet/arcade --- eng/Version.Details.xml | 20 ++++++++++---------- eng/Versions.props | 6 +++--- global.json | 4 ++-- 3 files changed, 15 insertions(+), 15 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index 5921ac2eb56..ccafc631ffb 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -11,25 +11,25 @@ - + https://github.com/dotnet/arcade - 5faea1b7965644d1f1c666a7130f6f614abe76c0 + 44324e2d3563921f60b1522fccf3fef45dcfe636 - + https://github.com/dotnet/arcade - 5faea1b7965644d1f1c666a7130f6f614abe76c0 + 44324e2d3563921f60b1522fccf3fef45dcfe636 - + https://github.com/dotnet/arcade - 5faea1b7965644d1f1c666a7130f6f614abe76c0 + 44324e2d3563921f60b1522fccf3fef45dcfe636 - + https://github.com/dotnet/arcade - 5faea1b7965644d1f1c666a7130f6f614abe76c0 + 44324e2d3563921f60b1522fccf3fef45dcfe636 - + https://github.com/dotnet/arcade - 5faea1b7965644d1f1c666a7130f6f614abe76c0 + 44324e2d3563921f60b1522fccf3fef45dcfe636 https://github.com/dotnet/arcade-services diff --git a/eng/Versions.props b/eng/Versions.props index cf672f0b220..338cd0b8660 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -66,8 +66,8 @@ 2.4.1 2.0.3 2.4.1 - 6.0.0-beta.21257.5 - 6.0.0-beta.21257.5 + 6.0.0-beta.21260.1 + 6.0.0-beta.21260.1 1.22.0 1.1.2 2.0.0 @@ -80,7 +80,7 @@ 1.1.0-beta.20258.6 1.1.0-beta-21228-01 1.1.0-beta-21228-01 - 6.0.0-beta.21257.5 + 6.0.0-beta.21260.1 1.0.0-beta.21258.1 1.1.0-beta.21228.1 1.0.0-prerelease.21257.2 diff --git a/global.json b/global.json index edaef2f7adf..7e0e63da3c7 100644 --- a/global.json +++ b/global.json @@ -3,7 +3,7 @@ "dotnet": "6.0.100-preview.3.21202.5" }, "msbuild-sdks": { - "Microsoft.DotNet.Arcade.Sdk": "6.0.0-beta.21257.5", - "Microsoft.DotNet.Helix.Sdk": "6.0.0-beta.21257.5" + "Microsoft.DotNet.Arcade.Sdk": "6.0.0-beta.21260.1", + "Microsoft.DotNet.Helix.Sdk": "6.0.0-beta.21260.1" } } From af82c2a6e33bd792c73f89ca9960d440bf5010ac Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Tue, 11 May 2021 15:43:18 +0000 Subject: [PATCH 076/699] Update dependencies from https://github.com/mono/linker build 20210510.2 (#7367) [main] Update dependencies from mono/linker --- eng/Version.Details.xml | 4 ++-- eng/Versions.props | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index ccafc631ffb..97894a963a3 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -47,9 +47,9 @@ https://github.com/dotnet/roslyn 6782d022b36702cf6626d7a98ccbc55ecefc729e - + https://github.com/mono/linker - fafb6cf6a385a8c753faa174b9ab7c3600a9d494 + 8a2996c96f9bbcfdf151d57534e05d1f24614242 https://github.com/dotnet/sourcelink diff --git a/eng/Versions.props b/eng/Versions.props index 338cd0b8660..61f5901aaf1 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -36,7 +36,7 @@ 2.1.1 2.1.0 3.10.0-3.21256.24 - 6.0.100-preview.5.21257.3 + 6.0.100-preview.5.21260.2 16.7.1 4.8.3 5.3.0.1 From 66a1a998db900b04aeae7b7561f82a206250a417 Mon Sep 17 00:00:00 2001 From: Michael Date: Tue, 11 May 2021 19:48:22 +0200 Subject: [PATCH 077/699] Update Master-to-Main-renaming-guide.md (#7296) missed closing bracket --- .../Projects/M2MRenaming/Master-to-Main-renaming-guide.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Documentation/Projects/M2MRenaming/Master-to-Main-renaming-guide.md b/Documentation/Projects/M2MRenaming/Master-to-Main-renaming-guide.md index 10950c0cf9e..7040653bdaa 100644 --- a/Documentation/Projects/M2MRenaming/Master-to-Main-renaming-guide.md +++ b/Documentation/Projects/M2MRenaming/Master-to-Main-renaming-guide.md @@ -124,7 +124,7 @@ Generate json data file describing Maestro migration, review it and disable all ## 2. Add `main` triggers to YAML pipelines **Please read** -Before you get on with this step, you should know, that once you change the default branch in your GitHub repository ([step 5](#5-change-the-default-branch-to-main-for-your-github-repository), all open PRs targeting `master` will be retargeted and all PR builds will be triggered again. +Before you get on with this step, you should know, that once you change the default branch in your GitHub repository ([step 5](#5-change-the-default-branch-to-main-for-your-github-repository)), all open PRs targeting `master` will be retargeted and all PR builds will be triggered again. This can cause a large strain on the engineering systems, so please consider the amount of opened pull requests in your repository. Please consider - based on the heaviness of your PR build and the number of PRs - whether you want to disable the PR builds for the time being or not. From 86ff8734ce70b958746549a41c08fb1f7a94dd2b Mon Sep 17 00:00:00 2001 From: Santiago Fernandez Madero Date: Tue, 11 May 2021 18:18:23 -0700 Subject: [PATCH 078/699] [API Compat] Fix attribute comparison in type members (#7376) --- .../src/Rules/Compat/AttributeDifference.cs | 2 +- .../tests/AttributeDifferenceTests.cs | 3 ++- .../AttributeDifference/Contract/AttributeDifference.cs | 1 + .../Implementation/AttributeDifferenceClass1.cs | 2 ++ 4 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/Microsoft.DotNet.ApiCompat/src/Rules/Compat/AttributeDifference.cs b/src/Microsoft.DotNet.ApiCompat/src/Rules/Compat/AttributeDifference.cs index 8558803afd0..f3a5d13dab3 100644 --- a/src/Microsoft.DotNet.ApiCompat/src/Rules/Compat/AttributeDifference.cs +++ b/src/Microsoft.DotNet.ApiCompat/src/Rules/Compat/AttributeDifference.cs @@ -83,7 +83,7 @@ public override DifferenceType Diff(IDifferences differences, ITypeDefinitionMem if (implMethod == null || contractMethod == null) return DifferenceType.Unknown; - bool changed = CheckAttributeDifferences(differences, implMethod, implMethod.Attributes, implMethod.Attributes); + bool changed = CheckAttributeDifferences(differences, implMethod, implMethod.Attributes, contractMethod.Attributes); IParameterDefinition[] method1Params = implMethod.Parameters.ToArray(); IParameterDefinition[] method2Params = contractMethod.Parameters.ToArray(); diff --git a/src/Microsoft.DotNet.ApiCompat/tests/AttributeDifferenceTests.cs b/src/Microsoft.DotNet.ApiCompat/tests/AttributeDifferenceTests.cs index 67019760c4b..b5d0f5d4c75 100644 --- a/src/Microsoft.DotNet.ApiCompat/tests/AttributeDifferenceTests.cs +++ b/src/Microsoft.DotNet.ApiCompat/tests/AttributeDifferenceTests.cs @@ -22,9 +22,10 @@ public void AttributeDifferenceIsFound() Assert.Contains("CannotRemoveAttribute : Attribute 'AttributeDifference.FooAttribute' exists on 'AttributeDifference.AttributeDifferenceClass1' in the implementation but not the contract.", runOutput); Assert.Contains("CannotRemoveAttribute : Attribute 'System.ComponentModel.DefaultValueAttribute' exists on generic param 'T' on member 'AttributeDifference.AttributeDifferenceClass1.GenericMethodWithAttribute()' in the implementation but not the contract.", runOutput); Assert.Contains("CannotRemoveAttribute : Attribute 'System.ComponentModel.DefaultValueAttribute' exists on generic param 'T' on member 'AttributeDifference.AttributeDifferenceClass1.GenericMethodWithAttribute()' in the implementation but not the contract.", runOutput); + Assert.Contains("CannotRemoveAttribute : Attribute 'AttributeDifference.FooAttribute' exists on 'AttributeDifference.AttributeDifferenceClass1.MethodWithAttribute()' in the implementation but not the contract.", runOutput); Assert.Contains("CannotRemoveAttribute : Attribute 'AttributeDifference.FooAttribute' exists on parameter 'myParameter' on member 'AttributeDifference.AttributeDifferenceClass1.MethodWithAttribute(System.String, System.Object)' in the implementation but not the contract.", runOutput); Assert.Contains("CannotRemoveAttribute : Attribute 'System.ComponentModel.DefaultValueAttribute' exists on generic param 'TOne' on member 'AttributeDifference.AttributeDifferenceGenericCLass' in the implementation but not the contract.", runOutput); - Assert.Contains("Total Issues: 5", runOutput); + Assert.Contains("Total Issues: 6", runOutput); } [Fact] diff --git a/src/Microsoft.DotNet.ApiCompat/tests/TestProjects/AttributeDifference/Contract/AttributeDifference.cs b/src/Microsoft.DotNet.ApiCompat/tests/TestProjects/AttributeDifference/Contract/AttributeDifference.cs index 11a807074ab..1344760bc70 100644 --- a/src/Microsoft.DotNet.ApiCompat/tests/TestProjects/AttributeDifference/Contract/AttributeDifference.cs +++ b/src/Microsoft.DotNet.ApiCompat/tests/TestProjects/AttributeDifference/Contract/AttributeDifference.cs @@ -10,6 +10,7 @@ public class AttributeDifferenceClass1 { public string MethodWithAttribute(string myParameter, [DefaultValue("myObject")] object myObject) => throw null; public T GenericMethodWithAttribute() => throw null; + public void MethodWithAttribute() { } } public class AttributeDifferenceGenericCLass { diff --git a/src/Microsoft.DotNet.ApiCompat/tests/TestProjects/AttributeDifference/Implementation/AttributeDifferenceClass1.cs b/src/Microsoft.DotNet.ApiCompat/tests/TestProjects/AttributeDifference/Implementation/AttributeDifferenceClass1.cs index c34b0c62efe..2e9020dd8f1 100644 --- a/src/Microsoft.DotNet.ApiCompat/tests/TestProjects/AttributeDifference/Implementation/AttributeDifferenceClass1.cs +++ b/src/Microsoft.DotNet.ApiCompat/tests/TestProjects/AttributeDifference/Implementation/AttributeDifferenceClass1.cs @@ -13,6 +13,8 @@ public class AttributeDifferenceClass1 { public string MethodWithAttribute([Foo] string myParameter, [DefaultValue("myObject")] object myObject) => myParameter; public T GenericMethodWithAttribute<[DefaultValue("T")] T>() => default(T); + [Foo] + public void MethodWithAttribute() { } } public class AttributeDifferenceGenericCLass<[DefaultValue("TOne")] TOne, [DefaultValue("TTwo")] TTwo> From c5c6ef92686f208055e884bad45d32966f0b1f95 Mon Sep 17 00:00:00 2001 From: Anirudh Agnihotry Date: Tue, 11 May 2021 20:52:55 -0700 Subject: [PATCH 079/699] rename packageValidation to package testing (#7375) --- Arcade.sln | 4 ++-- .../GetCompatibilePackageTargetFrameworksTests.cs | 2 +- .../Microsoft.DotNet.PackageTesting.Tests.csproj} | 2 +- .../GetCompatiblePackageTargetFrameworks.cs | 2 +- .../Microsoft.DotNet.PackageTesting.csproj} | 0 .../NupkgParser.cs | 2 +- .../Package.cs | 2 +- .../PackageAsset.cs | 2 +- .../build/Microsoft.DotNet.PackageTesting.props | 6 ++++++ .../build/Microsoft.DotNet.PackageValidation.props | 6 ------ 10 files changed, 14 insertions(+), 14 deletions(-) rename src/{Microsoft.DotNet.PackageValidation.Tests => Microsoft.DotNet.PackageTesting.Tests}/GetCompatibilePackageTargetFrameworksTests.cs (98%) rename src/{Microsoft.DotNet.PackageValidation.Tests/Microsoft.DotNet.PackageValidation.Tests.csproj => Microsoft.DotNet.PackageTesting.Tests/Microsoft.DotNet.PackageTesting.Tests.csproj} (79%) rename src/{Microsoft.DotNet.PackageValidation => Microsoft.DotNet.PackageTesting}/GetCompatiblePackageTargetFrameworks.cs (99%) rename src/{Microsoft.DotNet.PackageValidation/Microsoft.DotNet.PackageValidation.csproj => Microsoft.DotNet.PackageTesting/Microsoft.DotNet.PackageTesting.csproj} (100%) rename src/{Microsoft.DotNet.PackageValidation => Microsoft.DotNet.PackageTesting}/NupkgParser.cs (98%) rename src/{Microsoft.DotNet.PackageValidation => Microsoft.DotNet.PackageTesting}/Package.cs (95%) rename src/{Microsoft.DotNet.PackageValidation => Microsoft.DotNet.PackageTesting}/PackageAsset.cs (94%) create mode 100644 src/Microsoft.DotNet.PackageTesting/build/Microsoft.DotNet.PackageTesting.props delete mode 100644 src/Microsoft.DotNet.PackageValidation/build/Microsoft.DotNet.PackageValidation.props diff --git a/Arcade.sln b/Arcade.sln index 1036c6ac99a..3f79659d1cc 100644 --- a/Arcade.sln +++ b/Arcade.sln @@ -129,9 +129,9 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Arcade.Common", " EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Arcade.Test.Common", "src\Common\Microsoft.Arcade.Test.Common\Microsoft.Arcade.Test.Common.csproj", "{6CA09DC9-E654-4906-A977-1279F6EDC109}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.DotNet.PackageValidation", "src\Microsoft.DotNet.PackageValidation\Microsoft.DotNet.PackageValidation.csproj", "{B691A17B-B577-431C-AF4D-199BBAC8EC97}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.DotNet.PackageTesting", "src\Microsoft.DotNet.PackageTesting\Microsoft.DotNet.PackageTesting.csproj", "{B691A17B-B577-431C-AF4D-199BBAC8EC97}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.DotNet.PackageValidation.Tests", "src\Microsoft.DotNet.PackageValidation.Tests\Microsoft.DotNet.PackageValidation.Tests.csproj", "{8BBF14AC-48F0-4282-910E-48E816021660}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.DotNet.PackageTesting.Tests", "src\Microsoft.DotNet.PackageTesting.Tests\Microsoft.DotNet.PackageTesting.Tests.csproj", "{8BBF14AC-48F0-4282-910E-48E816021660}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Arcade.Common.Tests", "src\Common\Microsoft.Arcade.Common.Tests\Microsoft.Arcade.Common.Tests.csproj", "{B5E9D9D8-59E0-49F8-9C3C-75138A2D452C}" EndProject diff --git a/src/Microsoft.DotNet.PackageValidation.Tests/GetCompatibilePackageTargetFrameworksTests.cs b/src/Microsoft.DotNet.PackageTesting.Tests/GetCompatibilePackageTargetFrameworksTests.cs similarity index 98% rename from src/Microsoft.DotNet.PackageValidation.Tests/GetCompatibilePackageTargetFrameworksTests.cs rename to src/Microsoft.DotNet.PackageTesting.Tests/GetCompatibilePackageTargetFrameworksTests.cs index fa37f0ad158..10b0c3bbd42 100644 --- a/src/Microsoft.DotNet.PackageValidation.Tests/GetCompatibilePackageTargetFrameworksTests.cs +++ b/src/Microsoft.DotNet.PackageTesting.Tests/GetCompatibilePackageTargetFrameworksTests.cs @@ -5,7 +5,7 @@ using System.Collections.Generic; using Xunit; -namespace Microsoft.DotNet.PackageValidation.Tests +namespace Microsoft.DotNet.PackageTesting.Tests { public class GetCompatibilePackageTargetFrameworksTests { diff --git a/src/Microsoft.DotNet.PackageValidation.Tests/Microsoft.DotNet.PackageValidation.Tests.csproj b/src/Microsoft.DotNet.PackageTesting.Tests/Microsoft.DotNet.PackageTesting.Tests.csproj similarity index 79% rename from src/Microsoft.DotNet.PackageValidation.Tests/Microsoft.DotNet.PackageValidation.Tests.csproj rename to src/Microsoft.DotNet.PackageTesting.Tests/Microsoft.DotNet.PackageTesting.Tests.csproj index f69b97f4a64..21973221994 100644 --- a/src/Microsoft.DotNet.PackageValidation.Tests/Microsoft.DotNet.PackageValidation.Tests.csproj +++ b/src/Microsoft.DotNet.PackageTesting.Tests/Microsoft.DotNet.PackageTesting.Tests.csproj @@ -11,7 +11,7 @@ - + diff --git a/src/Microsoft.DotNet.PackageValidation/GetCompatiblePackageTargetFrameworks.cs b/src/Microsoft.DotNet.PackageTesting/GetCompatiblePackageTargetFrameworks.cs similarity index 99% rename from src/Microsoft.DotNet.PackageValidation/GetCompatiblePackageTargetFrameworks.cs rename to src/Microsoft.DotNet.PackageTesting/GetCompatiblePackageTargetFrameworks.cs index 9f877db7bc0..95c7a89efcf 100644 --- a/src/Microsoft.DotNet.PackageValidation/GetCompatiblePackageTargetFrameworks.cs +++ b/src/Microsoft.DotNet.PackageTesting/GetCompatiblePackageTargetFrameworks.cs @@ -9,7 +9,7 @@ using System.Collections.Generic; using System.Linq; -namespace Microsoft.DotNet.PackageValidation +namespace Microsoft.DotNet.PackageTesting { public class GetCompatiblePackageTargetFrameworks : BuildTask { diff --git a/src/Microsoft.DotNet.PackageValidation/Microsoft.DotNet.PackageValidation.csproj b/src/Microsoft.DotNet.PackageTesting/Microsoft.DotNet.PackageTesting.csproj similarity index 100% rename from src/Microsoft.DotNet.PackageValidation/Microsoft.DotNet.PackageValidation.csproj rename to src/Microsoft.DotNet.PackageTesting/Microsoft.DotNet.PackageTesting.csproj diff --git a/src/Microsoft.DotNet.PackageValidation/NupkgParser.cs b/src/Microsoft.DotNet.PackageTesting/NupkgParser.cs similarity index 98% rename from src/Microsoft.DotNet.PackageValidation/NupkgParser.cs rename to src/Microsoft.DotNet.PackageTesting/NupkgParser.cs index ed328a8947e..fe7ad03a382 100644 --- a/src/Microsoft.DotNet.PackageValidation/NupkgParser.cs +++ b/src/Microsoft.DotNet.PackageTesting/NupkgParser.cs @@ -7,7 +7,7 @@ using System.Collections.Generic; using System.Linq; -namespace Microsoft.DotNet.PackageValidation +namespace Microsoft.DotNet.PackageTesting { public class NupkgParser { diff --git a/src/Microsoft.DotNet.PackageValidation/Package.cs b/src/Microsoft.DotNet.PackageTesting/Package.cs similarity index 95% rename from src/Microsoft.DotNet.PackageValidation/Package.cs rename to src/Microsoft.DotNet.PackageTesting/Package.cs index e4d30d724f9..1e4b7b291e9 100644 --- a/src/Microsoft.DotNet.PackageValidation/Package.cs +++ b/src/Microsoft.DotNet.PackageTesting/Package.cs @@ -5,7 +5,7 @@ using NuGet.Packaging.Core; using System.Collections.Generic; -namespace Microsoft.DotNet.PackageValidation +namespace Microsoft.DotNet.PackageTesting { public class Package { diff --git a/src/Microsoft.DotNet.PackageValidation/PackageAsset.cs b/src/Microsoft.DotNet.PackageTesting/PackageAsset.cs similarity index 94% rename from src/Microsoft.DotNet.PackageValidation/PackageAsset.cs rename to src/Microsoft.DotNet.PackageTesting/PackageAsset.cs index b5eff60fea3..825a4dad481 100644 --- a/src/Microsoft.DotNet.PackageValidation/PackageAsset.cs +++ b/src/Microsoft.DotNet.PackageTesting/PackageAsset.cs @@ -3,7 +3,7 @@ using NuGet.Frameworks; -namespace Microsoft.DotNet.PackageValidation +namespace Microsoft.DotNet.PackageTesting { public class PackageAsset { diff --git a/src/Microsoft.DotNet.PackageTesting/build/Microsoft.DotNet.PackageTesting.props b/src/Microsoft.DotNet.PackageTesting/build/Microsoft.DotNet.PackageTesting.props new file mode 100644 index 00000000000..052e1689aa2 --- /dev/null +++ b/src/Microsoft.DotNet.PackageTesting/build/Microsoft.DotNet.PackageTesting.props @@ -0,0 +1,6 @@ + + + $(MSBuildThisFileDirectory)..\tools\net472\Microsoft.DotNet.PackageTesting.dll + $(MSBuildThisFileDirectory)..\tools\netcoreapp3.1\Microsoft.DotNet.PackageTesting.dll + + diff --git a/src/Microsoft.DotNet.PackageValidation/build/Microsoft.DotNet.PackageValidation.props b/src/Microsoft.DotNet.PackageValidation/build/Microsoft.DotNet.PackageValidation.props deleted file mode 100644 index 08703d1bd38..00000000000 --- a/src/Microsoft.DotNet.PackageValidation/build/Microsoft.DotNet.PackageValidation.props +++ /dev/null @@ -1,6 +0,0 @@ - - - $(MSBuildThisFileDirectory)..\tools\net472\Microsoft.DotNet.PackageValidation.dll - $(MSBuildThisFileDirectory)..\tools\netcoreapp3.1\Microsoft.DotNet.PackageValidation.dll - - From 83498136cca3a023b74f6e42cc9c0dc43afb478e Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Wed, 12 May 2021 17:42:43 +0000 Subject: [PATCH 080/699] [main] Update dependencies from dotnet/xliff-tasks dotnet/arcade (#7381) [main] Update dependencies from dotnet/xliff-tasks dotnet/arcade --- eng/Version.Details.xml | 24 ++++++++++++------------ eng/Versions.props | 8 ++++---- global.json | 4 ++-- 3 files changed, 18 insertions(+), 18 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index 97894a963a3..6289e257eae 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -11,25 +11,25 @@ - + https://github.com/dotnet/arcade - 44324e2d3563921f60b1522fccf3fef45dcfe636 + c5c6ef92686f208055e884bad45d32966f0b1f95 - + https://github.com/dotnet/arcade - 44324e2d3563921f60b1522fccf3fef45dcfe636 + c5c6ef92686f208055e884bad45d32966f0b1f95 - + https://github.com/dotnet/arcade - 44324e2d3563921f60b1522fccf3fef45dcfe636 + c5c6ef92686f208055e884bad45d32966f0b1f95 - + https://github.com/dotnet/arcade - 44324e2d3563921f60b1522fccf3fef45dcfe636 + c5c6ef92686f208055e884bad45d32966f0b1f95 - + https://github.com/dotnet/arcade - 44324e2d3563921f60b1522fccf3fef45dcfe636 + c5c6ef92686f208055e884bad45d32966f0b1f95 https://github.com/dotnet/arcade-services @@ -68,9 +68,9 @@ https://github.com/dotnet/symreader-converter c5ba7c88f92e2dde156c324a8c8edc04d9fa4fe0 - + https://github.com/dotnet/xliff-tasks - 0a2951a0b8b7bd08ea51f7e6492cc9d3c23181c1 + 1dacaf9f6c80953627314b44b538c3f3c109b41d diff --git a/eng/Versions.props b/eng/Versions.props index 61f5901aaf1..8fb25ac23d2 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -66,8 +66,8 @@ 2.4.1 2.0.3 2.4.1 - 6.0.0-beta.21260.1 - 6.0.0-beta.21260.1 + 6.0.0-beta.21261.6 + 6.0.0-beta.21261.6 1.22.0 1.1.2 2.0.0 @@ -80,8 +80,8 @@ 1.1.0-beta.20258.6 1.1.0-beta-21228-01 1.1.0-beta-21228-01 - 6.0.0-beta.21260.1 - 1.0.0-beta.21258.1 + 6.0.0-beta.21261.6 + 1.0.0-beta.21261.1 1.1.0-beta.21228.1 1.0.0-prerelease.21257.2 1.1.156402 diff --git a/global.json b/global.json index 7e0e63da3c7..8cebe038f47 100644 --- a/global.json +++ b/global.json @@ -3,7 +3,7 @@ "dotnet": "6.0.100-preview.3.21202.5" }, "msbuild-sdks": { - "Microsoft.DotNet.Arcade.Sdk": "6.0.0-beta.21260.1", - "Microsoft.DotNet.Helix.Sdk": "6.0.0-beta.21260.1" + "Microsoft.DotNet.Arcade.Sdk": "6.0.0-beta.21261.6", + "Microsoft.DotNet.Helix.Sdk": "6.0.0-beta.21261.6" } } From 57707a9e0150de043f8fc4a849f1f4f47dd3219a Mon Sep 17 00:00:00 2001 From: Matt Mitchell Date: Wed, 12 May 2021 11:28:49 -0700 Subject: [PATCH 081/699] Use msbuild logging for symbol messages (#7352) * Use msbuild logging for symbol messages Because the symbol upload internally uses the msbuild loggers, if this code uses a string builder and then prints all the info at the end, the binlog tends to look like: symbol upload diagnostic for symbol package 1 symbol upload diagnostic for symbol package 1 symbol upload diagnostic for symbol package 2 symbol upload diagnostic for symbol package 2 symbol upload diagnostic for symbol package 3 symbol upload diagnostic for symbol package 3 ... top level upload info for 1 top level upload info for 2 top level upload info for 3 Instead, it's easier to read as: top level upload info for 1 symbol upload diagnostic for symbol package 1 symbol upload diagnostic for symbol package 1 top level upload info for 2 symbol upload diagnostic for symbol package 2 symbol upload diagnostic for symbol package 2 top level upload info for 3 symbol upload diagnostic for symbol package 3 symbol upload diagnostic for symbol package 3 There will be some interleaving due to parallelism, but right now it's difficult to line up the top level messages with the diagnostic ones. * Fix compile error --- .../src/PublishArtifactsInManifestBase.cs | 40 +++++++------------ 1 file changed, 15 insertions(+), 25 deletions(-) diff --git a/src/Microsoft.DotNet.Build.Tasks.Feed/src/PublishArtifactsInManifestBase.cs b/src/Microsoft.DotNet.Build.Tasks.Feed/src/PublishArtifactsInManifestBase.cs index 7fbd6aebb18..dfa8dd31a45 100644 --- a/src/Microsoft.DotNet.Build.Tasks.Feed/src/PublishArtifactsInManifestBase.cs +++ b/src/Microsoft.DotNet.Build.Tasks.Feed/src/PublishArtifactsInManifestBase.cs @@ -390,8 +390,8 @@ public async Task PublishSymbolsUsingStreamingAsync( Dictionary> buildAssets, SemaphoreSlim clientThrottle) { - StringBuilder symbolLog = new StringBuilder(); - symbolLog.AppendLine("Publishing Symbols to Symbol server: "); + Log.LogMessage(MessageImportance.High, + $"Performing symbol publishing... \nExpirationInDays : {ExpirationInDays} \nConvertPortablePdbsToWindowsPdb : false \ndryRun: false "); var symbolCategory = TargetFeedContentType.Symbols; string containerId = await GetContainerIdAsync(ArtifactName.BlobArtifacts); @@ -411,6 +411,8 @@ public async Task PublishSymbolsUsingStreamingAsync( } } + Log.LogMessage(MessageImportance.High, $"Total number of symbol files : {symbolsToPublish.Count}"); + HashSet feedConfigsForSymbols = FeedConfigs[symbolCategory]; Dictionary serversToPublish = GetTargetSymbolServers(feedConfigsForSymbols, msdlToken, symWebToken); @@ -427,7 +429,7 @@ await Task.WhenAll(symbolsToPublish.Select(async symbol => await clientThrottle.WaitAsync(); string temporarySymbolsDirectory = CreateTemporaryDirectory(); string localSymbolPath = Path.Combine(temporarySymbolsDirectory, symbol); - symbolLog.AppendLine($"Downloading symbol : {symbol} to {localSymbolPath}"); + Log.LogMessage(MessageImportance.High, $"Downloading symbol : {symbol} to {localSymbolPath}"); Stopwatch gatherDownloadTime = Stopwatch.StartNew(); await DownloadFileAsync( @@ -438,18 +440,17 @@ await DownloadFileAsync( localSymbolPath); gatherDownloadTime.Stop(); - symbolLog.AppendLine($"Time taken to download file to '{localSymbolPath}' is {gatherDownloadTime.ElapsedMilliseconds / 1000.0} (seconds)"); - symbolLog.AppendLine($"Successfully downloaded symbol : {symbol} to {localSymbolPath}"); + Log.LogMessage(MessageImportance.High, $"Time taken to download file to '{localSymbolPath}' is {gatherDownloadTime.ElapsedMilliseconds / 1000.0} (seconds)"); + Log.LogMessage(MessageImportance.High, $"Successfully downloaded symbol : {symbol} to {localSymbolPath}"); List symbolFiles = new List(); symbolFiles.Add(localSymbolPath); - symbolLog.AppendLine($"Uploading symbol file '{string.Join(",", symbolFiles)}'"); foreach (var server in serversToPublish) { var serverPath = server.Key; var token = server.Value; - symbolLog.AppendLine($"Publishing symbol file {symbol} to {serverPath}:"); + Log.LogMessage(MessageImportance.High, $"Publishing symbol file {symbol} to {serverPath}:"); Stopwatch gatherSymbolPublishingTime = Stopwatch.StartNew(); try @@ -475,7 +476,7 @@ await PublishSymbolsHelper.PublishAsync( } gatherSymbolPublishingTime.Stop(); - symbolLog.AppendLine( + Log.LogMessage(MessageImportance.High, $"Symbol publishing for {symbol} took {gatherSymbolPublishingTime.ElapsedMilliseconds / 1000.0} (seconds)"); } @@ -487,13 +488,7 @@ await PublishSymbolsHelper.PublishAsync( } })); - symbolLog.AppendLine( - $"Performing symbol publishing... \nExpirationInDays : {ExpirationInDays} \nConvertPortablePdbsToWindowsPdb : false \ndryRun: false "); - symbolLog.AppendLine($"Total number of symbol files : {symbolsToPublish.Count}"); - symbolLog.AppendLine("Successfully published to Symbol Server."); - symbolLog.AppendLine(); - Log.LogMessage(MessageImportance.High, symbolLog.ToString()); - symbolLog.Clear(); + Log.LogMessage(MessageImportance.High, "Successfully published to symbol servers."); } } else @@ -522,7 +517,7 @@ await PublishSymbolsHelper.PublishAsync( { var serverPath = server.Key; var token = server.Value; - symbolLog.AppendLine($"Publishing pdbFiles to {serverPath}:"); + Log.LogMessage(MessageImportance.High, $"Publishing pdbFiles to {serverPath}:"); try { @@ -618,8 +613,7 @@ public async Task PublishSymbolsfromBlobArtifactsAsync( { if (Directory.Exists(temporarySymbolsLocation)) { - StringBuilder symbolLog = new StringBuilder(); - symbolLog.AppendLine("Publishing Symbols to Symbol server: "); + Log.LogMessage(MessageImportance.High, "Publishing Symbols to Symbol server: "); string[] fileEntries = Directory.GetFiles(temporarySymbolsLocation); var category = TargetFeedContentType.Symbols; @@ -647,9 +641,8 @@ public async Task PublishSymbolsfromBlobArtifactsAsync( foreach (var server in serversToPublish) { var serverPath = server.Key; - var token = server.Value; - symbolLog.AppendLine($"Publishing symbol packages to {serverPath}:"); - symbolLog.AppendLine( + var token = server.Value;; + Log.LogMessage(MessageImportance.High, $"Performing symbol publishing...\nSymbolServerPath : ${serverPath} \nExpirationInDays : {ExpirationInDays} \nConvertPortablePdbsToWindowsPdb : false \ndryRun: false \nTotal number of symbol files : {fileEntries.Length} "); try @@ -674,10 +667,7 @@ await PublishSymbolsHelper.PublishAsync( Log.LogError(ex.Message); } - symbolLog.AppendLine("Successfully published to Symbol Server."); - symbolLog.AppendLine(); - Log.LogMessage(MessageImportance.High, symbolLog.ToString()); - symbolLog.Clear(); + Log.LogMessage(MessageImportance.High, $"Successfully published to ${serverPath}."); } } else From bf714ead436711bd4404352a40f1b498ae16174f Mon Sep 17 00:00:00 2001 From: Chad Nedzlek Date: Wed, 12 May 2021 15:39:20 -0700 Subject: [PATCH 082/699] Use public pools for PR builds (#7384) --- azure-pipelines.yml | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 1d2e91d1fe7..dc106548107 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -44,8 +44,7 @@ stages: timeoutInMinutes: 90 pool: ${{ if eq(variables._RunAsPublic, True) }}: - name: NetCorePublic-Pool - queue: BuildPool.Server.Amd64.VS2017.Arcade.Open + vmImage: windows-latest ${{ if eq(variables._RunAsInternal, True) }}: name: NetCoreInternal-Pool queue: BuildPool.Server.Amd64.VS2017.Arcade @@ -71,8 +70,7 @@ stages: - job: Linux container: LinuxContainer pool: - name: NetCorePublic-Pool - queue: BuildPool.Ubuntu.1604.Amd64.Arcade.Open + vmImage: ubuntu-latest strategy: matrix: Build_Debug: From ff2ade061aeff2d00a5e49e8da4e330cc8ca1b33 Mon Sep 17 00:00:00 2001 From: Jon Fortescue Date: Wed, 12 May 2021 16:05:28 -0700 Subject: [PATCH 083/699] Add onboarding & release info to OneLocBuild doc (#7374) --- Documentation/OneLocBuild.md | 62 ++++++++++++++++++++++++++++++++++-- 1 file changed, 60 insertions(+), 2 deletions(-) diff --git a/Documentation/OneLocBuild.md b/Documentation/OneLocBuild.md index 50cfc2845db..9429ac4482a 100644 --- a/Documentation/OneLocBuild.md +++ b/Documentation/OneLocBuild.md @@ -9,6 +9,64 @@ repo. Xliff-Tasks will continue to be used in addition to OneLocBuild. To make OneLocBuild easier to use, we have integrated the task into Arcade. This integration is a job template ([here](/eng/common/templates/job/onelocbuild.yml)) that is described in this document. +## Onboarding to OneLocBuild Using Arcade + +Onboarding to OneLocBuild is a simple process: + +1. Ensure that your repository is on the latest version of Arcade. +2. Create a test branch (e.g. `LocalizationTests`) in your repository and add the following job template to your YAML: +```yaml +- template: /eng/common/templates/job/onelocbuild.yml + parameters: + CreatePr: false +``` +3. Run the pipeline you want to use OneLocBuild on your test branch. +4. Open a ticket with the localization team using + [this template](https://ceapex.visualstudio.com/CEINTL/_workitems/create/Loc%20Request). Include the link to the + test build you've done. +5. The loc team will generate an LCL package for you and send you its ID. It will be something like + `LCL-JUNO-PROD-YOURREPO`. +6. Change your YAML (subbing `'LCL-JUNO-PROD-YOURREPO'` for the package ID given to you) to: +```yaml +- template: /eng/common/templates/job/onelocbuild.yml + parameters: + LclSource: lclFilesfromPackage + LclPackageId: 'LCL-JUNO-PROD-YOURREPO' +``` +7. Merge the changes to your main branch and then open a + [repo modification ticket](https://ceapex.visualstudio.com/CEINTL/_workitems/create/Loc%20Request) with the loc team + to let them know to retarget the branch. + +As of 12 May 2021, if your repository is mirrored to internal with Maestro, you will also need to keep +`CreatePr: false` in your YAML. Currently, OneLocBuild does not support our scenario. The step to create a PR back to +GitHub expects a GitHub repository with the same name as the internal repo, so the step to create PRs fails, +breaking the build. Thus, we turn off automated PR creation to skip this step and we are creating PRs manually prior to +releases as a workaround. Please [get a hold of Engineering Services](https://github.com/dotnet/core-eng/wiki/How-to-get-a-hold-of-Engineering-Servicing) +so that you can be updated when automated PR creation is supported. + +## Releasing with OneLocBuild Using Arcade + +**Note: The SLA for translations is one week. Please allow at least two weeks from the release for this process.** + +### If You're Releasing from `main` +If you're releasing from the main branch of your repository, all that you need to do is ensure that you're merging +PRs from OneLocBuild as they are made and that you allow the translator SLA for any new strings prior to the release. + +### If You're Releasing from a Branch Other Than `main` (Including Servicing Branches) +If you're releasing from any other branch (including servicing branches), you must do the following: + +1. Add the OneLocBuild job template to the pipeline YAML of the release branch +2. Open a [repo modification ticket](https://ceapex.visualstudio.com/CEINTL/_workitems/create/Loc%20Request) with the + loc team at least two weeks before the release and request that they re-target your repository to the release branch. +4. Merge the OneLocBuild PRs to your release branch. +5. After the release, open another repo modification ticket to re-target your repository to the `main` branch again. + +## Filing Issues for Translation Issues + +File a translation issue ticket with the localization team (see documentation [here](https://dev.azure.com/ceapex/CEINTL/_wiki/wikis/CEINTL.wiki/1361/Provide-Enough-Information-in-DevRel-Feedback-Ticket)). + +# Technical Documentation + ## LocProject.json Index File The core component of OneLocBuild is the LocProject.json file. This file is an index file containing references to @@ -30,8 +88,8 @@ which include `test.xlf` in its name. } ``` -The selected files are then added to a generated LocProject.json file. At this point, template currently provides two options -for how to proceed. +The selected files are then added to a generated LocProject.json file. At this point, template currently provides two +options for how to proceed. ### Build-Time Generation From 6b9758661f4483a70654bcaf6f8d7c6a79ee5660 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C5=99emek=20Vysok=C3=BD?= Date: Thu, 13 May 2021 10:42:06 +0200 Subject: [PATCH 084/699] Add support for custom Apple XHarness commands in Helix SDK (#7380) Enables to specify `` metadata on the `` which will then inject those commands inside of the wrapper scripts we have that set and clean up the iOS simulator/device safely. Android support will come in a follow-up PR. --- azure-pipelines.yml | 17 +---- .../IZipArchiveManager.cs | 17 +++++ .../ZipArchiveManager.cs | 10 +-- .../CreateXHarnessAppleWorkItemsTests.cs | 59 +++++++++++++--- .../ProvisioningProfileProviderTests.cs | 2 +- .../Sdk/CreateXHarnessAndroidWorkItems.cs | 2 +- .../Sdk/CreateXHarnessAppleWorkItems.cs | 68 ++++++++++++------- .../Sdk/ProvisioningProfileProvider.cs | 2 +- .../Sdk/SendHelixJob.cs | 55 ++++++++++----- .../Sdk/XharnessTaskBase.cs | 36 ++++++---- .../Sdk/tools/xharness-runner/Readme.md | 61 ++++++++++++----- .../xharness-runner/XHarnessRunner.targets | 4 +- .../xharness-helix-job.apple.sh | 26 ++++++- .../xharness-runner/xharness-runner.apple.sh | 45 ++++-------- tests/UnitTests.XHarness.iOS.Device.proj | 2 +- ...UnitTests.XHarness.iOS.IncludeCliOnly.proj | 54 --------------- ... => UnitTests.XHarness.iOS.Simulator.proj} | 5 +- ...ice.proj => XHarness.Device.AppleRun.proj} | 0 ....proj => XHarness.Simulator.AppleRun.proj} | 0 ...proj => XHarness.Simulator.AppleTest.proj} | 8 +-- .../XHarness.Simulator.CustomCommands.proj | 43 ++++++++++++ 21 files changed, 314 insertions(+), 202 deletions(-) delete mode 100644 tests/UnitTests.XHarness.iOS.IncludeCliOnly.proj rename tests/{UnitTests.XHarness.iOS.proj => UnitTests.XHarness.iOS.Simulator.proj} (92%) rename tests/XHarness/{XHarness.RunAppBundle.Device.proj => XHarness.Device.AppleRun.proj} (100%) rename tests/XHarness/{XHarness.RunAppBundle.proj => XHarness.Simulator.AppleRun.proj} (100%) rename tests/XHarness/{XHarness.TestAppBundle.proj => XHarness.Simulator.AppleTest.proj} (84%) create mode 100644 tests/XHarness/XHarness.Simulator.CustomCommands.proj diff --git a/azure-pipelines.yml b/azure-pipelines.yml index dc106548107..4d76282f96f 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -178,8 +178,8 @@ stages: -ci -restore -test - -projects $(Build.SourcesDirectory)/tests/UnitTests.XHarness.iOS.proj - /bl:$(Build.SourcesDirectory)/artifacts/log/$(_BuildConfig)/Helix.XHarness.iOS.binlog + -projects $(Build.SourcesDirectory)/tests/UnitTests.XHarness.iOS.Simulator.proj + /bl:$(Build.SourcesDirectory)/artifacts/log/$(_BuildConfig)/UnitTests.XHarness.iOS.Simulator.binlog /p:RestoreUsingNuGetTargets=false displayName: XHarness iOS Simulator Helix Testing env: @@ -199,19 +199,6 @@ stages: # env: # SYSTEM_ACCESSTOKEN: $(System.AccessToken) # HelixAccessToken: '' - - script: eng/common/build.sh - -configuration $(_BuildConfig) - -prepareMachine - -ci - -restore - -test - -projects $(Build.SourcesDirectory)/tests/UnitTests.XHarness.iOS.IncludeCliOnly.proj - /bl:$(Build.SourcesDirectory)/artifacts/log/$(_BuildConfig)/Helix.XHarness.CLI.binlog - /p:RestoreUsingNuGetTargets=false - displayName: XHarness CLI pre-install Helix Testing - env: - SYSTEM_ACCESSTOKEN: $(System.AccessToken) - HelixAccessToken: '' - script: eng/common/build.sh -configuration $(_BuildConfig) -prepareMachine diff --git a/src/Common/Microsoft.Arcade.Common/IZipArchiveManager.cs b/src/Common/Microsoft.Arcade.Common/IZipArchiveManager.cs index 910f5530a11..87a59d883d5 100644 --- a/src/Common/Microsoft.Arcade.Common/IZipArchiveManager.cs +++ b/src/Common/Microsoft.Arcade.Common/IZipArchiveManager.cs @@ -1,6 +1,7 @@ // Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. +using System.IO; using System.Threading.Tasks; namespace Microsoft.Arcade.Common @@ -16,6 +17,22 @@ public interface IZipArchiveManager /// New name of the file in the archive Task AddResourceFileToArchive(string archivePath, string resourceName, string targetFileName = null); + /// + /// Creates a file with given content in a given archive. + /// + /// Path to the archive + /// New path of the file in the archive + /// Content of the file + Task AddContentToArchive(string archivePath, string targetFilename, Stream content); + + /// + /// Creates a file with given content in a given archive. + /// + /// Path to the archive + /// New path of the file in the archive + /// Content of the file + Task AddContentToArchive(string archivePath, string targetFilename, string content); + /// /// Compresses a directory into an archive on a given path. /// diff --git a/src/Common/Microsoft.Arcade.Common/ZipArchiveManager.cs b/src/Common/Microsoft.Arcade.Common/ZipArchiveManager.cs index a805eaf98a0..93edcb7bb03 100644 --- a/src/Common/Microsoft.Arcade.Common/ZipArchiveManager.cs +++ b/src/Common/Microsoft.Arcade.Common/ZipArchiveManager.cs @@ -4,6 +4,7 @@ using System.IO; using System.IO.Compression; using System.Reflection; +using System.Text; using System.Threading.Tasks; namespace Microsoft.Arcade.Common @@ -17,9 +18,7 @@ public async Task AddResourceFileToArchive(string archivePath, string } public void ArchiveDirectory(string directoryPath, string archivePath, bool includeBaseDirectory) - { - ZipFile.CreateFromDirectory(directoryPath, archivePath, CompressionLevel.Fastest, includeBaseDirectory); - } + => ZipFile.CreateFromDirectory(directoryPath, archivePath, CompressionLevel.Fastest, includeBaseDirectory); public void ArchiveFile(string filePath, string archivePath) { @@ -30,7 +29,10 @@ public void ArchiveFile(string filePath, string archivePath) } } - private async Task AddContentToArchive(string archivePath, string targetFilename, Stream content) + public Task AddContentToArchive(string archivePath, string targetFilename, string content) + => AddContentToArchive(archivePath, targetFilename, new MemoryStream(Encoding.UTF8.GetBytes(content))); + + public async Task AddContentToArchive(string archivePath, string targetFilename, Stream content) { using FileStream archiveStream = new FileStream(archivePath, FileMode.Open); using ZipArchive archive = new ZipArchive(archiveStream, ZipArchiveMode.Update); diff --git a/src/Microsoft.DotNet.Helix/Sdk.Tests/Microsoft.DotNet.Helix.Sdk.Tests/CreateXHarnessAppleWorkItemsTests.cs b/src/Microsoft.DotNet.Helix/Sdk.Tests/Microsoft.DotNet.Helix.Sdk.Tests/CreateXHarnessAppleWorkItemsTests.cs index 2cfea1576b8..c8da05191ec 100644 --- a/src/Microsoft.DotNet.Helix/Sdk.Tests/Microsoft.DotNet.Helix.Sdk.Tests/CreateXHarnessAppleWorkItemsTests.cs +++ b/src/Microsoft.DotNet.Helix/Sdk.Tests/Microsoft.DotNet.Helix.Sdk.Tests/CreateXHarnessAppleWorkItemsTests.cs @@ -86,16 +86,19 @@ public void AppleXHarnessWorkItemIsCreated() _fileSystem.FileExists(payloadArchive).Should().BeTrue(); var command = workItem.GetMetadata("Command"); - command.Should().Contain("--command test"); + command.Should().Contain("System.Foo.app"); + command.Should().Contain("--targets \"ios-device_13.5\""); command.Should().Contain("--timeout \"00:08:55\""); command.Should().Contain("--launch-timeout \"00:02:33\""); _profileProvider - .Verify(x => x.AddProfilesToBundles(It.Is(bundles => bundles.Any(b => b.ItemSpec == "/apps/System.Foo.app"))), Times.AtLeastOnce); + .Verify(x => x.AddProfilesToBundles(It.Is(bundles => bundles.Any(b => b.ItemSpec == "/apps/System.Foo.app"))), Times.Once); _zipArchiveManager - .Verify(x => x.AddResourceFileToArchive(payloadArchive, It.Is(s => s.Contains("xharness-helix-job.apple.sh")), "xharness-helix-job.apple.sh"), Times.AtLeastOnce); + .Verify(x => x.AddResourceFileToArchive(payloadArchive, It.Is(s => s.Contains("xharness-helix-job.apple.sh")), "xharness-helix-job.apple.sh"), Times.Once); _zipArchiveManager - .Verify(x => x.AddResourceFileToArchive(payloadArchive, It.Is(s => s.Contains("xharness-runner.apple.sh")), "xharness-runner.apple.sh"), Times.AtLeastOnce); + .Verify(x => x.AddResourceFileToArchive(payloadArchive, It.Is(s => s.Contains("xharness-runner.apple.sh")), "xharness-runner.apple.sh"), Times.Once); + _zipArchiveManager + .Verify(x => x.AddContentToArchive(payloadArchive, "command.sh", It.Is(s => s.Contains("xharness apple test"))), Times.Once); } [Fact] @@ -130,6 +133,34 @@ public void ArchivePayloadIsOverwritten() _fileSystem.RemovedFiles.Should().Contain(payloadArchive); } + [Fact] + public void CustomCommandsAreExecuted() + { + var collection = CreateMockServiceCollection(); + _task.ConfigureServices(collection); + _task.AppBundles = new[] + { + CreateAppBundle("apps/System.Foo.app", "ios-simulator-64_13.5", customCommands: "echo foo"), + }; + + // Act + using var provider = collection.BuildServiceProvider(); + _task.InvokeExecute(provider).Should().BeTrue(); + + // Verify + _task.WorkItems.Length.Should().Be(1); + + var workItem = _task.WorkItems.First(); + workItem.GetMetadata("Identity").Should().Be("System.Foo"); + + var payloadArchive = workItem.GetMetadata("PayloadArchive"); + payloadArchive.Should().NotBeNullOrEmpty(); + _fileSystem.FileExists(payloadArchive).Should().BeTrue(); + + _zipArchiveManager + .Verify(x => x.AddContentToArchive(payloadArchive, "command.sh", "echo foo"), Times.Once); + } + [Fact] public void AreDependenciesRegistered() { @@ -155,31 +186,37 @@ private ITaskItem CreateAppBundle( string? testTimeout = null, string? launchTimeout = null, int expectedExitCode = 0, - bool includesTestRunner = true) + bool includesTestRunner = true, + string? customCommands = null) { var mockBundle = new Mock(); mockBundle.SetupGet(x => x.ItemSpec).Returns(path); - mockBundle.Setup(x => x.GetMetadata(CreateXHarnessAppleWorkItems.TargetPropName)).Returns(targets); - mockBundle.Setup(x => x.GetMetadata("IncludesTestRunner")).Returns(includesTestRunner.ToString()); + mockBundle.Setup(x => x.GetMetadata(CreateXHarnessAppleWorkItems.MetadataNames.Targets)).Returns(targets); + mockBundle.Setup(x => x.GetMetadata(CreateXHarnessAppleWorkItems.MetadataNames.IncludesTestRunner)).Returns(includesTestRunner.ToString()); if (workItemTimeout != null) { - mockBundle.Setup(x => x.GetMetadata("WorkItemTimeout")).Returns(workItemTimeout); + mockBundle.Setup(x => x.GetMetadata(XHarnessTaskBase.MetadataName.WorkItemTimeout)).Returns(workItemTimeout); } if (testTimeout != null) { - mockBundle.Setup(x => x.GetMetadata("TestTimeout")).Returns(testTimeout); + mockBundle.Setup(x => x.GetMetadata(XHarnessTaskBase.MetadataName.TestTimeout)).Returns(testTimeout); } if (launchTimeout != null) { - mockBundle.Setup(x => x.GetMetadata("LaunchTimeout")).Returns(launchTimeout); + mockBundle.Setup(x => x.GetMetadata(CreateXHarnessAppleWorkItems.MetadataNames.LaunchTimeout)).Returns(launchTimeout); } if (expectedExitCode != 0) { - mockBundle.Setup(x => x.GetMetadata("ExpectedExitCode")).Returns(expectedExitCode.ToString()); + mockBundle.Setup(x => x.GetMetadata(XHarnessTaskBase.MetadataName.ExpectedExitCode)).Returns(expectedExitCode.ToString()); + } + + if (customCommands != null) + { + mockBundle.Setup(x => x.GetMetadata(XHarnessTaskBase.MetadataName.CustomCommands)).Returns(customCommands); } _fileSystem.CreateDirectory(path); diff --git a/src/Microsoft.DotNet.Helix/Sdk.Tests/Microsoft.DotNet.Helix.Sdk.Tests/ProvisioningProfileProviderTests.cs b/src/Microsoft.DotNet.Helix/Sdk.Tests/Microsoft.DotNet.Helix.Sdk.Tests/ProvisioningProfileProviderTests.cs index f6794c98dba..0c079af5ced 100644 --- a/src/Microsoft.DotNet.Helix/Sdk.Tests/Microsoft.DotNet.Helix.Sdk.Tests/ProvisioningProfileProviderTests.cs +++ b/src/Microsoft.DotNet.Helix/Sdk.Tests/Microsoft.DotNet.Helix.Sdk.Tests/ProvisioningProfileProviderTests.cs @@ -133,7 +133,7 @@ private static ITaskItem CreateAppBundle(string path, string targets) { var mockBundle = new Mock(); mockBundle.SetupGet(x => x.ItemSpec).Returns(path); - mockBundle.Setup(x => x.GetMetadata(CreateXHarnessAppleWorkItems.TargetPropName)).Returns(targets); + mockBundle.Setup(x => x.GetMetadata(CreateXHarnessAppleWorkItems.MetadataNames.Targets)).Returns(targets); return mockBundle.Object; } } diff --git a/src/Microsoft.DotNet.Helix/Sdk/CreateXHarnessAndroidWorkItems.cs b/src/Microsoft.DotNet.Helix/Sdk/CreateXHarnessAndroidWorkItems.cs index 1af2dd4286b..d2910307991 100644 --- a/src/Microsoft.DotNet.Helix/Sdk/CreateXHarnessAndroidWorkItems.cs +++ b/src/Microsoft.DotNet.Helix/Sdk/CreateXHarnessAndroidWorkItems.cs @@ -66,7 +66,7 @@ private async Task PrepareWorkItem(IZipArchiveManager zipArchiveManag { string workItemName = fileSystem.GetFileNameWithoutExtension(appPackage.ItemSpec); - var (testTimeout, workItemTimeout, expectedExitCode) = ParseMetadata(appPackage); + var (testTimeout, workItemTimeout, expectedExitCode, customCommands) = ParseMetadata(appPackage); string command = ValidateMetadataAndGetXHarnessAndroidCommand(appPackage, testTimeout, expectedExitCode); diff --git a/src/Microsoft.DotNet.Helix/Sdk/CreateXHarnessAppleWorkItems.cs b/src/Microsoft.DotNet.Helix/Sdk/CreateXHarnessAppleWorkItems.cs index 38bab231be6..a3effada738 100644 --- a/src/Microsoft.DotNet.Helix/Sdk/CreateXHarnessAppleWorkItems.cs +++ b/src/Microsoft.DotNet.Helix/Sdk/CreateXHarnessAppleWorkItems.cs @@ -15,12 +15,15 @@ namespace Microsoft.DotNet.Helix.Sdk /// public class CreateXHarnessAppleWorkItems : XHarnessTaskBase { - public const string TargetPropName = "Targets"; public const string iOSTargetName = "ios-device"; public const string tvOSTargetName = "tvos-device"; - private const string LaunchTimeoutPropName = "LaunchTimeout"; - private const string IncludesTestRunnerPropName = "IncludesTestRunner"; + public static class MetadataNames + { + public const string Targets = "Targets"; + public const string LaunchTimeout = "LaunchTimeout"; + public const string IncludesTestRunner = "IncludesTestRunner"; + } private const string EntryPointScript = "xharness-helix-job.apple.sh"; private const string RunnerScript = "xharness-runner.apple.sh"; @@ -73,7 +76,7 @@ public bool ExecuteTask( var tasks = AppBundles.Select(bundle => PrepareWorkItem(zipArchiveManager, fileSystem, bundle)); WorkItems = Task.WhenAll(tasks).GetAwaiter().GetResult().Where(wi => wi != null).ToArray(); - + return !Log.HasLoggedErrors; } @@ -88,38 +91,38 @@ private async Task PrepareWorkItem( ITaskItem appBundleItem) { string appFolderPath = appBundleItem.ItemSpec.TrimEnd(Path.DirectorySeparatorChar); - + string workItemName = fileSystem.GetFileName(appFolderPath); if (workItemName.EndsWith(".app")) { workItemName = workItemName.Substring(0, workItemName.Length - 4); } - var (testTimeout, workItemTimeout, expectedExitCode) = ParseMetadata(appBundleItem); + var (testTimeout, workItemTimeout, expectedExitCode, customCommands) = ParseMetadata(appBundleItem); // Validation of any metadata specific to iOS stuff goes here - if (!appBundleItem.TryGetMetadata(TargetPropName, out string target)) + if (!appBundleItem.TryGetMetadata(MetadataNames.Targets, out string targets)) { - Log.LogError($"'{TargetPropName}' metadata must be specified - " + + Log.LogError($"'{MetadataNames.Targets}' metadata must be specified - " + "expecting list of target device/simulator platforms to execute tests on (e.g. ios-simulator-64)"); return null; } - target = target.ToLowerInvariant(); + targets = targets.ToLowerInvariant(); // Optional timeout for the how long it takes for the app to be installed, booted and tests start executing TimeSpan launchTimeout = s_defaultLaunchTimeout; - if (appBundleItem.TryGetMetadata(LaunchTimeoutPropName, out string launchTimeoutProp)) + if (appBundleItem.TryGetMetadata(MetadataNames.LaunchTimeout, out string launchTimeoutProp)) { if (!TimeSpan.TryParse(launchTimeoutProp, out launchTimeout) || launchTimeout.Ticks < 0) { - Log.LogError($"Invalid value \"{launchTimeoutProp}\" provided in <{LaunchTimeoutPropName}>"); + Log.LogError($"Invalid value \"{launchTimeoutProp}\" provided in <{MetadataNames.LaunchTimeout}>"); return null; } } bool includesTestRunner = true; - if (appBundleItem.TryGetMetadata(IncludesTestRunnerPropName, out string includesTestRunnerProp)) + if (appBundleItem.TryGetMetadata(MetadataNames.IncludesTestRunner, out string includesTestRunnerProp)) { if (includesTestRunnerProp.ToLowerInvariant() == "false") { @@ -127,40 +130,58 @@ private async Task PrepareWorkItem( } } - if (includesTestRunner && expectedExitCode != 0) + if (includesTestRunner && expectedExitCode != 0 && customCommands != null) { Log.LogWarning("The ExpectedExitCode property is ignored in the `apple test` scenario"); } + if (customCommands == null) + { + // In case user didn't specify custom commands, we use our default one + customCommands = $"xharness apple {(includesTestRunner ? "test" : "run")} " + + "--app \"$app\" " + + "--output-directory \"$output_directory\" " + + "--targets \"$targets\" " + + "--timeout \"$timeout\" " + + (includesTestRunner + ? $"--launch-timeout \"$launch_timeout\" " + : $"--expected-exit-code $expected_exit_code ") + + "--xcode \"$xcode_path\" " + + "-v " + + (!string.IsNullOrEmpty(AppArguments) ? "-- " + AppArguments : string.Empty); + } + string appName = fileSystem.GetFileName(appBundleItem.ItemSpec); - string command = GetHelixCommand(appName, target, testTimeout, launchTimeout, includesTestRunner, expectedExitCode); - string payloadArchivePath = await CreateZipArchiveOfFolder(zipArchiveManager, fileSystem, appFolderPath); + string helixCommand = GetHelixCommand(appName, targets, testTimeout, launchTimeout, includesTestRunner, expectedExitCode); + string payloadArchivePath = await CreateZipArchiveOfFolder(zipArchiveManager, fileSystem, appFolderPath, customCommands); - Log.LogMessage($"Creating work item with properties Identity: {workItemName}, Payload: {appFolderPath}, Command: {command}"); + Log.LogMessage($"Creating work item with properties Identity: {workItemName}, Payload: {appFolderPath}, Command: {helixCommand}"); return new Build.Utilities.TaskItem(workItemName, new Dictionary() { { "Identity", workItemName }, { "PayloadArchive", payloadArchivePath }, - { "Command", command }, + { "Command", helixCommand }, { "Timeout", workItemTimeout.ToString() }, }); } private string GetHelixCommand(string appName, string targets, TimeSpan testTimeout, TimeSpan launchTimeout, bool includesTestRunner, int expectedExitCode) => $"chmod +x {EntryPointScript} && ./{EntryPointScript} " + - $"--app \"$HELIX_WORKITEM_ROOT/{appName}\" " + - "--output-directory \"$HELIX_WORKITEM_UPLOAD_ROOT\" " + + $"--app \"{appName}\" " + $"--targets \"{targets}\" " + $"--timeout \"{testTimeout}\" " + $"--launch-timeout \"{launchTimeout}\" " + - "--xharness-cli-path \"$XHARNESS_CLI_PATH\" " + - "--command " + (includesTestRunner ? "test" : "run") + - (expectedExitCode != 0 ? $" --expected-exit-code \"{expectedExitCode}\"" : string.Empty) + + (includesTestRunner ? "--includes-test-runner " : string.Empty) + + $"--expected-exit-code \"{expectedExitCode}\" " + (!string.IsNullOrEmpty(XcodeVersion) ? $" --xcode-version \"{XcodeVersion}\"" : string.Empty) + (!string.IsNullOrEmpty(AppArguments) ? $" --app-arguments \"{AppArguments}\"" : string.Empty); - private async Task CreateZipArchiveOfFolder(IZipArchiveManager zipArchiveManager, IFileSystem fileSystem, string folderToZip) + private async Task CreateZipArchiveOfFolder( + IZipArchiveManager zipArchiveManager, + IFileSystem fileSystem, + string folderToZip, + string injectedCommands) { if (!fileSystem.DirectoryExists(folderToZip)) { @@ -183,6 +204,7 @@ private async Task CreateZipArchiveOfFolder(IZipArchiveManager zipArchiv Log.LogMessage($"Adding the XHarness job scripts into the payload archive"); await zipArchiveManager.AddResourceFileToArchive(outputZipPath, ScriptNamespace + EntryPointScript, EntryPointScript); await zipArchiveManager.AddResourceFileToArchive(outputZipPath, ScriptNamespace + RunnerScript, RunnerScript); + await zipArchiveManager.AddContentToArchive(outputZipPath, CustomCommandsScript + ".sh", injectedCommands); return outputZipPath; } diff --git a/src/Microsoft.DotNet.Helix/Sdk/ProvisioningProfileProvider.cs b/src/Microsoft.DotNet.Helix/Sdk/ProvisioningProfileProvider.cs index 4b8dd572c67..1adb6080b39 100644 --- a/src/Microsoft.DotNet.Helix/Sdk/ProvisioningProfileProvider.cs +++ b/src/Microsoft.DotNet.Helix/Sdk/ProvisioningProfileProvider.cs @@ -62,7 +62,7 @@ public void AddProfilesToBundles(ITaskItem[] appBundles) foreach (var appBundle in appBundles) { - if (!appBundle.TryGetMetadata(CreateXHarnessAppleWorkItems.TargetPropName, out string bundleTargets)) + if (!appBundle.TryGetMetadata(CreateXHarnessAppleWorkItems.MetadataNames.Targets, out string bundleTargets)) { _log.LogError("'Targets' metadata must be specified - " + "expecting list of target device/simulator platforms to execute tests on (e.g. ios-simulator-64)"); diff --git a/src/Microsoft.DotNet.Helix/Sdk/SendHelixJob.cs b/src/Microsoft.DotNet.Helix/Sdk/SendHelixJob.cs index a4f18c4e2b4..6212882bbea 100644 --- a/src/Microsoft.DotNet.Helix/Sdk/SendHelixJob.cs +++ b/src/Microsoft.DotNet.Helix/Sdk/SendHelixJob.cs @@ -14,6 +14,27 @@ namespace Microsoft.DotNet.Helix.Sdk { public class SendHelixJob : HelixTask { + public static class MetadataNames + { + public const string Identity = "Identity"; + public const string Value = "Value"; + + // HelixWorkItem + public const string PayloadDirectory = "PayloadDirectory"; + public const string PayloadArchive = "PayloadArchive"; + public const string PayloadUri = "PayloadUri"; + public const string Timeout = "Timeout"; + public const string Command = "Command"; + public const string PreCommands = "PreCommands"; + public const string PostCommands = "PostCommands"; + + // Correlation payload + public const string FullPath = "FullPath"; + public const string Uri = "Uri"; + public const string Destination = "Destination"; + public const string IncludeDirectoryName = "IncludeDirectoryName"; + } + /// /// The 'type' value reported to Helix /// @@ -208,7 +229,7 @@ protected override async Task ExecuteCore(CancellationToken cancellationToken) def = AddProperty(def, helixProperty); } } - + def = AddBuildVariableProperty(def, "CollectionUri", "System.CollectionUri"); def = AddBuildVariableProperty(def, "Project", "System.TeamProject"); def = AddBuildVariableProperty(def, "BuildNumber", "Build.BuildNumber"); @@ -216,7 +237,7 @@ protected override async Task ExecuteCore(CancellationToken cancellationToken) def = AddBuildVariableProperty(def, "DefinitionName", "Build.DefinitionName"); def = AddBuildVariableProperty(def, "DefinitionId", "System.DefinitionId"); def = AddBuildVariableProperty(def, "Reason", "Build.Reason"); - var variablesToCopy = new [] + var variablesToCopy = new[] { "System.JobId", "System.JobName", @@ -274,12 +295,12 @@ private static string FromAzdoVariableNameToEnvironmentVariableName(string name) private IJobDefinition AddProperty(IJobDefinition def, ITaskItem property) { - if (!property.GetRequiredMetadata(Log, "Identity", out string key)) + if (!property.GetRequiredMetadata(Log, MetadataNames.Identity, out string key)) { return def; } - if (!property.GetRequiredMetadata(Log, "Value", out string value)) + if (!property.GetRequiredMetadata(Log, MetadataNames.Value, out string value)) { return def; } @@ -291,12 +312,12 @@ private IJobDefinition AddProperty(IJobDefinition def, ITaskItem property) private IJobDefinition AddWorkItem(IJobDefinition def, ITaskItem workItem) { - if (!workItem.GetRequiredMetadata(Log, "Identity", out string name)) + if (!workItem.GetRequiredMetadata(Log, MetadataNames.Identity, out string name)) { return def; } - if(name.Contains('%')) + if (name.Contains('%')) { Log.LogWarning($"Work Item named '{name}' contains encoded characters which is not recommended."); } @@ -310,7 +331,7 @@ private IJobDefinition AddWorkItem(IJobDefinition def, ITaskItem workItem) name = cleanedName; - if (!workItem.GetRequiredMetadata(Log, "Command", out string command)) + if (!workItem.GetRequiredMetadata(Log, MetadataNames.Command, out string command)) { return def; } @@ -339,9 +360,9 @@ private IJobDefinition AddWorkItem(IJobDefinition def, ITaskItem workItem) } } - string payloadDirectory = workItem.GetMetadata("PayloadDirectory"); - string payloadArchive = workItem.GetMetadata("PayloadArchive"); - string payloadUri = workItem.GetMetadata("PayloadUri"); + string payloadDirectory = workItem.GetMetadata(MetadataNames.PayloadDirectory); + string payloadArchive = workItem.GetMetadata(MetadataNames.PayloadArchive); + string payloadUri = workItem.GetMetadata(MetadataNames.PayloadUri); IWorkItemDefinition wi; if (!string.IsNullOrEmpty(payloadUri)) { @@ -365,7 +386,7 @@ private IJobDefinition AddWorkItem(IJobDefinition def, ITaskItem workItem) } - string timeoutString = workItem.GetMetadata("Timeout"); + string timeoutString = workItem.GetMetadata(MetadataNames.Timeout); if (!string.IsNullOrEmpty(timeoutString)) { if (TimeSpan.TryParse(timeoutString, CultureInfo.InvariantCulture, out TimeSpan timeout)) @@ -396,7 +417,7 @@ private IEnumerable GetCommands(ITaskItem workItem, string workItemComma } } - if (workItem.TryGetMetadata("PreCommands", out string workItemPreCommandsString)) + if (workItem.TryGetMetadata(MetadataNames.PreCommands, out string workItemPreCommandsString)) { foreach (string command in SplitCommands(workItemPreCommandsString)) { @@ -412,7 +433,7 @@ private IEnumerable GetCommands(ITaskItem workItem, string workItemComma // this way we can exit the process honoring that exit code, needed for retry. yield return IsPosixShell ? $"export {exitCodeVariableName}=$?" : $"set {exitCodeVariableName}=%ERRORLEVEL%"; - if (workItem.TryGetMetadata("PostCommands", out string workItemPostCommandsString)) + if (workItem.TryGetMetadata(MetadataNames.PostCommands, out string workItemPostCommandsString)) { foreach (string command in SplitCommands(workItemPostCommandsString)) { @@ -479,9 +500,9 @@ private IEnumerable SplitCommands(string value) private IJobDefinition AddCorrelationPayload(IJobDefinition def, ITaskItem correlationPayload) { - string path = correlationPayload.GetMetadata("FullPath"); - string uri = correlationPayload.GetMetadata("Uri"); - string destination = correlationPayload.GetMetadata("Destination") ?? ""; + string path = correlationPayload.GetMetadata(MetadataNames.FullPath); + string uri = correlationPayload.GetMetadata(MetadataNames.Uri); + string destination = correlationPayload.GetMetadata(MetadataNames.Destination) ?? ""; if (!string.IsNullOrEmpty(uri)) { @@ -499,7 +520,7 @@ private IJobDefinition AddCorrelationPayload(IJobDefinition def, ITaskItem corre if (Directory.Exists(path)) { - string includeDirectoryNameStr = correlationPayload.GetMetadata("IncludeDirectoryName"); + string includeDirectoryNameStr = correlationPayload.GetMetadata(MetadataNames.IncludeDirectoryName); bool.TryParse(includeDirectoryNameStr, out bool includeDirectoryName); Log.LogMessage(MessageImportance.Low, $"Adding Correlation Payload Directory '{path}', destination '{destination}'"); diff --git a/src/Microsoft.DotNet.Helix/Sdk/XharnessTaskBase.cs b/src/Microsoft.DotNet.Helix/Sdk/XharnessTaskBase.cs index b861b8f8816..0797b49f38e 100644 --- a/src/Microsoft.DotNet.Helix/Sdk/XharnessTaskBase.cs +++ b/src/Microsoft.DotNet.Helix/Sdk/XharnessTaskBase.cs @@ -12,11 +12,16 @@ public abstract class XHarnessTaskBase : MSBuildTaskBase private static readonly TimeSpan s_defaultWorkItemTimeout = TimeSpan.FromMinutes(20); private static readonly TimeSpan s_defaultTestTimeout = TimeSpan.FromMinutes(12); - private const string TestTimeoutPropName = "TestTimeout"; - private const string WorkItemTimeoutPropName = "WorkItemTimeout"; - private const string ExpectedExitCodePropName = "ExpectedExitCode"; + public class MetadataName + { + public const string TestTimeout = "TestTimeout"; + public const string WorkItemTimeout = "WorkItemTimeout"; + public const string ExpectedExitCode = "ExpectedExitCode"; + public const string CustomCommands = "CustomCommands"; + } protected const string ScriptNamespace = "tools.xharness_runner."; + protected const string CustomCommandsScript = "command"; /// /// Extra arguments that will be passed to the iOS/Android/... app that is being run @@ -39,25 +44,31 @@ public abstract class XHarnessTaskBase : MSBuildTaskBase /// - WorkItemTimeout - Optional timeout for the whole Helix work item run (includes SDK and tool installation) /// - ExpectedExitCode - Optional expected exit code parameter that is forwarded to XHarness /// - protected (TimeSpan TestTimeout, TimeSpan WorkItemTimeout, int ExpectedExitCode) ParseMetadata(ITaskItem xHarnessAppItem) + protected (TimeSpan TestTimeout, TimeSpan WorkItemTimeout, int ExpectedExitCode, string CustomCommands) ParseMetadata(ITaskItem xHarnessAppItem) { + xHarnessAppItem.TryGetMetadata(MetadataName.CustomCommands, out string customCommands); + if (string.IsNullOrEmpty(customCommands)) + { + customCommands = null; + } + // Optional timeout for the actual test execution in the TimeSpan format TimeSpan testTimeout = s_defaultTestTimeout; - if (xHarnessAppItem.TryGetMetadata(TestTimeoutPropName, out string testTimeoutProp)) + if (xHarnessAppItem.TryGetMetadata(MetadataName.TestTimeout, out string testTimeoutProp)) { if (!TimeSpan.TryParse(testTimeoutProp, out testTimeout) || testTimeout.Ticks < 0) { - Log.LogError($"Invalid value \"{testTimeoutProp}\" provided in <{TestTimeoutPropName}>"); + Log.LogError($"Invalid value \"{testTimeoutProp}\" provided in <{MetadataName.TestTimeout}>"); } } // Optional timeout for the whole Helix work item run (includes SDK and tool installation) TimeSpan workItemTimeout = s_defaultWorkItemTimeout; - if (xHarnessAppItem.TryGetMetadata(WorkItemTimeoutPropName, out string workItemTimeoutProp)) + if (xHarnessAppItem.TryGetMetadata(MetadataName.WorkItemTimeout, out string workItemTimeoutProp)) { if (!TimeSpan.TryParse(workItemTimeoutProp, out workItemTimeout) || workItemTimeout.Ticks < 0) { - Log.LogError($"Invalid value \"{workItemTimeoutProp}\" provided in <{WorkItemTimeoutPropName}>"); + Log.LogError($"Invalid value \"{workItemTimeoutProp}\" provided in <{MetadataName.WorkItemTimeout}>"); } } else if (!string.IsNullOrEmpty(testTimeoutProp)) @@ -67,7 +78,7 @@ public abstract class XHarnessTaskBase : MSBuildTaskBase workItemTimeout = testTimeout + s_defaultWorkItemTimeout - s_defaultTestTimeout; } - if (workItemTimeout <= testTimeout) + if (customCommands == null && workItemTimeout <= testTimeout) { Log.LogWarning( $"Work item timeout ({workItemTimeout}) should be larger than test timeout ({testTimeout}) " + @@ -75,15 +86,12 @@ public abstract class XHarnessTaskBase : MSBuildTaskBase } int expectedExitCode = 0; - if (xHarnessAppItem.TryGetMetadata(ExpectedExitCodePropName, out string expectedExitCodeProp)) + if (xHarnessAppItem.TryGetMetadata(MetadataName.ExpectedExitCode, out string expectedExitCodeProp)) { int.TryParse(expectedExitCodeProp, out expectedExitCode); } - return ( - TestTimeout: testTimeout, - WorkItemTimeout: workItemTimeout, - ExpectedExitCode: expectedExitCode); + return (testTimeout, workItemTimeout, expectedExitCode, customCommands); } } } diff --git a/src/Microsoft.DotNet.Helix/Sdk/tools/xharness-runner/Readme.md b/src/Microsoft.DotNet.Helix/Sdk/tools/xharness-runner/Readme.md index 38ed2786dc4..e9b6459f8c9 100644 --- a/src/Microsoft.DotNet.Helix/Sdk/tools/xharness-runner/Readme.md +++ b/src/Microsoft.DotNet.Helix/Sdk/tools/xharness-runner/Readme.md @@ -20,11 +20,12 @@ This is automatically included as a Helix Correlation Payload for the job when X ## How to use -There are three main ways how to use XHarness through the Helix SDK: -- Specify the apks/app bundles using the `XHarnessApkToTest` and `XHarnessAppBundleToTest` items as described below and everything will be taken care of from there. You no longer specify the `HelixCommand` to be executed. Each apk/app bundle will be processed as a separate Helix work item. +There are two main ways how to use XHarness through the Helix SDK: +- Specify the apks/app bundles using the `XHarnessApkToTest` and `XHarnessAppBundleToTest` items as described below and everything will be taken care of from there. + You no longer specify the `HelixCommand` to be executed even though you can specify your own custom commands to be executed. + Each apk/app bundle will be processed as a separate Helix work item. - Specify the `XHarnessAndroidProject` or `XHarnessAppleProject` task items which will point to projects that produce apks/app bundles from their `Build` target. - Examples - [iOS](https://github.com/dotnet/arcade/blob/master/tests/XHarness/XHarness.TestAppBundle.proj) and [Android](https://github.com/dotnet/arcade/blob/master/tests/XHarness/XHarness.TestApk.proj) -- Only request the XHarness dotnet tool to be pre-installed for the Helix job for you and then call the XHarness tool yourself as shown below. There are some required configuration properties that need to be set for XHarness to work and some optional to customize the run further: @@ -36,7 +37,7 @@ There are some required configuration properties that need to be set for XHarnes 1.0.0-prerelease.20322.1 - + test/product/ https://helix.int-dot.net $(BUILD_SOURCEVERSIONAUTHOR) @@ -50,20 +51,6 @@ There are some required configuration properties that need to be set for XHarnes ``` -### Calling the XHarness tool directly - -In case you decide to request the SDK to pre-install the XHarness tool only without any specific payload, you just don't specify `XHarnessApkToTest` or `XHarnessAppBundleToTest` items and you specify the Helix command directly. -There will be an environmental variable called `XHARNESS_CLI_PATH` set that will point to the XHarness CLI DLL that needs to be run using `dotnet exec` like so: - -```xml - - - dotnet exec $XHARNESS_CLI_PATH wasm test --engine ... - dotnet exec %XHARNESS_CLI_PATH% wasm test --engine ... - - -``` - ### iOS/tvOS/WatchOS .app bundle payloads To execute .app bundles, declare one or more `XHarnessAppBundleToTest` items: @@ -162,3 +149,41 @@ You can also specify some metadata that will help you configure the run better: ### WASM payloads We currently do not support execution of WASM workloads directly, please call the `xharness wasm test` command manually. + +### Calling the XHarness tool directly via custom commands + +In case you want to run your own custom set of commands on the application, you can specify the `CustomCommands` property. However, be mindful that you need to perform a clean up (read "uninstall the app") in case of some problems. + +Example: + +```xml + + + ios-simulator-64 + 00:12:00 + + set -e + deviceId=`xharness apple device $targets` + xharness apple install -t $targets --device "$deviceId" -o "$output_directory" --app=$app + set +e + result=0 + xharness apple just-test -t $targets --device "$deviceId" -o "$output_directory" --app net.dot.Some.iOS --timeout 00:08:00 + ((result|=$?)) + xharness apple uninstall -t $targets --device "$deviceId" -o "$output_directory" --app net.dot.Some.iOS + ((result|=$?)) + exit $result + + + +``` + +When using `CustomCommands`, several variables will be defined for you for easier run. + +#### Variables defined for Apple scenarios +- `$app` - path to the application +- `$output_directory` - path under which all files will be uploaded to Helix at the end of the job + - If a file named `testResults.xml` is found containing xUnit results, it will be uploaded back to Azure DevOps +- `$targets`, `$timeout`, `$launch_timeout`, `$expected_exit_code`, `$includes_test_runner` - parsed metadata defined on the original `XHarnessAppBundleToTest` MSBuild item + +#### Variables defined for Android scenarios +Android is currently not supported - coming soon! diff --git a/src/Microsoft.DotNet.Helix/Sdk/tools/xharness-runner/XHarnessRunner.targets b/src/Microsoft.DotNet.Helix/Sdk/tools/xharness-runner/XHarnessRunner.targets index d96450e5f79..113944554d5 100644 --- a/src/Microsoft.DotNet.Helix/Sdk/tools/xharness-runner/XHarnessRunner.targets +++ b/src/Microsoft.DotNet.Helix/Sdk/tools/xharness-runner/XHarnessRunner.targets @@ -61,6 +61,7 @@ $(HelixPreCommands);set XHARNESS_DISABLE_COLORED_OUTPUT=true $(HelixPreCommands);set XHARNESS_LOG_WITH_TIMESTAMPS=true $(HelixPreCommands);set XHARNESS_CLI_PATH=%HELIX_CORRELATION_PAYLOAD%\microsoft.dotnet.xharness.cli\$(_XHarnessPackageVersion)\tools\net6.0\any\Microsoft.DotNet.XHarness.CLI.dll + $(HelixPreCommands);doskey xharness="dotnet exec %XHARNESS_CLI_PATH%" @@ -93,8 +94,7 @@ - + diff --git a/src/Microsoft.DotNet.Helix/Sdk/tools/xharness-runner/xharness-helix-job.apple.sh b/src/Microsoft.DotNet.Helix/Sdk/tools/xharness-runner/xharness-helix-job.apple.sh index 3a654aeb38f..cb69815cee1 100644 --- a/src/Microsoft.DotNet.Helix/Sdk/tools/xharness-runner/xharness-helix-job.apple.sh +++ b/src/Microsoft.DotNet.Helix/Sdk/tools/xharness-runner/xharness-helix-job.apple.sh @@ -6,11 +6,35 @@ ### GUI rendering capabilities. ### +app='' +forwarded_args='' + +while [[ $# -gt 0 ]]; do + opt="$(echo "$1" | tr "[:upper:]" "[:lower:]")" + case "$opt" in + --app) + app="$2" + shift + ;; + *) + forwarded_args="$forwarded_args $1" + ;; + esac + shift +done + set -x +# It is important we call the script via `launchctl asuser` in order to be able to spawn +# the simulator which needs to run in a user session with GUI rendering capabilities. chmod +x xharness-runner.apple.sh helix_runner_uid=$(id -u) -sudo launchctl asuser "$helix_runner_uid" sh ./xharness-runner.apple.sh "$@" +sudo launchctl asuser "$helix_runner_uid" sh ./xharness-runner.apple.sh \ + $forwarded_args \ + --app "$HELIX_WORKITEM_ROOT/$app" \ + --xharness-cli-path "$XHARNESS_CLI_PATH" \ + --output-directory "$HELIX_WORKITEM_UPLOAD_ROOT" \ + exit_code=$? # This handles an issue where Simulators get reeaally slow and they start failing to install apps diff --git a/src/Microsoft.DotNet.Helix/Sdk/tools/xharness-runner/xharness-runner.apple.sh b/src/Microsoft.DotNet.Helix/Sdk/tools/xharness-runner/xharness-runner.apple.sh index 3fd2803a57f..c8795fb47bd 100644 --- a/src/Microsoft.DotNet.Helix/Sdk/tools/xharness-runner/xharness-runner.apple.sh +++ b/src/Microsoft.DotNet.Helix/Sdk/tools/xharness-runner/xharness-runner.apple.sh @@ -15,7 +15,7 @@ xharness_cli_path='' xcode_version='' app_arguments='' expected_exit_code=0 -command='test' +includes_test_runner=false while [[ $# -gt 0 ]]; do opt="$(echo "$1" | tr "[:upper:]" "[:lower:]")" @@ -56,13 +56,8 @@ while [[ $# -gt 0 ]]; do expected_exit_code="$2" shift ;; - --command) - command="$2" - shift - ;; - *) - echo "Invalid argument: $1" - exit 1 + --includes-test-runner) + includes_test_runner=true ;; esac shift @@ -74,23 +69,16 @@ function die () exit 1 } -if [ -z "$timeout" ]; then - die "Test timeout wasn't provided"; +if [ -z "$app" ]; then + die "App bundle path wasn't provided"; fi -if [ -z "$xharness_cli_path" ]; then - die "XHarness path wasn't provided"; +if [ -z "$targets" ]; then + die "No targets were provided"; fi -if [ -n "$app_arguments" ]; then - app_arguments="-- $app_arguments"; -fi - -if [ "$command" == "run" ]; then - app_arguments="--expected-exit-code=$expected_exit_code $app_arguments" -elif [ -n "$launch_timeout" ]; then - # shellcheck disable=SC2089 - app_arguments="--launch-timeout=$launch_timeout $app_arguments" +if [ -z "$xharness_cli_path" ]; then + die "XHarness path wasn't provided"; fi if [ -z "$xcode_version" ]; then @@ -143,19 +131,10 @@ fi export XHARNESS_DISABLE_COLORED_OUTPUT=true export XHARNESS_LOG_WITH_TIMESTAMPS=true +alias xharness="dotnet exec $xharness_cli_path" -# We include $app_arguments non-escaped and not arrayed because it might contain several extra arguments -# which come from outside and are appeneded behind "--" and forwarded to the iOS application from XHarness. -# shellcheck disable=SC2086,SC2090 -dotnet exec "$xharness_cli_path" apple $command \ - --app="$app" \ - --output-directory="$output_directory" \ - --targets="$targets" \ - --timeout="$timeout" \ - --xcode="$xcode_path" \ - -v \ - $app_arguments - +# Act out the actual commands +source command.sh exit_code=$? # Kill the simulator just in case when we fail to launch the app diff --git a/tests/UnitTests.XHarness.iOS.Device.proj b/tests/UnitTests.XHarness.iOS.Device.proj index 40172f0e4eb..917fc076e2a 100644 --- a/tests/UnitTests.XHarness.iOS.Device.proj +++ b/tests/UnitTests.XHarness.iOS.Device.proj @@ -24,7 +24,7 @@ - + diff --git a/tests/UnitTests.XHarness.iOS.IncludeCliOnly.proj b/tests/UnitTests.XHarness.iOS.IncludeCliOnly.proj deleted file mode 100644 index 70357b5d596..00000000000 --- a/tests/UnitTests.XHarness.iOS.IncludeCliOnly.proj +++ /dev/null @@ -1,54 +0,0 @@ - - - - - - - - $(MSBuildThisFileDirectory)../artifacts/bin/Microsoft.DotNet.Helix.Sdk/$(Configuration)/netcoreapp3.1/publish/Microsoft.DotNet.Helix.Sdk.dll - $(MSBuildThisFileDirectory)../artifacts/bin/Microsoft.DotNet.Helix.Sdk/$(Configuration)/net472/publish/Microsoft.DotNet.Helix.Sdk.dll - - - - test/product/ - $(AGENT_JOBNAME) - true - https://helix.dot.net - true - - - - - - dotnet exec "$XHARNESS_CLI_PATH" apple state - 00:03:00 - - - - - - - - - - - - - true - $(BUILD_SOURCEVERSIONAUTHOR) - anon - - - - - msbuild - - - - - - - diff --git a/tests/UnitTests.XHarness.iOS.proj b/tests/UnitTests.XHarness.iOS.Simulator.proj similarity index 92% rename from tests/UnitTests.XHarness.iOS.proj rename to tests/UnitTests.XHarness.iOS.Simulator.proj index f3232f46ad1..7c07d677773 100644 --- a/tests/UnitTests.XHarness.iOS.proj +++ b/tests/UnitTests.XHarness.iOS.Simulator.proj @@ -24,8 +24,9 @@ - - + + + diff --git a/tests/XHarness/XHarness.RunAppBundle.Device.proj b/tests/XHarness/XHarness.Device.AppleRun.proj similarity index 100% rename from tests/XHarness/XHarness.RunAppBundle.Device.proj rename to tests/XHarness/XHarness.Device.AppleRun.proj diff --git a/tests/XHarness/XHarness.RunAppBundle.proj b/tests/XHarness/XHarness.Simulator.AppleRun.proj similarity index 100% rename from tests/XHarness/XHarness.RunAppBundle.proj rename to tests/XHarness/XHarness.Simulator.AppleRun.proj diff --git a/tests/XHarness/XHarness.TestAppBundle.proj b/tests/XHarness/XHarness.Simulator.AppleTest.proj similarity index 84% rename from tests/XHarness/XHarness.TestAppBundle.proj rename to tests/XHarness/XHarness.Simulator.AppleTest.proj index 6225cbc254a..c176f023bfe 100644 --- a/tests/XHarness/XHarness.TestAppBundle.proj +++ b/tests/XHarness/XHarness.Simulator.AppleTest.proj @@ -3,7 +3,7 @@ - System.Numerics.Vectors.Tests.app + Microsoft.Extensions.Configuration.CommandLine.Tests.app https://netcorenativeassets.blob.core.windows.net/resource-packages/external/ios/test-app/ios-simulator-64/$(XHarnessTestAppBundleName).zip @@ -21,9 +21,9 @@ ios-simulator-64 - 00:30:00 - 00:35:00 - 00:20:00 + 00:05:00 + 00:12:00 + 00:06:00 diff --git a/tests/XHarness/XHarness.Simulator.CustomCommands.proj b/tests/XHarness/XHarness.Simulator.CustomCommands.proj new file mode 100644 index 00000000000..372ac9b06cb --- /dev/null +++ b/tests/XHarness/XHarness.Simulator.CustomCommands.proj @@ -0,0 +1,43 @@ + + + + + + System.Numerics.Vectors.Tests + https://netcorenativeassets.blob.core.windows.net/resource-packages/external/ios/test-app/ios-simulator-64/$(XHarnessAppBundleName).app.zip + + + + + + + + + + + + + + + + ios-simulator-64 + 00:12:00 + 00:05:00 + 00:05:00 + + set -ex + deviceId=`xharness apple device $targets` + xharness apple install -t=$targets --device="$deviceId" -o="$output_directory" --app="$app" -v + set +e + result=0 + xharness apple just-test -t=$targets --device="$deviceId" -o="$output_directory" --app="net.dot.$(XHarnessAppBundleName)" --launch-timeout=$launch_timeout --timeout=$timeout -v + ((result|=$?)) + xharness apple uninstall -t=$targets --device="$deviceId" -o="$output_directory" --app="net.dot.$(XHarnessAppBundleName)" -v + ((result|=$?)) + exit $result + + + + + + From c973cd26a83043e6eceb92416922db8dbcea8809 Mon Sep 17 00:00:00 2001 From: Pavel Savara Date: Thu, 13 May 2021 14:24:41 +0200 Subject: [PATCH 085/699] implemented conditional OuterLoopAttribute (#7370) implemented conditional OuterLoopAttribute, which conditionally sets `outerloop` category --- .../src/Attributes/OuterLoopAttribute.cs | 12 +++++ .../src/DiscovererHelpers.cs | 50 +++++++++++++++++- .../src/Discoverers/ActiveIssueDiscoverer.cs | 51 +------------------ .../Discoverers/OuterLoopTestsDiscoverer.cs | 8 ++- .../tests/ConditionalAttributeTests.cs | 33 ++++++++++++ 5 files changed, 102 insertions(+), 52 deletions(-) diff --git a/src/Microsoft.DotNet.XUnitExtensions/src/Attributes/OuterLoopAttribute.cs b/src/Microsoft.DotNet.XUnitExtensions/src/Attributes/OuterLoopAttribute.cs index 753c4531876..a444463bc22 100644 --- a/src/Microsoft.DotNet.XUnitExtensions/src/Attributes/OuterLoopAttribute.cs +++ b/src/Microsoft.DotNet.XUnitExtensions/src/Attributes/OuterLoopAttribute.cs @@ -13,7 +13,19 @@ namespace Xunit [AttributeUsage(AttributeTargets.Method | AttributeTargets.Class, AllowMultiple = true)] public class OuterLoopAttribute : Attribute, ITraitAttribute { + public Type CalleeType { get; private set; } + public string[] ConditionMemberNames { get; private set; } + public OuterLoopAttribute() { } public OuterLoopAttribute(string reason) { } + public OuterLoopAttribute(string reason, TestPlatforms platforms) { } + public OuterLoopAttribute(string reason, TargetFrameworkMonikers framework) { } + public OuterLoopAttribute(string reason, TestRuntimes runtimes) { } + public OuterLoopAttribute(string reason, TestPlatforms platforms = TestPlatforms.Any, TargetFrameworkMonikers framework = TargetFrameworkMonikers.Any, TestRuntimes runtimes = TestRuntimes.Any) { } + public OuterLoopAttribute(string reason, Type calleeType, params string[] conditionMemberNames) + { + CalleeType = calleeType; + ConditionMemberNames = conditionMemberNames; + } } } diff --git a/src/Microsoft.DotNet.XUnitExtensions/src/DiscovererHelpers.cs b/src/Microsoft.DotNet.XUnitExtensions/src/DiscovererHelpers.cs index dbb0dfd1459..4887e9e27bc 100644 --- a/src/Microsoft.DotNet.XUnitExtensions/src/DiscovererHelpers.cs +++ b/src/Microsoft.DotNet.XUnitExtensions/src/DiscovererHelpers.cs @@ -5,7 +5,6 @@ using System.Collections.Generic; using System.Diagnostics; using System.Linq; -using System.Reflection; using System.Runtime.InteropServices; using Xunit; @@ -59,5 +58,54 @@ internal static bool Evaluate(Type calleeType, string[] conditionMemberNames) return true; } + + internal static IEnumerable> EvaluateArguments(IEnumerable ctorArgs,string category, int skipFirst=1) + { + Debug.Assert(ctorArgs.Count() >= 2); + + TestPlatforms platforms = TestPlatforms.Any; + TargetFrameworkMonikers frameworks = TargetFrameworkMonikers.Any; + TestRuntimes runtimes = TestRuntimes.Any; + Type calleeType = null; + string[] conditionMemberNames = null; + + foreach (object arg in ctorArgs.Skip(skipFirst)) // First argument is the issue number or reason. + { + if (arg is TestPlatforms) + { + platforms = (TestPlatforms)arg; + } + else if (arg is TargetFrameworkMonikers) + { + frameworks = (TargetFrameworkMonikers)arg; + } + else if (arg is TestRuntimes) + { + runtimes = (TestRuntimes)arg; + } + else if (arg is Type) + { + calleeType = (Type)arg; + } + else if (arg is string[]) + { + conditionMemberNames = (string[])arg; + } + } + + if (calleeType != null && conditionMemberNames != null) + { + if (DiscovererHelpers.Evaluate(calleeType, conditionMemberNames)) + { + yield return new KeyValuePair(XunitConstants.Category, category); + } + } + else if (DiscovererHelpers.TestPlatformApplies(platforms) && + DiscovererHelpers.TestRuntimeApplies(runtimes) && + DiscovererHelpers.TestFrameworkApplies(frameworks)) + { + yield return new KeyValuePair(XunitConstants.Category, category); + } + } } } diff --git a/src/Microsoft.DotNet.XUnitExtensions/src/Discoverers/ActiveIssueDiscoverer.cs b/src/Microsoft.DotNet.XUnitExtensions/src/Discoverers/ActiveIssueDiscoverer.cs index 201df537d14..8e9ec7fc725 100644 --- a/src/Microsoft.DotNet.XUnitExtensions/src/Discoverers/ActiveIssueDiscoverer.cs +++ b/src/Microsoft.DotNet.XUnitExtensions/src/Discoverers/ActiveIssueDiscoverer.cs @@ -1,11 +1,7 @@ // Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. -using System; using System.Collections.Generic; -using System.Diagnostics; -using System.Linq; -using Xunit; using Xunit.Abstractions; using Xunit.Sdk; @@ -25,52 +21,7 @@ public class ActiveIssueDiscoverer : ITraitDiscoverer public IEnumerable> GetTraits(IAttributeInfo traitAttribute) { IEnumerable ctorArgs = traitAttribute.GetConstructorArguments(); - Debug.Assert(ctorArgs.Count() >= 2); - - string issue = ctorArgs.First().ToString(); - TestPlatforms platforms = TestPlatforms.Any; - TargetFrameworkMonikers frameworks = TargetFrameworkMonikers.Any; - TestRuntimes runtimes = TestRuntimes.Any; - Type calleeType = null; - string[] conditionMemberNames = null; - - foreach (object arg in ctorArgs.Skip(1)) // First argument is the issue number. - { - if (arg is TestPlatforms) - { - platforms = (TestPlatforms)arg; - } - else if (arg is TargetFrameworkMonikers) - { - frameworks = (TargetFrameworkMonikers)arg; - } - else if (arg is TestRuntimes) - { - runtimes = (TestRuntimes)arg; - } - else if (arg is Type) - { - calleeType = (Type)arg; - } - else if (arg is string[]) - { - conditionMemberNames = (string[])arg; - } - } - - if (calleeType != null && conditionMemberNames != null) - { - if (DiscovererHelpers.Evaluate(calleeType, conditionMemberNames)) - { - yield return new KeyValuePair(XunitConstants.Category, XunitConstants.Failing); - } - } - else if (DiscovererHelpers.TestPlatformApplies(platforms) && - DiscovererHelpers.TestRuntimeApplies(runtimes) && - DiscovererHelpers.TestFrameworkApplies(frameworks)) - { - yield return new KeyValuePair(XunitConstants.Category, XunitConstants.Failing); - } + return DiscovererHelpers.EvaluateArguments(ctorArgs, XunitConstants.Failing); } } } diff --git a/src/Microsoft.DotNet.XUnitExtensions/src/Discoverers/OuterLoopTestsDiscoverer.cs b/src/Microsoft.DotNet.XUnitExtensions/src/Discoverers/OuterLoopTestsDiscoverer.cs index b7672c43c96..22c829fb0e4 100644 --- a/src/Microsoft.DotNet.XUnitExtensions/src/Discoverers/OuterLoopTestsDiscoverer.cs +++ b/src/Microsoft.DotNet.XUnitExtensions/src/Discoverers/OuterLoopTestsDiscoverer.cs @@ -2,6 +2,7 @@ // The .NET Foundation licenses this file to you under the MIT license. using System.Collections.Generic; +using System.Linq; using Xunit.Abstractions; using Xunit.Sdk; @@ -20,7 +21,12 @@ public class OuterLoopTestsDiscoverer : ITraitDiscoverer /// The trait values. public IEnumerable> GetTraits(IAttributeInfo traitAttribute) { - yield return new KeyValuePair(XunitConstants.Category, XunitConstants.OuterLoop); + IEnumerable ctorArgs = traitAttribute.GetConstructorArguments(); + if (ctorArgs.Count() < 2) + { + return new[] { new KeyValuePair(XunitConstants.Category, XunitConstants.OuterLoop) }; + } + return DiscovererHelpers.EvaluateArguments(ctorArgs, XunitConstants.OuterLoop); } } } diff --git a/src/Microsoft.DotNet.XUnitExtensions/tests/ConditionalAttributeTests.cs b/src/Microsoft.DotNet.XUnitExtensions/tests/ConditionalAttributeTests.cs index 4981ba5d643..3624a069c9c 100644 --- a/src/Microsoft.DotNet.XUnitExtensions/tests/ConditionalAttributeTests.cs +++ b/src/Microsoft.DotNet.XUnitExtensions/tests/ConditionalAttributeTests.cs @@ -2,6 +2,7 @@ // The .NET Foundation licenses this file to you under the MIT license. using Xunit; +using Xunit.Sdk; namespace Microsoft.DotNet.XUnitExtensions.Tests { @@ -24,6 +25,38 @@ public void ConditionalAttributeA() s_conditionalFactExecuted = true; } + [Fact] + [OuterLoop("never outer loop", TestPlatforms.Any & ~TestPlatforms.Any)] + public void NeverConditionalOuterLoopAttribute() + { + var method = System.Reflection.MethodBase.GetCurrentMethod(); + var res = TraitHelper.GetTraits(method); + + Assert.Empty(res); + } + + [Fact] + [OuterLoop("always outer loop", TestPlatforms.Any)] + public void AlwaysConditionalOuterLoopAttribute() + { + var method = System.Reflection.MethodBase.GetCurrentMethod(); + var res = TraitHelper.GetTraits(method); + + Assert.Single(res); + Assert.Equal("outerloop", res[0].Value); + } + + [Fact] + [OuterLoop("always outer loop")] + public void AlwaysOuterLoopAttribute() + { + var method = System.Reflection.MethodBase.GetCurrentMethod(); + var res = TraitHelper.GetTraits(method); + + Assert.Single(res); + Assert.Equal("outerloop", res[0].Value); + } + [ConditionalTheory(nameof(AlwaysTrue))] [InlineData(1)] [InlineData(2)] From c2082dd40b5b224a369802a393e59f6bdcfbd727 Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Thu, 13 May 2021 14:52:47 +0000 Subject: [PATCH 086/699] [main] Update dependencies from dotnet/xliff-tasks dotnet/arcade mono/linker (#7387) [main] Update dependencies from dotnet/xliff-tasks dotnet/arcade mono/linker --- eng/Version.Details.xml | 28 ++++++++++++++-------------- eng/Versions.props | 10 +++++----- global.json | 4 ++-- 3 files changed, 21 insertions(+), 21 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index 6289e257eae..0767e70d4de 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -11,25 +11,25 @@ - + https://github.com/dotnet/arcade - c5c6ef92686f208055e884bad45d32966f0b1f95 + 6b9758661f4483a70654bcaf6f8d7c6a79ee5660 - + https://github.com/dotnet/arcade - c5c6ef92686f208055e884bad45d32966f0b1f95 + 6b9758661f4483a70654bcaf6f8d7c6a79ee5660 - + https://github.com/dotnet/arcade - c5c6ef92686f208055e884bad45d32966f0b1f95 + 6b9758661f4483a70654bcaf6f8d7c6a79ee5660 - + https://github.com/dotnet/arcade - c5c6ef92686f208055e884bad45d32966f0b1f95 + 6b9758661f4483a70654bcaf6f8d7c6a79ee5660 - + https://github.com/dotnet/arcade - c5c6ef92686f208055e884bad45d32966f0b1f95 + 6b9758661f4483a70654bcaf6f8d7c6a79ee5660 https://github.com/dotnet/arcade-services @@ -47,9 +47,9 @@ https://github.com/dotnet/roslyn 6782d022b36702cf6626d7a98ccbc55ecefc729e - + https://github.com/mono/linker - 8a2996c96f9bbcfdf151d57534e05d1f24614242 + 939d0ffd2720943149af7da0a922cf2913fb3e54 https://github.com/dotnet/sourcelink @@ -68,9 +68,9 @@ https://github.com/dotnet/symreader-converter c5ba7c88f92e2dde156c324a8c8edc04d9fa4fe0 - + https://github.com/dotnet/xliff-tasks - 1dacaf9f6c80953627314b44b538c3f3c109b41d + ac8cf3454829acf944e4ccb22b97d5abe3cb15ae diff --git a/eng/Versions.props b/eng/Versions.props index 8fb25ac23d2..54ca1c23633 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -36,7 +36,7 @@ 2.1.1 2.1.0 3.10.0-3.21256.24 - 6.0.100-preview.5.21260.2 + 6.0.100-preview.5.21263.1 16.7.1 4.8.3 5.3.0.1 @@ -66,8 +66,8 @@ 2.4.1 2.0.3 2.4.1 - 6.0.0-beta.21261.6 - 6.0.0-beta.21261.6 + 6.0.0-beta.21263.1 + 6.0.0-beta.21263.1 1.22.0 1.1.2 2.0.0 @@ -80,8 +80,8 @@ 1.1.0-beta.20258.6 1.1.0-beta-21228-01 1.1.0-beta-21228-01 - 6.0.0-beta.21261.6 - 1.0.0-beta.21261.1 + 6.0.0-beta.21263.1 + 1.0.0-beta.21262.1 1.1.0-beta.21228.1 1.0.0-prerelease.21257.2 1.1.156402 diff --git a/global.json b/global.json index 8cebe038f47..a3937e414b1 100644 --- a/global.json +++ b/global.json @@ -3,7 +3,7 @@ "dotnet": "6.0.100-preview.3.21202.5" }, "msbuild-sdks": { - "Microsoft.DotNet.Arcade.Sdk": "6.0.0-beta.21261.6", - "Microsoft.DotNet.Helix.Sdk": "6.0.0-beta.21261.6" + "Microsoft.DotNet.Arcade.Sdk": "6.0.0-beta.21263.1", + "Microsoft.DotNet.Helix.Sdk": "6.0.0-beta.21263.1" } } From 174acbcafeba3ae339c1935ec48812514ee09837 Mon Sep 17 00:00:00 2001 From: Michael Stuckey Date: Thu, 13 May 2021 11:19:40 -0700 Subject: [PATCH 087/699] Add user Dev WF (PR) Docs (#7335) Add user-oriented project docs --- .../Projects/Build Analysis/Introduction.md | 27 +++++++++++++++++++ .../Projects/Build Analysis/Specifics.md | 15 +++++++++++ 2 files changed, 42 insertions(+) create mode 100644 Documentation/Projects/Build Analysis/Introduction.md create mode 100644 Documentation/Projects/Build Analysis/Specifics.md diff --git a/Documentation/Projects/Build Analysis/Introduction.md b/Documentation/Projects/Build Analysis/Introduction.md new file mode 100644 index 00000000000..5a2fad01613 --- /dev/null +++ b/Documentation/Projects/Build Analysis/Introduction.md @@ -0,0 +1,27 @@ +# Build Analysis + +The Build Analysis Check is a service to improve the Pull Request experience by highlighting build and test information most helpful to .NET developers. Its goal is to make Pull Request results more actionable. + +## What does it do? + +High-level features include: + +- Highlight most important failure information +- Add context by combining information in Azure DevOps and Helix +- Reduce distance to most helpful analysis tools, such as Azure DevOps Test Result History for a particular test or the Helix artifact logs + +For more details, see the [specifics](Specifics.md) document. + +## How do I get it? + +Build Analysis is enabled on a per-repository basis. Contact dnceng to request it be enabled in your repository. + +## How do I use it? + +Once enabled, a new GitHub check suite will be included in all pull requests. Navigate to the "Checks" tab, then look for the ".NET Helix" suite. + +## Frequently Asked Questions + +### Is this useful even if my project does not use Helix? + +Yes! The Build Analysis result leverages Azure DevOps history and information to provide context and workflow improvements. Though it may bring additional information for Helix-based execution, it is not required. diff --git a/Documentation/Projects/Build Analysis/Specifics.md b/Documentation/Projects/Build Analysis/Specifics.md new file mode 100644 index 00000000000..7ed4c1574b7 --- /dev/null +++ b/Documentation/Projects/Build Analysis/Specifics.md @@ -0,0 +1,15 @@ +# Build Analysis Specifics + +The Build Analysis check includes these details: + +- Collapse failures of the same name across Jobs and Pipelines to improve discoverability. For example, failures of the same test across multiple operating systems are grouped together. +- Highlight a failure's state in the target branch +- Provide direct links to the most common pages for continuing analysis + - Link to the Azure DevOps build + - Link to the log of the specific step that failed + - Link to the Azure DevOps Test History for the pipeline + - Link to test history of the specific test + - Link to the Helix artifacts produced by a test + - Link to the test execution details + +Each Build Analysis page also includes a "was this helpful" link. This allows you to call out specific highlights or lowlights in your experience with the check. This feedback is then used by the Dev WF team to refine the analysis. \ No newline at end of file From e8d0df4f35cfa23174fe7204ef958cf5d1b8e797 Mon Sep 17 00:00:00 2001 From: Michelle McDaniel Date: Thu, 13 May 2021 12:13:20 -0700 Subject: [PATCH 088/699] Add more retries to symbols and sourcelink validation (#7364) * Add more retries to symbols and sourcelink validation For sourcelink validation, this change introduces retries. For symbols validation, this change expands retry scenarios to any failure, not just 503s, as sometimes, dotnet-symbol fails with no real indication why, and we want to retry on all scenarios. Also updates the logging, and separates out the files being downloaded via dotnet-symbol to separate directories based on msdl/symweb, so we don't think we have those files on both when they only exist on one, as our method for confirming if they were downloaded just checked to see if certain paths exist. * If the uri is not a github uri, don't retry, just fail the link * Address feedback, fix script --- .../post-build/sourcelink-validation.ps1 | 78 ++++++++++++------- eng/common/post-build/symbols-validation.ps1 | 21 ++--- 2 files changed, 64 insertions(+), 35 deletions(-) diff --git a/eng/common/post-build/sourcelink-validation.ps1 b/eng/common/post-build/sourcelink-validation.ps1 index 8c554729b61..85c89861719 100644 --- a/eng/common/post-build/sourcelink-validation.ps1 +++ b/eng/common/post-build/sourcelink-validation.ps1 @@ -16,6 +16,8 @@ $global:RepoFiles = @{} # Maximum number of jobs to run in parallel $MaxParallelJobs = 16 +$MaxRetries = 5 + # Wait time between check for system load $SecondsBetweenLoadChecks = 10 @@ -29,7 +31,10 @@ $ValidatePackage = { # Ensure input file exist if (!(Test-Path $PackagePath)) { Write-Host "Input file does not exist: $PackagePath" - return 1 + return [pscustomobject]@{ + result = 1 + packagePath = $PackagePath + } } # Extensions for which we'll look for SourceLink information @@ -59,7 +64,10 @@ $ValidatePackage = { # We ignore resource DLLs if ($FileName.EndsWith('.resources.dll')) { - return + return [pscustomobject]@{ + result = 0 + packagePath = $PackagePath + } } [System.IO.Compression.ZipFileExtensions]::ExtractToFile($_, $TargetFile, $true) @@ -91,36 +99,49 @@ $ValidatePackage = { $Status = 200 $Cache = $using:RepoFiles - if ( !($Cache.ContainsKey($FilePath)) ) { - try { - $Uri = $Link -as [System.URI] - - # Only GitHub links are valid - if ($Uri.AbsoluteURI -ne $null -and ($Uri.Host -match 'github' -or $Uri.Host -match 'githubusercontent')) { - $Status = (Invoke-WebRequest -Uri $Link -UseBasicParsing -Method HEAD -TimeoutSec 5).StatusCode + $totalRetries = 0 + + while ($totalRetries -lt $using:MaxRetries) { + if ( !($Cache.ContainsKey($FilePath)) ) { + try { + $Uri = $Link -as [System.URI] + + # Only GitHub links are valid + if ($Uri.AbsoluteURI -ne $null -and ($Uri.Host -match 'github' -or $Uri.Host -match 'githubusercontent')) { + $Status = (Invoke-WebRequest -Uri $Link -UseBasicParsing -Method HEAD -TimeoutSec 5).StatusCode + } + else { + # If it's not a github link, we want to break out of the loop and not retry. + $Status = 0 + $totalRetries = $using:MaxRetries + } } - else { + catch { + Write-Host $_ $Status = 0 } } - catch { - write-host $_ - $Status = 0 - } - } - if ($Status -ne 200) { - if ($NumFailedLinks -eq 0) { - if ($FailedFiles.Value -eq 0) { - Write-Host + if ($Status -ne 200) { + $totalRetries++ + + if ($totalRetries -ge $using:MaxRetries) { + if ($NumFailedLinks -eq 0) { + if ($FailedFiles.Value -eq 0) { + Write-Host + } + + Write-Host "`tFile $RealPath has broken links:" + } + + Write-Host "`t`tFailed to retrieve $Link" + + $NumFailedLinks++ } - - Write-Host "`tFile $RealPath has broken links:" } - - Write-Host "`t`tFailed to retrieve $Link" - - $NumFailedLinks++ + else { + break + } } } } @@ -136,7 +157,7 @@ $ValidatePackage = { } } catch { - + Write-Host $_ } finally { $zip.Dispose() @@ -220,6 +241,7 @@ function ValidateSourceLinkLinks { # Process each NuGet package in parallel Get-ChildItem "$InputPath\*.symbols.nupkg" | ForEach-Object { + Write-Host "Starting $($_.FullName)" Start-Job -ScriptBlock $ValidatePackage -ArgumentList $_.FullName | Out-Null $NumJobs = @(Get-Job -State 'Running').Count @@ -267,6 +289,10 @@ function InstallSourcelinkCli { try { InstallSourcelinkCli + foreach ($Job in @(Get-Job)) { + Remove-Job -Id $Job.Id + } + ValidateSourceLinkLinks } catch { diff --git a/eng/common/post-build/symbols-validation.ps1 b/eng/common/post-build/symbols-validation.ps1 index f26f6de81f0..a5af041ba77 100644 --- a/eng/common/post-build/symbols-validation.ps1 +++ b/eng/common/post-build/symbols-validation.ps1 @@ -133,27 +133,27 @@ $CountMissingSymbols = { elseif (Test-Path $SymbolPath) { return 'Module' } - elseif ($output.Contains("503 Service Unavailable")) { - # If we got a 503 error, we should retry. + else + { $totalRetries++ } - else { - return $null - } } return $null } + $FileGuid = New-Guid + $ExpandedSymbolsPath = Join-Path -Path $SymbolsPath -ChildPath $FileGuid + $SymbolsOnMSDL = & $FirstMatchingSymbolDescriptionOrDefault ` -FullPath $FileName ` -TargetServerParam '--microsoft-symbol-server' ` - -SymbolsPath $SymbolsPath ` + -SymbolsPath "$ExpandedSymbolsPath-msdl" ` -WindowsPdbVerificationParam $WindowsPdbVerificationParam $SymbolsOnSymWeb = & $FirstMatchingSymbolDescriptionOrDefault ` -FullPath $FileName ` -TargetServerParam '--internal-server' ` - -SymbolsPath $SymbolsPath ` + -SymbolsPath "$ExpandedSymbolsPath-symweb" ` -WindowsPdbVerificationParam $WindowsPdbVerificationParam Write-Host -NoNewLine "`t Checking file " $FileName "... " @@ -217,6 +217,7 @@ function CheckSymbolsAvailable { Remove-Item $ExtractPath -Force -Recurse -ErrorAction SilentlyContinue } + $TotalPackages = 0 $TotalFailures = 0 $DupedSymbols = 0 @@ -239,6 +240,8 @@ function CheckSymbolsAvailable { return } + $TotalPackages++ + Start-Job -ScriptBlock $CountMissingSymbols -ArgumentList @($FullName,$WindowsPdbVerificationParam) | Out-Null $NumJobs = @(Get-Job -State 'Running').Count @@ -264,11 +267,11 @@ function CheckSymbolsAvailable { if ($TotalFailures -gt 0 -or $DupedSymbols -gt 0) { if ($TotalFailures -gt 0) { - Write-PipelineTelemetryError -Category 'CheckSymbols' -Message "Symbols missing for $TotalFailures packages" + Write-PipelineTelemetryError -Category 'CheckSymbols' -Message "Symbols missing for $TotalFailures/$TotalPackages packages" } if ($DupedSymbols -gt 0) { - Write-PipelineTelemetryError -Category 'CheckSymbols' -Message "$DupedSymbols packages had duplicated symbol files" + Write-PipelineTelemetryError -Category 'CheckSymbols' -Message "$DupedSymbols/$TotalPackages packages had duplicated symbol files and could not be extracted" } ExitWithExitCode 1 From 2c329b20d628434d3753553cdde339b95a45003d Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Fri, 14 May 2021 15:24:57 +0000 Subject: [PATCH 089/699] [main] Update dependencies from dotnet/xharness dotnet/xliff-tasks dotnet/arcade mono/linker (#7392) [main] Update dependencies from dotnet/xharness dotnet/xliff-tasks dotnet/arcade mono/linker --- eng/Version.Details.xml | 32 ++++++++++++++++---------------- eng/Versions.props | 12 ++++++------ global.json | 4 ++-- 3 files changed, 24 insertions(+), 24 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index 0767e70d4de..c67f5a6fa17 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -11,25 +11,25 @@ - + https://github.com/dotnet/arcade - 6b9758661f4483a70654bcaf6f8d7c6a79ee5660 + e8d0df4f35cfa23174fe7204ef958cf5d1b8e797 - + https://github.com/dotnet/arcade - 6b9758661f4483a70654bcaf6f8d7c6a79ee5660 + e8d0df4f35cfa23174fe7204ef958cf5d1b8e797 - + https://github.com/dotnet/arcade - 6b9758661f4483a70654bcaf6f8d7c6a79ee5660 + e8d0df4f35cfa23174fe7204ef958cf5d1b8e797 - + https://github.com/dotnet/arcade - 6b9758661f4483a70654bcaf6f8d7c6a79ee5660 + e8d0df4f35cfa23174fe7204ef958cf5d1b8e797 - + https://github.com/dotnet/arcade - 6b9758661f4483a70654bcaf6f8d7c6a79ee5660 + e8d0df4f35cfa23174fe7204ef958cf5d1b8e797 https://github.com/dotnet/arcade-services @@ -39,17 +39,17 @@ https://github.com/dotnet/arcade-services cac955fe259cb611f6a29d09209bd717deb69037 - + https://github.com/dotnet/xharness - e2cf5abf03c18ca4c21618fbfd13bb79e330779c + 9596c3fbbb718819bc4bb9a9e3f6271b50fc718a https://github.com/dotnet/roslyn 6782d022b36702cf6626d7a98ccbc55ecefc729e - + https://github.com/mono/linker - 939d0ffd2720943149af7da0a922cf2913fb3e54 + 82e3d7cf6256e9cf477ab011dba5812a1ccca49d https://github.com/dotnet/sourcelink @@ -68,9 +68,9 @@ https://github.com/dotnet/symreader-converter c5ba7c88f92e2dde156c324a8c8edc04d9fa4fe0 - + https://github.com/dotnet/xliff-tasks - ac8cf3454829acf944e4ccb22b97d5abe3cb15ae + 2137c8df4bc5e13a105171079c433a3d72d505fb diff --git a/eng/Versions.props b/eng/Versions.props index 54ca1c23633..58dcb46ed0d 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -36,7 +36,7 @@ 2.1.1 2.1.0 3.10.0-3.21256.24 - 6.0.100-preview.5.21263.1 + 6.0.100-preview.5.21263.3 16.7.1 4.8.3 5.3.0.1 @@ -66,8 +66,8 @@ 2.4.1 2.0.3 2.4.1 - 6.0.0-beta.21263.1 - 6.0.0-beta.21263.1 + 6.0.0-beta.21263.5 + 6.0.0-beta.21263.5 1.22.0 1.1.2 2.0.0 @@ -80,10 +80,10 @@ 1.1.0-beta.20258.6 1.1.0-beta-21228-01 1.1.0-beta-21228-01 - 6.0.0-beta.21263.1 - 1.0.0-beta.21262.1 + 6.0.0-beta.21263.5 + 1.0.0-beta.21263.1 1.1.0-beta.21228.1 - 1.0.0-prerelease.21257.2 + 1.0.0-prerelease.21263.1 1.1.156402 1.1.152002 6.0.100-preview.5.21254.11 diff --git a/global.json b/global.json index a3937e414b1..ef5ff5b87ed 100644 --- a/global.json +++ b/global.json @@ -3,7 +3,7 @@ "dotnet": "6.0.100-preview.3.21202.5" }, "msbuild-sdks": { - "Microsoft.DotNet.Arcade.Sdk": "6.0.0-beta.21263.1", - "Microsoft.DotNet.Helix.Sdk": "6.0.0-beta.21263.1" + "Microsoft.DotNet.Arcade.Sdk": "6.0.0-beta.21263.5", + "Microsoft.DotNet.Helix.Sdk": "6.0.0-beta.21263.5" } } From 42de78a825b575a1ddeb73020a01fb8cd9311d09 Mon Sep 17 00:00:00 2001 From: Matt Mitchell Date: Fri, 14 May 2021 11:00:04 -0700 Subject: [PATCH 090/699] Switch roslyn channel to be the same as the rest of tooling dependencies (#7390) --- scripts/create-net6-preview-flow.ps1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/create-net6-preview-flow.ps1 b/scripts/create-net6-preview-flow.ps1 index eab6cd8d50d..d5850f60fd8 100644 --- a/scripts/create-net6-preview-flow.ps1 +++ b/scripts/create-net6-preview-flow.ps1 @@ -87,7 +87,7 @@ AddFlow https://github.com/dotnet/templating $SdkChannel https://github.com/dotn Write-Host "Add tooling->sdk flow" AddFlow https://github.com/nuget/nuget.client $VSChannel https://github.com/dotnet/sdk $SdkBranch EveryBuild -AddFlow https://github.com/dotnet/roslyn "VS Master" https://github.com/dotnet/sdk $SdkBranch EveryBuild +AddFlow https://github.com/dotnet/roslyn $VSChannel https://github.com/dotnet/sdk $SdkBranch EveryBuild AddFlow https://github.com/dotnet/fsharp $VSChannel https://github.com/dotnet/sdk $SdkBranch EveryBuild AddFlow https://github.com/dotnet/msbuild $VSChannel https://github.com/dotnet/sdk $SdkBranch EveryBuild From 836e0429939351379a73b85ab38e06b30227fb88 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C5=99emek=20Vysok=C3=BD?= Date: Mon, 17 May 2021 14:48:00 +0200 Subject: [PATCH 091/699] Add option to reset Apple simulators in Helix SDK (#7396) --- .../Sdk/CreateXHarnessAppleWorkItems.cs | 24 +++++++++++++++++-- .../Sdk/tools/xharness-runner/Readme.md | 8 +++++-- .../xharness-runner/xharness-runner.apple.sh | 4 ++++ 3 files changed, 32 insertions(+), 4 deletions(-) diff --git a/src/Microsoft.DotNet.Helix/Sdk/CreateXHarnessAppleWorkItems.cs b/src/Microsoft.DotNet.Helix/Sdk/CreateXHarnessAppleWorkItems.cs index a3effada738..1145d896658 100644 --- a/src/Microsoft.DotNet.Helix/Sdk/CreateXHarnessAppleWorkItems.cs +++ b/src/Microsoft.DotNet.Helix/Sdk/CreateXHarnessAppleWorkItems.cs @@ -23,6 +23,7 @@ public static class MetadataNames public const string Targets = "Targets"; public const string LaunchTimeout = "LaunchTimeout"; public const string IncludesTestRunner = "IncludesTestRunner"; + public const string ResetSimulator = "ResetSimulator"; } private const string EntryPointScript = "xharness-helix-job.apple.sh"; @@ -135,6 +136,15 @@ private async Task PrepareWorkItem( Log.LogWarning("The ExpectedExitCode property is ignored in the `apple test` scenario"); } + bool resetSimulator = false; + if (appBundleItem.TryGetMetadata(MetadataNames.ResetSimulator, out string resetSimulatorRunnerProp)) + { + if (resetSimulatorRunnerProp.ToLowerInvariant() == "true") + { + resetSimulator = true; + } + } + if (customCommands == null) { // In case user didn't specify custom commands, we use our default one @@ -146,13 +156,14 @@ private async Task PrepareWorkItem( (includesTestRunner ? $"--launch-timeout \"$launch_timeout\" " : $"--expected-exit-code $expected_exit_code ") + + (resetSimulator ? $"--reset-simulator " : string.Empty) + "--xcode \"$xcode_path\" " + "-v " + (!string.IsNullOrEmpty(AppArguments) ? "-- " + AppArguments : string.Empty); } string appName = fileSystem.GetFileName(appBundleItem.ItemSpec); - string helixCommand = GetHelixCommand(appName, targets, testTimeout, launchTimeout, includesTestRunner, expectedExitCode); + string helixCommand = GetHelixCommand(appName, targets, testTimeout, launchTimeout, includesTestRunner, expectedExitCode, resetSimulator); string payloadArchivePath = await CreateZipArchiveOfFolder(zipArchiveManager, fileSystem, appFolderPath, customCommands); Log.LogMessage($"Creating work item with properties Identity: {workItemName}, Payload: {appFolderPath}, Command: {helixCommand}"); @@ -166,13 +177,22 @@ private async Task PrepareWorkItem( }); } - private string GetHelixCommand(string appName, string targets, TimeSpan testTimeout, TimeSpan launchTimeout, bool includesTestRunner, int expectedExitCode) => + private string GetHelixCommand( + string appName, + string targets, + TimeSpan testTimeout, + TimeSpan launchTimeout, + bool includesTestRunner, + int expectedExitCode, + bool resetSimulator) + => $"chmod +x {EntryPointScript} && ./{EntryPointScript} " + $"--app \"{appName}\" " + $"--targets \"{targets}\" " + $"--timeout \"{testTimeout}\" " + $"--launch-timeout \"{launchTimeout}\" " + (includesTestRunner ? "--includes-test-runner " : string.Empty) + + (resetSimulator ? "--reset-simulator" : string.Empty) + $"--expected-exit-code \"{expectedExitCode}\" " + (!string.IsNullOrEmpty(XcodeVersion) ? $" --xcode-version \"{XcodeVersion}\"" : string.Empty) + (!string.IsNullOrEmpty(AppArguments) ? $" --app-arguments \"{AppArguments}\"" : string.Empty); diff --git a/src/Microsoft.DotNet.Helix/Sdk/tools/xharness-runner/Readme.md b/src/Microsoft.DotNet.Helix/Sdk/tools/xharness-runner/Readme.md index e9b6459f8c9..38f94eab3d7 100644 --- a/src/Microsoft.DotNet.Helix/Sdk/tools/xharness-runner/Readme.md +++ b/src/Microsoft.DotNet.Helix/Sdk/tools/xharness-runner/Readme.md @@ -67,7 +67,7 @@ To execute .app bundles, declare one or more `XHarnessAppBundleToTest` items: The `` metadata is a required configuration that tells XHarness which kind of device/Simulator to target. Use the XHarness CLI help command to find more (see the `--targets` option). -You can also specify some metadata that will help you configure the run better: +You can also specify some additional metadata that will help you configure the run better: ```xml @@ -89,6 +89,10 @@ You can also specify some metadata that will help you configure the run better: false + + + + true ``` @@ -128,7 +132,7 @@ To execute .apks, declare one or more `XHarnessApkToTest` items: ``` -You can also specify some metadata that will help you configure the run better: +You can also specify some additional metadata that will help you configure the run better: ```xml diff --git a/src/Microsoft.DotNet.Helix/Sdk/tools/xharness-runner/xharness-runner.apple.sh b/src/Microsoft.DotNet.Helix/Sdk/tools/xharness-runner/xharness-runner.apple.sh index c8795fb47bd..58264b2ed74 100644 --- a/src/Microsoft.DotNet.Helix/Sdk/tools/xharness-runner/xharness-runner.apple.sh +++ b/src/Microsoft.DotNet.Helix/Sdk/tools/xharness-runner/xharness-runner.apple.sh @@ -16,6 +16,7 @@ xcode_version='' app_arguments='' expected_exit_code=0 includes_test_runner=false +reset_simulator=false while [[ $# -gt 0 ]]; do opt="$(echo "$1" | tr "[:upper:]" "[:lower:]")" @@ -59,6 +60,9 @@ while [[ $# -gt 0 ]]; do --includes-test-runner) includes_test_runner=true ;; + --reset-simulator) + reset_simulator=true + ;; esac shift done From 2c78124e3df8a374632b4ff210eb46cde7b70eb2 Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Mon, 17 May 2021 14:37:09 +0000 Subject: [PATCH 092/699] [main] Update dependencies from dotnet/xliff-tasks dotnet/roslyn dotnet/arcade dotnet/xharness mono/linker (#7397) [main] Update dependencies from dotnet/xliff-tasks dotnet/roslyn dotnet/arcade dotnet/xharness mono/linker --- eng/Version.Details.xml | 36 ++++++++++++++++++------------------ eng/Versions.props | 14 +++++++------- global.json | 4 ++-- 3 files changed, 27 insertions(+), 27 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index c67f5a6fa17..36d40beaf79 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -11,25 +11,25 @@ - + https://github.com/dotnet/arcade - e8d0df4f35cfa23174fe7204ef958cf5d1b8e797 + 42de78a825b575a1ddeb73020a01fb8cd9311d09 - + https://github.com/dotnet/arcade - e8d0df4f35cfa23174fe7204ef958cf5d1b8e797 + 42de78a825b575a1ddeb73020a01fb8cd9311d09 - + https://github.com/dotnet/arcade - e8d0df4f35cfa23174fe7204ef958cf5d1b8e797 + 42de78a825b575a1ddeb73020a01fb8cd9311d09 - + https://github.com/dotnet/arcade - e8d0df4f35cfa23174fe7204ef958cf5d1b8e797 + 42de78a825b575a1ddeb73020a01fb8cd9311d09 - + https://github.com/dotnet/arcade - e8d0df4f35cfa23174fe7204ef958cf5d1b8e797 + 42de78a825b575a1ddeb73020a01fb8cd9311d09 https://github.com/dotnet/arcade-services @@ -39,17 +39,17 @@ https://github.com/dotnet/arcade-services cac955fe259cb611f6a29d09209bd717deb69037 - + https://github.com/dotnet/xharness - 9596c3fbbb718819bc4bb9a9e3f6271b50fc718a + 2eef520188beb49e31460d0a7dbe040294428ff1 - + https://github.com/dotnet/roslyn - 6782d022b36702cf6626d7a98ccbc55ecefc729e + dc0aff25e0ace6e6bf98269963612f9a67cdc897 - + https://github.com/mono/linker - 82e3d7cf6256e9cf477ab011dba5812a1ccca49d + 7a5c445a69359415b7ff18b91cd24472ef9509ff https://github.com/dotnet/sourcelink @@ -68,9 +68,9 @@ https://github.com/dotnet/symreader-converter c5ba7c88f92e2dde156c324a8c8edc04d9fa4fe0 - + https://github.com/dotnet/xliff-tasks - 2137c8df4bc5e13a105171079c433a3d72d505fb + f4bfde77fb60daf52d8fec738d96d1d54e37dd88 diff --git a/eng/Versions.props b/eng/Versions.props index 58dcb46ed0d..c05b89e73e9 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -35,8 +35,8 @@ 2.0.0 2.1.1 2.1.0 - 3.10.0-3.21256.24 - 6.0.100-preview.5.21263.3 + 3.10.0-4.21262.12 + 6.0.100-preview.5.21264.1 16.7.1 4.8.3 5.3.0.1 @@ -66,8 +66,8 @@ 2.4.1 2.0.3 2.4.1 - 6.0.0-beta.21263.5 - 6.0.0-beta.21263.5 + 6.0.0-beta.21264.2 + 6.0.0-beta.21264.2 1.22.0 1.1.2 2.0.0 @@ -80,10 +80,10 @@ 1.1.0-beta.20258.6 1.1.0-beta-21228-01 1.1.0-beta-21228-01 - 6.0.0-beta.21263.5 - 1.0.0-beta.21263.1 + 6.0.0-beta.21264.2 + 1.0.0-beta.21265.1 1.1.0-beta.21228.1 - 1.0.0-prerelease.21263.1 + 1.0.0-prerelease.21264.3 1.1.156402 1.1.152002 6.0.100-preview.5.21254.11 diff --git a/global.json b/global.json index ef5ff5b87ed..4af823ee231 100644 --- a/global.json +++ b/global.json @@ -3,7 +3,7 @@ "dotnet": "6.0.100-preview.3.21202.5" }, "msbuild-sdks": { - "Microsoft.DotNet.Arcade.Sdk": "6.0.0-beta.21263.5", - "Microsoft.DotNet.Helix.Sdk": "6.0.0-beta.21263.5" + "Microsoft.DotNet.Arcade.Sdk": "6.0.0-beta.21264.2", + "Microsoft.DotNet.Helix.Sdk": "6.0.0-beta.21264.2" } } From f211f0e1cd86e4e22f2b76c2b6872d5e0fb00eba Mon Sep 17 00:00:00 2001 From: Jacques Eloff Date: Mon, 17 May 2021 16:59:18 -0700 Subject: [PATCH 093/699] Update workload build tasks (#7362) * Update workload build tasks * Add installer platform to payload package * Set package type to DotnetPlatform * Handle abstract workload definitions, more tests * Fix .csproj template, add template items for NuGet * Fix unit test * PR feedback --- .../GenerateVisualStudioWorkloadTests.cs | 72 ++++- .../VisualStudioComponentTests.cs | 6 +- .../testassets/BlazorWorkloadManifest.json | 259 ++++++++++++++++++ .../src/EmbeddedTemplates.cs | 5 +- .../src/GenerateMsiBase.cs | 102 ++++++- .../src/GenerateTaskBase.cs | 17 ++ .../src/GenerateVisualStudioWorkload.cs | 78 ++++-- .../src/GenerateWorkloadMsis.cs | 34 ++- .../src/GetWorkloadPackPackageReferences.cs | 142 ++++++++++ .../src/Metadata.cs | 2 + ...rosoft.DotNet.Build.Tasks.Workloads.csproj | 2 + .../src/Misc/Icon.png | Bin 0 -> 7006 bytes .../src/Misc/LICENSE.TXT | 23 ++ .../src/MsiProperties.cs | 44 +++ .../src/MsiTemplate/Registry.wxs | 13 +- .../src/MsiTemplate/Variables.wxi | 3 + .../src/NuGetPackage.cs | 18 ++ .../src/VisualStudioComponent.cs | 18 +- 18 files changed, 786 insertions(+), 52 deletions(-) create mode 100644 src/Microsoft.DotNet.Build.Tasks.Workloads.Tests/testassets/BlazorWorkloadManifest.json create mode 100644 src/Microsoft.DotNet.Build.Tasks.Workloads/src/GetWorkloadPackPackageReferences.cs create mode 100644 src/Microsoft.DotNet.Build.Tasks.Workloads/src/Misc/Icon.png create mode 100644 src/Microsoft.DotNet.Build.Tasks.Workloads/src/Misc/LICENSE.TXT create mode 100644 src/Microsoft.DotNet.Build.Tasks.Workloads/src/MsiProperties.cs diff --git a/src/Microsoft.DotNet.Build.Tasks.Workloads.Tests/GenerateVisualStudioWorkloadTests.cs b/src/Microsoft.DotNet.Build.Tasks.Workloads.Tests/GenerateVisualStudioWorkloadTests.cs index 6a302bc095d..9d84c83e341 100644 --- a/src/Microsoft.DotNet.Build.Tasks.Workloads.Tests/GenerateVisualStudioWorkloadTests.cs +++ b/src/Microsoft.DotNet.Build.Tasks.Workloads.Tests/GenerateVisualStudioWorkloadTests.cs @@ -3,9 +3,11 @@ using System; using System.Collections.Generic; +using System.Linq; using System.IO; using Microsoft.Arcade.Test.Common; using Microsoft.Build.Utilities; +using Microsoft.Build.Framework; using Xunit; namespace Microsoft.DotNet.Build.Tasks.Workloads.Tests @@ -14,6 +16,8 @@ public class GenerateVisualStudioWorkloadTests { public string IntermediateBaseOutputPath = Path.Combine(AppContext.BaseDirectory, "obj"); + public string TestAssetsPath = Path.Combine(AppContext.BaseDirectory, "testassets"); + public string TestIntermediateBaseOutputPath => Path.Combine(IntermediateBaseOutputPath, Path.GetFileNameWithoutExtension(Path.GetTempFileName())); [Fact] @@ -27,15 +31,17 @@ public void ItGeneratesASwixProjectFromAWorkloadManifest() { new TaskItem(workloadManifest) }, - - ComponentVersion = "6.5.38766", + ComponentVersions = new TaskItem[] + { + new TaskItem("microsoft-net-sdk-blazorwebassembly-aot", new Dictionary { { "Version", "6.5.38766" } }), + }, GenerateMsis = false, IntermediateBaseOutputPath = TestIntermediateBaseOutputPath, WixToolsetPath = "", BuildEngine = new MockBuildEngine() }; - buildTask.Execute(); + Assert.True(buildTask.Execute()); string outputPath = Path.GetDirectoryName(buildTask.SwixProjects[0].GetMetadata("FullPath")); string componentSwr = File.ReadAllText(Path.Combine(outputPath, "component.swr")); @@ -60,14 +66,17 @@ public void ItCanShortenPackageIds() { new TaskItem("Microsoft.NET.Runtime", new Dictionary { {"Replacement", "MSFT"} }) }, - ComponentVersion = "6.5.38766", + ComponentVersions = new TaskItem[] + { + new TaskItem("microsoft-net-sdk-blazorwebassembly-aot", new Dictionary { { "Version", "6.5.38766" } }), + }, GenerateMsis = false, IntermediateBaseOutputPath = TestIntermediateBaseOutputPath, WixToolsetPath = "", BuildEngine = new MockBuildEngine() }; - buildTask.Execute(); + Assert.True(buildTask.Execute()); string outputPath = Path.GetDirectoryName(buildTask.SwixProjects[0].GetMetadata("FullPath")); string componentSwr = File.ReadAllText(Path.Combine(outputPath, "component.swr")); @@ -96,7 +105,7 @@ public void ItGeneratesASwixProjectFromAWorkloadManifestPackage() BuildEngine = new MockBuildEngine() }; - buildTask.Execute(); + Assert.True(buildTask.Execute()); string outputPath = Path.GetDirectoryName(buildTask.SwixProjects[0].GetMetadata("FullPath")); string componentSwr = File.ReadAllText(Path.Combine(outputPath, "component.swr")); @@ -106,5 +115,56 @@ public void ItGeneratesASwixProjectFromAWorkloadManifestPackage() Assert.Contains("vs.dependency id=Microsoft.NET.Runtime.MonoAOTCompiler.Task.6.0.0-preview.4.21201.1", componentSwr); Assert.Contains("vs.dependency id=Microsoft.NET.Runtime.Emscripten.Python.6.0.0-preview.4.21205.1", componentSwr); } + + [Fact] + public void ItSkipsAbstractManifests() + { + var buildTask = new GenerateVisualStudioWorkload() + { + WorkloadManifests = new TaskItem[] + { + new TaskItem(Path.Combine(TestAssetsPath, "BlazorWorkloadManifest.json")) + }, + GenerateMsis = false, + IntermediateBaseOutputPath = TestIntermediateBaseOutputPath, + WixToolsetPath = "", + BuildEngine = new MockBuildEngine() + }; + + Assert.True(buildTask.Execute()); + string outputPath = Path.GetDirectoryName(buildTask.SwixProjects[0].GetMetadata("FullPath")); + string componentSwr = File.ReadAllText(Path.Combine(outputPath, "component.swr")); + Assert.Single(buildTask.SwixProjects); + Assert.Contains(@"package name=microsoft.net.sdk.blazorwebassembly.aot + version=6.0.0.0", componentSwr); + } + + [Fact] + public void ItReportsMissingPacks() + { + var buildTask = new GenerateVisualStudioWorkload() + { + WorkloadManifests = new TaskItem[] + { + new TaskItem(Path.Combine(TestAssetsPath, "BlazorWorkloadManifest.json")) + }, + GenerateMsis = true, + IntermediateBaseOutputPath = TestIntermediateBaseOutputPath, + WixToolsetPath = "", + PackagesPath = Path.Combine(TestAssetsPath, "packages"), + BuildEngine = new MockBuildEngine() + }; + + // The task will fail to generate VS components because we have no generated MSI packages. + // The package feeds are volatile until we actually release and the execution time for the unit tests would spike + Assert.False(buildTask.Execute()); + ITaskItem missingPack = buildTask.MissingPacks.Where(mp => string.Equals(mp.ItemSpec, "Microsoft.NET.Runtime.MonoAOTCompiler.Task")).FirstOrDefault(); + + // This package would be required by the workload, but would be missing + Assert.Equal(Path.Combine(TestAssetsPath, "packages", "Microsoft.NET.Runtime.MonoAOTCompiler.Task.6.0.0-preview.5.21262.5.nupkg"), missingPack.GetMetadata("SourcePackage")); + + // This package should not show as missing because it has the wrong platform and belongs to an abstract workload + Assert.DoesNotContain("Microsoft.NETCore.App.Runtime.AOT.osx-x64.Cross.ios-arm", buildTask.MissingPacks.Select(p => p.ItemSpec)); + } } } diff --git a/src/Microsoft.DotNet.Build.Tasks.Workloads.Tests/VisualStudioComponentTests.cs b/src/Microsoft.DotNet.Build.Tasks.Workloads.Tests/VisualStudioComponentTests.cs index 26dcf22903c..f7e2c9e0a29 100644 --- a/src/Microsoft.DotNet.Build.Tasks.Workloads.Tests/VisualStudioComponentTests.cs +++ b/src/Microsoft.DotNet.Build.Tasks.Workloads.Tests/VisualStudioComponentTests.cs @@ -23,7 +23,7 @@ public void ItAssignsDefaultValues() { WorkloadManifest manifest = Create("WorkloadManifest.json"); WorkloadDefinition definition = manifest.Workloads.FirstOrDefault().Value; - VisualStudioComponent component = VisualStudioComponent.Create(null, manifest, definition, "1.2.3.4", NoItems, NoItems, NoItems); + VisualStudioComponent component = VisualStudioComponent.Create(null, manifest, definition, NoItems, NoItems, NoItems, NoItems); string swixProjDirectory = RandomPath; Directory.CreateDirectory(swixProjDirectory); @@ -51,7 +51,7 @@ public void ItCanOverrideDefaultValues() }) }; - VisualStudioComponent component = VisualStudioComponent.Create(null, manifest, definition, "1.2.3.4", NoItems, resources, NoItems); + VisualStudioComponent component = VisualStudioComponent.Create(null, manifest, definition, NoItems, NoItems, resources, NoItems); string swixProjDirectory = RandomPath; Directory.CreateDirectory(swixProjDirectory); @@ -69,7 +69,7 @@ public void ItCreatesSafeComponentIds() { WorkloadManifest manifest = Create("WorkloadManifest.json"); WorkloadDefinition definition = manifest.Workloads.FirstOrDefault().Value; - VisualStudioComponent component = VisualStudioComponent.Create(null, manifest, definition, "1.2.3.4", NoItems, NoItems, NoItems); + VisualStudioComponent component = VisualStudioComponent.Create(null, manifest, definition, NoItems, NoItems, NoItems, NoItems); string swixProjDirectory = RandomPath; Directory.CreateDirectory(swixProjDirectory); diff --git a/src/Microsoft.DotNet.Build.Tasks.Workloads.Tests/testassets/BlazorWorkloadManifest.json b/src/Microsoft.DotNet.Build.Tasks.Workloads.Tests/testassets/BlazorWorkloadManifest.json new file mode 100644 index 00000000000..d5047b135f1 --- /dev/null +++ b/src/Microsoft.DotNet.Build.Tasks.Workloads.Tests/testassets/BlazorWorkloadManifest.json @@ -0,0 +1,259 @@ +{ + "version": "6.0.0-preview.5.21262.5", + "workloads": { + "microsoft-net-sdk-blazorwebassembly-aot": { + "description": "Browser Runtime native performance tools", + "packs": [ + "Microsoft.NETCore.App.Runtime.Mono.browser-wasm", + "Microsoft.NET.Runtime.MonoAOTCompiler.Task", + "Microsoft.NET.Runtime.WebAssembly.Sdk", + "Microsoft.NETCore.App.Runtime.AOT.Cross.browser-wasm", + "Microsoft.NET.Runtime.Emscripten.Node", + "Microsoft.NET.Runtime.Emscripten.Python", + "Microsoft.NET.Runtime.Emscripten.Sdk" + ] + }, + "microsoft-net-runtime-android": { + "abstract": true, + "description": "Android Mono Runtime and AOT Workload", + "packs": [ + "Microsoft.NET.Runtime.RuntimeConfigParser.Task", + "Microsoft.NET.Runtime.MonoAOTCompiler.Task", + "Microsoft.NETCore.App.Runtime.Mono.android-arm", + "Microsoft.NETCore.App.Runtime.Mono.android-arm64", + "Microsoft.NETCore.App.Runtime.Mono.android-x64", + "Microsoft.NETCore.App.Runtime.Mono.android-x86", + "Microsoft.NETCore.App.Runtime.AOT.Cross.android-x64", + "Microsoft.NETCore.App.Runtime.AOT.Cross.android-arm", + "Microsoft.NETCore.App.Runtime.AOT.Cross.android-arm64" + ] + }, + "microsoft-net-runtime-ios": { + "abstract": true, + "description": "iOS Mono Runtime and AOT Workload", + "packs": [ + "Microsoft.NET.Runtime.RuntimeConfigParser.Task", + "Microsoft.NET.Runtime.MonoAOTCompiler.Task", + "Microsoft.NETCore.App.Runtime.Mono.ios-arm", + "Microsoft.NETCore.App.Runtime.Mono.ios-arm64", + "Microsoft.NETCore.App.Runtime.Mono.iossimulator", + "Microsoft.NETCore.App.Runtime.Mono.iossimulator-x86", + "Microsoft.NETCore.App.Runtime.AOT.Cross.ios-arm", + "Microsoft.NETCore.App.Runtime.AOT.Cross.ios-arm64", + "Microsoft.NETCore.App.Runtime.AOT.Cross.iossimulator", + "Microsoft.NETCore.App.Runtime.AOT.Cross.iossimulator-x86" + ], + "platforms": [ "osx-arm64", "osx-x64" ] + }, + "microsoft-net-runtime-tvos": { + "abstract": true, + "description": "tvOS Mono Runtime and AOT Workload", + "packs": [ + "Microsoft.NET.Runtime.RuntimeConfigParser.Task", + "Microsoft.NET.Runtime.MonoAOTCompiler.Task", + "Microsoft.NETCore.App.Runtime.Mono.tvos-arm64", + "Microsoft.NETCore.App.Runtime.Mono.tvos-x64", + "Microsoft.NETCore.App.Runtime.Mono.tvossimulator", + "Microsoft.NETCore.App.Runtime.AOT.Cross.tvos-arm64", + "Microsoft.NETCore.App.Runtime.AOT.Cross.tvossimulator" + ], + "platforms": [ "osx-arm64", "osx-x64" ] + } + }, + "packs": { + "Microsoft.NET.Runtime.RuntimeConfigParser.Task": { + "kind": "Sdk", + "version": "6.0.0-preview.5.21262.5" + }, + "Microsoft.NET.Runtime.MonoAOTCompiler.Task": { + "kind": "Sdk", + "version": "6.0.0-preview.5.21262.5" + }, + "Microsoft.NET.Runtime.WebAssembly.Sdk": { + "kind": "Sdk", + "version": "6.0.0-preview.5.21262.5" + }, + "Microsoft.NETCore.App.Runtime.Mono.android-arm": { + "kind": "framework", + "version": "6.0.0-preview.5.21262.5" + }, + "Microsoft.NETCore.App.Runtime.Mono.android-arm64": { + "kind": "framework", + "version": "6.0.0-preview.5.21262.5" + }, + "Microsoft.NETCore.App.Runtime.Mono.android-x64": { + "kind": "framework", + "version": "6.0.0-preview.5.21262.5" + }, + "Microsoft.NETCore.App.Runtime.Mono.android-x86": { + "kind": "framework", + "version": "6.0.0-preview.5.21262.5" + }, + "Microsoft.NETCore.App.Runtime.AOT.Cross.android-x86": { + "kind": "Sdk", + "version": "6.0.0-preview.5.21262.5", + "alias-to": { + "win-x64": "Microsoft.NETCore.App.Runtime.AOT.win-x64.Cross.android-x86", + "linux-x64": "Microsoft.NETCore.App.Runtime.AOT.linux-x64.Cross.android-x86", + "osx-x64": "Microsoft.NETCore.App.Runtime.AOT.osx-x64.Cross.android-x86", + "osx-arm64": "Microsoft.NETCore.App.Runtime.AOT.osx-x64.Cross.android-x86" + } + }, + "Microsoft.NETCore.App.Runtime.AOT.Cross.android-x64": { + "kind": "Sdk", + "version": "6.0.0-preview.5.21262.5", + "alias-to": { + "win-x64": "Microsoft.NETCore.App.Runtime.AOT.win-x64.Cross.android-x64", + "linux-x64": "Microsoft.NETCore.App.Runtime.AOT.linux-x64.Cross.android-x64", + "osx-x64": "Microsoft.NETCore.App.Runtime.AOT.osx-x64.Cross.android-x64", + "osx-arm64": "Microsoft.NETCore.App.Runtime.AOT.osx-x64.Cross.android-x64" + } + }, + "Microsoft.NETCore.App.Runtime.AOT.Cross.android-arm": { + "kind": "Sdk", + "version": "6.0.0-preview.5.21262.5", + "alias-to": { + "win-x64": "Microsoft.NETCore.App.Runtime.AOT.win-x64.Cross.android-arm", + "linux-x64": "Microsoft.NETCore.App.Runtime.AOT.linux-x64.Cross.android-arm", + "osx-x64": "Microsoft.NETCore.App.Runtime.AOT.osx-x64.Cross.android-arm", + "osx-arm64": "Microsoft.NETCore.App.Runtime.AOT.osx-x64.Cross.android-arm" + } + }, + "Microsoft.NETCore.App.Runtime.AOT.Cross.android-arm64": { + "kind": "Sdk", + "version": "6.0.0-preview.5.21262.5", + "alias-to": { + "win-x64": "Microsoft.netcore.app.runtime.aot.win-x64.Cross.android-arm64", + "linux-x64": "Microsoft.NETCore.App.Runtime.AOT.linux-x64.Cross.android-arm64", + "osx-x64": "Microsoft.NETCore.App.Runtime.AOT.osx-x64.Cross.android-arm64", + "osx-arm64": "Microsoft.NETCore.App.Runtime.AOT.osx-x64.Cross.android-arm64" + } + }, + "Microsoft.NETCore.App.Runtime.Mono.ios-arm" : { + "kind": "framework", + "version": "6.0.0-preview.5.21262.5" + }, + "Microsoft.NETCore.App.Runtime.Mono.ios-arm64" : { + "kind": "framework", + "version": "6.0.0-preview.5.21262.5" + }, + "Microsoft.NETCore.App.Runtime.Mono.iossimulator" : { + "kind": "framework", + "version": "6.0.0-preview.5.21262.5", + "alias-to": { + "osx-arm64": "Microsoft.NETCore.App.Runtime.Mono.iossimulator-arm64", + "osx-x64": "Microsoft.NETCore.App.Runtime.Mono.iossimulator-x64" + } + }, + "Microsoft.NETCore.App.Runtime.Mono.iossimulator-x86" : { + "kind": "framework", + "version": "6.0.0-preview.5.21262.5", + "alias-to": { + "osx-x64": "Microsoft.NETCore.App.Runtime.Mono.iossimulator-x86" + } + }, + "Microsoft.NETCore.App.Runtime.AOT.Cross.tvos-arm64": { + "kind": "Sdk", + "version": "6.0.0-preview.5.21262.5", + "alias-to": { + "osx-x64": "Microsoft.NETCore.App.Runtime.AOT.osx-x64.Cross.tvos-arm64", + "osx-arm64": "Microsoft.NETCore.App.Runtime.AOT.osx-x64.Cross.tvos-arm64", + } + }, + "Microsoft.NETCore.App.Runtime.Mono.tvos-arm64" : { + "kind": "framework", + "version": "6.0.0-preview.5.21262.5" + }, + "Microsoft.NETCore.App.Runtime.Mono.tvossimulator" : { + "kind": "framework", + "version": "6.0.0-preview.5.21262.5", + "alias-to": { + "osx-arm64": "Microsoft.NETCore.App.Runtime.Mono.tvossimulator-arm64", + "osx-x64": "Microsoft.NETCore.App.Runtime.Mono.tvossimulator-x64" + } + }, + "Microsoft.NETCore.App.Runtime.AOT.Cross.tvossimulator": { + "kind": "Sdk", + "version": "6.0.0-preview.5.21262.5", + "alias-to": { + "osx-arm64": "Microsoft.NETCore.App.Runtime.AOT.osx-x64.Cross.tvossimulator-arm64", + "osx-x64": "Microsoft.NETCore.App.Runtime.AOT.osx-x64.Cross.tvossimulator-x64" + } + }, + "Microsoft.NETCore.App.Runtime.AOT.Cross.ios-arm": { + "kind": "Sdk", + "version": "6.0.0-preview.5.21262.5", + "alias-to": { + "osx-x64": "Microsoft.NETCore.App.Runtime.AOT.osx-x64.Cross.ios-arm", + "osx-arm64": "Microsoft.NETCore.App.Runtime.AOT.osx-x64.Cross.ios-arm", + } + }, + "Microsoft.NETCore.App.Runtime.AOT.Cross.ios-arm64": { + "kind": "Sdk", + "version": "6.0.0-preview.5.21262.5", + "alias-to": { + "osx-x64": "Microsoft.NETCore.App.Runtime.AOT.osx-x64.Cross.ios-arm64", + "osx-arm64": "Microsoft.NETCore.App.Runtime.AOT.osx-x64.Cross.ios-arm64", + } + }, + "Microsoft.NETCore.App.Runtime.AOT.Cross.iossimulator": { + "kind": "Sdk", + "version": "6.0.0-preview.5.21262.5", + "alias-to": { + "osx-arm64": "Microsoft.NETCore.App.Runtime.AOT.osx-x64.Cross.iossimulator-arm64", + "osx-x64": "Microsoft.NETCore.App.Runtime.AOT.osx-x64.Cross.iossimulator-x64" + } + }, + "Microsoft.NETCore.App.Runtime.AOT.Cross.iossimulator-x86": { + "kind": "Sdk", + "version": "6.0.0-preview.5.21262.5", + "alias-to": { + "osx-x64": "Microsoft.NETCore.App.Runtime.AOT.osx-x64.Cross.iossimulator-x86" + } + }, + "Microsoft.NETCore.App.Runtime.AOT.Cross.browser-wasm": { + "kind": "Sdk", + "version": "6.0.0-preview.5.21262.5", + "alias-to": { + "win-x86": "Microsoft.NETCore.App.Runtime.AOT.win-x86.Cross.browser-wasm", + "win-x64": "Microsoft.NETCore.App.Runtime.AOT.win-x64.Cross.browser-wasm", + "linux-x64": "Microsoft.NETCore.App.Runtime.AOT.linux-x64.Cross.browser-wasm", + "osx-x64": "Microsoft.NETCore.App.Runtime.AOT.osx-x64.Cross.browser-wasm", + "osx-arm64": "Microsoft.NETCore.App.Runtime.AOT.osx-x64.Cross.browser-wasm" + } + }, + "Microsoft.NETCore.App.Runtime.Mono.browser-wasm" : { + "kind": "framework", + "version": "6.0.0-preview.5.21262.5" + }, + "Microsoft.NET.Runtime.Emscripten.Node" : { + "kind": "Sdk", + "version": "6.0.0-preview.5.21226.1", + "alias-to": { + "win-x64": "Microsoft.NET.Runtime.Emscripten.2.0.12.Node.win-x64", + "linux-x64": "Microsoft.NET.Runtime.Emscripten.2.0.12.Node.linux-x64", + "osx-x64": "Microsoft.NET.Runtime.Emscripten.2.0.12.Node.osx-x64", + "osx-arm64": "Microsoft.NET.Runtime.Emscripten.2.0.12.Node.osx-x64" + } + }, + "Microsoft.NET.Runtime.Emscripten.Python" : { + "kind": "Sdk", + "version": "6.0.0-preview.5.21226.1", + "alias-to": { + "win-x64": "Microsoft.NET.Runtime.Emscripten.2.0.12.Python.win-x64", + "osx-x64": "Microsoft.NET.Runtime.Emscripten.2.0.12.Python.osx-x64", + "osx-arm64": "Microsoft.NET.Runtime.Emscripten.2.0.12.Python.osx-x64" + } + }, + "Microsoft.NET.Runtime.Emscripten.Sdk" : { + "kind": "Sdk", + "version": "6.0.0-preview.5.21226.1", + "alias-to": { + "win-x64": "Microsoft.NET.Runtime.Emscripten.2.0.12.Sdk.win-x64", + "linux-x64": "Microsoft.NET.Runtime.Emscripten.2.0.12.Sdk.linux-x64", + "osx-x64": "Microsoft.NET.Runtime.Emscripten.2.0.12.Sdk.osx-x64", + "osx-arm64": "Microsoft.NET.Runtime.Emscripten.2.0.12.Sdk.osx-x64" + } + } + } +} diff --git a/src/Microsoft.DotNet.Build.Tasks.Workloads/src/EmbeddedTemplates.cs b/src/Microsoft.DotNet.Build.Tasks.Workloads/src/EmbeddedTemplates.cs index 0db62ecef27..ffb6b3739e9 100644 --- a/src/Microsoft.DotNet.Build.Tasks.Workloads/src/EmbeddedTemplates.cs +++ b/src/Microsoft.DotNet.Build.Tasks.Workloads/src/EmbeddedTemplates.cs @@ -73,7 +73,10 @@ static EmbeddedTemplates() { $"component.swr", $"{s_namespace}.SwixTemplate.component.swr" }, { $"component.res.swr", $"{s_namespace}.SwixTemplate.component.res.swr" }, { $"component.swixproj", $"{s_namespace}.SwixTemplate.component.swixproj" }, - { $"manifest.vsmanproj", $"{s_namespace}.SwixTempalte.manifest.vsmanproj"} + { $"manifest.vsmanproj", $"{s_namespace}.SwixTempalte.manifest.vsmanproj"}, + + { "Icon.png", $"{s_namespace}.Misc.Icon.png"}, + { "LICENSE.TXT", $"{s_namespace}.Misc.LICENSE.TXT"} }; } } diff --git a/src/Microsoft.DotNet.Build.Tasks.Workloads/src/GenerateMsiBase.cs b/src/Microsoft.DotNet.Build.Tasks.Workloads/src/GenerateMsiBase.cs index 9d80faf5a85..dcc1480a9ea 100644 --- a/src/Microsoft.DotNet.Build.Tasks.Workloads/src/GenerateMsiBase.cs +++ b/src/Microsoft.DotNet.Build.Tasks.Workloads/src/GenerateMsiBase.cs @@ -5,6 +5,8 @@ using System.Collections.Generic; using System.IO; using System.Linq; +using System.Text.Json; +using System.Xml; using Microsoft.Build.Framework; using Microsoft.Build.Utilities; using Microsoft.NET.Sdk.WorkloadManifestReader; @@ -124,7 +126,7 @@ protected IEnumerable Generate(string sourcePackage, string swixPacka if (string.IsNullOrWhiteSpace(nupkg.Title)) { - Log?.LogWarning($"'{sourcePackage}' should have a non-empty title. The MSI ProductName will be set to the package ID instead."); + Log?.LogMessage(MessageImportance.High, $"'{sourcePackage}' should have a non-empty title. The MSI ProductName will be set to the package ID instead."); productName = nupkg.Id; } @@ -229,11 +231,26 @@ protected IEnumerable Generate(string sourcePackage, string swixPacka throw new Exception($"Failed to link MSI."); } + // Generate metadata used for CLI based installations. + string msiPath = light.OutputFile; + MsiProperties msiProps = new MsiProperties + { + InstallSize = MsiUtils.GetInstallSize(msiPath), + ProductCode = MsiUtils.GetProperty(msiPath, "ProductCode"), + ProductVersion = MsiUtils.GetProperty(msiPath, "ProductVersion"), + ProviderKeyName = $"{nupkg.Id},{nupkg.Version},{platform}", + UpgradeCode = MsiUtils.GetProperty(msiPath, "UpgradeCode") + }; + + string msiJsonPath = Path.Combine(Path.GetDirectoryName(msiPath), Path.GetFileNameWithoutExtension(msiPath) + ".json"); + File.WriteAllText(msiJsonPath, JsonSerializer.Serialize(msiProps)); + TaskItem msi = new(light.OutputFile); msi.SetMetadata(Metadata.Platform, platform); msi.SetMetadata(Metadata.Version, nupkg.ProductVersion); + msi.SetMetadata(Metadata.JsonProperties, msiJsonPath); - if (GenerateSwixAuthoring) + if (GenerateSwixAuthoring && IsSupportedByVisualStudio(platform)) { string swixProject = GenerateSwixPackageAuthoring(light.OutputFile, !string.IsNullOrWhiteSpace(swixPackageId) ? swixPackageId : @@ -245,12 +262,93 @@ protected IEnumerable Generate(string sourcePackage, string swixPacka } } + // Generate a .csproj to build a NuGet payload package to carry the MSI and JSON manifest + msi.SetMetadata(Metadata.PackageProject, GeneratePackageProject(msi.ItemSpec, msiJsonPath, platform, nupkg)); + msis.Add(msi); } return msis; } + private string GeneratePackageProject(string msiPath, string msiJsonPath, string platform, NugetPackage nupkg) + { + string msiPackageProject = Path.Combine(MsiPackageDirectory, platform, nupkg.Id, "msi.csproj"); + string msiPackageProjectDir = Path.GetDirectoryName(msiPackageProject); + + Log?.LogMessage($"Generating package project: '{msiPackageProject}'"); + + if (Directory.Exists(msiPackageProjectDir)) + { + Directory.Delete(msiPackageProjectDir, recursive: true); + } + + Directory.CreateDirectory(msiPackageProjectDir); + + EmbeddedTemplates.Extract("Icon.png", msiPackageProjectDir); + EmbeddedTemplates.Extract("LICENSE.TXT", msiPackageProjectDir); + + string licenseTextPath = Path.Combine(msiPackageProjectDir, "LICENSE.TXT"); + + XmlWriterSettings settings = new XmlWriterSettings + { + Indent = true, + IndentChars = " ", + }; + + XmlWriter writer = XmlWriter.Create(msiPackageProject, settings); + + writer.WriteStartElement("Project"); + writer.WriteAttributeString("Sdk", "Microsoft.NET.Sdk"); + + writer.WriteStartElement("PropertyGroup"); + writer.WriteElementString("TargetFramework", "net5.0"); + writer.WriteElementString("GeneratePackageOnBuild", "true"); + writer.WriteElementString("IncludeBuildOutput", "false"); + writer.WriteElementString("IsPackable", "true"); + writer.WriteElementString("PackageType", "DotnetPlatform"); + writer.WriteElementString("SuppressDependenciesWhenPacking", "true"); + writer.WriteElementString("NoWarn", "$(NoWarn);NU5128"); + writer.WriteElementString("PackageId", $"{nupkg.Id}.Msi.{platform}"); + writer.WriteElementString("PackageVersion", $"{nupkg.Version}"); + writer.WriteElementString("Description", nupkg.Description); + writer.WriteElementString("PackageIcon", "Icon.png"); + + if (!string.IsNullOrWhiteSpace(nupkg.Authors)) + { + writer.WriteElementString("Authors", nupkg.Authors); + } + + if (!string.IsNullOrWhiteSpace(nupkg.Copyright)) + { + writer.WriteElementString("Copyright", nupkg.Copyright); + } + + writer.WriteElementString("PackageLicenseExpression", "MIT"); + writer.WriteEndElement(); + + writer.WriteStartElement("ItemGroup"); + WriteItem(writer, "None", msiPath, @"\data"); + WriteItem(writer, "None", msiJsonPath, @"\data"); + WriteItem(writer, "None", licenseTextPath, @"\"); + writer.WriteEndElement(); + + writer.WriteEndElement(); + writer.Flush(); + writer.Close(); + + return msiPackageProject; + } + + private void WriteItem(XmlWriter writer, string itemName, string include, string packagePath) + { + writer.WriteStartElement(itemName); + writer.WriteAttributeString("Include", include); + writer.WriteAttributeString("Pack", "true"); + writer.WriteAttributeString("PackagePath", packagePath); + writer.WriteEndElement(); + } + private string GenerateSwixPackageAuthoring(string msiPath, string packageId, string platform) { GenerateVisualStudioMsiPackageProject swixTask = new() diff --git a/src/Microsoft.DotNet.Build.Tasks.Workloads/src/GenerateTaskBase.cs b/src/Microsoft.DotNet.Build.Tasks.Workloads/src/GenerateTaskBase.cs index 82d7dfe48b9..54f9f2cbbfb 100644 --- a/src/Microsoft.DotNet.Build.Tasks.Workloads/src/GenerateTaskBase.cs +++ b/src/Microsoft.DotNet.Build.Tasks.Workloads/src/GenerateTaskBase.cs @@ -12,6 +12,8 @@ namespace Microsoft.DotNet.Build.Tasks.Workloads { public abstract class GenerateTaskBase : Task { + public static readonly string[] SupportedVisualStudioPlatforms = { "x86", "x64" }; + /// /// The root intermediate output directory. /// @@ -42,6 +44,11 @@ public string IntermediateBaseOutputPath /// public string MsiDirectory => Path.Combine(SourceDirectory, "msi"); + /// + /// Root directory for .csproj sources to build NuGet packages. + /// + public string MsiPackageDirectory => Path.Combine(SourceDirectory, "msiPackage"); + /// /// The directory containing the WiX toolset binaries. /// @@ -51,5 +58,15 @@ public string WixToolsetPath get; set; } + + /// + /// Determines if the specified platfor is support by Visual Studio. + /// + /// The platform to check + /// if the platform is supported by Visual Studio. + protected bool IsSupportedByVisualStudio(string platform) + { + return SupportedVisualStudioPlatforms.Contains(platform); + } } } diff --git a/src/Microsoft.DotNet.Build.Tasks.Workloads/src/GenerateVisualStudioWorkload.cs b/src/Microsoft.DotNet.Build.Tasks.Workloads/src/GenerateVisualStudioWorkload.cs index e590fdfe609..92f9a43eb5f 100644 --- a/src/Microsoft.DotNet.Build.Tasks.Workloads/src/GenerateVisualStudioWorkload.cs +++ b/src/Microsoft.DotNet.Build.Tasks.Workloads/src/GenerateVisualStudioWorkload.cs @@ -31,7 +31,7 @@ public ITaskItem[] ComponentResources /// The version of the component in the Visual Studio manifest. If no version is specified, /// the manifest version is used. /// - public string ComponentVersion + public ITaskItem[] ComponentVersions { get; set; @@ -99,6 +99,15 @@ public ITaskItem[] WorkloadPackages set; } + /// + /// Semicolon sepearate list of ICEs to suppress. + /// + public string SuppressIces + { + get; + set; + } + /// /// The paths of the generated .swixproj files. /// @@ -109,6 +118,13 @@ public ITaskItem[] SwixProjects set; } + [Output] + public ITaskItem[] Msis + { + get; + set; + } + public override bool Execute() { try @@ -167,6 +183,7 @@ internal IEnumerable GenerateMsisFromManifests(ITaskItem[] workloadMa OutputPath = this.OutputPath, PackagesPath = this.PackagesPath, ShortNames = this.ShortNames, + SuppressIces = this.SuppressIces, WixToolsetPath = this.WixToolsetPath, WorkloadManifests = workloadManifests }; @@ -184,11 +201,16 @@ internal IEnumerable GenerateMsisFromManifests(ITaskItem[] workloadMa foreach (ITaskItem item in MissingPacks) { - Log?.LogWarning($"Unable to locate '{item.GetMetadata(Metadata.SourcePackage)}'. Short name: {item.GetMetadata(Metadata.ShortName)}, Platform: {item.GetMetadata(Metadata.Platform)}, Workload Pack: ({item.ItemSpec})."); + Log?.LogMessage(MessageImportance.High, $"Unable to locate '{item.GetMetadata(Metadata.SourcePackage)}'. Short name: {item.GetMetadata(Metadata.ShortName)}, Platform: {item.GetMetadata(Metadata.Platform)}, Workload Pack: ({item.ItemSpec})."); } } - return msiTask.Msis.Select(m => new TaskItem(m.GetMetadata(Metadata.SwixProject))); + Msis = msiTask.Msis; + + // The Msis output parameter also contains the .swixproj files, but for VS, we want all the project files for + // packages and components. + return msiTask.Msis.Where(m => !string.IsNullOrWhiteSpace(m.GetMetadata(Metadata.SwixProject))). + Select(m => new TaskItem(m.GetMetadata(Metadata.SwixProject))); } } @@ -200,9 +222,23 @@ internal IEnumerable ProcessWorkloadManifestFile(string workloadManif foreach (WorkloadDefinition workloadDefinition in manifest.Workloads.Values) { + // Abstract workloads can only be extended, so we can't generate items for this yet. Might need to do a second pass + // if there are other manifests that extend the workload. + if (workloadDefinition.IsAbstract) + { + Log?.LogMessage(MessageImportance.High, $"{workloadDefinition.Id} is abstract and will be skipped."); + continue; + } + + if ((workloadDefinition.Platforms?.Count > 0) && (!workloadDefinition.Platforms.Any(p => p.StartsWith("win")))) + { + Log?.LogMessage(MessageImportance.High, $"{workloadDefinition.Id} platforms does not support Windows and will be skipped ({string.Join(", ", workloadDefinition.Platforms)})."); + continue; + } + // Each workload maps to a Visual Studio component. VisualStudioComponent component = VisualStudioComponent.Create(Log, manifest, workloadDefinition, - ComponentVersion, ShortNames, ComponentResources, MissingPacks); + ComponentVersions, ShortNames, ComponentResources, MissingPacks); // If there are no dependencies, regardless of whether we are generating MSIs, we'll report an // error as we'd produce invalid SWIX. @@ -226,17 +262,10 @@ internal IEnumerable ProcessWorkloadManifestFile(string workloadManif internal IEnumerable ProcessWorkloadManifestPackage(string workloadManifestPackage) { NugetPackage workloadPackage = new(workloadManifestPackage, Log); - string packageContentPath = Path.Combine(PackageDirectory, $"{workloadPackage.Identity}"); workloadPackage.Extract(packageContentPath, Enumerable.Empty()); - string workloadManifestJsonPath = Directory.GetFiles(packageContentPath, "WorkloadManifest.json").FirstOrDefault(); - - if (string.IsNullOrWhiteSpace(workloadManifestJsonPath)) - { - throw new FileNotFoundException($"Unable to locate WorkloadManifest.json under '{packageContentPath}'."); - } - return ProcessWorkloadManifestFile(workloadManifestJsonPath); + return ProcessWorkloadManifestFile(GetWorkloadManifestJsonPath(packageContentPath)); } internal ITaskItem[] GetManifestsFromManifestPackages(ITaskItem[] workloadPackages) @@ -248,13 +277,7 @@ internal ITaskItem[] GetManifestsFromManifestPackages(ITaskItem[] workloadPackag NugetPackage workloadPackage = new(item.GetMetadata("FullPath"), Log); string packageContentPath = Path.Combine(PackageDirectory, $"{workloadPackage.Identity}"); workloadPackage.Extract(packageContentPath, Enumerable.Empty()); - string workloadManifestJsonPath = Directory.GetFiles(packageContentPath, "WorkloadManifest.json").FirstOrDefault(); - - if (string.IsNullOrWhiteSpace(workloadManifestJsonPath)) - { - throw new FileNotFoundException($"Unable to locate WorkloadManifest.json under '{packageContentPath}'."); - } - + string workloadManifestJsonPath = GetWorkloadManifestJsonPath(packageContentPath); Log?.LogMessage(MessageImportance.Low, $"Adding manifest: {workloadManifestJsonPath}"); manifests.Add(new TaskItem(workloadManifestJsonPath)); @@ -262,5 +285,22 @@ internal ITaskItem[] GetManifestsFromManifestPackages(ITaskItem[] workloadPackag return manifests.ToArray(); } + + internal string GetWorkloadManifestJsonPath(string packageContentPath) + { + string dataDirectory = Path.Combine(packageContentPath, "data"); + + // Check the data directory first, otherwise fall back to the older format where manifests were in the root of the package. + string workloadManifestJsonPath = Directory.Exists(dataDirectory) ? + Directory.GetFiles(dataDirectory, "WorkloadManifest.json").FirstOrDefault() : + Directory.GetFiles(packageContentPath, "WorkloadManifest.json").FirstOrDefault(); + + if (string.IsNullOrWhiteSpace(workloadManifestJsonPath)) + { + throw new FileNotFoundException($"Unable to locate WorkloadManifest.json under '{packageContentPath}'."); + } + + return workloadManifestJsonPath; + } } } diff --git a/src/Microsoft.DotNet.Build.Tasks.Workloads/src/GenerateWorkloadMsis.cs b/src/Microsoft.DotNet.Build.Tasks.Workloads/src/GenerateWorkloadMsis.cs index 375071c27fc..43518c7c7d1 100644 --- a/src/Microsoft.DotNet.Build.Tasks.Workloads/src/GenerateWorkloadMsis.cs +++ b/src/Microsoft.DotNet.Build.Tasks.Workloads/src/GenerateWorkloadMsis.cs @@ -5,7 +5,6 @@ using System.Collections.Generic; using System.IO; using System.Linq; -using System.Text; using Microsoft.Build.Framework; using Microsoft.Build.Utilities; using Microsoft.NET.Sdk.WorkloadManifestReader; @@ -59,7 +58,7 @@ public override bool Execute() return false; } - // Each pack maps to multiple packs and different MSI packages. We considering a pack + // Each pack maps to multiple packs and different MSI packages. We consider a pack // to be missing when none of its dependent MSIs were found/generated. IEnumerable workloadPacks = GetWorkloadPacks(); List missingPackIds = new(workloadPacks.Select(p => $"{p.Id}")); @@ -72,12 +71,18 @@ public override bool Execute() { if (!File.Exists(sourcePackage)) { - Log?.LogWarning($"Workload pack package does not exist: {sourcePackage}"); + Log?.LogMessage(MessageImportance.High, $"Workload pack package does not exist: {sourcePackage}"); + + missingPacks.Add(new TaskItem($"{pack.Id}", new Dictionary + { + { Metadata.SourcePackage, sourcePackage }, + { Metadata.Platform, string.Join(",", platforms) }, + { Metadata.ShortName, $"{pack.Id.ToString().Replace(ShortNames)}" } + })); + continue; } - missingPackIds.Remove(pack.Id.ToString()); - // Swix package is always versioned to support upgrading SxS installs. The pack alias will be // used for individual MSIs string swixPackageId = $"{pack.Id.ToString().Replace(ShortNames)}.{pack.Version}"; @@ -89,7 +94,7 @@ public override bool Execute() } Msis = msis.ToArray(); - MissingPacks = missingPackIds.Select(p => new TaskItem(p)).ToArray(); + MissingPacks = missingPacks.ToArray(); } catch (Exception e) { @@ -106,8 +111,19 @@ private IEnumerable GetWorkloadPacks() IEnumerable manifests = WorkloadManifests.Select( w => WorkloadManifestReader.ReadWorkloadManifest(Path.GetFileNameWithoutExtension(w.ItemSpec), File.OpenRead(w.ItemSpec))); - return manifests.SelectMany(m => m.Packs.Values).GroupBy(x => new { x.Id, x.Version }). - Select(g => g.First()); + // We want all workloads in all manifests iff + // 1. The workload isn't abstract + // 2. The workload has no platform or at least one platform includes Windows + var workloads = manifests.SelectMany(m => m.Workloads). + Select(w => w.Value). + Where(wd => !wd.IsAbstract). + Where(wd => (wd.Platforms == null) || wd.Platforms.Any(p => p.StartsWith("win"))); + + var packIds = workloads.SelectMany(w => w.Packs).Distinct(); + + return manifests.SelectMany(m => m.Packs.Values). + Where(p => packIds.Contains(p.Id)). + Distinct(); } /// @@ -142,7 +158,7 @@ private IEnumerable GetWorkloadPacks() break; default: Log?.LogMessage($"Skipping alias ({rid})."); - break; + continue; } } } diff --git a/src/Microsoft.DotNet.Build.Tasks.Workloads/src/GetWorkloadPackPackageReferences.cs b/src/Microsoft.DotNet.Build.Tasks.Workloads/src/GetWorkloadPackPackageReferences.cs new file mode 100644 index 00000000000..ddfac1f4afb --- /dev/null +++ b/src/Microsoft.DotNet.Build.Tasks.Workloads/src/GetWorkloadPackPackageReferences.cs @@ -0,0 +1,142 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +using System; +using System.Xml; +using System.IO; +using System.Collections.Generic; +using System.Linq; +using Microsoft.Build.Framework; +using Microsoft.Build.Utilities; +using Microsoft.NET.Sdk.WorkloadManifestReader; + +namespace Microsoft.DotNet.Build.Tasks.Workloads +{ + public class GetWorkloadPackPackageReferences : Task + { + public string ProjectFile + { + get; + set; + } + + public ITaskItem[] ExcludedPackIds + { + get; + set; + } + + public string PackageSource + { + get; + set; + } + + [Required] + public ITaskItem[] ManifestFiles + { + get; + set; + } + + public override bool Execute() + { + try + { + Directory.CreateDirectory(Path.GetDirectoryName(ProjectFile)); + + List packs = new(); + + var excludedPackIds = ExcludedPackIds.Select(i => i.ItemSpec); + + XmlWriterSettings settings = new XmlWriterSettings + { + Indent = true, + IndentChars = " " + }; + + XmlWriter writer = XmlWriter.Create(ProjectFile, settings); + + writer.WriteStartElement("Project"); + writer.WriteAttributeString("Sdk", "Microsoft.NET.Sdk"); + + writer.WriteStartElement("PropertyGroup"); + writer.WriteElementString("TargetFramework", "net6.0"); + writer.WriteElementString("IncludeBuildOutput", "false"); + writer.WriteEndElement(); + + writer.WriteStartElement("ItemGroup"); + + foreach (var manifestFile in ManifestFiles) + { + WorkloadManifest manifest = WorkloadManifestReader.ReadWorkloadManifest(Path.GetFileNameWithoutExtension(manifestFile.ItemSpec), + File.OpenRead(manifestFile.ItemSpec)); + + foreach (var pack in manifest.Packs.Values) + { + if (pack.IsAlias) + { + foreach (var alias in pack.AliasTo.Keys.Where(k => k.StartsWith("win"))) + { + if (!excludedPackIds.Contains($"{pack.AliasTo[alias]}")) + { + WriteItem(writer, "PackageDownload", ("Include", $"{pack.AliasTo[alias]}"), ("Version", $"[{pack.Version}]")); + packs.Add($"$(NuGetPackageRoot){pack.AliasTo[alias]}\\{pack.Version}\\*.nupkg"); + } + } + } + else if (!excludedPackIds.Contains($"{pack.Id}")) + { + WriteItem(writer, "PackageDownload", ("Include", $"{pack.Id}"), ("Version", $"[{pack.Version}]")); + packs.Add($"$(NuGetPackageRoot){pack.Id}\\{pack.Version}\\*.nupkg"); + } + } + } + + writer.WriteEndElement(); + + writer.WriteStartElement("Target"); + writer.WriteAttributeString("Name", "CopyPacks"); + writer.WriteAttributeString("AfterTargets", "Build"); + + writer.WriteStartElement("ItemGroup"); + + foreach (var pack in packs) + { + WriteItem(writer, "Pack", ("Include", pack)); + } + + writer.WriteEndElement(); + + writer.WriteStartElement("Copy"); + writer.WriteAttributeString("SourceFiles", "@(Pack)"); + writer.WriteAttributeString("DestinationFolder", $"{PackageSource}"); + writer.WriteEndElement(); + + writer.WriteEndElement(); + + writer.WriteEndElement(); + writer.Flush(); + writer.Close(); + } + catch (Exception e) + { + Log.LogErrorFromException(e); + } + + return !Log.HasLoggedErrors; + } + + private void WriteItem(XmlWriter writer, string itemName, params (string name, string value)[] metadata) + { + writer.WriteStartElement(itemName); + + foreach (var m in metadata) + { + writer.WriteAttributeString(m.name, m.value); + } + + writer.WriteEndElement(); + } + } +} diff --git a/src/Microsoft.DotNet.Build.Tasks.Workloads/src/Metadata.cs b/src/Microsoft.DotNet.Build.Tasks.Workloads/src/Metadata.cs index ae45d44be14..d4dc2f89d93 100644 --- a/src/Microsoft.DotNet.Build.Tasks.Workloads/src/Metadata.cs +++ b/src/Microsoft.DotNet.Build.Tasks.Workloads/src/Metadata.cs @@ -8,8 +8,10 @@ internal class Metadata public const string AliasTo = "AliasTo"; public const string Category = "Category"; public const string Description = "Description"; + public const string JsonProperties = "JsonProperties"; public const string Platform = "Platform"; public const string Replacement = "Replacement"; + public const string PackageProject = "PackageProject"; public const string ShortName = "ShortName"; public const string SourcePackage = "SourcePackage"; public const string SwixProject = "SwixProject"; diff --git a/src/Microsoft.DotNet.Build.Tasks.Workloads/src/Microsoft.DotNet.Build.Tasks.Workloads.csproj b/src/Microsoft.DotNet.Build.Tasks.Workloads/src/Microsoft.DotNet.Build.Tasks.Workloads.csproj index 824ba35510e..ae34705aed9 100644 --- a/src/Microsoft.DotNet.Build.Tasks.Workloads/src/Microsoft.DotNet.Build.Tasks.Workloads.csproj +++ b/src/Microsoft.DotNet.Build.Tasks.Workloads/src/Microsoft.DotNet.Build.Tasks.Workloads.csproj @@ -21,6 +21,7 @@ + @@ -47,6 +48,7 @@ + diff --git a/src/Microsoft.DotNet.Build.Tasks.Workloads/src/Misc/Icon.png b/src/Microsoft.DotNet.Build.Tasks.Workloads/src/Misc/Icon.png new file mode 100644 index 0000000000000000000000000000000000000000..a0f1fdbf4d5eae0e561018cccee74f6a454cdb9c GIT binary patch literal 7006 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 literal 0 HcmV?d00001 diff --git a/src/Microsoft.DotNet.Build.Tasks.Workloads/src/Misc/LICENSE.TXT b/src/Microsoft.DotNet.Build.Tasks.Workloads/src/Misc/LICENSE.TXT new file mode 100644 index 00000000000..984713a4962 --- /dev/null +++ b/src/Microsoft.DotNet.Build.Tasks.Workloads/src/Misc/LICENSE.TXT @@ -0,0 +1,23 @@ +The MIT License (MIT) + +Copyright (c) .NET Foundation and Contributors + +All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/src/Microsoft.DotNet.Build.Tasks.Workloads/src/MsiProperties.cs b/src/Microsoft.DotNet.Build.Tasks.Workloads/src/MsiProperties.cs new file mode 100644 index 00000000000..2bacc28619a --- /dev/null +++ b/src/Microsoft.DotNet.Build.Tasks.Workloads/src/MsiProperties.cs @@ -0,0 +1,44 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Microsoft.DotNet.Build.Tasks.Workloads +{ + public class MsiProperties + { + public long InstallSize + { + get; + set; + } + + public string ProductCode + { + get; + set; + } + + public string ProductVersion + { + get; + set; + } + + public string ProviderKeyName + { + get; + set; + } + + public string UpgradeCode + { + get; + set; + } + } +} diff --git a/src/Microsoft.DotNet.Build.Tasks.Workloads/src/MsiTemplate/Registry.wxs b/src/Microsoft.DotNet.Build.Tasks.Workloads/src/MsiTemplate/Registry.wxs index fce56ea6036..9835ce99ca4 100644 --- a/src/Microsoft.DotNet.Build.Tasks.Workloads/src/MsiTemplate/Registry.wxs +++ b/src/Microsoft.DotNet.Build.Tasks.Workloads/src/MsiTemplate/Registry.wxs @@ -5,12 +5,13 @@ - - + + + + + + + diff --git a/src/Microsoft.DotNet.Build.Tasks.Workloads/src/MsiTemplate/Variables.wxi b/src/Microsoft.DotNet.Build.Tasks.Workloads/src/MsiTemplate/Variables.wxi index 33388df5a58..72c0e6d4c9b 100644 --- a/src/Microsoft.DotNet.Build.Tasks.Workloads/src/MsiTemplate/Variables.wxi +++ b/src/Microsoft.DotNet.Build.Tasks.Workloads/src/MsiTemplate/Variables.wxi @@ -4,12 +4,15 @@ + + + diff --git a/src/Microsoft.DotNet.Build.Tasks.Workloads/src/NuGetPackage.cs b/src/Microsoft.DotNet.Build.Tasks.Workloads/src/NuGetPackage.cs index a9b9c299425..8a7cacb015c 100644 --- a/src/Microsoft.DotNet.Build.Tasks.Workloads/src/NuGetPackage.cs +++ b/src/Microsoft.DotNet.Build.Tasks.Workloads/src/NuGetPackage.cs @@ -27,6 +27,16 @@ public string Authors get; } + public string Copyright + { + get; + } + + public string Description + { + get; + } + /// /// The NuGet package identifier. /// @@ -40,6 +50,11 @@ public PackageIdentity Identity get; } + public LicenseMetadata LicenseData + { + get; + } + public string LicenseUrl { get; @@ -78,6 +93,9 @@ public NugetPackage(string packagePath, TaskLoggingHelper log) Title = nuspecReader.GetTitle(); Authors = nuspecReader.GetAuthors(); LicenseUrl = nuspecReader.GetLicenseUrl(); + Description = nuspecReader.GetDescription(); + Copyright = nuspecReader.GetCopyright(); + LicenseData = nuspecReader.GetLicenseMetadata(); } /// diff --git a/src/Microsoft.DotNet.Build.Tasks.Workloads/src/VisualStudioComponent.cs b/src/Microsoft.DotNet.Build.Tasks.Workloads/src/VisualStudioComponent.cs index da7a91bf17f..1728ac61216 100644 --- a/src/Microsoft.DotNet.Build.Tasks.Workloads/src/VisualStudioComponent.cs +++ b/src/Microsoft.DotNet.Build.Tasks.Workloads/src/VisualStudioComponent.cs @@ -188,20 +188,26 @@ private Dictionary GetReplacementTokens() /// /// /// - /// + /// /// /// /// /// - public static VisualStudioComponent Create(TaskLoggingHelper log, WorkloadManifest manifest, WorkloadDefinition workload, string componentVersion, + public static VisualStudioComponent Create(TaskLoggingHelper log, WorkloadManifest manifest, WorkloadDefinition workload, ITaskItem[] componentVersions, ITaskItem[] shortNames, ITaskItem[] componentResources, ITaskItem[] missingPacks) { log?.LogMessage("Creating Visual Studio component"); - Version version = string.IsNullOrWhiteSpace(componentVersion) ? new Version($"{manifest.Version}.0") : - new Version(componentVersion); + string workloadId = $"{workload.Id}"; + + // If there's an explicit version mapping we use that, otherwise we fall back to the manifest version + // and normalize it since it can have semantic information and Visual Studio components do not support that. + ITaskItem versionItem = componentVersions?.Where(v => string.Equals(v.ItemSpec, workloadId, StringComparison.OrdinalIgnoreCase)).FirstOrDefault(); + Version version = (versionItem != null) && !string.IsNullOrWhiteSpace(versionItem.GetMetadata(Metadata.Version)) + ? new Version(versionItem.GetMetadata(Metadata.Version)) + : (new NuGetVersion(manifest.Version)).Version; ITaskItem resourceItem = componentResources?.Where( - r => string.Equals(r.ItemSpec, workload.Id.ToString(), StringComparison.OrdinalIgnoreCase)).FirstOrDefault(); + r => string.Equals(r.ItemSpec, workloadId, StringComparison.OrdinalIgnoreCase)).FirstOrDefault(); // Workload definitions do not have separate title/description fields so the only option // is to default to the workload description for both. @@ -209,7 +215,7 @@ public static VisualStudioComponent Create(TaskLoggingHelper log, WorkloadManife string description = resourceItem?.GetMetadata(Metadata.Description) ?? workload.Description; string category = resourceItem?.GetMetadata(Metadata.Category) ?? ".NET"; - VisualStudioComponent component = new(Utils.ToSafeId(workload.Id.ToString()), description, + VisualStudioComponent component = new(Utils.ToSafeId(workloadId), description, title, version, shortNames, category); IEnumerable missingPackIds = missingPacks.Select(p => p.ItemSpec); From 14c87f62885e862f000e4b3f6e44707cf00a2ca2 Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Tue, 18 May 2021 13:57:52 +0000 Subject: [PATCH 094/699] Update dependencies from https://github.com/mono/linker build 20210517.3 (#7400) [main] Update dependencies from mono/linker --- eng/Version.Details.xml | 4 ++-- eng/Versions.props | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index 36d40beaf79..594ace80563 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -47,9 +47,9 @@ https://github.com/dotnet/roslyn dc0aff25e0ace6e6bf98269963612f9a67cdc897 - + https://github.com/mono/linker - 7a5c445a69359415b7ff18b91cd24472ef9509ff + a621b9a630950026f5508c8089a59c0e825bd6e0 https://github.com/dotnet/sourcelink diff --git a/eng/Versions.props b/eng/Versions.props index c05b89e73e9..eff73577c9d 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -36,7 +36,7 @@ 2.1.1 2.1.0 3.10.0-4.21262.12 - 6.0.100-preview.5.21264.1 + 6.0.100-preview.5.21267.3 16.7.1 4.8.3 5.3.0.1 From 70ced169e50772437a88ccd1ba997af858cede26 Mon Sep 17 00:00:00 2001 From: Jon Fortescue Date: Tue, 18 May 2021 09:33:29 -0700 Subject: [PATCH 095/699] Update links for OneLocBuild doc (#7398) --- Documentation/OneLocBuild.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Documentation/OneLocBuild.md b/Documentation/OneLocBuild.md index 9429ac4482a..5c702259d12 100644 --- a/Documentation/OneLocBuild.md +++ b/Documentation/OneLocBuild.md @@ -22,8 +22,8 @@ Onboarding to OneLocBuild is a simple process: ``` 3. Run the pipeline you want to use OneLocBuild on your test branch. 4. Open a ticket with the localization team using - [this template](https://ceapex.visualstudio.com/CEINTL/_workitems/create/Loc%20Request). Include the link to the - test build you've done. + [this template](https://ceapex.visualstudio.com/CEINTL/_workitems/create/Loc%20Request?templateId=60b0dcf9-9892-4910-934e-d5becddd1bc1&ownerId=c2e38d3d-0e9e-429f-955d-6e39fc6f0457). + Include the link to the test build you've done. 5. The loc team will generate an LCL package for you and send you its ID. It will be something like `LCL-JUNO-PROD-YOURREPO`. 6. Change your YAML (subbing `'LCL-JUNO-PROD-YOURREPO'` for the package ID given to you) to: @@ -34,8 +34,8 @@ Onboarding to OneLocBuild is a simple process: LclPackageId: 'LCL-JUNO-PROD-YOURREPO' ``` 7. Merge the changes to your main branch and then open a - [repo modification ticket](https://ceapex.visualstudio.com/CEINTL/_workitems/create/Loc%20Request) with the loc team - to let them know to retarget the branch. + [repo modification ticket](https://ceapex.visualstudio.com/CEINTL/_workitems/create/Loc%20Request?templateId=415a0569-35ed-45c3-9321-8b1affff1f52&ownerId=c2e38d3d-0e9e-429f-955d-6e39fc6f0457) + with the loc team to let them know to retarget the branch. As of 12 May 2021, if your repository is mirrored to internal with Maestro, you will also need to keep `CreatePr: false` in your YAML. Currently, OneLocBuild does not support our scenario. The step to create a PR back to From 4af242bfa5d3c4ce64607545c93b40d56339f63a Mon Sep 17 00:00:00 2001 From: Matt Galbraith Date: Tue, 18 May 2021 10:56:17 -0700 Subject: [PATCH 096/699] Add retries to Azure Devops Reporter scripts (#7399) * https://github.com/dotnet/arcade/issues/7371 - retry in the case of HTTP 503 (10x, 3 seconds between attempts) , and stop trying in the case of "run is deleted" * Oops --- .../reporter/azure_devops_result_publisher.py | 78 ++++++++++++++----- .../Sdk/tools/azure-pipelines/reporter/run.py | 2 +- 2 files changed, 58 insertions(+), 22 deletions(-) diff --git a/src/Microsoft.DotNet.Helix/Sdk/tools/azure-pipelines/reporter/azure_devops_result_publisher.py b/src/Microsoft.DotNet.Helix/Sdk/tools/azure-pipelines/reporter/azure_devops_result_publisher.py index fe9441887d0..47fc6454009 100644 --- a/src/Microsoft.DotNet.Helix/Sdk/tools/azure-pipelines/reporter/azure_devops_result_publisher.py +++ b/src/Microsoft.DotNet.Helix/Sdk/tools/azure-pipelines/reporter/azure_devops_result_publisher.py @@ -1,18 +1,21 @@ import base64 import os import logging +import time from typing import Iterable, Mapping, List, Dict, Optional, Tuple from builtins import str as text from azure.devops.connection import Connection from msrest.authentication import BasicTokenAuthentication, BasicAuthentication from azure.devops.v5_1.test import TestClient from azure.devops.v5_1.test.models import TestCaseResult, TestAttachmentRequestModel, TestSubResult +from azure.devops.exceptions import AzureDevOpsClientRequestError from helpers import get_env from defs import TestResult log = logging.getLogger(__name__) + class AzureDevOpsTestResultPublisher: def __init__(self, collection_uri, access_token, team_project, test_run_id=None): """ @@ -38,15 +41,15 @@ def is_data_driven_test(self, r: str) -> bool: return r.endswith(")") def get_ddt_base_name(self, r: str) -> str: - return r.split('(',1)[0] + return r.split('(', 1)[0] def send_attachment(self, test_client, attachment, published_result): try: # Python 3 will throw a TypeError exception because b64encode expects bytes - stream=base64.b64encode(text(attachment.text)) + stream = base64.b64encode(text(attachment.text)) except TypeError: # stream has to be a string but b64encode takes and returns bytes on Python 3 - stream=base64.b64encode(bytes(attachment.text, "utf-8")).decode("utf-8") + stream = base64.b64encode(bytes(attachment.text, "utf-8")).decode("utf-8") test_client.create_test_result_attachment( TestAttachmentRequestModel( @@ -55,7 +58,7 @@ def send_attachment(self, test_client, attachment, published_result): ), self.team_project, self.test_run_id, published_result.id) def send_sub_attachment(self, test_client, attachment, published_result, sub_result_id): - stream=base64.b64encode(bytes(attachment.text, "utf-8")).decode("utf-8") + stream = base64.b64encode(bytes(attachment.text, "utf-8")).decode("utf-8") test_client.create_test_sub_result_attachment( TestAttachmentRequestModel( @@ -63,11 +66,43 @@ def send_sub_attachment(self, test_client, attachment, published_result, sub_res stream=stream, ), self.team_project, self.test_run_id, published_result.id, sub_result_id) - def publish_results(self, test_case_results: Iterable[TestCaseResult], test_result_order: Dict[str, List[str]], results_with_attachments: Mapping[str, TestResult]) -> None: + def publish_results(self, test_case_results: Iterable[TestCaseResult], test_result_order: Dict[str, List[str]], + results_with_attachments: Mapping[str, TestResult]) -> None: connection = self.get_connection() test_client = connection.get_client("azure.devops.v5_1.test.TestClient") # type: TestClient - published_results = test_client.add_test_results_to_test_run(list(test_case_results), self.team_project, self.test_run_id) # type: List[TestCaseResult] + tries_left = 10 + succeeded = False + test_run_ended = False + + while tries_left > 0 and not test_run_ended and not succeeded: + try: + published_results = test_client. \ + add_test_results_to_test_run(list(test_case_results), + self.team_project, + self.test_run_id) # type: List[TestCaseResult] + succeeded = True + + except AzureDevOpsClientRequestError as ex: + # Odd syntax here is to deal with checking substrings of the list of args in this exception + hit_503 = len([element for element in ex.args if ('invalid status code of 503' in element)]) != 0 + test_run_ended = len([element for element in ex.args if ('It may have been deleted' in element)]) != 0 + if hit_503: + tries_left -= 1 + log.warning("Hit HTTP 503 from Azure DevOps. Will wait three seconds and try again.") + time.sleep(3) + elif test_run_ended: # Not exceptional, don't retry. + tries_left = 0 + else: + raise ex + + if test_run_ended: + log.info("Test run has ended, skipping attaching results as it would fail.") + return + + # !succeeded means a 503 and not succeeding after 10 tries (otherwise we threw already), so give a nice error + if not succeeded: + raise Exception('Failed to report test results to Azure Dev Ops after retrying. Please contact dnceng.') for published_result in published_results: @@ -89,11 +124,12 @@ def publish_results(self, test_case_results: Iterable[TestCaseResult], test_resu # is true , and uses the order of test names recorded earlier to look-up the attachments. elif published_result.sub_results is not None: sub_results_order = test_result_order[published_result.automated_test_name] - + # Sanity check if len(sub_results_order) != len(published_result.sub_results): - log.warning("Returned subresults list length does not match expected. Attachments may not pair correctly.") - + log.warning( + "Returned subresults list length does not match expected. Attachments may not pair correctly.") + for (name, sub_result) in zip(sub_results_order, published_result.sub_results): if name in results_with_attachments: result = results_with_attachments.get(name) @@ -111,25 +147,25 @@ def convert_to_sub_test(r: TestResult) -> Optional[TestSubResult]: return TestSubResult( comment=comment, display_name=text(r.name), - duration_in_ms=r.duration_seconds*1000, + duration_in_ms=r.duration_seconds * 1000, outcome="Passed" - ) + ) if r.result == "Fail": return TestSubResult( comment=comment, display_name=text(r.name), - duration_in_ms=r.duration_seconds*1000, + duration_in_ms=r.duration_seconds * 1000, outcome="Failed", stack_trace=text(r.stack_trace) if r.stack_trace is not None else None, error_message=text(r.failure_message) - ) + ) if r.result == "Skip": return TestSubResult( comment=comment, display_name=text(r.name), - duration_in_ms=r.duration_seconds*1000, + duration_in_ms=r.duration_seconds * 1000, outcome="NotExecuted" - ) + ) log.warning("Unexpected result value {} for {}".format(r.result, r.name)) return None @@ -141,7 +177,7 @@ def convert_result(r: TestResult) -> Optional[TestCaseResult]: automated_test_type=text(r.kind), automated_test_storage=self.work_item_name, priority=1, - duration_in_ms=r.duration_seconds*1000, + duration_in_ms=r.duration_seconds * 1000, outcome="Passed", state="Completed", comment=comment, @@ -153,7 +189,7 @@ def convert_result(r: TestResult) -> Optional[TestCaseResult]: automated_test_type=text(r.kind), automated_test_storage=self.work_item_name, priority=1, - duration_in_ms=r.duration_seconds*1000, + duration_in_ms=r.duration_seconds * 1000, outcome="Failed", state="Completed", error_message=text(r.failure_message), @@ -168,7 +204,7 @@ def convert_result(r: TestResult) -> Optional[TestCaseResult]: automated_test_type=text(r.kind), automated_test_storage=self.work_item_name, priority=1, - duration_in_ms=r.duration_seconds*1000, + duration_in_ms=r.duration_seconds * 1000, outcome="NotExecuted", state="Completed", error_message=text(r.skip_reason), @@ -178,13 +214,13 @@ def convert_result(r: TestResult) -> Optional[TestCaseResult]: log.warning("Unexpected result value {} for {}".format(r.result, r.name)) return None - unconverted_results = list(results) # type: List[TestResult] + unconverted_results = list(results) # type: List[TestResult] log.debug("Count of unconverted_results: {0}".format(len(unconverted_results))) # Find all DDTs, determine parent, and add to dictionary data_driven_tests = {} # type: Dict[str, TestCaseResult] - non_data_driven_tests = [] # type: List[TestCaseResult] - test_name_ordering = {} # type: Dict[str, List[str]] + non_data_driven_tests = [] # type: List[TestCaseResult] + test_name_ordering = {} # type: Dict[str, List[str]] for r in unconverted_results: if r is None: diff --git a/src/Microsoft.DotNet.Helix/Sdk/tools/azure-pipelines/reporter/run.py b/src/Microsoft.DotNet.Helix/Sdk/tools/azure-pipelines/reporter/run.py index bde3200f8f4..d596132a795 100644 --- a/src/Microsoft.DotNet.Helix/Sdk/tools/azure-pipelines/reporter/run.py +++ b/src/Microsoft.DotNet.Helix/Sdk/tools/azure-pipelines/reporter/run.py @@ -93,7 +93,7 @@ def main(): worker.daemon = True worker.start() - log.info("Beginning reading of test results.") + log.info("Beginning to read test results...") # In case the user puts the results in HELIX_WORKITEM_UPLOAD_ROOT for upload, check there too. all_results = read_results([os.getcwd(), From f53feab62c4b34b3b3e7e57b2dd98f0140da6be7 Mon Sep 17 00:00:00 2001 From: Jon Fortescue Date: Tue, 18 May 2021 14:15:50 -0700 Subject: [PATCH 097/699] Update link to create repo modification ticket (#7402) --- Documentation/OneLocBuild.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Documentation/OneLocBuild.md b/Documentation/OneLocBuild.md index 5c702259d12..bd65199df31 100644 --- a/Documentation/OneLocBuild.md +++ b/Documentation/OneLocBuild.md @@ -56,7 +56,7 @@ PRs from OneLocBuild as they are made and that you allow the translator SLA for If you're releasing from any other branch (including servicing branches), you must do the following: 1. Add the OneLocBuild job template to the pipeline YAML of the release branch -2. Open a [repo modification ticket](https://ceapex.visualstudio.com/CEINTL/_workitems/create/Loc%20Request) with the +2. Open a [repo modification ticket](https://ceapex.visualstudio.com/CEINTL/_workitems/create/Loc%20Request?templateId=415a0569-35ed-45c3-9321-8b1affff1f52&ownerId=c2e38d3d-0e9e-429f-955d-6e39fc6f0457) with the loc team at least two weeks before the release and request that they re-target your repository to the release branch. 4. Merge the OneLocBuild PRs to your release branch. 5. After the release, open another repo modification ticket to re-target your repository to the `main` branch again. From 516eb1e7fae3228cc7159aca3133c6c58a86c3f2 Mon Sep 17 00:00:00 2001 From: Viktor Hofer Date: Wed, 19 May 2021 11:31:15 +0200 Subject: [PATCH 098/699] Gen facades cleanup (#7401) * Remove ILRewriter in GenFacades and cleanup and minor improvements --- eng/Versions.props | 3 - .../build/Microsoft.DotNet.GenAPI.targets | 24 +- .../ClearAssemblyReferenceVersions.cs | 1 - .../ILRewriter/FacadeGenerationException.cs | 14 - .../ILRewriter/GenFacades.cs | 886 ------------------ .../ILRewriter/GenFacadesTask.cs | 163 ---- .../ILRewriter/TypeReferenceRewriter.cs | 42 - .../ILRewriter/VersionResourceSerializer.cs | 279 ------ .../Microsoft.DotNet.GenFacades.csproj | 35 +- .../NotSupportedAssemblyGenerator.cs | 43 +- .../build/Microsoft.DotNet.GenFacades.targets | 16 +- ...rosoft.DotNet.GenFacadesILRewriter.targets | 95 -- ...soft.DotNet.GenFacadesNotSupported.targets | 55 +- ...soft.DotNet.GenPartialFacadeSource.targets | 50 +- 14 files changed, 76 insertions(+), 1630 deletions(-) delete mode 100644 src/Microsoft.DotNet.GenFacades/ILRewriter/FacadeGenerationException.cs delete mode 100644 src/Microsoft.DotNet.GenFacades/ILRewriter/GenFacades.cs delete mode 100644 src/Microsoft.DotNet.GenFacades/ILRewriter/GenFacadesTask.cs delete mode 100644 src/Microsoft.DotNet.GenFacades/ILRewriter/TypeReferenceRewriter.cs delete mode 100644 src/Microsoft.DotNet.GenFacades/ILRewriter/VersionResourceSerializer.cs delete mode 100644 src/Microsoft.DotNet.GenFacades/build/Microsoft.DotNet.GenFacadesILRewriter.targets diff --git a/eng/Versions.props b/eng/Versions.props index eff73577c9d..bafcaa163dc 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -9,7 +9,6 @@ 2.2.1 1.0.2 - 4.0.0-rc3-24214-00 1.10.1 0.25.2 2.0.10 @@ -74,9 +73,7 @@ 1.6.0 1.0.0 2.0.4 - 1.1.0-beta2-19575-01 1.1.0-beta2-19575-01 - 1.7.0 1.1.0-beta.20258.6 1.1.0-beta-21228-01 1.1.0-beta-21228-01 diff --git a/src/Microsoft.DotNet.GenAPI/build/Microsoft.DotNet.GenAPI.targets b/src/Microsoft.DotNet.GenAPI/build/Microsoft.DotNet.GenAPI.targets index 9f10b25beb6..4239c494a85 100644 --- a/src/Microsoft.DotNet.GenAPI/build/Microsoft.DotNet.GenAPI.targets +++ b/src/Microsoft.DotNet.GenAPI/build/Microsoft.DotNet.GenAPI.targets @@ -1,4 +1,3 @@ - @@ -7,12 +6,12 @@ dotnet $(TargetDir)$(TargetName).cs - <_GenAPIPath Condition="'$(MSBuildRuntimeType)' == 'core'">$(MSBuildThisFileDirectory)\..\tools\netcoreapp3.1\Microsoft.DotNet.GenAPI.dll - <_GenAPIPath Condition="'$(MSBuildRuntimeType)' != 'core'">$(MSBuildThisFileDirectory)\..\tools\net472\Microsoft.DotNet.GenAPI.exe + <_GenAPIPath Condition="'$(MSBuildRuntimeType)' == 'Core'">$(MSBuildThisFileDirectory)\..\tools\netcoreapp3.1\Microsoft.DotNet.GenAPI.dll + <_GenAPIPath Condition="'$(MSBuildRuntimeType)' != 'Core'">$(MSBuildThisFileDirectory)\..\tools\net472\Microsoft.DotNet.GenAPI.exe - <_GenAPICommand Condition="'$(MSBuildRuntimeType)' == 'core'">"$(DotNetTool)" "$(_GenAPIPath)" - <_GenAPICommand Condition="'$(MSBuildRuntimeType)' != 'core' and '$(OS)' == 'Windows_NT'">"$(_GenAPIPath)" - <_GenAPICommand Condition="'$(MSBuildRuntimeType)' != 'core' and '$(OS)' != 'Windows_NT'">mono --runtime=v4.0.30319 "$(_GenAPIPath)" + <_GenAPICommand Condition="'$(MSBuildRuntimeType)' == 'Core'">"$(DotNetTool)" "$(_GenAPIPath)" + <_GenAPICommand Condition="'$(MSBuildRuntimeType)' != 'Core' and '$(OS)' == 'Windows_NT'">"$(_GenAPIPath)" + <_GenAPICommand Condition="'$(MSBuildRuntimeType)' != 'Core' and '$(OS)' != 'Windows_NT'">mono --runtime=v4.0.30319 "$(_GenAPIPath)" <_referencePathDirectoriesWithDuplicates Include="@(ReferencePath->'%(RootDir)%(Directory)'->TrimEnd('\'))" /> @@ -49,13 +43,13 @@ @(_referencePathDirectories) - + - + diff --git a/src/Microsoft.DotNet.GenFacades/ClearAssemblyReferenceVersions.cs b/src/Microsoft.DotNet.GenFacades/ClearAssemblyReferenceVersions.cs index ce1bd1638d3..73fe72c35c4 100644 --- a/src/Microsoft.DotNet.GenFacades/ClearAssemblyReferenceVersions.cs +++ b/src/Microsoft.DotNet.GenFacades/ClearAssemblyReferenceVersions.cs @@ -6,7 +6,6 @@ using Microsoft.DotNet.Build.Tasks; using System; using System.IO; -using System.Linq; using System.Reflection.Metadata; using System.Reflection.Metadata.Ecma335; using System.Reflection.PortableExecutable; diff --git a/src/Microsoft.DotNet.GenFacades/ILRewriter/FacadeGenerationException.cs b/src/Microsoft.DotNet.GenFacades/ILRewriter/FacadeGenerationException.cs deleted file mode 100644 index 86a5ab8be99..00000000000 --- a/src/Microsoft.DotNet.GenFacades/ILRewriter/FacadeGenerationException.cs +++ /dev/null @@ -1,14 +0,0 @@ -// Licensed to the .NET Foundation under one or more agreements. -// The .NET Foundation licenses this file to you under the MIT license. - -using System; - -namespace Microsoft.DotNet.GenFacades.ILRewriter -{ - internal sealed class FacadeGenerationException : Exception - { - public FacadeGenerationException(string message) : base(message) - { - } - } -} diff --git a/src/Microsoft.DotNet.GenFacades/ILRewriter/GenFacades.cs b/src/Microsoft.DotNet.GenFacades/ILRewriter/GenFacades.cs deleted file mode 100644 index 0b00d971093..00000000000 --- a/src/Microsoft.DotNet.GenFacades/ILRewriter/GenFacades.cs +++ /dev/null @@ -1,886 +0,0 @@ -// Licensed to the .NET Foundation under one or more agreements. -// The .NET Foundation licenses this file to you under the MIT license. - -using System; -using System.Collections.Generic; -using System.Diagnostics; -using System.IO; -using System.Linq; -using System.Text; -using Microsoft.Cci; -using Microsoft.Cci.Extensions; -using Microsoft.Cci.MutableCodeModel; -using System.Globalization; -using Microsoft.DiaSymReader.Tools; -using System.Runtime.InteropServices; - -namespace Microsoft.DotNet.GenFacades.ILRewriter -{ - public class Generator - { - private const uint ReferenceAssemblyFlag = 0x70; - - public static bool Execute( - string seeds, - string contracts, - string facadePath, - Version assemblyFileVersion = null, - bool clearBuildAndRevision = false, - bool ignoreMissingTypes = false, - bool ignoreBuildAndRevisionMismatch = false, - bool buildDesignTimeFacades = false, - string inclusionContracts = null, - ErrorTreatment seedLoadErrorTreatment = ErrorTreatment.Default, - ErrorTreatment contractLoadErrorTreatment = ErrorTreatment.Default, - string[] seedTypePreferencesUnsplit = null, - bool forceZeroVersionSeeds = false, - bool producePdb = true, - string partialFacadeAssemblyPath = null, - bool buildPartialReferenceFacade = false) - { - if (!Directory.Exists(facadePath)) - Directory.CreateDirectory(facadePath); - - var nameTable = new NameTable(); - var internFactory = new InternFactory(); - - try - { - Dictionary seedTypePreferences = ParseSeedTypePreferences(seedTypePreferencesUnsplit); - - using (var contractHost = new HostEnvironment(nameTable, internFactory)) - using (var seedHost = new HostEnvironment(nameTable, internFactory)) - { - contractHost.LoadErrorTreatment = contractLoadErrorTreatment; - seedHost.LoadErrorTreatment = seedLoadErrorTreatment; - - var contractAssemblies = LoadAssemblies(contractHost, contracts); - IReadOnlyDictionary> docIdTable = GenerateDocIdTable(contractAssemblies, inclusionContracts); - - IAssembly[] seedAssemblies = LoadAssemblies(seedHost, seeds).ToArray(); - - IAssemblyReference seedCoreAssemblyRef = ((Microsoft.Cci.Immutable.PlatformType)seedHost.PlatformType).CoreAssemblyRef; - - if (forceZeroVersionSeeds) - { - // Create a deep copier, copy the seed assemblies, and zero out their versions. - var copier = new MetadataDeepCopier(seedHost); - - for (int i = 0; i < seedAssemblies.Length; i++) - { - var mutableSeed = copier.Copy(seedAssemblies[i]); - mutableSeed.Version = new Version(0, 0, 0, 0); - // Copy the modified seed assembly back. - seedAssemblies[i] = mutableSeed; - - if (mutableSeed.Name.UniqueKey == seedCoreAssemblyRef.Name.UniqueKey) - { - seedCoreAssemblyRef = mutableSeed; - } - } - } - - var typeTable = GenerateTypeTable(seedAssemblies); - var facadeGenerator = new FacadeGenerator(seedHost, contractHost, docIdTable, typeTable, seedTypePreferences, clearBuildAndRevision, buildDesignTimeFacades, assemblyFileVersion); - - if (buildPartialReferenceFacade && ignoreMissingTypes) - { - throw new FacadeGenerationException( - "When buildPartialReferenceFacade is specified ignoreMissingTypes must not be specified."); - } - - if (partialFacadeAssemblyPath != null) - { - if (contractAssemblies.Count() != 1) - { - throw new FacadeGenerationException( - "When partialFacadeAssemblyPath is specified, only exactly one corresponding contract assembly can be specified."); - } - - if (buildPartialReferenceFacade) - { - throw new FacadeGenerationException( - "When partialFacadeAssemblyPath is specified, buildPartialReferenceFacade must not be specified."); - } - - IAssembly contractAssembly = contractAssemblies.First(); - IAssembly partialFacadeAssembly = seedHost.LoadAssembly(partialFacadeAssemblyPath); - if (contractAssembly.Name != partialFacadeAssembly.Name - || contractAssembly.Version.Major != partialFacadeAssembly.Version.Major - || contractAssembly.Version.Minor != partialFacadeAssembly.Version.Minor - || (!ignoreBuildAndRevisionMismatch && contractAssembly.Version.Build != partialFacadeAssembly.Version.Build) - || (!ignoreBuildAndRevisionMismatch && contractAssembly.Version.Revision != partialFacadeAssembly.Version.Revision) - || contractAssembly.GetPublicKeyToken() != partialFacadeAssembly.GetPublicKeyToken()) - { - throw new FacadeGenerationException( - string.Format("The partial facade assembly's name, version, and public key token must exactly match the contract to be filled. Contract: {0}, Facade: {1}", - contractAssembly.AssemblyIdentity, - partialFacadeAssembly.AssemblyIdentity)); - } - - Assembly filledPartialFacade = facadeGenerator.GenerateFacade(contractAssembly, seedCoreAssemblyRef, ignoreMissingTypes, - overrideContractAssembly: partialFacadeAssembly, - forceAssemblyReferenceVersionsToZero: forceZeroVersionSeeds); - - if (filledPartialFacade == null) - { - Trace.TraceError("Errors were encountered while generating the facade."); - return false; - } - - string pdbLocation = null; - - if (producePdb) - { - string pdbFolder = Path.GetDirectoryName(partialFacadeAssemblyPath); - pdbLocation = Path.Combine(pdbFolder, contractAssembly.Name + ".pdb"); - if (producePdb && !File.Exists(pdbLocation)) - { - pdbLocation = null; - Trace.TraceWarning("No PDB file present for un-transformed partial facade. No PDB will be generated."); - } - } - - OutputFacadeToFile(facadePath, seedHost, filledPartialFacade, contractAssembly, pdbLocation); - } - else - { - foreach (var contract in contractAssemblies) - { - Assembly facade = facadeGenerator.GenerateFacade(contract, seedCoreAssemblyRef, ignoreMissingTypes, buildPartialReferenceFacade: buildPartialReferenceFacade); - if (facade == null) - { -#if !COREFX - Debug.Assert(Environment.ExitCode != 0); -#endif - return false; - } - - OutputFacadeToFile(facadePath, seedHost, facade, contract); - } - } - } - - return true; - } - catch (FacadeGenerationException ex) - { - Trace.TraceError(ex.Message); -#if !COREFX - Debug.Assert(Environment.ExitCode != 0); -#endif - return false; - } - } - - private static void OutputFacadeToFile(string facadePath, HostEnvironment seedHost, Assembly facade, IAssembly contract, string pdbLocation = null) - { - bool needsConversion = false; - string pdbOutputPath = Path.Combine(facadePath, contract.Name + ".pdb"); - string finalPdbOutputPath = pdbOutputPath; - - // Use the filename (including extension .dll/.winmd) so people can have some control over the output facade file name. - string facadeFileName = Path.GetFileName(contract.Location); - string facadeOutputPath = Path.Combine(facadePath, facadeFileName); - using (Stream peOutStream = File.Create(facadeOutputPath)) - { - if (pdbLocation != null) - { - if (File.Exists(pdbLocation)) - { - // Convert from portable to windows PDBs if necessary. If we convert - // set the pdbOutput path to a *.windows.pdb file so we can convert it back - // to 'finalPdbOutputPath'. - if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) - needsConversion = ConvertFromPortableIfNecessary(facade.Location, ref pdbLocation); - if (needsConversion) - { - // We want to keep the same file name for the PDB because it is used as a key when looking it up on a symbol server - string pdbOutputPathPdbDir = Path.Combine(Path.GetDirectoryName(pdbOutputPath), "WindowsPdb"); - Directory.CreateDirectory(pdbOutputPathPdbDir); - pdbOutputPath = Path.Combine(pdbOutputPathPdbDir, Path.GetFileName(pdbOutputPath)); - } - - // do the main GenFacades logic (which today only works with windows PDBs). - using (Stream pdbReadStream = File.OpenRead(pdbLocation)) - using (PdbReader pdbReader = new PdbReader(pdbReadStream, seedHost)) - using (PdbWriter pdbWriter = new PdbWriter(pdbOutputPath, pdbReader)) - { - PeWriter.WritePeToStream(facade, seedHost, peOutStream, pdbReader, pdbReader, pdbWriter); - } - } - else - { - throw new FacadeGenerationException("Couldn't find the pdb at the given location: " + pdbLocation); - } - } - else - { - PeWriter.WritePeToStream(facade, seedHost, peOutStream); - } - } - - // If we started with Portable PDBs we need to convert the output to portable again. - // We have to do this after facadeOutputPath is closed for writing. - if (needsConversion) - { - Trace.TraceInformation("Converting PDB generated by GenFacades " + pdbOutputPath + " to portable format " + finalPdbOutputPath); - ConvertFromWindowsPdb(facadeOutputPath, pdbOutputPath, finalPdbOutputPath); - } - } - - /// - /// Given dllInputPath determine if it is portable. If so convert it *\WindowsPdb\*.pdb and update 'pdbInputPath' to - /// point to this converted file. - /// Returns true if the conversion was done (that is the original file was portable). - /// 'dllInputPath' is the DLL that goes along with 'pdbInputPath'. - /// - private static bool ConvertFromPortableIfNecessary(string dllInputPath, ref string pdbInputPath) - { - string originalPdbInputPath = pdbInputPath; - using (Stream pdbReadStream = File.OpenRead(pdbInputPath)) - { - // If the input is not portable, there is nothing to do, and we can early out. - if (!PdbConverter.IsPortable(pdbReadStream)) - return false; - - // We want to keep the same file name for the PDB because it is used as a key when looking it up on a symbol server - string pdbInputPathPdbDir = Path.Combine(Path.GetDirectoryName(pdbInputPath), "WindowsPdb"); - Directory.CreateDirectory(pdbInputPathPdbDir); - pdbInputPath = Path.Combine(pdbInputPathPdbDir, Path.GetFileName(pdbInputPath)); - - Trace.TraceInformation("PDB " + originalPdbInputPath + " is a portable PDB, converting it to " + pdbInputPath); - PdbConverter converter = new PdbConverter(d => Trace.TraceError(d.ToString(CultureInfo.InvariantCulture))); - using (Stream peStream = File.OpenRead(dllInputPath)) - using (Stream pdbWriteStream = File.OpenWrite(pdbInputPath)) - { - converter.ConvertPortableToWindows(peStream, pdbReadStream, pdbWriteStream, new PortablePdbConversionOptions(suppressSourceLinkConversion: true)); - } - } - return true; - } - - /// - /// Convert the windows PDB winPdbInputPath to portablePdbOutputPath. - /// 'dllInputPath' is the DLL that goes along with 'winPdbInputPath'. - /// - private static void ConvertFromWindowsPdb(string dllInputPath, string winPdbInputPath, string portablePdbOutputPath) - { - PdbConverter converter = new PdbConverter(d => Trace.TraceError(d.ToString(CultureInfo.InvariantCulture))); - using (Stream peStream = File.OpenRead(dllInputPath)) - using (Stream pdbReadStream = File.OpenRead(winPdbInputPath)) - using (Stream pdbWriteStream = File.OpenWrite(portablePdbOutputPath)) - { - converter.ConvertWindowsToPortable(peStream, pdbReadStream, pdbWriteStream); - } - } - - private static Dictionary ParseSeedTypePreferences(string[] preferences) - { - var dictionary = new Dictionary(StringComparer.Ordinal); - - if (preferences != null) - { - foreach (string preference in preferences) - { - int i = preference.IndexOf('='); - if (i < 0) - { - throw new FacadeGenerationException("Invalid seed type preference. Correct usage is /preferSeedType:FullTypeName=AssemblyName"); - } - - string key = preference.Substring(0, i); - string value = preference.Substring(i + 1); - - if (!key.StartsWith("T:", StringComparison.Ordinal)) - { - key = "T:" + key; - } - - string existingValue; - if (dictionary.TryGetValue(key, out existingValue)) - { - Trace.TraceWarning("Overriding /preferSeedType:{0}={1} with /preferSeedType:{2}={3}.", key, existingValue, key, value); - } - - dictionary[key] = value; - } - } - - return dictionary; - } - - private static IEnumerable LoadAssemblies(HostEnvironment host, string assemblyPaths) - { - host.UnifyToLibPath = true; - string[] splitPaths = HostEnvironment.SplitPaths(assemblyPaths); - - foreach (string path in splitPaths) - { - if (Directory.Exists(path)) - { - host.AddLibPath(Path.GetFullPath(path)); - } - else if (File.Exists(path)) - { - host.AddLibPath(Path.GetDirectoryName(Path.GetFullPath(path))); - } - } - - return host.LoadAssemblies(splitPaths); - } - - private static IReadOnlyDictionary> GenerateDocIdTable(IEnumerable contractAssemblies, string inclusionContracts) - { - Dictionary> mutableDocIdTable = new Dictionary>(); - foreach (IAssembly contractAssembly in contractAssemblies) - { - string simpleName = contractAssembly.AssemblyIdentity.Name.Value; - if (mutableDocIdTable.ContainsKey(simpleName)) - throw new FacadeGenerationException(string.Format("Multiple contracts named \"{0}\" specified on -contracts.", simpleName)); - mutableDocIdTable[simpleName] = new HashSet(EnumerateDocIdsToForward(contractAssembly)); - } - - if (inclusionContracts != null) - { - foreach (string inclusionContractPath in HostEnvironment.SplitPaths(inclusionContracts)) - { - // Assembly identity conflicts are permitted and normal in the inclusion contract list so load each one in a throwaway host to avoid problems. - using (HostEnvironment inclusionHost = new HostEnvironment(new NameTable(), new InternFactory())) - { - IAssembly inclusionAssembly = inclusionHost.LoadAssemblyFrom(inclusionContractPath); - if (inclusionAssembly == null || inclusionAssembly is Dummy) - throw new FacadeGenerationException(string.Format("Could not load assembly \"{0}\".", inclusionContractPath)); - string simpleName = inclusionAssembly.Name.Value; - HashSet hashset; - if (!mutableDocIdTable.TryGetValue(simpleName, out hashset)) - { - Trace.TraceWarning("An assembly named \"{0}\" was specified in the -include list but no contract was specified named \"{0}\". Ignoring.", simpleName); - } - else - { - foreach (string docId in EnumerateDocIdsToForward(inclusionAssembly)) - { - hashset.Add(docId); - } - } - } - } - } - - Dictionary> docIdTable = new Dictionary>(); - foreach (KeyValuePair> kv in mutableDocIdTable) - { - string key = kv.Key; - IEnumerable sortedDocIds = kv.Value.OrderBy(s => s, StringComparer.OrdinalIgnoreCase); - docIdTable.Add(key, sortedDocIds); - } - return docIdTable; - } - - private static IEnumerable EnumerateDocIdsToForward(IAssembly contractAssembly) - { - // Use INamedTypeReference instead of INamespaceTypeReference in order to also include nested - // class type-forwards. - var typeForwardsToForward = contractAssembly.ExportedTypes.Select(alias => alias.AliasedType) - .OfType(); - - var typesToForward = contractAssembly.GetAllTypes().Where(t => TypeHelper.IsVisibleOutsideAssembly(t)) - .OfType(); - List result = typeForwardsToForward.Concat(typesToForward) - .Select(type => TypeHelper.GetTypeName(type, NameFormattingOptions.DocumentationId)).ToList(); - - foreach(var type in typesToForward) - { - AddNestedTypeDocIds(result, type); - } - - return result; - } - - private static void AddNestedTypeDocIds(List docIds, INamedTypeDefinition type) - { - foreach (var nestedType in type.NestedTypes) - { - if (TypeHelper.IsVisibleOutsideAssembly(nestedType)) - docIds.Add(TypeHelper.GetTypeName(nestedType, NameFormattingOptions.DocumentationId)); - AddNestedTypeDocIds(docIds, nestedType); - } - } - - private static IReadOnlyDictionary> GenerateTypeTable(IEnumerable seedAssemblies) - { - var typeTable = new Dictionary>(); - foreach (var assembly in seedAssemblies) - { - foreach (var type in assembly.GetAllTypes().OfType()) - { - if (!TypeHelper.IsVisibleOutsideAssembly(type)) - continue; - AddTypeAndNestedTypesToTable(typeTable, type); - } - } - return typeTable; - } - - private static void AddTypeAndNestedTypesToTable(Dictionary> typeTable, INamedTypeDefinition type) - { - if (type != null) - { - IReadOnlyList seedTypes; - string docId = TypeHelper.GetTypeName(type, NameFormattingOptions.DocumentationId); - if (!typeTable.TryGetValue(docId, out seedTypes)) - { - seedTypes = new List(1); - typeTable.Add(docId, seedTypes); - } - if (!seedTypes.Contains(type)) - ((List)seedTypes).Add(type); - - foreach (INestedTypeDefinition nestedType in type.NestedTypes) - { - if (TypeHelper.IsVisibleOutsideAssembly(nestedType)) - AddTypeAndNestedTypesToTable(typeTable, nestedType); - } - } - } - - private class FacadeGenerator - { - private readonly IMetadataHost _seedHost; - private readonly IMetadataHost _contractHost; - private readonly IReadOnlyDictionary> _docIdTable; - private readonly IReadOnlyDictionary> _typeTable; - private readonly IReadOnlyDictionary _seedTypePreferences; - private readonly bool _clearBuildAndRevision; - private readonly bool _buildDesignTimeFacades; - private readonly Version _assemblyFileVersion; - - public FacadeGenerator( - IMetadataHost seedHost, - IMetadataHost contractHost, - IReadOnlyDictionary> docIdTable, - IReadOnlyDictionary> typeTable, - IReadOnlyDictionary seedTypePreferences, - bool clearBuildAndRevision, - bool buildDesignTimeFacades, - Version assemblyFileVersion - ) - { - _seedHost = seedHost; - _contractHost = contractHost; - _docIdTable = docIdTable; - _typeTable = typeTable; - _seedTypePreferences = seedTypePreferences; - _clearBuildAndRevision = clearBuildAndRevision; - _buildDesignTimeFacades = buildDesignTimeFacades; - _assemblyFileVersion = assemblyFileVersion; - } - - public Assembly GenerateFacade(IAssembly contractAssembly, - IAssemblyReference seedCoreAssemblyReference, - bool ignoreMissingTypes, IAssembly overrideContractAssembly = null, - bool buildPartialReferenceFacade = false, - bool forceAssemblyReferenceVersionsToZero = false) - { - Assembly assembly; - if (overrideContractAssembly != null) - { - MetadataDeepCopier copier = new MetadataDeepCopier(_seedHost); - assembly = copier.Copy(overrideContractAssembly); // Use non-empty partial facade if present - } - else - { - MetadataDeepCopier copier = new MetadataDeepCopier(_contractHost); - assembly = copier.Copy(contractAssembly); - - // if building a reference facade don't strip the contract - if (!buildPartialReferenceFacade) - { - ReferenceAssemblyToFacadeRewriter rewriter = new ReferenceAssemblyToFacadeRewriter(_seedHost, _contractHost, seedCoreAssemblyReference, _assemblyFileVersion != null); - rewriter.Rewrite(assembly); - } - } - - if (forceAssemblyReferenceVersionsToZero) - { - foreach (AssemblyReference ar in assembly.AssemblyReferences) - { - ar.Version = new Version(0, 0, 0, 0); - } - } - - string contractAssemblyName = contractAssembly.AssemblyIdentity.Name.Value; - IEnumerable docIds = _docIdTable[contractAssemblyName]; - - // Add all the type forwards - bool error = false; - - Dictionary existingDocIds = assembly.AllTypes.ToDictionary(typeDef => typeDef.RefDocId(), typeDef => typeDef); - IEnumerable docIdsToForward = buildPartialReferenceFacade ? existingDocIds.Keys : docIds.Where(id => !existingDocIds.ContainsKey(id)); - Dictionary forwardedTypes = new Dictionary(); - foreach (string docId in docIdsToForward) - { - IReadOnlyList seedTypes; - if (!_typeTable.TryGetValue(docId, out seedTypes)) - { - if (!ignoreMissingTypes && !buildPartialReferenceFacade) - { - Trace.TraceError("Did not find type '{0}' in any of the seed assemblies.", docId); - error = true; - } - continue; - } - - INamedTypeDefinition seedType = GetSeedType(docId, seedTypes); - if (seedType == null) - { - TraceDuplicateSeedTypeError(docId, seedTypes); - error = true; - continue; - } - - if (buildPartialReferenceFacade) - { - // honor preferSeedType for keeping contract type - string preferredSeedAssembly; - bool keepType = _seedTypePreferences.TryGetValue(docId, out preferredSeedAssembly) && - contractAssemblyName.Equals(preferredSeedAssembly, StringComparison.OrdinalIgnoreCase); - - if (keepType) - { - continue; - } - - assembly.AllTypes.Remove(existingDocIds[docId]); - forwardedTypes.Add(docId, seedType); - } - - AddTypeForward(assembly, seedType); - } - - if (buildPartialReferenceFacade) - { - if (forwardedTypes.Count == 0) - { - Trace.TraceError("Did not find any types in any of the seed assemblies."); - return null; - } - else - { - // for any thing that's now a typeforward, make sure typerefs point to that rather than - // the type previously inside the assembly. - TypeReferenceRewriter typeRefRewriter = new TypeReferenceRewriter(_seedHost, oldType => - { - INamedTypeReference newType = null; - return forwardedTypes.TryGetValue(oldType.DocId(), out newType) ? newType : oldType; - }); - - var remainingTypes = assembly.AllTypes.Where(t => t.Name.Value != ""); - - if (!remainingTypes.Any()) - { - Trace.TraceInformation($"Removed all types from {contractAssembly.Name} thus will remove ReferenceAssemblyAttribute."); - assembly.AssemblyAttributes.RemoveAll(ca => ca.FullName() == "System.Runtime.CompilerServices.ReferenceAssemblyAttribute"); - assembly.Flags &= ~ReferenceAssemblyFlag; - } - - typeRefRewriter.Rewrite(assembly); - } - } - - if (error) - { - return null; - } - - if (_assemblyFileVersion != null) - { - assembly.AssemblyAttributes.Add(CreateAttribute("System.Reflection.AssemblyFileVersionAttribute", seedCoreAssemblyReference.ResolvedAssembly, _assemblyFileVersion.ToString())); - assembly.AssemblyAttributes.Add(CreateAttribute("System.Reflection.AssemblyInformationalVersionAttribute", seedCoreAssemblyReference.ResolvedAssembly, _assemblyFileVersion.ToString())); - } - - if (_buildDesignTimeFacades) - { - assembly.AssemblyAttributes.Add(CreateAttribute("System.Runtime.CompilerServices.ReferenceAssemblyAttribute", seedCoreAssemblyReference.ResolvedAssembly)); - assembly.Flags |= ReferenceAssemblyFlag; - } - - if (_clearBuildAndRevision) - { - assembly.Version = new Version(assembly.Version.Major, assembly.Version.Minor, 0, 0); - } - - AddWin32VersionResource(contractAssembly.Location, assembly); - - return assembly; - } - - private INamedTypeDefinition GetSeedType(string docId, IReadOnlyList seedTypes) - { - Debug.Assert(seedTypes.Count != 0); // we should already have checked for non-existent types. - - if (seedTypes.Count == 1) - { - return seedTypes[0]; - } - - string preferredSeedAssembly; - if (_seedTypePreferences.TryGetValue(docId, out preferredSeedAssembly)) - { - return seedTypes.SingleOrDefault(t => String.Equals(t.GetAssembly().Name.Value, preferredSeedAssembly, StringComparison.OrdinalIgnoreCase)); - } - - return null; - } - - private static void TraceDuplicateSeedTypeError(string docId, IReadOnlyList seedTypes) - { - var sb = new StringBuilder(); - sb.AppendFormat("The type '{0}' is defined in multiple seed assemblies. If this is intentional, specify one of the following arguments to choose the preferred seed type:", docId); - - foreach (INamedTypeDefinition type in seedTypes) - { - sb.AppendFormat(" /preferSeedType:{0}={1}", docId.Substring("T:".Length), type.GetAssembly().Name.Value); - } - - Trace.TraceError(sb.ToString()); - } - - private void AddTypeForward(Assembly assembly, INamedTypeDefinition seedType) - { - var alias = new NamespaceAliasForType(); - alias.AliasedType = ConvertDefinitionToReferenceIfTypeIsNested(seedType, _seedHost); - alias.IsPublic = true; - - if (assembly.ExportedTypes == null) - assembly.ExportedTypes = new List(); - // Make sure that the typeforward doesn't already exist in the ExportedTypes - if (!assembly.ExportedTypes.Any(t => t.AliasedType.RefDocId() == alias.AliasedType.RefDocId())) - assembly.ExportedTypes.Add(alias); - else - throw new FacadeGenerationException($"{seedType.FullName()} typeforward already exists"); - } - - private void AddWin32VersionResource(string contractLocation, Assembly facade) - { - var versionInfo = FileVersionInfo.GetVersionInfo(contractLocation); - Version fileVersion = new Version(versionInfo.FileMajorPart, versionInfo.FileMinorPart, versionInfo.FileBuildPart, versionInfo.FilePrivatePart); - Version productVersion = new Version(versionInfo.ProductMajorPart, versionInfo.ProductMinorPart, versionInfo.ProductBuildPart, versionInfo.ProductPrivatePart); - var versionSerializer = new VersionResourceSerializer( - true, - versionInfo.Comments, - versionInfo.CompanyName, - versionInfo.FileDescription, - fileVersion, - versionInfo.InternalName, - versionInfo.LegalCopyright, - versionInfo.LegalTrademarks, - versionInfo.OriginalFilename, - versionInfo.ProductName, - productVersion, - facade.Version); - - using (var stream = new MemoryStream()) - using (var writer = new BinaryWriter(stream, Encoding.Unicode, true)) - { - versionSerializer.WriteVerResource(writer); - - var resource = new Win32Resource(); - resource.Id = 1; - resource.TypeId = 0x10; - resource.Data = stream.ToArray().ToList(); - - facade.Win32Resources.Add(resource); - } - } - - // This shouldn't be necessary, but CCI is putting a nonzero TypeDefId in the ExportedTypes table - // for nested types if NamespaceAliasForType.AliasedType is set to an ITypeDefinition - // so we make an ITypeReference copy as a workaround. - private static INamedTypeReference ConvertDefinitionToReferenceIfTypeIsNested(INamedTypeDefinition typeDef, IMetadataHost host) - { - var nestedTypeDef = typeDef as INestedTypeDefinition; - if (nestedTypeDef == null) - return typeDef; - - var typeRef = new NestedTypeReference(); - typeRef.Copy(nestedTypeDef, host.InternFactory); - return typeRef; - } - - private ICustomAttribute CreateAttribute(string typeName, IAssembly seedCoreAssembly, string argument = null) - { - var type = seedCoreAssembly.GetAllTypes().FirstOrDefault(t => t.FullName() == typeName); - if (type == null) - { - throw new FacadeGenerationException(String.Format("Cannot find {0} type in seed core assembly.", typeName)); - } - - IEnumerable constructors = type.GetMembersNamed(_seedHost.NameTable.Ctor, false).OfType(); - - IMethodDefinition constructor = null; - if (argument != null) - { - constructor = constructors.SingleOrDefault(m => m.ParameterCount == 1 && m.Parameters.First().Type.AreEquivalent("System.String")); - } - else - { - constructor = constructors.SingleOrDefault(m => m.ParameterCount == 0); - } - - if (constructor == null) - { - throw new FacadeGenerationException(String.Format("Cannot find {0} constructor taking single string argument in seed core assembly.", typeName)); - } - - var attribute = new CustomAttribute(); - attribute.Constructor = constructor; - - if (argument != null) - { - var argumentExpression = new MetadataConstant(); - argumentExpression.Type = _seedHost.PlatformType.SystemString; - argumentExpression.Value = argument; - - attribute.Arguments = new List(1); - attribute.Arguments.Add(argumentExpression); - } - - return attribute; - } - } - - private class ReferenceAssemblyToFacadeRewriter : MetadataRewriter - { - private IMetadataHost _seedHost; - private IMetadataHost _contractHost; - private IAssemblyReference _seedCoreAssemblyReference; - private bool _stripFileVersionAttributes; - - public ReferenceAssemblyToFacadeRewriter( - IMetadataHost seedHost, - IMetadataHost contractHost, - IAssemblyReference seedCoreAssemblyReference, - bool stripFileVersionAttributes) - : base(seedHost) - { - _seedHost = seedHost; - _contractHost = contractHost; - _stripFileVersionAttributes = stripFileVersionAttributes; - _seedCoreAssemblyReference = seedCoreAssemblyReference; - } - - public override IAssemblyReference Rewrite(IAssemblyReference assemblyReference) - { - if (assemblyReference == null) - return assemblyReference; - - if (assemblyReference.UnifiedAssemblyIdentity.Equals(_contractHost.CoreAssemblySymbolicIdentity) && - !assemblyReference.ModuleIdentity.Equals(host.CoreAssemblySymbolicIdentity)) - { - assemblyReference = _seedCoreAssemblyReference; - } - - return base.Rewrite(assemblyReference); - } - - public override void RewriteChildren(RootUnitNamespace rootUnitNamespace) - { - var assemblyReference = rootUnitNamespace.Unit as IAssemblyReference; - if (assemblyReference != null) - rootUnitNamespace.Unit = Rewrite(assemblyReference).ResolvedUnit; - - base.RewriteChildren(rootUnitNamespace); - } - - public override List Rewrite(List namespaceMembers) - { - // Ignore traversing or rewriting any namspace members. - return base.Rewrite(new List()); - } - - public override void RewriteChildren(Assembly assembly) - { - // Clear all win32 resources. The version resource will get repopulated. - assembly.Win32Resources = new List(); - - // Remove all the references they will get repopulated while outputing. - assembly.AssemblyReferences.Clear(); - - // Remove all the module references (aka native references) - assembly.ModuleReferences = new List(); - - // Remove all file references (ex: *.nlp files in mscorlib) - assembly.Files = new List(); - - // Remove all security attributes (ex: permissionset in IL) - assembly.SecurityAttributes = new List(); - - // Reset the core assembly symbolic identity to the seed core assembly (e.g. mscorlib, corefx) - // and not the contract core (e.g. System.Runtime). - assembly.CoreAssemblySymbolicIdentity = _seedCoreAssemblyReference.AssemblyIdentity; - - // Add reference to seed core assembly up-front so that we keep the same order as the C# compiler. - assembly.AssemblyReferences.Add(_seedCoreAssemblyReference); - - // Remove all type definitions except for the "" type. Remove all fields and methods from it. - NamespaceTypeDefinition moduleType = assembly.AllTypes.SingleOrDefault(t => t.Name.Value == "") as NamespaceTypeDefinition; - assembly.AllTypes.Clear(); - if (moduleType != null) - { - moduleType.Fields?.Clear(); - moduleType.Methods?.Clear(); - assembly.AllTypes.Add(moduleType); - } - - // Remove any preexisting typeforwards. - assembly.ExportedTypes = new List(); - - // Remove any preexisting resources. - assembly.Resources = new List(); - - // Clear the reference assembly flag from the contract. - // For design-time facades, it will be added back later. - assembly.Flags &= ~ReferenceAssemblyFlag; - - // This flag should not be set until the delay-signed assembly we emit is actually signed. - assembly.StrongNameSigned = false; - - base.RewriteChildren(assembly); - } - - public override List Rewrite(List customAttributes) - { - if (customAttributes == null) - return customAttributes; - - List newCustomAttributes = new List(); - - // Remove all of them except for the ones that begin with Assembly - // Also remove AssemblyFileVersion and AssemblyInformationVersion if stripFileVersionAttributes is set - foreach (ICustomAttribute attribute in customAttributes) - { - ITypeReference attributeType = attribute.Type; - if (attributeType is Dummy) - continue; - - string typeName = TypeHelper.GetTypeName(attributeType, NameFormattingOptions.OmitContainingNamespace | NameFormattingOptions.OmitContainingType); - - if (!typeName.StartsWith("Assembly")) - continue; - - // We need to remove the signature key attribute otherwise we will not be able to re-sign these binaries. - if (typeName == "AssemblySignatureKeyAttribute") - continue; - - if (_stripFileVersionAttributes && ((typeName == "AssemblyFileVersionAttribute" || typeName == "AssemblyInformationalVersionAttribute"))) - continue; - - newCustomAttributes.Add(attribute); - } - return base.Rewrite(newCustomAttributes); - } - } - } -} diff --git a/src/Microsoft.DotNet.GenFacades/ILRewriter/GenFacadesTask.cs b/src/Microsoft.DotNet.GenFacades/ILRewriter/GenFacadesTask.cs deleted file mode 100644 index 3eb2988b9c2..00000000000 --- a/src/Microsoft.DotNet.GenFacades/ILRewriter/GenFacadesTask.cs +++ /dev/null @@ -1,163 +0,0 @@ -// Licensed to the .NET Foundation under one or more agreements. -// The .NET Foundation licenses this file to you under the MIT license. - -using Microsoft.Build.Framework; -using Microsoft.Build.Utilities; -using Microsoft.DotNet.Build.Tasks; -using Microsoft.Cci.Extensions; -using System; -using System.Diagnostics; -using System.Linq; -using MSBuild = Microsoft.Build.Utilities; - -namespace Microsoft.DotNet.GenFacades.ILRewriter -{ - /// - /// Runs GenFacades In-Proc. - /// - public sealed class GenFacadesTask : BuildTask - { - [Required] - public string Seeds { get; set; } - - [Required] - public string Contracts { get; set; } - - [Required] - public string FacadePath { get; set; } - - public Version AssemblyFileVersion { get; set; } - - public bool ClearBuildAndRevision { get; set; } - - public bool IgnoreMissingTypes { get; set; } - - public bool IgnoreBuildAndRevisionMismatch { get; set; } - - public bool BuildDesignTimeFacades { get; set; } - - public string InclusionContracts { get; set; } - - public string SeedLoadErrorTreatment { get; set; } - - public string ContractLoadErrorTreatment { get; set; } - - public ITaskItem[] SeedTypePreferencesUnsplit { get; set; } - - public bool ForceZeroVersionSeeds { get; set; } - - public bool ProducePdb { get; set; } = true; - - public string PartialFacadeAssemblyPath { get; set; } - - public bool BuildPartialReferenceFacade { get; set; } - - public override bool Execute() - { - TraceLogger logger = new TraceLogger(Log); - - try - { - Trace.Listeners.Add(logger); - ErrorTreatment seedLoadErrorTreatment = ErrorTreatment.Default; - ErrorTreatment contractLoadErrorTreatment = ErrorTreatment.Default; - - if (SeedLoadErrorTreatment != null) - { - seedLoadErrorTreatment = (ErrorTreatment)Enum.Parse(typeof(ErrorTreatment), SeedLoadErrorTreatment); - } - if (ContractLoadErrorTreatment != null) - { - contractLoadErrorTreatment = (ErrorTreatment)Enum.Parse(typeof(ErrorTreatment), ContractLoadErrorTreatment); - } - - string[] seedTypePreferencesUnsplit = null; - if (SeedTypePreferencesUnsplit != null) - { - seedTypePreferencesUnsplit = SeedTypePreferencesUnsplit.Select(iti => $"{iti.ItemSpec}={iti.GetMetadata("Assembly")}").ToArray(); - Trace.WriteLine("seedTypePreferencesUnsplit: " + string.Join(" || ", seedTypePreferencesUnsplit)); - } - - bool result = Generator.Execute( - Seeds, - Contracts, - FacadePath, - AssemblyFileVersion, - ClearBuildAndRevision, - IgnoreMissingTypes, - IgnoreBuildAndRevisionMismatch, - BuildDesignTimeFacades, - InclusionContracts, - seedLoadErrorTreatment, - contractLoadErrorTreatment, - seedTypePreferencesUnsplit, - ForceZeroVersionSeeds, - ProducePdb, - PartialFacadeAssemblyPath, - BuildPartialReferenceFacade); - - if (!result) - { - Log.LogError("Errors were encountered when generating facade(s)."); - } - - return result; - } - catch (Exception e) - { - Log.LogErrorFromException(e, showStackTrace: false); - return false; - } - finally - { - Trace.Listeners.Remove(logger); - } - } - } - - // Trace listener which writes to the MSBuild log. - public class TraceLogger : TraceListener - { - private readonly ILog _log; - - public TraceLogger(ILog log) - { - _log = log; - } - - public override void TraceEvent(TraceEventCache eventCache, String source, TraceEventType eventType, int id, string message) - { - TraceEvent(eventCache, source, eventType, id, message, null); - } - - public override void TraceEvent(TraceEventCache eventCache, String source, TraceEventType eventType, int id, string format, params object[] args) - { - string message = args == null ? format : string.Format(format, args); - - if (eventType == TraceEventType.Error) - { - // Disabled until we fix warnings -https://github.com/dotnet/corefx/issues/29861 - //_log.LogError(message); - _log.LogWarning(message); - } - else if (eventType == TraceEventType.Warning) - { - _log.LogWarning(message); - } - else - { - _log.LogMessage(message); - } - } - - public override void Write(string message) - { - _log.LogMessage(message); - } - - public override void WriteLine(string message) - { - _log.LogMessage(message + Environment.NewLine); - } - } -} diff --git a/src/Microsoft.DotNet.GenFacades/ILRewriter/TypeReferenceRewriter.cs b/src/Microsoft.DotNet.GenFacades/ILRewriter/TypeReferenceRewriter.cs deleted file mode 100644 index 4291c29c24e..00000000000 --- a/src/Microsoft.DotNet.GenFacades/ILRewriter/TypeReferenceRewriter.cs +++ /dev/null @@ -1,42 +0,0 @@ -// Licensed to the .NET Foundation under one or more agreements. -// The .NET Foundation licenses this file to you under the MIT license. - -using Microsoft.Cci; -using Microsoft.Cci.MutableCodeModel; -using System; - -namespace Microsoft.DotNet.GenFacades.ILRewriter -{ - internal sealed class TypeReferenceRewriter : MetadataRewriter - { - private readonly Func transform; - - public TypeReferenceRewriter(IMetadataHost host, Func transform): base(host, true) - { - this.transform = transform; - } - - T TransformType(T oldValue) where T: class, ITypeReference - { - return transform(oldValue) as T; - } - - public override INamespaceTypeReference Rewrite(INamespaceTypeReference namespaceTypeReference) - { - return base.Rewrite(TransformType(namespaceTypeReference)); - } - - public override INestedTypeReference Rewrite(INestedTypeReference nestedTypeReference) - { - return base.Rewrite(TransformType(nestedTypeReference)); - } - - public override void RewriteChildren(GenericTypeInstanceReference genericTypeInstanceReference) - { - genericTypeInstanceReference.GenericType = TransformType(genericTypeInstanceReference.GenericType); - base.RewriteChildren(genericTypeInstanceReference); - genericTypeInstanceReference.GenericArguments = this.Rewrite(genericTypeInstanceReference.GenericArguments); - genericTypeInstanceReference.GenericType = this.Rewrite(genericTypeInstanceReference.GenericType); - } - } -} diff --git a/src/Microsoft.DotNet.GenFacades/ILRewriter/VersionResourceSerializer.cs b/src/Microsoft.DotNet.GenFacades/ILRewriter/VersionResourceSerializer.cs deleted file mode 100644 index 94c1534b386..00000000000 --- a/src/Microsoft.DotNet.GenFacades/ILRewriter/VersionResourceSerializer.cs +++ /dev/null @@ -1,279 +0,0 @@ -// Licensed to the .NET Foundation under one or more agreements. -// The .NET Foundation licenses this file to you under the MIT license. - -// This code is from Roslyn/Source/Compilers/Core/CvtRes.cs - -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; - -using DWORD = System.UInt32; -using WCHAR = System.Char; -using WORD = System.UInt16; - -namespace Microsoft.DotNet.GenFacades.ILRewriter -{ - internal class VersionResourceSerializer - { - private readonly string _commentsContents; - private readonly string _companyNameContents; - private readonly string _fileDescriptionContents; - private readonly Version _fileVersion; - private readonly string _internalNameContents; - private readonly string _legalCopyrightContents; - private readonly string _legalTrademarksContents; - private readonly string _originalFileNameContents; - private readonly string _productNameContents; - private readonly Version _productVersion; - private readonly Version _assemblyVersion; - - private const string vsVersionInfoKey = "VS_VERSION_INFO"; - private const string varFileInfoKey = "VarFileInfo"; - private const string translationKey = "Translation"; - private const string stringFileInfoKey = "StringFileInfo"; - private readonly string _langIdAndCodePageKey; //should be 8 characters - private const DWORD CP_WINUNICODE = 1200; - - private const ushort sizeVS_FIXEDFILEINFO = sizeof(DWORD) * 13; - private readonly bool _isDll; - - internal VersionResourceSerializer(bool isDll, string comments, string companyName, string fileDescription, Version fileVersion, - string internalName, string legalCopyright, string legalTrademark, string originalFileName, string productName, Version productVersion, - Version assemblyVersion) - { - _isDll = isDll; - _commentsContents = comments; - _companyNameContents = companyName; - _fileDescriptionContents = fileDescription; - _fileVersion = fileVersion; - _internalNameContents = internalName; - _legalCopyrightContents = legalCopyright; - _legalTrademarksContents = legalTrademark; - _originalFileNameContents = originalFileName; - _productNameContents = productName; - _productVersion = productVersion; - _assemblyVersion = assemblyVersion; - _langIdAndCodePageKey = System.String.Format("{0:x4}{1:x4}", 0 /*langId*/, CP_WINUNICODE /*codepage*/); - } - - private const uint VFT_APP = 0x00000001; - private const uint VFT_DLL = 0x00000002; - - private IEnumerable> GetVerStrings() - { - if (_commentsContents != null) yield return new KeyValuePair("Comments", _commentsContents); - if (_companyNameContents != null) yield return new KeyValuePair("CompanyName", _companyNameContents); - if (_fileDescriptionContents != null) yield return new KeyValuePair("FileDescription", _fileDescriptionContents); - if (_fileVersion != null) yield return new KeyValuePair("FileVersion", _fileVersion.ToString()); - if (_internalNameContents != null) yield return new KeyValuePair("InternalName", _internalNameContents); - if (_legalCopyrightContents != null) yield return new KeyValuePair("LegalCopyright", _legalCopyrightContents); - if (_legalTrademarksContents != null) yield return new KeyValuePair("LegalTrademarks", _legalTrademarksContents); - if (_originalFileNameContents != null) yield return new KeyValuePair("OriginalFilename", _originalFileNameContents); - if (_productNameContents != null) yield return new KeyValuePair("ProductName", _productNameContents); - if (_productVersion != null) yield return new KeyValuePair("ProductVersion", _productVersion.ToString()); - if (_assemblyVersion != null) yield return new KeyValuePair("Assembly Version", _assemblyVersion.ToString()); - } - - private uint FileType { get { return (_isDll) ? VFT_DLL : VFT_APP; } } - - private void WriteVSFixedFileInfo(BinaryWriter writer) - { - writer.Write((DWORD)0xFEEF04BD); - writer.Write((DWORD)0x00010000); - writer.Write((DWORD)(_fileVersion.Major << 16) | (uint)_fileVersion.Minor); - writer.Write((DWORD)(_fileVersion.Build << 16) | (uint)_fileVersion.Revision); - writer.Write((DWORD)(_productVersion.Major << 16) | (uint)_productVersion.Minor); - writer.Write((DWORD)(_productVersion.Build << 16) | (uint)_productVersion.Revision); - writer.Write((DWORD)0x0000003F); //VS_FFI_FILEFLAGSMASK (EDMAURER) really? all these bits are valid? - writer.Write((DWORD)0); //file flags - writer.Write((DWORD)0x00000004); //VOS__WINDOWS32 - writer.Write((DWORD)this.FileType); - writer.Write((DWORD)0); //file subtype - writer.Write((DWORD)0); //date most sig - writer.Write((DWORD)0); //date least sig - } - - /// - /// Assume that 3 WORDs preceded this string and that the they began 32-bit aligned. - /// Given the string length compute the number of bytes that should be written to end - /// the buffer on a 32-bit boundary - /// - /// - private static int PadKeyLen(int cb) - { - //add previously written 3 WORDS, round up, then subtract the 3 WORDS. - return PadToDword(cb + 3 * sizeof(WORD)) - 3 * sizeof(WORD); - } - /// - /// assuming the length of bytes submitted began on a 32-bit boundary, - /// round up this length as necessary so that it ends at a 32-bit boundary. - /// - /// - /// - private static int PadToDword(int cb) - { - return (cb + 3) & ~3; - } - - private const int HDRSIZE = 3 * sizeof(ushort); - - private static ushort SizeofVerString(string lpszKey, string lpszValue) - { - int cbKey, cbValue; - - cbKey = (lpszKey.Length + 1) * 2; // Make room for the NULL - cbValue = (lpszValue.Length + 1) * 2; - if (cbKey + cbValue >= 0xFFF0) - return 0xFFFF; - - return (ushort)(PadKeyLen(cbKey) + // key, 0 padded to DWORD boundary - PadToDword(cbValue) + // value, 0 padded to dword boundary - HDRSIZE); // block header. - } - - private static void WriteVersionString(KeyValuePair keyValuePair, BinaryWriter writer) - { - System.Diagnostics.Debug.Assert(keyValuePair.Value != null); - - ushort cbBlock = SizeofVerString(keyValuePair.Key, keyValuePair.Value); - int cbKey = (keyValuePair.Key.Length + 1) * 2; // includes terminating NUL - int cbVal = (keyValuePair.Value.Length + 1) * 2; // includes terminating NUL - - var startPos = writer.BaseStream.Position; - - writer.Write((WORD)cbBlock); - writer.Write((WORD)(keyValuePair.Value.Length + 1)); //add 1 for nul - writer.Write((WORD)1); - writer.Write(keyValuePair.Key.ToCharArray()); - writer.Write((WORD)'\0'); - writer.Write(new byte[PadKeyLen(cbKey) - cbKey]); - writer.Write(keyValuePair.Value.ToCharArray()); - writer.Write((WORD)'\0'); - writer.Write(new byte[PadToDword(cbVal) - cbVal]); - - System.Diagnostics.Debug.Assert(cbBlock == writer.BaseStream.Position - startPos); - } - - /// - /// compute number of chars needed to end up on a 32-bit boundary assuming that three - /// WORDS preceded this string. - /// - /// - /// - private static int KEYSIZE(string sz) - { - return PadKeyLen((sz.Length + 1) * sizeof(WCHAR)) / sizeof(WCHAR); - } - private static int KEYBYTES(string sz) - { - return KEYSIZE(sz) * sizeof(WCHAR); - } - - private int GetStringsSize() - { - return GetVerStrings().Aggregate(0, (curSum, pair) => SizeofVerString(pair.Key, pair.Value) + curSum); - } - - internal int GetDataSize() - { - int sizeEXEVERRESOURCE = sizeof(WORD) * 3 * 5 + 2 * sizeof(WORD) + //five headers + two words for CP and lang - KEYBYTES(vsVersionInfoKey) + - KEYBYTES(varFileInfoKey) + - KEYBYTES(translationKey) + - KEYBYTES(stringFileInfoKey) + - KEYBYTES(_langIdAndCodePageKey) + - sizeVS_FIXEDFILEINFO; - - return GetStringsSize() + sizeEXEVERRESOURCE; - } - - internal void WriteVerResource(BinaryWriter writer) - { - /* - must be assumed to start on a 32-bit boundary. - * - * the sub-elements of the VS_VERSIONINFO consist of a header (3 WORDS) a string - * and then beginning on the next 32-bit boundary, the elements children - - struct VS_VERSIONINFO - { - WORD cbRootBlock; // size of whole resource - WORD cbRootValue; // size of VS_FIXEDFILEINFO structure - WORD fRootText; // root is text? - WCHAR szRootKey[KEYSIZE("VS_VERSION_INFO")]; // Holds "VS_VERSION_INFO" - VS_FIXEDFILEINFO vsFixed; // fixed information. - WORD cbVarBlock; // size of VarFileInfo block - WORD cbVarValue; // always 0 - WORD fVarText; // VarFileInfo is text? - WCHAR szVarKey[KEYSIZE("VarFileInfo")]; // Holds "VarFileInfo" - WORD cbTransBlock; // size of Translation block - WORD cbTransValue; // size of Translation value - WORD fTransText; // Translation is text? - WCHAR szTransKey[KEYSIZE("Translation")]; // Holds "Translation" - WORD langid; // language id - WORD codepage; // codepage id - WORD cbStringBlock; // size of StringFileInfo block - WORD cbStringValue; // always 0 - WORD fStringText; // StringFileInfo is text? - WCHAR szStringKey[KEYSIZE("StringFileInfo")]; // Holds "StringFileInfo" - WORD cbLangCpBlock; // size of language/codepage block - WORD cbLangCpValue; // always 0 - WORD fLangCpText; // LangCp is text? - WCHAR szLangCpKey[KEYSIZE("12345678")]; // Holds hex version of language/codepage - // followed by strings - }; - */ - - var debugPos = writer.BaseStream.Position; - var dataSize = GetDataSize(); - - writer.Write((WORD)dataSize); - writer.Write((WORD)sizeVS_FIXEDFILEINFO); - writer.Write((WORD)0); - writer.Write(vsVersionInfoKey.ToCharArray()); - writer.Write(new byte[KEYBYTES(vsVersionInfoKey) - vsVersionInfoKey.Length * 2]); - System.Diagnostics.Debug.Assert((writer.BaseStream.Position & 3) == 0); - WriteVSFixedFileInfo(writer); - writer.Write((WORD)(sizeof(WORD) * 2 + 2 * HDRSIZE + KEYBYTES(varFileInfoKey) + KEYBYTES(translationKey))); - writer.Write((WORD)0); - writer.Write((WORD)1); - writer.Write(varFileInfoKey.ToCharArray()); - writer.Write(new byte[KEYBYTES(varFileInfoKey) - varFileInfoKey.Length * 2]); //padding - System.Diagnostics.Debug.Assert((writer.BaseStream.Position & 3) == 0); - writer.Write((WORD)(sizeof(WORD) * 2 + HDRSIZE + KEYBYTES(translationKey))); - writer.Write((WORD)(sizeof(WORD) * 2)); - writer.Write((WORD)0); - writer.Write(translationKey.ToCharArray()); - writer.Write(new byte[KEYBYTES(translationKey) - translationKey.Length * 2]); //padding - System.Diagnostics.Debug.Assert((writer.BaseStream.Position & 3) == 0); - writer.Write((WORD)0); //langId; MAKELANGID(LANG_NEUTRAL, SUBLANG_NEUTRAL)) = 0 - writer.Write((WORD)CP_WINUNICODE); //codepage; 1200 = CP_WINUNICODE - System.Diagnostics.Debug.Assert((writer.BaseStream.Position & 3) == 0); - writer.Write((WORD)(2 * HDRSIZE + KEYBYTES(stringFileInfoKey) + KEYBYTES(_langIdAndCodePageKey) + GetStringsSize())); - writer.Write((WORD)0); - writer.Write((WORD)1); - writer.Write(stringFileInfoKey.ToCharArray()); //actually preceded by 5 WORDS so not consistent with the - //assumptions of KEYBYTES, but equivalent. - writer.Write(new byte[KEYBYTES(stringFileInfoKey) - stringFileInfoKey.Length * 2]); //padding. - System.Diagnostics.Debug.Assert((writer.BaseStream.Position & 3) == 0); - writer.Write((WORD)(HDRSIZE + KEYBYTES(_langIdAndCodePageKey) + GetStringsSize())); - writer.Write((WORD)0); - writer.Write((WORD)1); - writer.Write(_langIdAndCodePageKey.ToCharArray()); - writer.Write(new byte[KEYBYTES(_langIdAndCodePageKey) - _langIdAndCodePageKey.Length * 2]); //padding - System.Diagnostics.Debug.Assert((writer.BaseStream.Position & 3) == 0); - - System.Diagnostics.Debug.Assert(writer.BaseStream.Position - debugPos == dataSize - GetStringsSize()); - debugPos = writer.BaseStream.Position; - - foreach (var entry in GetVerStrings()) - { - System.Diagnostics.Debug.Assert(entry.Value != null); - WriteVersionString(entry, writer); - } - - System.Diagnostics.Debug.Assert(writer.BaseStream.Position - debugPos == GetStringsSize()); - } - } -} diff --git a/src/Microsoft.DotNet.GenFacades/Microsoft.DotNet.GenFacades.csproj b/src/Microsoft.DotNet.GenFacades/Microsoft.DotNet.GenFacades.csproj index f79632b9289..db51ae171ed 100644 --- a/src/Microsoft.DotNet.GenFacades/Microsoft.DotNet.GenFacades.csproj +++ b/src/Microsoft.DotNet.GenFacades/Microsoft.DotNet.GenFacades.csproj @@ -1,9 +1,7 @@ - net472;$(TargetFrameworkForNETSDK) - $(TargetFrameworkForNETSDK) - false + $(TargetFrameworkForNETSDK);net472 MSBuildSdk false true @@ -21,24 +19,6 @@ - - - - - - - - - - - - - - - - - - @@ -48,19 +28,6 @@ - - - - PreserveNewest - false - - - PreserveNewest - false - - - - diff --git a/src/Microsoft.DotNet.GenFacades/NotSupportedAssemblyGenerator.cs b/src/Microsoft.DotNet.GenFacades/NotSupportedAssemblyGenerator.cs index ed8a9a24bef..235f10e4c5c 100644 --- a/src/Microsoft.DotNet.GenFacades/NotSupportedAssemblyGenerator.cs +++ b/src/Microsoft.DotNet.GenFacades/NotSupportedAssemblyGenerator.cs @@ -31,60 +31,55 @@ public override bool Execute() if (SourceFiles == null || SourceFiles.Length == 0) { Log.LogError("There are no ref source files."); + return false; } - else - { - GenerateNotSupportedAssemblyFiles(SourceFiles); - } + + GenerateNotSupportedAssemblyFiles(SourceFiles); + return !Log.HasLoggedErrors; } private void GenerateNotSupportedAssemblyFiles(IEnumerable sourceFiles) { + string[] apiExclusions = null; + if (!string.IsNullOrEmpty(ApiExclusionListPath) && File.Exists(ApiExclusionListPath)) + { + apiExclusions = File.ReadAllLines(ApiExclusionListPath); + } + foreach (ITaskItem item in sourceFiles) { string sourceFile = item.ItemSpec; - if (string.IsNullOrEmpty(sourceFile)) - { - continue; - } + string outputPath = item.GetMetadata("OutputPath"); + if (!File.Exists(sourceFile)) { Log.LogError($"File {sourceFile} was not found."); continue; } - string text = GenerateNotSupportedAssemblyForSourceFile(sourceFile); - if(text != null) - File.WriteAllText(item.GetMetadata("NotSupportedPath"), text); + GenerateNotSupportedAssemblyForSourceFile(sourceFile, outputPath, apiExclusions); } } - private string GenerateNotSupportedAssemblyForSourceFile(string sourceFile) + private void GenerateNotSupportedAssemblyForSourceFile(string sourceFile, string outputPath, string[] apiExclusions) { - string[] apiExclusions; SyntaxTree syntaxTree; + try { syntaxTree = CSharpSyntaxTree.ParseText(File.ReadAllText(sourceFile)); } catch(Exception ex) { - Log.LogError(ex.Message); - return null; + Log.LogErrorFromException(ex, false); + return; } - if (string.IsNullOrEmpty(ApiExclusionListPath) || !File.Exists(ApiExclusionListPath)) - { - apiExclusions = null; - } - else - { - apiExclusions = File.ReadAllLines(ApiExclusionListPath); - } var rewriter = new NotSupportedAssemblyRewriter(Message, apiExclusions); SyntaxNode root = rewriter.Visit(syntaxTree.GetRoot()); - return root.GetText().ToString(); + string text = root.GetText().ToString(); + File.WriteAllText(outputPath, text); } } diff --git a/src/Microsoft.DotNet.GenFacades/build/Microsoft.DotNet.GenFacades.targets b/src/Microsoft.DotNet.GenFacades/build/Microsoft.DotNet.GenFacades.targets index 06bf66277c6..9a6f0feea61 100644 --- a/src/Microsoft.DotNet.GenFacades/build/Microsoft.DotNet.GenFacades.targets +++ b/src/Microsoft.DotNet.GenFacades/build/Microsoft.DotNet.GenFacades.targets @@ -2,17 +2,11 @@ - <_MicrosoftDotNetGenFacadesTaskDir Condition="'$(MSBuildRuntimeType)' == 'core'">$(MSBuildThisFileDirectory)../tools/netcoreapp3.1/ - <_MicrosoftDotNetGenFacadesTaskDir Condition="'$(MSBuildRuntimeType)' != 'core'">$(MSBuildThisFileDirectory)../tools/net472/ + $(MSBuildThisFileDirectory)..\tools\netcoreapp3.1\Microsoft.DotNet.GenFacades.dll + $(MSBuildThisFileDirectory)..\tools\net472\Microsoft.DotNet.GenFacades.dll - - $(_MicrosoftDotNetGenFacadesTaskDir)Microsoft.DotNet.GenFacades.dll - - - - - - - + + diff --git a/src/Microsoft.DotNet.GenFacades/build/Microsoft.DotNet.GenFacadesILRewriter.targets b/src/Microsoft.DotNet.GenFacades/build/Microsoft.DotNet.GenFacadesILRewriter.targets deleted file mode 100644 index b8d3f388405..00000000000 --- a/src/Microsoft.DotNet.GenFacades/build/Microsoft.DotNet.GenFacadesILRewriter.targets +++ /dev/null @@ -1,95 +0,0 @@ - - - - - $(NoWarn);0436 - - - - - $(IntermediateOutputPath)$(TargetName)$(TargetExt) - $(IntermediateOutputPath)$(TargetName).pdb - $(IntermediateOutputPath)PreGenFacades/ - $(GenFacadesInputPath)$(TargetName)$(TargetExt) - $(GenFacadesInputPath)$(TargetName).pdb - $(IntermediateOutputPath) - $(GenFacadesInputPath)genfacades.rsp - - - - - - $(TargetsTriggeredByCompilation);FillPartialFacadeUsingTask - - - - - - - - - - - - - - - - - - - - true - - false - false - false - - - - - - - $(GenFacadesInputAssembly) - true - - - - - - - - - - diff --git a/src/Microsoft.DotNet.GenFacades/build/Microsoft.DotNet.GenFacadesNotSupported.targets b/src/Microsoft.DotNet.GenFacades/build/Microsoft.DotNet.GenFacadesNotSupported.targets index 8682b0bcff4..fdc6b533ccf 100644 --- a/src/Microsoft.DotNet.GenFacades/build/Microsoft.DotNet.GenFacadesNotSupported.targets +++ b/src/Microsoft.DotNet.GenFacades/build/Microsoft.DotNet.GenFacadesNotSupported.targets @@ -4,68 +4,61 @@ - UpdateRefToNonSupportedAssembly;$(CoreCompileDependsOn) + AddGenFacadeNotSupportedCompileItem;$(CoreCompileDependsOn) false $(NoWarn);CA1823;CA1821;CS0169 - - - True - + + - GetCompileItems + SourceFilesProjectOutputGroup false - ReferenceSources + _contractSourceFilesGroup false - - - - - - - - - + - + Condition="'%(ProjectReference.Targets)' == 'GetCompile' and ('$(BuildingInsideVisualStudio)' == 'true' or '$(BuildProjectReferences)' != 'true')"> + - + - + <_contractSourceFilesGroup IsRooted="$([System.IO.Path]::IsPathRooted('%(_contractSourceFilesGroup.OriginalItemSpec)'))" /> + + - + - - + + + diff --git a/src/Microsoft.DotNet.GenFacades/build/Microsoft.DotNet.GenPartialFacadeSource.targets b/src/Microsoft.DotNet.GenFacades/build/Microsoft.DotNet.GenPartialFacadeSource.targets index be7ed061db1..3b99772b6db 100644 --- a/src/Microsoft.DotNet.GenFacades/build/Microsoft.DotNet.GenPartialFacadeSource.targets +++ b/src/Microsoft.DotNet.GenFacades/build/Microsoft.DotNet.GenPartialFacadeSource.targets @@ -1,29 +1,26 @@ + + + + true - - $(GeneratePartialFacadeSourceDependsOn);ResolveMatchingContract - - - - - $(IntermediateOutputPath)\$(AssemblyTitle).Forwards.cs - - $(CoreCompileDependsOn);GeneratePartialFacadeSource - + $(GeneratePartialFacadeSourceDependsOn);ResolveMatchingContract + $(CoreCompileDependsOn);GeneratePartialFacadeSource + + + $(TargetsTriggeredByCompilation);ClearAssemblyReferenceVersions + + $(IntermediateOutputPath)$(AssemblyTitle).Forwards.cs - - - - $(IntermediateOutputPath)\$(AssemblyTitle).Forwards.cs %(ResolvedMatchingContract.Identity) @@ -36,27 +33,14 @@ IgnoreMissingTypesList="@(GenFacadesIgnoreMissingType)" OmitTypes="@(GenFacadesOmitType)" OutputSourcePath="$(OutputSourcePath)" - SeedTypePreferences="@(SeedTypePreference)" - /> - - - - + SeedTypePreferences="@(SeedTypePreference)" /> - - + + + - - - - $(TargetsTriggeredByCompilation);ClearAssemblyReferenceVersions - - - - - <_ClearAssemblyReferenceVersionsAssembly>$(IntermediateOutputPath)$(TargetName)$(TargetExt) @@ -64,10 +48,12 @@ + DestinationFolder="$(IntermediateOutputPath)ClearRef" + Condition="'$(GenFacadesForceZeroVersionSeedsDebugMode)' == 'true'"> + From fecdaeca751e49cf64bdce8e18057a3768153de7 Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Wed, 19 May 2021 15:15:21 +0000 Subject: [PATCH 099/699] Update dependencies from https://github.com/mono/linker build 20210518.2 (#7409) [main] Update dependencies from mono/linker --- eng/Version.Details.xml | 4 ++-- eng/Versions.props | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index 594ace80563..02c3c1258f4 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -47,9 +47,9 @@ https://github.com/dotnet/roslyn dc0aff25e0ace6e6bf98269963612f9a67cdc897 - + https://github.com/mono/linker - a621b9a630950026f5508c8089a59c0e825bd6e0 + 30f2498c2a3de1f7e236d5793f5f1aca6e5ba456 https://github.com/dotnet/sourcelink diff --git a/eng/Versions.props b/eng/Versions.props index bafcaa163dc..be9e08022f1 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -35,7 +35,7 @@ 2.1.1 2.1.0 3.10.0-4.21262.12 - 6.0.100-preview.5.21267.3 + 6.0.100-preview.5.21268.2 16.7.1 4.8.3 5.3.0.1 From 0b0d5b90b5aba80c66a9e7a210e0af8093dc4f57 Mon Sep 17 00:00:00 2001 From: Jacques Eloff Date: Wed, 19 May 2021 11:04:34 -0700 Subject: [PATCH 100/699] Capture .wixobj data to support post-build signing (#7406) --- .../src/GenerateMsiBase.cs | 1 + src/Microsoft.DotNet.Build.Tasks.Workloads/src/Metadata.cs | 1 + 2 files changed, 2 insertions(+) diff --git a/src/Microsoft.DotNet.Build.Tasks.Workloads/src/GenerateMsiBase.cs b/src/Microsoft.DotNet.Build.Tasks.Workloads/src/GenerateMsiBase.cs index dcc1480a9ea..4a8db6efd96 100644 --- a/src/Microsoft.DotNet.Build.Tasks.Workloads/src/GenerateMsiBase.cs +++ b/src/Microsoft.DotNet.Build.Tasks.Workloads/src/GenerateMsiBase.cs @@ -249,6 +249,7 @@ protected IEnumerable Generate(string sourcePackage, string swixPacka msi.SetMetadata(Metadata.Platform, platform); msi.SetMetadata(Metadata.Version, nupkg.ProductVersion); msi.SetMetadata(Metadata.JsonProperties, msiJsonPath); + msi.SetMetadata(Metadata.WixObj, candleIntermediateOutputPath); if (GenerateSwixAuthoring && IsSupportedByVisualStudio(platform)) { diff --git a/src/Microsoft.DotNet.Build.Tasks.Workloads/src/Metadata.cs b/src/Microsoft.DotNet.Build.Tasks.Workloads/src/Metadata.cs index d4dc2f89d93..2c5e220fcce 100644 --- a/src/Microsoft.DotNet.Build.Tasks.Workloads/src/Metadata.cs +++ b/src/Microsoft.DotNet.Build.Tasks.Workloads/src/Metadata.cs @@ -17,5 +17,6 @@ internal class Metadata public const string SwixProject = "SwixProject"; public const string Title = "Title"; public const string Version = "Version"; + public const string WixObj = "WixObj"; } } From 750bcf39614c37ca34c9e5c41a7654237d981805 Mon Sep 17 00:00:00 2001 From: Lukas Lansky Date: Wed, 19 May 2021 21:38:59 +0200 Subject: [PATCH 101/699] Taking over runtime's C# style rules (#7410) --- .editorconfig | 150 +++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 147 insertions(+), 3 deletions(-) diff --git a/.editorconfig b/.editorconfig index 746feabd043..c2ca9d7d0e2 100644 --- a/.editorconfig +++ b/.editorconfig @@ -14,11 +14,155 @@ tab_width = 2 indent_size = 2 tab_width = 2 +[*.{*proj,xml,props,targets,tasks}] +indent_size = 2 +tab_width = 2 + [*.{cs}] indent_size = 4 tab_width = 4 -[*.{*proj,xml,props,targets,tasks}] -indent_size = 2 -tab_width = 2 +# New line preferences +csharp_new_line_before_open_brace = all +csharp_new_line_before_else = true +csharp_new_line_before_catch = true +csharp_new_line_before_finally = true +csharp_new_line_before_members_in_object_initializers = true +csharp_new_line_before_members_in_anonymous_types = true +csharp_new_line_between_query_expression_clauses = true + +# Indentation preferences +csharp_indent_block_contents = true +csharp_indent_braces = false +csharp_indent_case_contents = true +csharp_indent_case_contents_when_block = true +csharp_indent_switch_labels = true +csharp_indent_labels = one_less_than_current + +# Modifier preferences +csharp_preferred_modifier_order = public,private,protected,internal,static,extern,new,virtual,abstract,sealed,override,readonly,unsafe,volatile,async:suggestion + +# avoid this. unless absolutely necessary +dotnet_style_qualification_for_field = false:suggestion +dotnet_style_qualification_for_property = false:suggestion +dotnet_style_qualification_for_method = false:suggestion +dotnet_style_qualification_for_event = false:suggestion + +# Types: use keywords instead of BCL types, and permit var only when the type is clear +csharp_style_var_for_built_in_types = false:suggestion +csharp_style_var_when_type_is_apparent = false:none +csharp_style_var_elsewhere = false:suggestion +dotnet_style_predefined_type_for_locals_parameters_members = true:suggestion +dotnet_style_predefined_type_for_member_access = true:suggestion + +# name all constant fields using PascalCase +dotnet_naming_rule.constant_fields_should_be_pascal_case.severity = suggestion +dotnet_naming_rule.constant_fields_should_be_pascal_case.symbols = constant_fields +dotnet_naming_rule.constant_fields_should_be_pascal_case.style = pascal_case_style +dotnet_naming_symbols.constant_fields.applicable_kinds = field +dotnet_naming_symbols.constant_fields.required_modifiers = const +dotnet_naming_style.pascal_case_style.capitalization = pascal_case + +# static fields should have s_ prefix +dotnet_naming_rule.static_fields_should_have_prefix.severity = suggestion +dotnet_naming_rule.static_fields_should_have_prefix.symbols = static_fields +dotnet_naming_rule.static_fields_should_have_prefix.style = static_prefix_style +dotnet_naming_symbols.static_fields.applicable_kinds = field +dotnet_naming_symbols.static_fields.required_modifiers = static +dotnet_naming_symbols.static_fields.applicable_accessibilities = private, internal, private_protected +dotnet_naming_style.static_prefix_style.required_prefix = s_ +dotnet_naming_style.static_prefix_style.capitalization = camel_case + +# internal and private fields should be _camelCase +dotnet_naming_rule.camel_case_for_private_internal_fields.severity = suggestion +dotnet_naming_rule.camel_case_for_private_internal_fields.symbols = private_internal_fields +dotnet_naming_rule.camel_case_for_private_internal_fields.style = camel_case_underscore_style +dotnet_naming_symbols.private_internal_fields.applicable_kinds = field +dotnet_naming_symbols.private_internal_fields.applicable_accessibilities = private, internal +dotnet_naming_style.camel_case_underscore_style.required_prefix = _ +dotnet_naming_style.camel_case_underscore_style.capitalization = camel_case + +# Code style defaults +csharp_using_directive_placement = outside_namespace:suggestion +dotnet_sort_system_directives_first = true +csharp_prefer_braces = true:silent +csharp_preserve_single_line_blocks = true:none +csharp_preserve_single_line_statements = false:none +csharp_prefer_static_local_function = true:suggestion +csharp_prefer_simple_using_statement = false:none +csharp_style_prefer_switch_expression = true:suggestion + +# Code quality +dotnet_style_readonly_field = true:suggestion +dotnet_code_quality_unused_parameters = non_public:suggestion + +# Expression-level preferences +dotnet_style_object_initializer = true:suggestion +dotnet_style_collection_initializer = true:suggestion +dotnet_style_explicit_tuple_names = true:suggestion +dotnet_style_coalesce_expression = true:suggestion +dotnet_style_null_propagation = true:suggestion +dotnet_style_prefer_is_null_check_over_reference_equality_method = true:suggestion +dotnet_style_prefer_inferred_tuple_names = true:suggestion +dotnet_style_prefer_inferred_anonymous_type_member_names = true:suggestion +dotnet_style_prefer_auto_properties = true:suggestion +dotnet_style_prefer_conditional_expression_over_assignment = true:silent +dotnet_style_prefer_conditional_expression_over_return = true:silent +csharp_prefer_simple_default_expression = true:suggestion + +# Expression-bodied members +csharp_style_expression_bodied_methods = true:silent +csharp_style_expression_bodied_constructors = true:silent +csharp_style_expression_bodied_operators = true:silent +csharp_style_expression_bodied_properties = true:silent +csharp_style_expression_bodied_indexers = true:silent +csharp_style_expression_bodied_accessors = true:silent +csharp_style_expression_bodied_lambdas = true:silent +csharp_style_expression_bodied_local_functions = true:silent + +# Pattern matching +csharp_style_pattern_matching_over_is_with_cast_check = true:suggestion +csharp_style_pattern_matching_over_as_with_null_check = true:suggestion +csharp_style_inlined_variable_declaration = true:suggestion + +# Null checking preferences +csharp_style_throw_expression = true:suggestion +csharp_style_conditional_delegate_call = true:suggestion + +# Other features +csharp_style_prefer_index_operator = false:none +csharp_style_prefer_range_operator = false:none +csharp_style_pattern_local_over_anonymous_function = false:none + +# Space preferences +csharp_space_after_cast = false +csharp_space_after_colon_in_inheritance_clause = true +csharp_space_after_comma = true +csharp_space_after_dot = false +csharp_space_after_keywords_in_control_flow_statements = true +csharp_space_after_semicolon_in_for_statement = true +csharp_space_around_binary_operators = before_and_after +csharp_space_around_declaration_statements = do_not_ignore +csharp_space_before_colon_in_inheritance_clause = true +csharp_space_before_comma = false +csharp_space_before_dot = false +csharp_space_before_open_square_brackets = false +csharp_space_before_semicolon_in_for_statement = false +csharp_space_between_empty_square_brackets = false +csharp_space_between_method_call_empty_parameter_list_parentheses = false +csharp_space_between_method_call_name_and_opening_parenthesis = false +csharp_space_between_method_call_parameter_list_parentheses = false +csharp_space_between_method_declaration_empty_parameter_list_parentheses = false +csharp_space_between_method_declaration_name_and_open_parenthesis = false +csharp_space_between_method_declaration_parameter_list_parentheses = false +csharp_space_between_parentheses = false +csharp_space_between_square_brackets = false + +# Analyzers +dotnet_code_quality.CA1052.api_surface = private, internal +dotnet_code_quality.CA1802.api_surface = private, internal +dotnet_code_quality.CA1822.api_surface = private, internal +dotnet_code_quality.CA2208.api_surface = public +# License header +file_header_template = Licensed to the .NET Foundation under one or more agreements.\nThe .NET Foundation licenses this file to you under the MIT license. From 30a24acfe3f8bc3874117ece73ceb1ccfc7e7057 Mon Sep 17 00:00:00 2001 From: Jon Fortescue Date: Wed, 19 May 2021 15:02:24 -0700 Subject: [PATCH 102/699] Move LocProject.json to eng folder (#7412) --- Documentation/OneLocBuild.md | 3 ++- eng/common/generate-locproject.ps1 | 12 ++++++------ eng/common/templates/job/onelocbuild.yml | 4 ++-- 3 files changed, 10 insertions(+), 9 deletions(-) diff --git a/Documentation/OneLocBuild.md b/Documentation/OneLocBuild.md index bd65199df31..159fef2d010 100644 --- a/Documentation/OneLocBuild.md +++ b/Documentation/OneLocBuild.md @@ -101,7 +101,8 @@ LocProject.json file. The LocProject.json file is emitted in build logs and as a While it is **not the recommended path**, repos can instead opt to check in a static LocProject.json and have the script compare it against the generated one. If they differ, the script will break the build so that a dev can -update either the LocProject.json or the LocExclusions.json file accordingly. +update either the LocProject.json or the LocExclusions.json file accordingly. The LocProject.json should be checked +placed in the `eng/Localize` directory. Because the script can be run locally, devs can also do this validation prior to pushing their changes. diff --git a/eng/common/generate-locproject.ps1 b/eng/common/generate-locproject.ps1 index 24c00b5be98..de348a2e225 100644 --- a/eng/common/generate-locproject.ps1 +++ b/eng/common/generate-locproject.ps1 @@ -14,7 +14,7 @@ $ErrorActionPreference = "Stop" Import-Module -Name (Join-Path $PSScriptRoot 'native\CommonLibrary.psm1') -$exclusionsFilePath = "$SourcesDirectory\Localize\LocExclusions.json" +$exclusionsFilePath = "$SourcesDirectory\eng\Localize\LocExclusions.json" $exclusions = @{ Exclusions = @() } if (Test-Path -Path $exclusionsFilePath) { @@ -92,14 +92,14 @@ Write-Host "LocProject.json generated:`n`n$json`n`n" Pop-Location if (!$UseCheckedInLocProjectJson) { - New-Item "$SourcesDirectory\Localize\LocProject.json" -Force # Need this to make sure the Localize directory is created - Set-Content "$SourcesDirectory\Localize\LocProject.json" $json + New-Item "$SourcesDirectory\eng\Localize\LocProject.json" -Force # Need this to make sure the Localize directory is created + Set-Content "$SourcesDirectory\eng\Localize\LocProject.json" $json } else { - New-Item "$SourcesDirectory\Localize\LocProject-generated.json" -Force # Need this to make sure the Localize directory is created - Set-Content "$SourcesDirectory\Localize\LocProject-generated.json" $json + New-Item "$SourcesDirectory\eng\Localize\LocProject-generated.json" -Force # Need this to make sure the Localize directory is created + Set-Content "$SourcesDirectory\eng\Localize\LocProject-generated.json" $json - if ((Get-FileHash "$SourcesDirectory\Localize\LocProject-generated.json").Hash -ne (Get-FileHash "$SourcesDirectory\Localize\LocProject.json").Hash) { + if ((Get-FileHash "$SourcesDirectory\eng\Localize\LocProject-generated.json").Hash -ne (Get-FileHash "$SourcesDirectory\eng\Localize\LocProject.json").Hash) { Write-PipelineTelemetryError -Category "OneLocBuild" -Message "Existing LocProject.json differs from generated LocProject.json. Download LocProject-generated.json and compare them." exit 1 diff --git a/eng/common/templates/job/onelocbuild.yml b/eng/common/templates/job/onelocbuild.yml index 958db4064cf..2acdd5256dd 100644 --- a/eng/common/templates/job/onelocbuild.yml +++ b/eng/common/templates/job/onelocbuild.yml @@ -53,7 +53,7 @@ jobs: env: SYSTEM_ACCESSTOKEN: $(System.AccessToken) inputs: - locProj: Localize/LocProject.json + locProj: eng/Localize/LocProject.json outDir: $(Build.ArtifactStagingDirectory) lclSource: ${{ parameters.LclSource }} lclPackageId: ${{ parameters.LclPackageId }} @@ -79,7 +79,7 @@ jobs: - task: PublishBuildArtifacts@1 displayName: Publish LocProject.json inputs: - PathtoPublish: '$(Build.SourcesDirectory)/Localize/' + PathtoPublish: '$(Build.SourcesDirectory)/eng/Localize/' PublishLocation: Container ArtifactName: Loc condition: ${{ parameters.condition }} \ No newline at end of file From 4d173174f0632beb4801746939daeaffe3061c4d Mon Sep 17 00:00:00 2001 From: Matt Galbraith Date: Wed, 19 May 2021 15:28:37 -0700 Subject: [PATCH 103/699] Reduce parallelism of publishing upload clients (#7414) See writeup in https://github.com/dotnet/core-eng/issues/13098. Hosted agents are running < 50% of the RAM they had recently. I am endeavoring to get this back but it won't be fast if at all. --- .../src/PublishArtifactsInManifestBase.cs | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/Microsoft.DotNet.Build.Tasks.Feed/src/PublishArtifactsInManifestBase.cs b/src/Microsoft.DotNet.Build.Tasks.Feed/src/PublishArtifactsInManifestBase.cs index dfa8dd31a45..c336a196ed9 100644 --- a/src/Microsoft.DotNet.Build.Tasks.Feed/src/PublishArtifactsInManifestBase.cs +++ b/src/Microsoft.DotNet.Build.Tasks.Feed/src/PublishArtifactsInManifestBase.cs @@ -70,13 +70,17 @@ public abstract class PublishArtifactsInManifestBase : Microsoft.Build.Utilities [Required] public string NugetPath { get; set; } - private const int StreamingPublishingMaxClients = 20; - private const int NonStreamingPublishingMaxClients = 16; + private const int StreamingPublishingMaxClients = 16; + private const int NonStreamingPublishingMaxClients = 12; /// /// Maximum number of parallel uploads for the upload tasks. /// For streaming publishing, 20 is used as the most optimal. /// For non-streaming publishing, 16 is used (there are multiple sets of 16-parallel uploads) + /// + /// NOTE: Due to the desire to run on hosted agents and drastic memory changes in these VMs + /// (see https://github.com/dotnet/core-eng/issues/13098 for details) these numbers are + /// currently reduced below optimal to prevent OOM. /// public int MaxClients { get { return UseStreamingPublishing ? StreamingPublishingMaxClients : NonStreamingPublishingMaxClients; } } From 349d4a363ccb18d94f406f782c13ccf48df30805 Mon Sep 17 00:00:00 2001 From: Matt Galbraith Date: Thu, 20 May 2021 11:17:06 -0700 Subject: [PATCH 104/699] Add details about the failure notification feature (#7394) * Add details about the failure notification feature * PR feedbacks --- Documentation/BranchesChannelsAndSubscriptions.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Documentation/BranchesChannelsAndSubscriptions.md b/Documentation/BranchesChannelsAndSubscriptions.md index a8dcabfeca0..202cdd75bc9 100644 --- a/Documentation/BranchesChannelsAndSubscriptions.md +++ b/Documentation/BranchesChannelsAndSubscriptions.md @@ -51,6 +51,7 @@ Subscriptions have the following characteristics: - They have a desired quality metric for when the mapping should be applied (e.g. should tests have passed?) - They have a trigger for when the mapping should be applied. +- They may optionally include a list of GitHub logins (users who must be a public member of the Microsoft organization) or team aliases (for notification to work, this team must exist in the target repository's organization). When included in a non-batched subscription, failed policies for the pull requests produced will tag these users. As such, these users should be teams or users who represent subject-matter experts for the source repository of the subscription. A subscription can be visualized with the following pseudocode @@ -84,6 +85,9 @@ A subscription can be visualized with the following pseudocode if (subscription.isDesiredQuality(repo)) { mergeChanges() } + else if (subscription.hasFailureNotificationTags and subscription.isNotBatched) { + tagTheseUsersOnDependencyFlowPullRequest() + } } ``` From 96098ac4ee8303ff32bfa4014cbd2f3a18e026eb Mon Sep 17 00:00:00 2001 From: Matt Galbraith Date: Thu, 20 May 2021 17:09:11 -0700 Subject: [PATCH 105/699] Workaround for https://github.com/dotnet/arcade/issues/7371 (#7421) * Workaround for https://github.com/dotnet/arcade/issues/7371. Have azure-pipelines reporter parse XML for failures if ADO fails for any reason, return 0 if we actually passed. * PR feedbacks --- .../Sdk/tools/azure-pipelines/reporter/run.py | 132 +++++++++++++----- 1 file changed, 98 insertions(+), 34 deletions(-) diff --git a/src/Microsoft.DotNet.Helix/Sdk/tools/azure-pipelines/reporter/run.py b/src/Microsoft.DotNet.Helix/Sdk/tools/azure-pipelines/reporter/run.py index d596132a795..deaaa25136c 100644 --- a/src/Microsoft.DotNet.Helix/Sdk/tools/azure-pipelines/reporter/run.py +++ b/src/Microsoft.DotNet.Helix/Sdk/tools/azure-pipelines/reporter/run.py @@ -1,10 +1,11 @@ import os +import re import sys import traceback import logging from queue import Queue from threading import Thread, Lock -from typing import Tuple, Optional +from typing import Tuple, Optional, List from test_results_reader import read_results from helpers import batch, get_env @@ -13,6 +14,7 @@ workerFailedLock = Lock() workerFailed = False + class UploadWorker(Thread): def __init__(self, queue, idx, collection_uri, team_project, test_run_id, access_token): super(UploadWorker, self).__init__() @@ -50,7 +52,6 @@ def run(self): self.queue.task_done() - def process_args() -> Tuple[str, str, str, Optional[str]]: if len(sys.argv) < 4 or len(sys.argv) > 5: print("Usage:") @@ -70,52 +71,115 @@ def process_args() -> Tuple[str, str, str, Optional[str]]: return collection_uri, team_project, test_run_id, access_token +# This reporter will be phased out soon, but until then we need to deal with ADO outages and failures from client lib +# Currently only understands XUnit TestResults.xml (should not be around long enough to need more) +# See https://github.com/dotnet/arcade/issues/7371 for details +def check_passed_to_workaround_ado_api_failure(dirs_to_check: List[str]) -> bool: + print("Reporting has failed. Running mitigation for https://github.com/dotnet/arcade/issues/7371") + found_a_result = False + acceptable_xunit_file_names = [ + "testResults.xml", + "test-results.xml", + "test_results.xml", + "TestResults.xUnit.xml" + ] + + failure_count_found = 0 + + for dir_name in dirs_to_check: + print("Searching '{}' for test results files".format(dir_name)) + for root, dirs, files in os.walk(dir_name): + for file_name in files: + if file_name in acceptable_xunit_file_names: + file_path = os.path.join(root, file_name) + print('Found results file {} '.format(file_path)) + found_a_result = True + failure_count_found += get_failure_count(file_path) + + if found_a_result: + if failure_count_found == 0: + print("Reporter script has failed, but XUnit test results show no failures.") + return True + else: + print("Reporter script has failed, and we were able to find XUnit test results with failures ({})" + .format(str(failure_count_found))) + else: + print("Tried to mitigate but no results files found.") + return False + + +def get_failure_count(test_results_path: str): + fail_count = 0 + with open(test_results_path, encoding="utf-8") as result_file: + total_regex = re.compile(r'failed="(\d+)"') + for line in result_file: + if ' Date: Fri, 21 May 2021 09:48:59 +0200 Subject: [PATCH 106/699] Remove empty XHarness logs (#7418) Since we added few more log files which are sometimes empty (app's `.err.log` for example), let's not upload them to Helix --- .../Sdk/tools/xharness-runner/xharness-runner.apple.sh | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/Microsoft.DotNet.Helix/Sdk/tools/xharness-runner/xharness-runner.apple.sh b/src/Microsoft.DotNet.Helix/Sdk/tools/xharness-runner/xharness-runner.apple.sh index 58264b2ed74..8bbe9428f41 100644 --- a/src/Microsoft.DotNet.Helix/Sdk/tools/xharness-runner/xharness-runner.apple.sh +++ b/src/Microsoft.DotNet.Helix/Sdk/tools/xharness-runner/xharness-runner.apple.sh @@ -81,6 +81,10 @@ if [ -z "$targets" ]; then die "No targets were provided"; fi +if [ -z "$output_directory" ]; then + die "No output directory provided"; +fi + if [ -z "$xharness_cli_path" ]; then die "XHarness path wasn't provided"; fi @@ -156,6 +160,9 @@ fi # The simulator logs comming from the sudo-spawned Simulator.app are not readable by the helix uploader chmod 0644 "$output_directory"/*.log +# Remove empty files +find "$output_directory" -name "*.log" -maxdepth 1 -size 0 -print -delete + if [ "$command" == 'test' ]; then test_results=$(ls "$output_directory"/xunit-*.xml) From f02949cb7d1b68fbd643114ce306bc5a336036e9 Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Fri, 21 May 2021 14:31:39 +0000 Subject: [PATCH 107/699] [main] Update dependencies from mono/linker (#7417) [main] Update dependencies from mono/linker --- eng/Version.Details.xml | 4 ++-- eng/Versions.props | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index 02c3c1258f4..d57e6206e63 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -47,9 +47,9 @@ https://github.com/dotnet/roslyn dc0aff25e0ace6e6bf98269963612f9a67cdc897 - + https://github.com/mono/linker - 30f2498c2a3de1f7e236d5793f5f1aca6e5ba456 + aaf4880139edc005a56284a85fafcf8a58f418d8 https://github.com/dotnet/sourcelink diff --git a/eng/Versions.props b/eng/Versions.props index be9e08022f1..949640b8fb2 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -35,7 +35,7 @@ 2.1.1 2.1.0 3.10.0-4.21262.12 - 6.0.100-preview.5.21268.2 + 6.0.100-preview.5.21270.1 16.7.1 4.8.3 5.3.0.1 From 50f5645789f9119c906755cb1d2549acdeb0d0b7 Mon Sep 17 00:00:00 2001 From: Christopher Costa Date: Fri, 21 May 2021 10:48:25 -0700 Subject: [PATCH 108/699] Update PostBuildSigning.md (#7428) @adiaaida @markwilkie @mmitche --- Documentation/CorePackages/PostBuildSigning.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Documentation/CorePackages/PostBuildSigning.md b/Documentation/CorePackages/PostBuildSigning.md index d2dd4184efe..615e6b36145 100644 --- a/Documentation/CorePackages/PostBuildSigning.md +++ b/Documentation/CorePackages/PostBuildSigning.md @@ -37,6 +37,10 @@ The process works as follows: The crux of the SignTool algorithm is determining the certificate for a specific file. *Side note: Certificates are associated with a specific file name or file extension, though they cannot be associated with a specific path. For instance, 'foo/bar/baz.zip' is only dealt with as 'baz.zip'*. When dealing with a single repo, SignTool just interprets the signing info as applying to all files passed to it. A baz.zip found anywhere in the input file set is treated identically. When dealing with post build signing, it's possible that a foo.dll found in an sdk asset may actually come from the runtime, which may have indicated that *.dll get a different certificate. *So SignTool needs to track where foo.dll originally came from*. Did it come from the build of dotnet/runtime, or from dotnet/sdk? To do this, SignTool associates each input top level item to sign and the signing info for a build with a 'collision priority ID' This collision priority ID serves as a way to disambiguate the source signing information for a nested artifact. As each top-level asset is unpacked, the hash of each nested file is determined and looked up in a map. If the map already contains a file with the same name and hash, the collision priority ID's are compared. If the current one in the map is lower, the signing info for the existing file is used. Otherwise, the certificate information is recomputed based on the lower collision priority ID. +## Post Build Signing a single repo vs full product + +Post build signing is intended to sign a full set of product inputs. Given that some repos produce artifacts that repackage artifacts from other repos, the full graph of builds and dependent builds are required to *fully* sign artifacts. If you only have the artifacts from an individual repo, then post build signing will sign what it can, given the information available. If it is repackaging an MSI from another repo, and that repo's manifest / metadata are not available, then post build signing will sign the packaged artifact, but not its contents because it is unable to repackage an MSI without the light command package data from that dependent repo. The result will be that signing validation would fail and properly report unsigned files. It is up to the repo owner to investigate whether those unsigned files are valid, invalid, or should be ignored because they are the result of post build signing with partial input (false positives). + ## Additional Information More information about the file types that are signed and the certificates used to sign them can be found here: From da05407f9a21c9a3092b19dc4068432dd1b2445d Mon Sep 17 00:00:00 2001 From: David Wrighton Date: Fri, 21 May 2021 10:49:46 -0700 Subject: [PATCH 109/699] Place mibc data into RuntimeList.xml with AssetType PgoData (#7425) --- .../src/CreateFrameworkListFile.cs | 14 ++++++++++++-- .../targets/sharedfx.targets | 5 +++++ 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/src/Microsoft.DotNet.SharedFramework.Sdk/src/CreateFrameworkListFile.cs b/src/Microsoft.DotNet.SharedFramework.Sdk/src/CreateFrameworkListFile.cs index 90bd96b13af..984fee0faa3 100644 --- a/src/Microsoft.DotNet.SharedFramework.Sdk/src/CreateFrameworkListFile.cs +++ b/src/Microsoft.DotNet.SharedFramework.Sdk/src/CreateFrameworkListFile.cs @@ -88,12 +88,13 @@ public override bool Execute() FileVersion = FileUtilities.GetFileVersion(item.ItemSpec), IsNative = item.GetMetadata("IsNative") == "true", IsSymbolFile = item.GetMetadata("IsSymbolFile") == "true", + IsPgoData = item.GetMetadata("IsPgoData") == "true", IsResourceFile = item.ItemSpec .EndsWith(".resources.dll", StringComparison.OrdinalIgnoreCase) }) .Where(f => !f.IsSymbolFile && - (f.Filename.EndsWith(".dll", StringComparison.OrdinalIgnoreCase) || f.IsNative)) + (f.Filename.EndsWith(".dll", StringComparison.OrdinalIgnoreCase) || f.IsNative || f.IsPgoData)) // Remove duplicate files this task is given. .GroupBy(f => f.Item.ItemSpec) .Select(g => g.First()) @@ -111,6 +112,10 @@ public override bool Execute() { type = "Resources"; } + else if (f.IsPgoData) + { + type = "PgoData"; + } string path = Path.Combine(f.TargetPath, f.Filename).Replace('\\', '/'); @@ -137,7 +142,12 @@ public override bool Execute() new XAttribute("Culture", Path.GetFileName(Path.GetDirectoryName(path)))); } - if (f.AssemblyName != null) + if (f.IsPgoData) + { + // Pgo data is never carried with single file images + element.Add(new XAttribute("DropFromSingleFile", "true")); + } + else if (f.AssemblyName != null) { byte[] publicKeyToken = f.AssemblyName.GetPublicKeyToken(); string publicKeyTokenHex; diff --git a/src/Microsoft.DotNet.SharedFramework.Sdk/targets/sharedfx.targets b/src/Microsoft.DotNet.SharedFramework.Sdk/targets/sharedfx.targets index 860db8a71ff..ed8fe84415b 100644 --- a/src/Microsoft.DotNet.SharedFramework.Sdk/targets/sharedfx.targets +++ b/src/Microsoft.DotNet.SharedFramework.Sdk/targets/sharedfx.targets @@ -130,6 +130,10 @@ true + + true + PgoData + @@ -380,6 +384,7 @@ <_FrameworkListRootAttribute Include="FrameworkName" Value="$(SharedFrameworkName)" /> <_FrameworkListRootAttribute Include="Name" Value="$(SharedFrameworkFriendlyName)" /> <_FrameworkListTargetFilePrefix Include="ref/;runtimes/" /> + <_FrameworkListTargetFilePrefix Condition="'$(PlatformPackageType)' == 'RuntimePack'" Include="PgoData" /> Date: Fri, 21 May 2021 19:46:05 -0700 Subject: [PATCH 110/699] publish to symweb (#7432) --- .../src/model/PublishingConstants.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Microsoft.DotNet.Build.Tasks.Feed/src/model/PublishingConstants.cs b/src/Microsoft.DotNet.Build.Tasks.Feed/src/model/PublishingConstants.cs index 5d45c56e00f..bc4fafd1972 100644 --- a/src/Microsoft.DotNet.Build.Tasks.Feed/src/model/PublishingConstants.cs +++ b/src/Microsoft.DotNet.Build.Tasks.Feed/src/model/PublishingConstants.cs @@ -574,7 +574,7 @@ public enum BuildQuality FeedDotNetToolsInternalSymbols, FeedInternalForChecksums, FeedInternalForInstallers, - PublicAndInternalSymbolTargets, + InternalSymbolTargets, filenamesToExclude: FilenamesToExclude, flatten: false), From 91b13575f3e9b9a1c2053fcdb387fdd7fddd38ae Mon Sep 17 00:00:00 2001 From: Anton Firszov Date: Mon, 24 May 2021 14:21:37 +0200 Subject: [PATCH 111/699] Fix RemoteExecutor for VS testhost (#7426) * fix RemoteExecutor for VS testhost Co-authored-by: Igor Velikorossov Co-authored-by: Igor Velikorossov --- .../src/RemoteExecutor.cs | 30 ++++++++++++++++++- .../tests/RemoteExecutorTests.cs | 10 +++---- 2 files changed, 34 insertions(+), 6 deletions(-) diff --git a/src/Microsoft.DotNet.RemoteExecutor/src/RemoteExecutor.cs b/src/Microsoft.DotNet.RemoteExecutor/src/RemoteExecutor.cs index ae6ab0db014..d7cf364973f 100644 --- a/src/Microsoft.DotNet.RemoteExecutor/src/RemoteExecutor.cs +++ b/src/Microsoft.DotNet.RemoteExecutor/src/RemoteExecutor.cs @@ -10,6 +10,7 @@ using System.Runtime.InteropServices; using System.Threading.Tasks; using Xunit; +using IOPath = System.IO.Path; namespace Microsoft.DotNet.RemoteExecutor { @@ -51,17 +52,44 @@ static RemoteExecutor() return; } - HostRunnerName = System.IO.Path.GetFileName(processFileName); Path = typeof(RemoteExecutor).Assembly.Location; if (IsNetCore()) { HostRunner = processFileName; + + string hostName = RuntimeInformation.IsOSPlatform(OSPlatform.Windows) ? "dotnet.exe" : "dotnet"; + + // Partially addressing https://github.com/dotnet/arcade/issues/6371 + // We expect to run tests with dotnet. However in certain scenarios we may have a different apphost (e.g. Visual Studio testhost). + // Attempt to find and use dotnet. + if (!IOPath.GetFileName(HostRunner).Equals(hostName, StringComparison.OrdinalIgnoreCase)) + { + string runtimePath = IOPath.GetDirectoryName(typeof(object).Assembly.Location); + + // In case we are running the app via a runtime, dotnet.exe is located 3 folders above the runtime. Example: + // runtime -> C:\Program Files\dotnet\shared\Microsoft.NETCore.App\5.0.6\ + // dotnet.exe -> C:\Program Files\dotnet\shared\dotnet.exe + // This should also work on Unix and locally built runtime/testhost. + string directory = GetDirectoryName(GetDirectoryName(GetDirectoryName(runtimePath))); + if (directory != string.Empty) + { + string dotnetExe = IOPath.Combine(directory, hostName); + if (File.Exists(dotnetExe)) + { + HostRunner = dotnetExe; + } + } + } } else if (RuntimeInformation.FrameworkDescription.StartsWith(".NET Framework", StringComparison.OrdinalIgnoreCase)) { HostRunner = Path; } + + HostRunnerName = IOPath.GetFileName(HostRunner); + + static string GetDirectoryName(string path) => string.IsNullOrEmpty(path) ? string.Empty : IOPath.GetDirectoryName(path); } private static bool IsNetCore() => diff --git a/src/Microsoft.DotNet.RemoteExecutor/tests/RemoteExecutorTests.cs b/src/Microsoft.DotNet.RemoteExecutor/tests/RemoteExecutorTests.cs index cba294ebbfe..251577cc61d 100644 --- a/src/Microsoft.DotNet.RemoteExecutor/tests/RemoteExecutorTests.cs +++ b/src/Microsoft.DotNet.RemoteExecutor/tests/RemoteExecutorTests.cs @@ -10,7 +10,7 @@ namespace Microsoft.DotNet.RemoteExecutor.Tests { public class RemoteExecutorTests { - [Fact(Skip = "Remote executor is broken in VS test explorer")] + [Fact] public void AsyncAction_ThrowException() { Assert.Throws(() => @@ -22,7 +22,7 @@ public void AsyncAction_ThrowException() ); } - [Fact(Skip = "Remote executor is broken in VS test explorer")] + [Fact] public void AsyncAction() { RemoteExecutor.Invoke(async () => @@ -31,7 +31,7 @@ public void AsyncAction() }, new RemoteInvokeOptions { RollForward = "Major" }).Dispose(); } - [Fact(Skip = "Remote executor is broken in VS test explorer")] + [Fact] public void AsyncFunc_ThrowException() { Assert.Throws(() => @@ -44,7 +44,7 @@ public void AsyncFunc_ThrowException() ); } - [Fact(Skip = "Remote executor is broken in VS test explorer")] + [Fact] public void AsyncFunc_InvalidReturnCode() { Assert.Throws(() => @@ -56,7 +56,7 @@ public void AsyncFunc_InvalidReturnCode() ); } - [Fact(Skip = "Remote executor is broken in VS test explorer")] + [Fact] public void AsyncFunc_NoThrow_ValidReturnCode() { RemoteExecutor.Invoke(async () => From 97ed765fa1f4d4f98a405e831a7fd0b5481d2c6a Mon Sep 17 00:00:00 2001 From: Michael Simons Date: Mon, 24 May 2021 08:12:56 -0500 Subject: [PATCH 112/699] Add SB CI template option to skip publish validation (#7427) --- eng/common/templates/job/source-build.yml | 3 +++ eng/common/templates/steps/source-build.yml | 7 ++++++- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/eng/common/templates/job/source-build.yml b/eng/common/templates/job/source-build.yml index aad41464926..5023d36dcb3 100644 --- a/eng/common/templates/job/source-build.yml +++ b/eng/common/templates/job/source-build.yml @@ -15,6 +15,9 @@ parameters: # nonPortable: false # Enables non-portable mode. This means a more specific RID (e.g. fedora.32-x64 rather than # linux-x64), and compiling against distro-provided packages rather than portable ones. + # skipPublishValidation: false + # Disables publishing validation. By default, a check is performed to ensure no packages are + # published by source-build. # container: '' # A container to use. Runs in docker. # pool: {} diff --git a/eng/common/templates/steps/source-build.yml b/eng/common/templates/steps/source-build.yml index 65ee5992bf4..e20637ed6a1 100644 --- a/eng/common/templates/steps/source-build.yml +++ b/eng/common/templates/steps/source-build.yml @@ -34,9 +34,14 @@ steps: targetRidArgs='/p:TargetRid=${{ parameters.platform.targetRID }}' fi + publishArgs= + if [ '${{ parameters.platform.skipPublishValidation }}' != 'true' ]; then + publishArgs='--publish' + fi + ${{ coalesce(parameters.platform.buildScript, './build.sh') }} --ci \ --configuration $buildConfig \ - --restore --build --pack --publish -bl \ + --restore --build --pack $publishArgs -bl \ $officialBuildArgs \ $targetRidArgs \ /p:SourceBuildNonPortable=${{ parameters.platform.nonPortable }} \ From d80364d2227b4d9ca7bb0c8dcf9af7f2d08c2901 Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Mon, 24 May 2021 14:57:40 +0000 Subject: [PATCH 113/699] [main] Update dependencies from dotnet/xliff-tasks dotnet/arcade mono/linker dotnet/roslyn dotnet/xharness (#7434) [main] Update dependencies from dotnet/xliff-tasks dotnet/arcade mono/linker dotnet/roslyn dotnet/xharness --- eng/Version.Details.xml | 36 ++++++++++++++++++------------------ eng/Versions.props | 14 +++++++------- global.json | 4 ++-- 3 files changed, 27 insertions(+), 27 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index d57e6206e63..2db0f67be35 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -11,25 +11,25 @@ - + https://github.com/dotnet/arcade - 42de78a825b575a1ddeb73020a01fb8cd9311d09 + 50f5645789f9119c906755cb1d2549acdeb0d0b7 - + https://github.com/dotnet/arcade - 42de78a825b575a1ddeb73020a01fb8cd9311d09 + 50f5645789f9119c906755cb1d2549acdeb0d0b7 - + https://github.com/dotnet/arcade - 42de78a825b575a1ddeb73020a01fb8cd9311d09 + 50f5645789f9119c906755cb1d2549acdeb0d0b7 - + https://github.com/dotnet/arcade - 42de78a825b575a1ddeb73020a01fb8cd9311d09 + 50f5645789f9119c906755cb1d2549acdeb0d0b7 - + https://github.com/dotnet/arcade - 42de78a825b575a1ddeb73020a01fb8cd9311d09 + 50f5645789f9119c906755cb1d2549acdeb0d0b7 https://github.com/dotnet/arcade-services @@ -39,17 +39,17 @@ https://github.com/dotnet/arcade-services cac955fe259cb611f6a29d09209bd717deb69037 - + https://github.com/dotnet/xharness - 2eef520188beb49e31460d0a7dbe040294428ff1 + 98970876f4d21e6da5198a5c41de51ab1101089f - + https://github.com/dotnet/roslyn - dc0aff25e0ace6e6bf98269963612f9a67cdc897 + a408003c46b125f0c5fdc47472e5f0f5750f1e5d - + https://github.com/mono/linker - aaf4880139edc005a56284a85fafcf8a58f418d8 + 4526d388102db2dc481522d9dee92b8f32414b23 https://github.com/dotnet/sourcelink @@ -68,9 +68,9 @@ https://github.com/dotnet/symreader-converter c5ba7c88f92e2dde156c324a8c8edc04d9fa4fe0 - + https://github.com/dotnet/xliff-tasks - f4bfde77fb60daf52d8fec738d96d1d54e37dd88 + f5321d0c7b3f5e6103440fc017253bcdb50a0a26 diff --git a/eng/Versions.props b/eng/Versions.props index 949640b8fb2..5845a666731 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -34,8 +34,8 @@ 2.0.0 2.1.1 2.1.0 - 3.10.0-4.21262.12 - 6.0.100-preview.5.21270.1 + 3.10.0-4.21273.6 + 6.0.100-preview.5.21271.1 16.7.1 4.8.3 5.3.0.1 @@ -65,8 +65,8 @@ 2.4.1 2.0.3 2.4.1 - 6.0.0-beta.21264.2 - 6.0.0-beta.21264.2 + 6.0.0-beta.21271.3 + 6.0.0-beta.21271.3 1.22.0 1.1.2 2.0.0 @@ -77,10 +77,10 @@ 1.1.0-beta.20258.6 1.1.0-beta-21228-01 1.1.0-beta-21228-01 - 6.0.0-beta.21264.2 - 1.0.0-beta.21265.1 + 6.0.0-beta.21271.3 + 1.0.0-beta.21272.1 1.1.0-beta.21228.1 - 1.0.0-prerelease.21264.3 + 1.0.0-prerelease.21271.1 1.1.156402 1.1.152002 6.0.100-preview.5.21254.11 diff --git a/global.json b/global.json index 4af823ee231..174c2dcf03a 100644 --- a/global.json +++ b/global.json @@ -3,7 +3,7 @@ "dotnet": "6.0.100-preview.3.21202.5" }, "msbuild-sdks": { - "Microsoft.DotNet.Arcade.Sdk": "6.0.0-beta.21264.2", - "Microsoft.DotNet.Helix.Sdk": "6.0.0-beta.21264.2" + "Microsoft.DotNet.Arcade.Sdk": "6.0.0-beta.21271.3", + "Microsoft.DotNet.Helix.Sdk": "6.0.0-beta.21271.3" } } From fce95f2bb1a748e65ec6f8f0606c76e0c0d62c27 Mon Sep 17 00:00:00 2001 From: Matt Galbraith Date: Mon, 24 May 2021 13:31:02 -0700 Subject: [PATCH 114/699] Log a warning when anyone uses V2 publishing from Arcade 6.0+ (#7415) * Log a warning when anyone uses V2 publishing from Arcade 6.0+ (main as of this commit) --- azure-pipelines.yml | 30 ++++++++++--------- .../channels/generic-internal-channel.yml | 6 ++++ .../channels/generic-public-channel.yml | 6 ++++ 3 files changed, 28 insertions(+), 14 deletions(-) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 4d76282f96f..3c3b4de3868 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -130,20 +130,22 @@ stages: env: SYSTEM_ACCESSTOKEN: $(System.AccessToken) HelixAccessToken: '' - - powershell: eng\common\build.ps1 - -configuration $(_BuildConfig) - -prepareMachine - -ci - -restore - -test - -projects $(Build.SourcesDirectory)\tests\UnitTests.XHarness.Android.WindowsQueues.proj - /bl:$(Build.SourcesDirectory)\artifacts\log\$(_BuildConfig)\Helix.XHarness.Android.WindowsQueues.binlog - /p:RestoreUsingNuGetTargets=false - /p:XharnessTestARM64_V8A=true - displayName: XHarness Android Helix Testing (Windows) - env: - SYSTEM_ACCESSTOKEN: $(System.AccessToken) - HelixAccessToken: '' + # We don't have enough hardware to run these tests on Arcade PR given the Arcade XHarness SDK changes infrequently. (https://github.com/dotnet/core-eng/issues/12238) + # Until the above issue is resolved, if you are editing the Xharness SDK's Windows side, please exercise this manually. Contact dnceng for assistance. + # - powershell: eng\common\build.ps1 + # -configuration $(_BuildConfig) + # -prepareMachine + # -ci + # -restore + # -test + # -projects $(Build.SourcesDirectory)\tests\UnitTests.XHarness.Android.WindowsQueues.proj + # /bl:$(Build.SourcesDirectory)\artifacts\log\$(_BuildConfig)\Helix.XHarness.Android.WindowsQueues.binlog + # /p:RestoreUsingNuGetTargets=false + # /p:XharnessTestARM64_V8A=true + # displayName: XHarness Android Helix Testing (Windows) + # env: + # SYSTEM_ACCESSTOKEN: $(System.AccessToken) + # HelixAccessToken: '' - job: Linux timeoutInMinutes: 90 container: LinuxContainer diff --git a/eng/common/templates/post-build/channels/generic-internal-channel.yml b/eng/common/templates/post-build/channels/generic-internal-channel.yml index 58fa9a35b8c..8990dfc8c87 100644 --- a/eng/common/templates/post-build/channels/generic-internal-channel.yml +++ b/eng/common/templates/post-build/channels/generic-internal-channel.yml @@ -40,6 +40,9 @@ stages: pool: vmImage: 'windows-2019' steps: + - script: echo "##vso[task.logissue type=warning]Going forward, v2 Arcade publishing is no longer supported. Please read https://github.com/dotnet/arcade/blob/main/Documentation/CorePackages/Publishing.md for details, then contact dnceng if you have further questions." + displayName: Warn about v2 Arcade Publishing Usage + # This is necessary whenever we want to publish/restore to an AzDO private feed - task: NuGetAuthenticate@0 displayName: 'Authenticate to AzDO Feeds' @@ -110,6 +113,9 @@ stages: pool: vmImage: 'windows-2019' steps: + - script: echo "##vso[task.logissue type=warning]Going forward, v2 Arcade publishing is no longer supported. Please read https://github.com/dotnet/arcade/blob/main/Documentation/CorePackages/Publishing.md for details, then contact dnceng if you have further questions." + displayName: Warn about v2 Arcade Publishing Usage + - task: DownloadBuildArtifacts@0 displayName: Download Build Assets continueOnError: true diff --git a/eng/common/templates/post-build/channels/generic-public-channel.yml b/eng/common/templates/post-build/channels/generic-public-channel.yml index b50c0b3bdb8..3220c6a4f92 100644 --- a/eng/common/templates/post-build/channels/generic-public-channel.yml +++ b/eng/common/templates/post-build/channels/generic-public-channel.yml @@ -42,6 +42,9 @@ stages: pool: vmImage: 'windows-2019' steps: + - script: echo "##vso[task.logissue type=warning]Going forward, v2 Arcade publishing is no longer supported. Please read https://github.com/dotnet/arcade/blob/main/Documentation/CorePackages/Publishing.md for details, then contact dnceng if you have further questions." + displayName: Warn about v2 Arcade Publishing Usage + - task: DownloadBuildArtifacts@0 displayName: Download Build Assets continueOnError: true @@ -109,6 +112,9 @@ stages: pool: vmImage: 'windows-2019' steps: + - script: echo "##vso[task.logissue type=warning]Going forward, v2 Arcade publishing is no longer supported. Please read https://github.com/dotnet/arcade/blob/main/Documentation/CorePackages/Publishing.md for details, then contact dnceng if you have further questions." + displayName: Warn about v2 Arcade Publishing Usage + - task: DownloadBuildArtifacts@0 displayName: Download Build Assets continueOnError: true From 8a53ad43df84e818d020f89f395764f04c05ce68 Mon Sep 17 00:00:00 2001 From: Matt Thalman Date: Mon, 24 May 2021 16:34:20 -0500 Subject: [PATCH 115/699] Allow for additional GitHub issue state to be set (#7429) --- .../src/Clients/GitHubClient.cs | 20 +++++++++++++++++-- .../src/Helpers/CollectionExtensions.cs | 19 ++++++++++++++++++ .../src/Helpers/RepositoryHelper.cs | 15 ++++++++++++-- .../src/IssueManager.cs | 11 ++++++++-- 4 files changed, 59 insertions(+), 6 deletions(-) create mode 100644 src/Microsoft.DotNet.Git.IssueManager/src/Helpers/CollectionExtensions.cs diff --git a/src/Microsoft.DotNet.Git.IssueManager/src/Clients/GitHubClient.cs b/src/Microsoft.DotNet.Git.IssueManager/src/Clients/GitHubClient.cs index a51e587d759..f9b8f747591 100644 --- a/src/Microsoft.DotNet.Git.IssueManager/src/Clients/GitHubClient.cs +++ b/src/Microsoft.DotNet.Git.IssueManager/src/Clients/GitHubClient.cs @@ -3,9 +3,11 @@ using Octokit; using System; +using System.Collections.Generic; using System.Linq; using System.Text.RegularExpressions; using System.Threading.Tasks; +using Microsoft.DotNet.Git.IssueManager.Helpers; namespace Microsoft.DotNet.Git.IssueManager.Clients { @@ -38,7 +40,10 @@ public static async Task CreateNewIssueAsync( string repositoryUrl, string issueTitle, string issueDescription, - string personalAccessToken) + string personalAccessToken, + int? milestone = null, + IEnumerable labels = null, + IEnumerable assignees = null) { (string owner, string repoName) = ParseRepoUri(repositoryUrl); @@ -48,9 +53,20 @@ public static async Task CreateNewIssueAsync( NewIssue issueToBeCreated = new NewIssue(issueTitle) { - Body = issueDescription + Body = issueDescription, + Milestone = milestone }; + if (labels is not null) + { + issueToBeCreated.Labels.AddRange(labels); + } + + if (assignees is not null) + { + issueToBeCreated.Assignees.AddRange(assignees); + } + Issue createdIssue = await client.Issue.Create(owner, repoName, issueToBeCreated); return createdIssue.Number; diff --git a/src/Microsoft.DotNet.Git.IssueManager/src/Helpers/CollectionExtensions.cs b/src/Microsoft.DotNet.Git.IssueManager/src/Helpers/CollectionExtensions.cs new file mode 100644 index 00000000000..dfe6aa27d6e --- /dev/null +++ b/src/Microsoft.DotNet.Git.IssueManager/src/Helpers/CollectionExtensions.cs @@ -0,0 +1,19 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +using System.Collections.Generic; +using System.Collections.ObjectModel; + +namespace Microsoft.DotNet.Git.IssueManager.Helpers +{ + internal static class CollectionExtensions + { + public static void AddRange(this Collection collection, IEnumerable items) + { + foreach (T item in items) + { + collection.Add(item); + } + } + } +} diff --git a/src/Microsoft.DotNet.Git.IssueManager/src/Helpers/RepositoryHelper.cs b/src/Microsoft.DotNet.Git.IssueManager/src/Helpers/RepositoryHelper.cs index 9d9741efd83..d487396d3a8 100644 --- a/src/Microsoft.DotNet.Git.IssueManager/src/Helpers/RepositoryHelper.cs +++ b/src/Microsoft.DotNet.Git.IssueManager/src/Helpers/RepositoryHelper.cs @@ -3,6 +3,7 @@ using Microsoft.DotNet.Git.IssueManager.Clients; using System; +using System.Collections.Generic; using System.Threading.Tasks; namespace Microsoft.DotNet.Git.IssueManager.Helpers @@ -42,7 +43,10 @@ public static async Task CreateNewIssueAsync( string repositoryUrl, string issueTitle, string issueDescription, - string gitHubPersonalAccessToken) + string gitHubPersonalAccessToken, + int? milestone = null, + IEnumerable labels = null, + IEnumerable assignees = null) { if (Uri.TryCreate(repositoryUrl, UriKind.Absolute, out Uri parsedUri)) { @@ -53,7 +57,14 @@ public static async Task CreateNewIssueAsync( throw new ArgumentException("A GitHub personal access token is needed for this operation."); } - return await GitHubClient.CreateNewIssueAsync(repositoryUrl, issueTitle, issueDescription, gitHubPersonalAccessToken); + return await GitHubClient.CreateNewIssueAsync( + repositoryUrl, + issueTitle, + issueDescription, + gitHubPersonalAccessToken, + milestone, + labels, + assignees); } throw new NotImplementedException("Creating issues is not currently supported for an Azure DevOps repo."); diff --git a/src/Microsoft.DotNet.Git.IssueManager/src/IssueManager.cs b/src/Microsoft.DotNet.Git.IssueManager/src/IssueManager.cs index 510eab1797e..3eeac623e76 100644 --- a/src/Microsoft.DotNet.Git.IssueManager/src/IssueManager.cs +++ b/src/Microsoft.DotNet.Git.IssueManager/src/IssueManager.cs @@ -3,6 +3,7 @@ using Microsoft.DotNet.Git.IssueManager.Helpers; using System; +using System.Collections.Generic; using System.Threading.Tasks; namespace Microsoft.DotNet.Git.IssueManager @@ -53,13 +54,19 @@ public async Task GetCommitAuthorAsync(string repositoryUrl, string comm public async Task CreateNewIssueAsync( string repositoryUrl, string issueTitle, - string issueDescription) + string issueDescription, + int? milestone = null, + IEnumerable labels = null, + IEnumerable assignees = null) { return await RepositoryHelper.CreateNewIssueAsync( repositoryUrl, issueTitle, issueDescription, - GitHubPersonalAccessToken); + GitHubPersonalAccessToken, + milestone, + labels, + assignees); } } } From f22435d0f9cc367e75e1875d93ef980be1be6b79 Mon Sep 17 00:00:00 2001 From: Matt Galbraith Date: Mon, 24 May 2021 17:34:52 -0700 Subject: [PATCH 116/699] Fix Azure Devops Reporter : new change assumes Python 3.6+ (#7438) * It seems we don't test this codepath in default test runs, and the mentioned changes introduce a python 3.6-ism. The fix is simply to access the RegEx's groups via the older method in all cases. * Add expected-to-fail test to exercise failure reporting path * New approach; specify a failure test result with all the bad characters in it like we do with JUnit and XUnit --- .../azure-pipelines/reporter/formats/xunit.py | 2 +- tests/UnitTests.proj | 11 +++++++++++ tests/XUnit/testResults.xml | 14 ++++++++++++++ 3 files changed, 26 insertions(+), 1 deletion(-) create mode 100644 tests/XUnit/testResults.xml diff --git a/src/Microsoft.DotNet.Helix/Sdk/tools/azure-pipelines/reporter/formats/xunit.py b/src/Microsoft.DotNet.Helix/Sdk/tools/azure-pipelines/reporter/formats/xunit.py index 0a5d09da677..b46a11f1964 100644 --- a/src/Microsoft.DotNet.Helix/Sdk/tools/azure-pipelines/reporter/formats/xunit.py +++ b/src/Microsoft.DotNet.Helix/Sdk/tools/azure-pipelines/reporter/formats/xunit.py @@ -24,7 +24,7 @@ def bs(match): sym = grp[1] if sym == 'x': return chr(int(grp[2:], 16)) - return _unescape_char_map.get(match[0][1]) or sym + return _unescape_char_map.get(match.group(0)[1]) or sym return re.sub(r'\\x[0-9a-fA-F][0-9a-fA-F][0-9a-fA-F]?[0-9a-fA-F]?|\\[^x]', bs, value) class XUnitFormat(ResultFormat): diff --git a/tests/UnitTests.proj b/tests/UnitTests.proj index a5a1a709a07..e1f2e16a924 100644 --- a/tests/UnitTests.proj +++ b/tests/UnitTests.proj @@ -46,6 +46,17 @@ + + + echo 'done!' + $(MSBuildThisFileDirectory)XUnit + + + + + + + diff --git a/tests/XUnit/testResults.xml b/tests/XUnit/testResults.xml new file mode 100644 index 00000000000..960c5d56442 --- /dev/null +++ b/tests/XUnit/testResults.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + \ No newline at end of file From 0b031dd4199856b6ec8898be79ea58ee29648fff Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Tue, 25 May 2021 13:37:06 +0000 Subject: [PATCH 117/699] Update dependencies from https://github.com/dotnet/arcade build 20210524.6 (#7441) [main] Update dependencies from dotnet/arcade --- eng/Version.Details.xml | 20 ++++++++++---------- eng/Versions.props | 6 +++--- global.json | 4 ++-- 3 files changed, 15 insertions(+), 15 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index 2db0f67be35..76465c2267f 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -11,25 +11,25 @@ - + https://github.com/dotnet/arcade - 50f5645789f9119c906755cb1d2549acdeb0d0b7 + f22435d0f9cc367e75e1875d93ef980be1be6b79 - + https://github.com/dotnet/arcade - 50f5645789f9119c906755cb1d2549acdeb0d0b7 + f22435d0f9cc367e75e1875d93ef980be1be6b79 - + https://github.com/dotnet/arcade - 50f5645789f9119c906755cb1d2549acdeb0d0b7 + f22435d0f9cc367e75e1875d93ef980be1be6b79 - + https://github.com/dotnet/arcade - 50f5645789f9119c906755cb1d2549acdeb0d0b7 + f22435d0f9cc367e75e1875d93ef980be1be6b79 - + https://github.com/dotnet/arcade - 50f5645789f9119c906755cb1d2549acdeb0d0b7 + f22435d0f9cc367e75e1875d93ef980be1be6b79 https://github.com/dotnet/arcade-services diff --git a/eng/Versions.props b/eng/Versions.props index 5845a666731..e809a6d3fae 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -65,8 +65,8 @@ 2.4.1 2.0.3 2.4.1 - 6.0.0-beta.21271.3 - 6.0.0-beta.21271.3 + 6.0.0-beta.21274.6 + 6.0.0-beta.21274.6 1.22.0 1.1.2 2.0.0 @@ -77,7 +77,7 @@ 1.1.0-beta.20258.6 1.1.0-beta-21228-01 1.1.0-beta-21228-01 - 6.0.0-beta.21271.3 + 6.0.0-beta.21274.6 1.0.0-beta.21272.1 1.1.0-beta.21228.1 1.0.0-prerelease.21271.1 diff --git a/global.json b/global.json index 174c2dcf03a..7b31014b646 100644 --- a/global.json +++ b/global.json @@ -3,7 +3,7 @@ "dotnet": "6.0.100-preview.3.21202.5" }, "msbuild-sdks": { - "Microsoft.DotNet.Arcade.Sdk": "6.0.0-beta.21271.3", - "Microsoft.DotNet.Helix.Sdk": "6.0.0-beta.21271.3" + "Microsoft.DotNet.Arcade.Sdk": "6.0.0-beta.21274.6", + "Microsoft.DotNet.Helix.Sdk": "6.0.0-beta.21274.6" } } From db134249803789d6aea30ec562a581a585533aa2 Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Tue, 25 May 2021 14:32:49 +0000 Subject: [PATCH 118/699] Update dependencies from https://github.com/mono/linker build 20210524.3 (#7442) [main] Update dependencies from mono/linker --- eng/Version.Details.xml | 4 ++-- eng/Versions.props | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index 76465c2267f..410944f0a80 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -47,9 +47,9 @@ https://github.com/dotnet/roslyn a408003c46b125f0c5fdc47472e5f0f5750f1e5d - + https://github.com/mono/linker - 4526d388102db2dc481522d9dee92b8f32414b23 + fa7e6d38408a7b46c8f1bbfd80c5a917990cedd6 https://github.com/dotnet/sourcelink diff --git a/eng/Versions.props b/eng/Versions.props index e809a6d3fae..d5785ff2dc0 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -35,7 +35,7 @@ 2.1.1 2.1.0 3.10.0-4.21273.6 - 6.0.100-preview.5.21271.1 + 6.0.100-preview.5.21274.3 16.7.1 4.8.3 5.3.0.1 From d79f97dddaf4d56a483df4303ac6c3e60b498581 Mon Sep 17 00:00:00 2001 From: Medeni Baykal <433724+Haplois@users.noreply.github.com> Date: Tue, 25 May 2021 17:17:48 +0200 Subject: [PATCH 119/699] Fixed a minor issue in sdk-task.ps1 (#7440) --- eng/common/sdk-task.ps1 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/eng/common/sdk-task.ps1 b/eng/common/sdk-task.ps1 index f55c43c6f47..65f1d75f3d3 100644 --- a/eng/common/sdk-task.ps1 +++ b/eng/common/sdk-task.ps1 @@ -53,7 +53,7 @@ try { } if ($task -eq "") { - Write-PipelineTelemetryError -Category 'Build' -Message "Missing required parameter '-task '" -ForegroundColor Red + Write-PipelineTelemetryError -Category 'Build' -Message "Missing required parameter '-task '" Print-Usage ExitWithExitCode 1 } @@ -78,7 +78,7 @@ try { $taskProject = GetSdkTaskProject $task if (!(Test-Path $taskProject)) { - Write-PipelineTelemetryError -Category 'Build' -Message "Unknown task: $task" -ForegroundColor Red + Write-PipelineTelemetryError -Category 'Build' -Message "Unknown task: $task" ExitWithExitCode 1 } From 21cab0d894dbc02129c1be7d74a460992660e055 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C5=99emek=20Vysok=C3=BD?= Date: Tue, 25 May 2021 18:18:02 +0200 Subject: [PATCH 120/699] Reboot the OSX machine when cannot find Apple Simulator (#7416) --- .../xharness-helix-job.apple.sh | 19 +++++++----- .../xharness-runner/xharness-runner.apple.sh | 30 +++++++++---------- .../XHarness/XHarness.Simulator.AppleRun.proj | 2 +- .../XHarness.Simulator.AppleTest.proj | 2 +- .../XHarness.Simulator.CustomCommands.proj | 2 +- 5 files changed, 29 insertions(+), 26 deletions(-) diff --git a/src/Microsoft.DotNet.Helix/Sdk/tools/xharness-runner/xharness-helix-job.apple.sh b/src/Microsoft.DotNet.Helix/Sdk/tools/xharness-runner/xharness-helix-job.apple.sh index cb69815cee1..a6e535f629f 100644 --- a/src/Microsoft.DotNet.Helix/Sdk/tools/xharness-runner/xharness-helix-job.apple.sh +++ b/src/Microsoft.DotNet.Helix/Sdk/tools/xharness-runner/xharness-helix-job.apple.sh @@ -37,14 +37,17 @@ sudo launchctl asuser "$helix_runner_uid" sh ./xharness-runner.apple.sh \ exit_code=$? -# This handles an issue where Simulators get reeaally slow and they start failing to install apps -# The only solution is to reboot the machine, so we request a work item retry + MacOS reboot when this happens -# 123 - timeout in installation on Simulators -installation_timeout_exit_code=123 -if [ $exit_code -eq $installation_timeout_exit_code ]; then - # Since we run the payload script using launchctl, env vars are not set there and we have to do this part here - "$HELIX_PYTHONPATH" -c "from helix.workitemutil import request_infra_retry; request_infra_retry('Retrying because iOS Simulator application install hung')" - "$HELIX_PYTHONPATH" -c "from helix.workitemutil import request_reboot; request_reboot('Rebooting because iOS Simulator application install hung ')" +# For some of the issues such as Simulators get reeaally slow and they start failing to install apps, +# the only solution is to reboot the machine. +# We usually also ask the work item to be re-tried on a different machine +# Since we run the payload script using launchctl, env vars such as PYTHON_PATH are not set there and we have to do this part here +# We signal this by creating files +if [ -f './.retry' ]; then + "$HELIX_PYTHONPATH" -c "from helix.workitemutil import request_infra_retry; request_infra_retry('Retrying because XHarness ended with $exit_code')" +fi + +if [ -f './.reboot' ]; then + "$HELIX_PYTHONPATH" -c "from helix.workitemutil import request_reboot; request_reboot('Rebooting because XHarness ended with $exit_code')" fi exit $exit_code diff --git a/src/Microsoft.DotNet.Helix/Sdk/tools/xharness-runner/xharness-runner.apple.sh b/src/Microsoft.DotNet.Helix/Sdk/tools/xharness-runner/xharness-runner.apple.sh index 8bbe9428f41..a4f3f119607 100644 --- a/src/Microsoft.DotNet.Helix/Sdk/tools/xharness-runner/xharness-runner.apple.sh +++ b/src/Microsoft.DotNet.Helix/Sdk/tools/xharness-runner/xharness-runner.apple.sh @@ -145,16 +145,27 @@ alias xharness="dotnet exec $xharness_cli_path" source command.sh exit_code=$? +# Exit code values - https://github.com/dotnet/xharness/blob/main/src/Microsoft.DotNet.XHarness.Common/CLI/ExitCode.cs + # Kill the simulator just in case when we fail to launch the app # 80 - app crash if [ $exit_code -eq 80 ]; then sudo pkill -9 -f "$simulator_app" fi +# If we fail to find a simulator and we are not targeting a specific version (e.g. `ios-simulator_13.5`), it is probably an issue because Xcode should always have at least one runtime version inside +# 81 - simulator/device not found +if [ $exit_code -eq 81 ] && [[ "$targets" =~ "simulator" ]] && [[ ! "$targets" =~ "_" ]]; then + touch './.retry' + touch './.reboot' +fi + # If we have a launch failure AND we are on simulators, we need to signal that we want a reboot+retry # The script that is running this one will notice and request Helix to do it +# 83 - app launch failure if [ $exit_code -eq 83 ] && [[ "$targets" =~ "simulator" ]]; then - exit_code=123 + touch './.retry' + touch './.reboot' fi # The simulator logs comming from the sudo-spawned Simulator.app are not readable by the helix uploader @@ -163,20 +174,9 @@ chmod 0644 "$output_directory"/*.log # Remove empty files find "$output_directory" -name "*.log" -maxdepth 1 -size 0 -print -delete -if [ "$command" == 'test' ]; then - test_results=$(ls "$output_directory"/xunit-*.xml) - - if [ ! -f "$test_results" ]; then - echo "Failed to find xUnit tests results in the output directory. Existing files:" - ls -la "$output_directory" - - if [ $exit_code -eq 0 ]; then - exit_code=5 - fi - - exit $exit_code - fi - +# Rename test result XML so that AzDO reporter recognizes it +test_results=$(ls "$output_directory"/xunit-*.xml) +if [ -f "$test_results" ]; then echo "Found test results in $output_directory/$test_results. Renaming to testResults.xml to prepare for Helix upload" # Prepare test results for Helix to pick up diff --git a/tests/XHarness/XHarness.Simulator.AppleRun.proj b/tests/XHarness/XHarness.Simulator.AppleRun.proj index f7a836eb9b3..ae243e11185 100644 --- a/tests/XHarness/XHarness.Simulator.AppleRun.proj +++ b/tests/XHarness/XHarness.Simulator.AppleRun.proj @@ -21,7 +21,7 @@ ios-simulator-64 - 00:10:00 + 00:12:00 00:08:00 00:05:00 false diff --git a/tests/XHarness/XHarness.Simulator.AppleTest.proj b/tests/XHarness/XHarness.Simulator.AppleTest.proj index c176f023bfe..63e90f432f0 100644 --- a/tests/XHarness/XHarness.Simulator.AppleTest.proj +++ b/tests/XHarness/XHarness.Simulator.AppleTest.proj @@ -22,7 +22,7 @@ ios-simulator-64 00:05:00 - 00:12:00 + 00:15:00 00:06:00 diff --git a/tests/XHarness/XHarness.Simulator.CustomCommands.proj b/tests/XHarness/XHarness.Simulator.CustomCommands.proj index 372ac9b06cb..acf82c3e966 100644 --- a/tests/XHarness/XHarness.Simulator.CustomCommands.proj +++ b/tests/XHarness/XHarness.Simulator.CustomCommands.proj @@ -21,7 +21,7 @@ ios-simulator-64 - 00:12:00 + 00:15:00 00:05:00 00:05:00 From 579b548c545da1a9747bc5df599f38fe86d66251 Mon Sep 17 00:00:00 2001 From: Matt Galbraith Date: Tue, 25 May 2021 10:15:29 -0700 Subject: [PATCH 121/699] Temporarily move publishing to Helix build agents (#7404) As seen in https://github.com/dotnet/core-eng/issues/13098 and the linked IcM ticket, we seem to have moved from WIN- to fv- machines and started hitting memory issues. --- eng/publishing/v3/publish-assets.yml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/eng/publishing/v3/publish-assets.yml b/eng/publishing/v3/publish-assets.yml index 17c85fba28b..e31f4470b45 100644 --- a/eng/publishing/v3/publish-assets.yml +++ b/eng/publishing/v3/publish-assets.yml @@ -24,8 +24,11 @@ jobs: value: $[ dependencies.setupMaestroVars.outputs['setReleaseVars.AzDOBuildId'] ] - name: AzDOAccount value: $[ dependencies.setupMaestroVars.outputs['setReleaseVars.AzDOBuildAccount'] ] + # Using non-hosted build agents to (hopefully temporarily) work around OOMs + # See https://github.com/dotnet/core-eng/issues/13098 for context pool: - vmImage: 'windows-2019' + name: NetCoreInternal-Pool + queue: BuildPool.Server.Amd64.VS2019 steps: - task: DownloadBuildArtifacts@0 displayName: Download Build Assets From 75844fd6347644e74478086d899be0050b55e043 Mon Sep 17 00:00:00 2001 From: Matt Galbraith Date: Tue, 25 May 2021 18:10:24 -0700 Subject: [PATCH 122/699] Move publishing workaround to only https://dev.azure.com/dnceng/ (#7446) * Move publishing workaround to only https://dev.azure.com/dnceng/ * Try different syntax --- eng/publishing/v3/publish-assets.yml | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/eng/publishing/v3/publish-assets.yml b/eng/publishing/v3/publish-assets.yml index e31f4470b45..bdb0fe9e462 100644 --- a/eng/publishing/v3/publish-assets.yml +++ b/eng/publishing/v3/publish-assets.yml @@ -24,11 +24,16 @@ jobs: value: $[ dependencies.setupMaestroVars.outputs['setReleaseVars.AzDOBuildId'] ] - name: AzDOAccount value: $[ dependencies.setupMaestroVars.outputs['setReleaseVars.AzDOBuildAccount'] ] + # Using non-hosted build agents to (hopefully temporarily) work around OOMs # See https://github.com/dotnet/core-eng/issues/13098 for context - pool: - name: NetCoreInternal-Pool - queue: BuildPool.Server.Amd64.VS2019 + ${{ if eq(variables['System.TeamFoundationCollectionUri'], 'https://dev.azure.com/dnceng/') }}: + pool: + name: NetCoreInternal-Pool + queue: BuildPool.Server.Amd64.VS2019 + ${{ if ne(variables['System.TeamFoundationCollectionUri'], 'https://dev.azure.com/dnceng/') }}: + pool: + vmImage: 'windows-2019' steps: - task: DownloadBuildArtifacts@0 displayName: Download Build Assets From 403a19dde2bafd895ca979554d3b8fcc1362875a Mon Sep 17 00:00:00 2001 From: Anton Firszov Date: Wed, 26 May 2021 14:53:15 +0200 Subject: [PATCH 123/699] Target netcoreapp2.1 in RemoteExecutor (#7443) Fixes #7435 --- .../src/Microsoft.DotNet.RemoteExecutor.csproj | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/Microsoft.DotNet.RemoteExecutor/src/Microsoft.DotNet.RemoteExecutor.csproj b/src/Microsoft.DotNet.RemoteExecutor/src/Microsoft.DotNet.RemoteExecutor.csproj index 4665c0973dd..24b5c5f1caf 100644 --- a/src/Microsoft.DotNet.RemoteExecutor/src/Microsoft.DotNet.RemoteExecutor.csproj +++ b/src/Microsoft.DotNet.RemoteExecutor/src/Microsoft.DotNet.RemoteExecutor.csproj @@ -3,7 +3,8 @@ Exe - netcoreapp3.1;net461 + + netcoreapp2.1;net461 This package provides support for running tests out-of-process. true true From aaa9816a6c724e2d0d41c1e28b496a736909dbc6 Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Wed, 26 May 2021 13:21:34 +0000 Subject: [PATCH 124/699] Update dependencies from https://github.com/dotnet/xliff-tasks build 20210525.1 (#7447) [main] Update dependencies from dotnet/xliff-tasks --- eng/Version.Details.xml | 4 ++-- eng/Versions.props | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index 410944f0a80..4cf1f8e6e9a 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -68,9 +68,9 @@ https://github.com/dotnet/symreader-converter c5ba7c88f92e2dde156c324a8c8edc04d9fa4fe0 - + https://github.com/dotnet/xliff-tasks - f5321d0c7b3f5e6103440fc017253bcdb50a0a26 + 2f7e6e21fab95c1eab90142212e9af1ebf3211eb diff --git a/eng/Versions.props b/eng/Versions.props index d5785ff2dc0..4320bbd0623 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -78,7 +78,7 @@ 1.1.0-beta-21228-01 1.1.0-beta-21228-01 6.0.0-beta.21274.6 - 1.0.0-beta.21272.1 + 1.0.0-beta.21275.1 1.1.0-beta.21228.1 1.0.0-prerelease.21271.1 1.1.156402 From 06bd9d91c631b2ed734a9c7e58ae1c71dadf1f6b Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Wed, 26 May 2021 14:17:24 +0000 Subject: [PATCH 125/699] [main] Update dependencies from dotnet/arcade mono/linker (#7448) [main] Update dependencies from dotnet/arcade mono/linker --- eng/Version.Details.xml | 24 ++++++++++++------------ eng/Versions.props | 8 ++++---- global.json | 4 ++-- 3 files changed, 18 insertions(+), 18 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index 4cf1f8e6e9a..810c4cc07b3 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -11,25 +11,25 @@ - + https://github.com/dotnet/arcade - f22435d0f9cc367e75e1875d93ef980be1be6b79 + 579b548c545da1a9747bc5df599f38fe86d66251 - + https://github.com/dotnet/arcade - f22435d0f9cc367e75e1875d93ef980be1be6b79 + 579b548c545da1a9747bc5df599f38fe86d66251 - + https://github.com/dotnet/arcade - f22435d0f9cc367e75e1875d93ef980be1be6b79 + 579b548c545da1a9747bc5df599f38fe86d66251 - + https://github.com/dotnet/arcade - f22435d0f9cc367e75e1875d93ef980be1be6b79 + 579b548c545da1a9747bc5df599f38fe86d66251 - + https://github.com/dotnet/arcade - f22435d0f9cc367e75e1875d93ef980be1be6b79 + 579b548c545da1a9747bc5df599f38fe86d66251 https://github.com/dotnet/arcade-services @@ -47,9 +47,9 @@ https://github.com/dotnet/roslyn a408003c46b125f0c5fdc47472e5f0f5750f1e5d - + https://github.com/mono/linker - fa7e6d38408a7b46c8f1bbfd80c5a917990cedd6 + 620b243420f5218be7002fdc04223c05854c60d6 https://github.com/dotnet/sourcelink diff --git a/eng/Versions.props b/eng/Versions.props index 4320bbd0623..dfb3c9c1040 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -35,7 +35,7 @@ 2.1.1 2.1.0 3.10.0-4.21273.6 - 6.0.100-preview.5.21274.3 + 6.0.100-preview.6.21275.1 16.7.1 4.8.3 5.3.0.1 @@ -65,8 +65,8 @@ 2.4.1 2.0.3 2.4.1 - 6.0.0-beta.21274.6 - 6.0.0-beta.21274.6 + 6.0.0-beta.21275.5 + 6.0.0-beta.21275.5 1.22.0 1.1.2 2.0.0 @@ -77,7 +77,7 @@ 1.1.0-beta.20258.6 1.1.0-beta-21228-01 1.1.0-beta-21228-01 - 6.0.0-beta.21274.6 + 6.0.0-beta.21275.5 1.0.0-beta.21275.1 1.1.0-beta.21228.1 1.0.0-prerelease.21271.1 diff --git a/global.json b/global.json index 7b31014b646..c4be1626535 100644 --- a/global.json +++ b/global.json @@ -3,7 +3,7 @@ "dotnet": "6.0.100-preview.3.21202.5" }, "msbuild-sdks": { - "Microsoft.DotNet.Arcade.Sdk": "6.0.0-beta.21274.6", - "Microsoft.DotNet.Helix.Sdk": "6.0.0-beta.21274.6" + "Microsoft.DotNet.Arcade.Sdk": "6.0.0-beta.21275.5", + "Microsoft.DotNet.Helix.Sdk": "6.0.0-beta.21275.5" } } From cb7c3c00ef355302906526c1762158dfd82d460e Mon Sep 17 00:00:00 2001 From: Ricardo Arenas Date: Wed, 26 May 2021 09:07:47 -0700 Subject: [PATCH 126/699] add publishing configuration for the 5.0.4xx channels (#7450) --- .../src/model/PublishingConstants.cs | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/src/Microsoft.DotNet.Build.Tasks.Feed/src/model/PublishingConstants.cs b/src/Microsoft.DotNet.Build.Tasks.Feed/src/model/PublishingConstants.cs index bc4fafd1972..b8ab1b7c0c0 100644 --- a/src/Microsoft.DotNet.Build.Tasks.Feed/src/model/PublishingConstants.cs +++ b/src/Microsoft.DotNet.Build.Tasks.Feed/src/model/PublishingConstants.cs @@ -451,6 +451,34 @@ public enum BuildQuality InternalSymbolTargets, filenamesToExclude: FilenamesToExclude), + // ".NET 5 SDK 5.0.4xx" (public), + new TargetChannelConfig( + 1985, + false, + PublishingInfraVersion.Next, + akaMSChannelName: "5.0.4xx", + FeedDotNet5Shipping, + FeedDotNet5Transport, + FeedDotNet5Symbols, + FeedForChecksums, + FeedForInstallers, + PublicAndInternalSymbolTargets, + filenamesToExclude: FilenamesToExclude), + + // ".NET 5 SDK 5.0.4xx Internal" (internal), + new TargetChannelConfig( + 1986, + true, + PublishingInfraVersion.Next, + akaMSChannelName: "internal/5.0.4xx", + FeedDotNet5InternalShipping, + FeedDotNet5InternalTransport, + FeedDotNet5InternalSymbols, + FeedInternalForChecksums, + FeedInternalForInstallers, + InternalSymbolTargets, + filenamesToExclude: FilenamesToExclude), + // ".NET Eng - Latest", new TargetChannelConfig( 2, From c2a8af3f309fc27402fa9c18bac6df757a9c41ed Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Wed, 26 May 2021 19:27:17 +0000 Subject: [PATCH 127/699] Update dependencies from https://github.com/dotnet/arcade build 20210526.4 (#7451) [main] Update dependencies from dotnet/arcade --- eng/Version.Details.xml | 20 ++++++++++---------- eng/Versions.props | 6 +++--- global.json | 4 ++-- 3 files changed, 15 insertions(+), 15 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index 810c4cc07b3..4b909f8447b 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -11,25 +11,25 @@ - + https://github.com/dotnet/arcade - 579b548c545da1a9747bc5df599f38fe86d66251 + cb7c3c00ef355302906526c1762158dfd82d460e - + https://github.com/dotnet/arcade - 579b548c545da1a9747bc5df599f38fe86d66251 + cb7c3c00ef355302906526c1762158dfd82d460e - + https://github.com/dotnet/arcade - 579b548c545da1a9747bc5df599f38fe86d66251 + cb7c3c00ef355302906526c1762158dfd82d460e - + https://github.com/dotnet/arcade - 579b548c545da1a9747bc5df599f38fe86d66251 + cb7c3c00ef355302906526c1762158dfd82d460e - + https://github.com/dotnet/arcade - 579b548c545da1a9747bc5df599f38fe86d66251 + cb7c3c00ef355302906526c1762158dfd82d460e https://github.com/dotnet/arcade-services diff --git a/eng/Versions.props b/eng/Versions.props index dfb3c9c1040..c3bd5081e77 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -65,8 +65,8 @@ 2.4.1 2.0.3 2.4.1 - 6.0.0-beta.21275.5 - 6.0.0-beta.21275.5 + 6.0.0-beta.21276.4 + 6.0.0-beta.21276.4 1.22.0 1.1.2 2.0.0 @@ -77,7 +77,7 @@ 1.1.0-beta.20258.6 1.1.0-beta-21228-01 1.1.0-beta-21228-01 - 6.0.0-beta.21275.5 + 6.0.0-beta.21276.4 1.0.0-beta.21275.1 1.1.0-beta.21228.1 1.0.0-prerelease.21271.1 diff --git a/global.json b/global.json index c4be1626535..650a05eebc4 100644 --- a/global.json +++ b/global.json @@ -3,7 +3,7 @@ "dotnet": "6.0.100-preview.3.21202.5" }, "msbuild-sdks": { - "Microsoft.DotNet.Arcade.Sdk": "6.0.0-beta.21275.5", - "Microsoft.DotNet.Helix.Sdk": "6.0.0-beta.21275.5" + "Microsoft.DotNet.Arcade.Sdk": "6.0.0-beta.21276.4", + "Microsoft.DotNet.Helix.Sdk": "6.0.0-beta.21276.4" } } From c3e0e4070f6cd3873b775e3f4136e29f4d66cb49 Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Thu, 27 May 2021 14:32:06 +0000 Subject: [PATCH 128/699] [main] Update dependencies from dotnet/xliff-tasks dotnet/arcade mono/linker (#7452) [main] Update dependencies from dotnet/xliff-tasks dotnet/arcade mono/linker --- eng/Version.Details.xml | 28 ++++++++++++++-------------- eng/Versions.props | 10 +++++----- global.json | 4 ++-- 3 files changed, 21 insertions(+), 21 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index 4b909f8447b..4aceaf8973e 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -11,25 +11,25 @@ - + https://github.com/dotnet/arcade - cb7c3c00ef355302906526c1762158dfd82d460e + c2a8af3f309fc27402fa9c18bac6df757a9c41ed - + https://github.com/dotnet/arcade - cb7c3c00ef355302906526c1762158dfd82d460e + c2a8af3f309fc27402fa9c18bac6df757a9c41ed - + https://github.com/dotnet/arcade - cb7c3c00ef355302906526c1762158dfd82d460e + c2a8af3f309fc27402fa9c18bac6df757a9c41ed - + https://github.com/dotnet/arcade - cb7c3c00ef355302906526c1762158dfd82d460e + c2a8af3f309fc27402fa9c18bac6df757a9c41ed - + https://github.com/dotnet/arcade - cb7c3c00ef355302906526c1762158dfd82d460e + c2a8af3f309fc27402fa9c18bac6df757a9c41ed https://github.com/dotnet/arcade-services @@ -47,9 +47,9 @@ https://github.com/dotnet/roslyn a408003c46b125f0c5fdc47472e5f0f5750f1e5d - + https://github.com/mono/linker - 620b243420f5218be7002fdc04223c05854c60d6 + 2a55a297d7d916ef9cd7b132b267529d8e44a883 https://github.com/dotnet/sourcelink @@ -68,9 +68,9 @@ https://github.com/dotnet/symreader-converter c5ba7c88f92e2dde156c324a8c8edc04d9fa4fe0 - + https://github.com/dotnet/xliff-tasks - 2f7e6e21fab95c1eab90142212e9af1ebf3211eb + 46d44d82440342f3bd00e6502d586ae4504507c2 diff --git a/eng/Versions.props b/eng/Versions.props index c3bd5081e77..66797de45d9 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -35,7 +35,7 @@ 2.1.1 2.1.0 3.10.0-4.21273.6 - 6.0.100-preview.6.21275.1 + 6.0.100-preview.6.21276.2 16.7.1 4.8.3 5.3.0.1 @@ -65,8 +65,8 @@ 2.4.1 2.0.3 2.4.1 - 6.0.0-beta.21276.4 - 6.0.0-beta.21276.4 + 6.0.0-beta.21276.5 + 6.0.0-beta.21276.5 1.22.0 1.1.2 2.0.0 @@ -77,8 +77,8 @@ 1.1.0-beta.20258.6 1.1.0-beta-21228-01 1.1.0-beta-21228-01 - 6.0.0-beta.21276.4 - 1.0.0-beta.21275.1 + 6.0.0-beta.21276.5 + 1.0.0-beta.21276.1 1.1.0-beta.21228.1 1.0.0-prerelease.21271.1 1.1.156402 diff --git a/global.json b/global.json index 650a05eebc4..e1c907cbafb 100644 --- a/global.json +++ b/global.json @@ -3,7 +3,7 @@ "dotnet": "6.0.100-preview.3.21202.5" }, "msbuild-sdks": { - "Microsoft.DotNet.Arcade.Sdk": "6.0.0-beta.21276.4", - "Microsoft.DotNet.Helix.Sdk": "6.0.0-beta.21276.4" + "Microsoft.DotNet.Arcade.Sdk": "6.0.0-beta.21276.5", + "Microsoft.DotNet.Helix.Sdk": "6.0.0-beta.21276.5" } } From b5ca0997b26992dcc4e55ec3d87d71000be295ce Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Fri, 28 May 2021 13:56:19 +0000 Subject: [PATCH 129/699] [main] Update dependencies from dotnet/xliff-tasks dotnet/arcade mono/linker (#7454) [main] Update dependencies from dotnet/xliff-tasks dotnet/arcade mono/linker --- eng/Version.Details.xml | 28 ++++++++++++++-------------- eng/Versions.props | 10 +++++----- global.json | 4 ++-- 3 files changed, 21 insertions(+), 21 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index 4aceaf8973e..ce650dda091 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -11,25 +11,25 @@ - + https://github.com/dotnet/arcade - c2a8af3f309fc27402fa9c18bac6df757a9c41ed + c3e0e4070f6cd3873b775e3f4136e29f4d66cb49 - + https://github.com/dotnet/arcade - c2a8af3f309fc27402fa9c18bac6df757a9c41ed + c3e0e4070f6cd3873b775e3f4136e29f4d66cb49 - + https://github.com/dotnet/arcade - c2a8af3f309fc27402fa9c18bac6df757a9c41ed + c3e0e4070f6cd3873b775e3f4136e29f4d66cb49 - + https://github.com/dotnet/arcade - c2a8af3f309fc27402fa9c18bac6df757a9c41ed + c3e0e4070f6cd3873b775e3f4136e29f4d66cb49 - + https://github.com/dotnet/arcade - c2a8af3f309fc27402fa9c18bac6df757a9c41ed + c3e0e4070f6cd3873b775e3f4136e29f4d66cb49 https://github.com/dotnet/arcade-services @@ -47,9 +47,9 @@ https://github.com/dotnet/roslyn a408003c46b125f0c5fdc47472e5f0f5750f1e5d - + https://github.com/mono/linker - 2a55a297d7d916ef9cd7b132b267529d8e44a883 + 50901f9ba5c8672c2758577a61f45fea3cc6cd76 https://github.com/dotnet/sourcelink @@ -68,9 +68,9 @@ https://github.com/dotnet/symreader-converter c5ba7c88f92e2dde156c324a8c8edc04d9fa4fe0 - + https://github.com/dotnet/xliff-tasks - 46d44d82440342f3bd00e6502d586ae4504507c2 + 426214b8acf4ce48093e776d1a8ad35db8e72af2 diff --git a/eng/Versions.props b/eng/Versions.props index 66797de45d9..52274c92638 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -35,7 +35,7 @@ 2.1.1 2.1.0 3.10.0-4.21273.6 - 6.0.100-preview.6.21276.2 + 6.0.100-preview.6.21277.2 16.7.1 4.8.3 5.3.0.1 @@ -65,8 +65,8 @@ 2.4.1 2.0.3 2.4.1 - 6.0.0-beta.21276.5 - 6.0.0-beta.21276.5 + 6.0.0-beta.21277.1 + 6.0.0-beta.21277.1 1.22.0 1.1.2 2.0.0 @@ -77,8 +77,8 @@ 1.1.0-beta.20258.6 1.1.0-beta-21228-01 1.1.0-beta-21228-01 - 6.0.0-beta.21276.5 - 1.0.0-beta.21276.1 + 6.0.0-beta.21277.1 + 1.0.0-beta.21277.1 1.1.0-beta.21228.1 1.0.0-prerelease.21271.1 1.1.156402 diff --git a/global.json b/global.json index e1c907cbafb..7e3a90e2fbe 100644 --- a/global.json +++ b/global.json @@ -3,7 +3,7 @@ "dotnet": "6.0.100-preview.3.21202.5" }, "msbuild-sdks": { - "Microsoft.DotNet.Arcade.Sdk": "6.0.0-beta.21276.5", - "Microsoft.DotNet.Helix.Sdk": "6.0.0-beta.21276.5" + "Microsoft.DotNet.Arcade.Sdk": "6.0.0-beta.21277.1", + "Microsoft.DotNet.Helix.Sdk": "6.0.0-beta.21277.1" } } From 0289da402091efda0e58a6dce5dc722201d6304e Mon Sep 17 00:00:00 2001 From: Michael Simons Date: Fri, 28 May 2021 10:08:31 -0500 Subject: [PATCH 130/699] Default UsingToolVisualStudioIbcTraining in ArPow builds (#7453) --- src/Microsoft.DotNet.Arcade.Sdk/tools/DefaultVersions.props | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Microsoft.DotNet.Arcade.Sdk/tools/DefaultVersions.props b/src/Microsoft.DotNet.Arcade.Sdk/tools/DefaultVersions.props index f5defdb54ef..1dc0c2e0db8 100644 --- a/src/Microsoft.DotNet.Arcade.Sdk/tools/DefaultVersions.props +++ b/src/Microsoft.DotNet.Arcade.Sdk/tools/DefaultVersions.props @@ -66,7 +66,7 @@ - + false false false From c7d6bd607715f334cda90e01967bb0c02dee09be Mon Sep 17 00:00:00 2001 From: Viktor Hofer Date: Mon, 31 May 2021 21:10:17 +0200 Subject: [PATCH 131/699] Support browser wasm in compatible pkg tfms task (#7460) Becaues of the default arch value of "-x64", for browser this resolves to "browser-x64" which isn't a supported RID. Defaulting to wasm for browser as a workaround. --- .../GetCompatiblePackageTargetFrameworks.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Microsoft.DotNet.PackageTesting/GetCompatiblePackageTargetFrameworks.cs b/src/Microsoft.DotNet.PackageTesting/GetCompatiblePackageTargetFrameworks.cs index 95c7a89efcf..fa10507cc1b 100644 --- a/src/Microsoft.DotNet.PackageTesting/GetCompatiblePackageTargetFrameworks.cs +++ b/src/Microsoft.DotNet.PackageTesting/GetCompatiblePackageTargetFrameworks.cs @@ -140,7 +140,7 @@ public string GetRidsFromPackage(Package package) if (item.AssetType == AssetType.RuntimeAsset) { string testRid = item.Rid; - string testArch = "-x64"; + string testArch = testRid == "browser" ? "-wasm" : "-x64"; if (testRid == "unix") { if (!rids.Contains("linux" + testArch)) From 9945dc4ebbb511b027df34cb5ab579f6395d1dda Mon Sep 17 00:00:00 2001 From: Matt Galbraith Date: Wed, 2 Jun 2021 09:56:49 -0700 Subject: [PATCH 132/699] Work around https://github.com/dotnet/arcade/issues/7371 (#7457) - Don't have a threading contention for stdout by only using stdout in the exception case; "starting..." adds minimal value, one can assume if the script is called it starts. - sleep() the main thread 5s before accessing stdout in case the exception case wants to happen - Remove most non-error-path logging since it adds little value and multiple threads competing for stdout can cause un-catch-able failure. --- .../Sdk/tools/azure-pipelines/reporter/run.py | 15 ++++----------- 1 file changed, 4 insertions(+), 11 deletions(-) diff --git a/src/Microsoft.DotNet.Helix/Sdk/tools/azure-pipelines/reporter/run.py b/src/Microsoft.DotNet.Helix/Sdk/tools/azure-pipelines/reporter/run.py index deaaa25136c..e862eb2335d 100644 --- a/src/Microsoft.DotNet.Helix/Sdk/tools/azure-pipelines/reporter/run.py +++ b/src/Microsoft.DotNet.Helix/Sdk/tools/azure-pipelines/reporter/run.py @@ -1,6 +1,7 @@ import os import re import sys +import time import traceback import logging from queue import Queue @@ -35,11 +36,9 @@ def __print(self, msg): def __process(self, batch): self.publisher.upload_batch(batch) self.total_uploaded = self.total_uploaded + len(batch) - self.__print('uploaded {} results'.format(self.total_uploaded)) def run(self): global workerFailed, workerFailedLock - self.__print("starting...") while True: try: item = self.queue.get() @@ -146,26 +145,20 @@ def main(): worker.daemon = True worker.start() - log.info("Beginning to read test results...") + # https://github.com/dotnet/arcade/issues/7371 - trying to avoid contention for stdout + time.sleep(5) # In case the user puts the results in HELIX_WORKITEM_UPLOAD_ROOT for upload, check there too. - all_results = read_results([os.getcwd(), - get_env("HELIX_WORKITEM_UPLOAD_ROOT")]) + all_results = read_results([os.getcwd(), get_env("HELIX_WORKITEM_UPLOAD_ROOT")]) batch_size = 1000 batches = batch(all_results, batch_size) - log.info("Uploading results in batches of size {}".format(batch_size)) - for b in batches: q.put(b) - log.info("Main thread finished queueing batches") - q.join() - log.info("Main thread exiting") - with workerFailedLock: if workerFailed: if check_passed_to_workaround_ado_api_failure([os.getcwd(), get_env("HELIX_WORKITEM_UPLOAD_ROOT")]): From d55328bb17061f27c220cd9df93255383d2bfd1c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C5=99emek=20Vysok=C3=BD?= Date: Thu, 3 Jun 2021 15:00:09 +0200 Subject: [PATCH 133/699] Stop supporting multiple targets in XHarness Helix SDK (#7462) We never supported this really and it was deprecated in https://github.com/dotnet/xharness/pull/618 This will be a breaking change in the SDK: ```xml ios-simulator-64 ``` will change to ```xml ios-simulator-64 ``` --- eng/Version.Details.xml | 4 ++-- eng/Versions.props | 2 +- .../CreateXHarnessAppleWorkItemsTests.cs | 6 +++--- .../ProvisioningProfileProviderTests.cs | 2 +- .../Sdk/CreateXHarnessAppleWorkItems.cs | 16 ++++++++-------- .../Sdk/ProvisioningProfileProvider.cs | 2 +- .../Sdk/tools/xharness-runner/Readme.md | 18 +++++++++--------- .../xharness-runner/xharness-runner.apple.sh | 12 ++++++------ tests/XHarness/XHarness.Device.AppleRun.proj | 2 +- .../XHarness/XHarness.Simulator.AppleRun.proj | 2 +- .../XHarness/XHarness.Simulator.AppleTest.proj | 2 +- .../XHarness.Simulator.CustomCommands.proj | 10 +++++----- 12 files changed, 39 insertions(+), 39 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index ce650dda091..e01e9a8c605 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -39,9 +39,9 @@ https://github.com/dotnet/arcade-services cac955fe259cb611f6a29d09209bd717deb69037 - + https://github.com/dotnet/xharness - 98970876f4d21e6da5198a5c41de51ab1101089f + debdb2b11d810cea0435f5d086c0bf17b3ee6402 https://github.com/dotnet/roslyn diff --git a/eng/Versions.props b/eng/Versions.props index 52274c92638..6cce36ce8f0 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -80,7 +80,7 @@ 6.0.0-beta.21277.1 1.0.0-beta.21277.1 1.1.0-beta.21228.1 - 1.0.0-prerelease.21271.1 + 1.0.0-prerelease.21303.1 1.1.156402 1.1.152002 6.0.100-preview.5.21254.11 diff --git a/src/Microsoft.DotNet.Helix/Sdk.Tests/Microsoft.DotNet.Helix.Sdk.Tests/CreateXHarnessAppleWorkItemsTests.cs b/src/Microsoft.DotNet.Helix/Sdk.Tests/Microsoft.DotNet.Helix.Sdk.Tests/CreateXHarnessAppleWorkItemsTests.cs index c8da05191ec..b1c76a859a2 100644 --- a/src/Microsoft.DotNet.Helix/Sdk.Tests/Microsoft.DotNet.Helix.Sdk.Tests/CreateXHarnessAppleWorkItemsTests.cs +++ b/src/Microsoft.DotNet.Helix/Sdk.Tests/Microsoft.DotNet.Helix.Sdk.Tests/CreateXHarnessAppleWorkItemsTests.cs @@ -87,7 +87,7 @@ public void AppleXHarnessWorkItemIsCreated() var command = workItem.GetMetadata("Command"); command.Should().Contain("System.Foo.app"); - command.Should().Contain("--targets \"ios-device_13.5\""); + command.Should().Contain("--target \"ios-device_13.5\""); command.Should().Contain("--timeout \"00:08:55\""); command.Should().Contain("--launch-timeout \"00:02:33\""); @@ -181,7 +181,7 @@ public void AreDependenciesRegistered() private ITaskItem CreateAppBundle( string path, - string targets, + string target, string? workItemTimeout = null, string? testTimeout = null, string? launchTimeout = null, @@ -191,7 +191,7 @@ private ITaskItem CreateAppBundle( { var mockBundle = new Mock(); mockBundle.SetupGet(x => x.ItemSpec).Returns(path); - mockBundle.Setup(x => x.GetMetadata(CreateXHarnessAppleWorkItems.MetadataNames.Targets)).Returns(targets); + mockBundle.Setup(x => x.GetMetadata(CreateXHarnessAppleWorkItems.MetadataNames.Target)).Returns(target); mockBundle.Setup(x => x.GetMetadata(CreateXHarnessAppleWorkItems.MetadataNames.IncludesTestRunner)).Returns(includesTestRunner.ToString()); if (workItemTimeout != null) diff --git a/src/Microsoft.DotNet.Helix/Sdk.Tests/Microsoft.DotNet.Helix.Sdk.Tests/ProvisioningProfileProviderTests.cs b/src/Microsoft.DotNet.Helix/Sdk.Tests/Microsoft.DotNet.Helix.Sdk.Tests/ProvisioningProfileProviderTests.cs index 0c079af5ced..f84e7a6f117 100644 --- a/src/Microsoft.DotNet.Helix/Sdk.Tests/Microsoft.DotNet.Helix.Sdk.Tests/ProvisioningProfileProviderTests.cs +++ b/src/Microsoft.DotNet.Helix/Sdk.Tests/Microsoft.DotNet.Helix.Sdk.Tests/ProvisioningProfileProviderTests.cs @@ -133,7 +133,7 @@ private static ITaskItem CreateAppBundle(string path, string targets) { var mockBundle = new Mock(); mockBundle.SetupGet(x => x.ItemSpec).Returns(path); - mockBundle.Setup(x => x.GetMetadata(CreateXHarnessAppleWorkItems.MetadataNames.Targets)).Returns(targets); + mockBundle.Setup(x => x.GetMetadata(CreateXHarnessAppleWorkItems.MetadataNames.Target)).Returns(targets); return mockBundle.Object; } } diff --git a/src/Microsoft.DotNet.Helix/Sdk/CreateXHarnessAppleWorkItems.cs b/src/Microsoft.DotNet.Helix/Sdk/CreateXHarnessAppleWorkItems.cs index 1145d896658..d61f7db5660 100644 --- a/src/Microsoft.DotNet.Helix/Sdk/CreateXHarnessAppleWorkItems.cs +++ b/src/Microsoft.DotNet.Helix/Sdk/CreateXHarnessAppleWorkItems.cs @@ -20,7 +20,7 @@ public class CreateXHarnessAppleWorkItems : XHarnessTaskBase public static class MetadataNames { - public const string Targets = "Targets"; + public const string Target = "TestTarget"; public const string LaunchTimeout = "LaunchTimeout"; public const string IncludesTestRunner = "IncludesTestRunner"; public const string ResetSimulator = "ResetSimulator"; @@ -102,14 +102,14 @@ private async Task PrepareWorkItem( var (testTimeout, workItemTimeout, expectedExitCode, customCommands) = ParseMetadata(appBundleItem); // Validation of any metadata specific to iOS stuff goes here - if (!appBundleItem.TryGetMetadata(MetadataNames.Targets, out string targets)) + if (!appBundleItem.TryGetMetadata(MetadataNames.Target, out string target)) { - Log.LogError($"'{MetadataNames.Targets}' metadata must be specified - " + + Log.LogError($"'{MetadataNames.Target}' metadata must be specified - " + "expecting list of target device/simulator platforms to execute tests on (e.g. ios-simulator-64)"); return null; } - targets = targets.ToLowerInvariant(); + target = target.ToLowerInvariant(); // Optional timeout for the how long it takes for the app to be installed, booted and tests start executing TimeSpan launchTimeout = s_defaultLaunchTimeout; @@ -151,7 +151,7 @@ private async Task PrepareWorkItem( customCommands = $"xharness apple {(includesTestRunner ? "test" : "run")} " + "--app \"$app\" " + "--output-directory \"$output_directory\" " + - "--targets \"$targets\" " + + "--target \"$target\" " + "--timeout \"$timeout\" " + (includesTestRunner ? $"--launch-timeout \"$launch_timeout\" " @@ -163,7 +163,7 @@ private async Task PrepareWorkItem( } string appName = fileSystem.GetFileName(appBundleItem.ItemSpec); - string helixCommand = GetHelixCommand(appName, targets, testTimeout, launchTimeout, includesTestRunner, expectedExitCode, resetSimulator); + string helixCommand = GetHelixCommand(appName, target, testTimeout, launchTimeout, includesTestRunner, expectedExitCode, resetSimulator); string payloadArchivePath = await CreateZipArchiveOfFolder(zipArchiveManager, fileSystem, appFolderPath, customCommands); Log.LogMessage($"Creating work item with properties Identity: {workItemName}, Payload: {appFolderPath}, Command: {helixCommand}"); @@ -179,7 +179,7 @@ private async Task PrepareWorkItem( private string GetHelixCommand( string appName, - string targets, + string target, TimeSpan testTimeout, TimeSpan launchTimeout, bool includesTestRunner, @@ -188,7 +188,7 @@ private string GetHelixCommand( => $"chmod +x {EntryPointScript} && ./{EntryPointScript} " + $"--app \"{appName}\" " + - $"--targets \"{targets}\" " + + $"--target \"{target}\" " + $"--timeout \"{testTimeout}\" " + $"--launch-timeout \"{launchTimeout}\" " + (includesTestRunner ? "--includes-test-runner " : string.Empty) + diff --git a/src/Microsoft.DotNet.Helix/Sdk/ProvisioningProfileProvider.cs b/src/Microsoft.DotNet.Helix/Sdk/ProvisioningProfileProvider.cs index 1adb6080b39..b1c88bc5ace 100644 --- a/src/Microsoft.DotNet.Helix/Sdk/ProvisioningProfileProvider.cs +++ b/src/Microsoft.DotNet.Helix/Sdk/ProvisioningProfileProvider.cs @@ -62,7 +62,7 @@ public void AddProfilesToBundles(ITaskItem[] appBundles) foreach (var appBundle in appBundles) { - if (!appBundle.TryGetMetadata(CreateXHarnessAppleWorkItems.MetadataNames.Targets, out string bundleTargets)) + if (!appBundle.TryGetMetadata(CreateXHarnessAppleWorkItems.MetadataNames.Target, out string bundleTargets)) { _log.LogError("'Targets' metadata must be specified - " + "expecting list of target device/simulator platforms to execute tests on (e.g. ios-simulator-64)"); diff --git a/src/Microsoft.DotNet.Helix/Sdk/tools/xharness-runner/Readme.md b/src/Microsoft.DotNet.Helix/Sdk/tools/xharness-runner/Readme.md index 38f94eab3d7..c953bbbb06c 100644 --- a/src/Microsoft.DotNet.Helix/Sdk/tools/xharness-runner/Readme.md +++ b/src/Microsoft.DotNet.Helix/Sdk/tools/xharness-runner/Readme.md @@ -59,13 +59,13 @@ To execute .app bundles, declare one or more `XHarnessAppBundleToTest` items: - ios-simulator-64_13.5 + ios-simulator-64_13.5 ``` -The `` metadata is a required configuration that tells XHarness which kind of device/Simulator to target. -Use the XHarness CLI help command to find more (see the `--targets` option). +The `` metadata is a required configuration that tells XHarness which kind of device/Simulator to target. +Use the XHarness CLI help command to find more (see the `--target` option). You can also specify some additional metadata that will help you configure the run better: @@ -163,17 +163,17 @@ Example: ```xml - ios-simulator-64 + ios-simulator-64 00:12:00 set -e - deviceId=`xharness apple device $targets` - xharness apple install -t $targets --device "$deviceId" -o "$output_directory" --app=$app + deviceId=`xharness apple device $target` + xharness apple install -t $target --device "$deviceId" -o "$output_directory" --app=$app set +e result=0 - xharness apple just-test -t $targets --device "$deviceId" -o "$output_directory" --app net.dot.Some.iOS --timeout 00:08:00 + xharness apple just-test -t $target --device "$deviceId" -o "$output_directory" --app net.dot.Some.iOS --timeout 00:08:00 ((result|=$?)) - xharness apple uninstall -t $targets --device "$deviceId" -o "$output_directory" --app net.dot.Some.iOS + xharness apple uninstall -t $target --device "$deviceId" -o "$output_directory" --app net.dot.Some.iOS ((result|=$?)) exit $result @@ -187,7 +187,7 @@ When using `CustomCommands`, several variables will be defined for you for easie - `$app` - path to the application - `$output_directory` - path under which all files will be uploaded to Helix at the end of the job - If a file named `testResults.xml` is found containing xUnit results, it will be uploaded back to Azure DevOps -- `$targets`, `$timeout`, `$launch_timeout`, `$expected_exit_code`, `$includes_test_runner` - parsed metadata defined on the original `XHarnessAppBundleToTest` MSBuild item +- `$target`, `$timeout`, `$launch_timeout`, `$expected_exit_code`, `$includes_test_runner` - parsed metadata defined on the original `XHarnessAppBundleToTest` MSBuild item #### Variables defined for Android scenarios Android is currently not supported - coming soon! diff --git a/src/Microsoft.DotNet.Helix/Sdk/tools/xharness-runner/xharness-runner.apple.sh b/src/Microsoft.DotNet.Helix/Sdk/tools/xharness-runner/xharness-runner.apple.sh index a4f3f119607..09e2d117e7d 100644 --- a/src/Microsoft.DotNet.Helix/Sdk/tools/xharness-runner/xharness-runner.apple.sh +++ b/src/Microsoft.DotNet.Helix/Sdk/tools/xharness-runner/xharness-runner.apple.sh @@ -8,7 +8,7 @@ app='' output_directory='' -targets='' +target='' timeout='' launch_timeout='' xharness_cli_path='' @@ -29,8 +29,8 @@ while [[ $# -gt 0 ]]; do output_directory="$2" shift ;; - --targets) - targets="$2" + --target) + target="$2" shift ;; --timeout) @@ -77,8 +77,8 @@ if [ -z "$app" ]; then die "App bundle path wasn't provided"; fi -if [ -z "$targets" ]; then - die "No targets were provided"; +if [ -z "$target" ]; then + die "No target were provided"; fi if [ -z "$output_directory" ]; then @@ -96,7 +96,7 @@ else fi # Signing -if [ "$targets" == 'ios-device' ] || [ "$targets" == 'tvos-device' ]; then +if [ "$target" == 'ios-device' ] || [ "$target" == 'tvos-device' ]; then echo "Real device target detected, application will be signed" provisioning_profile="$app/embedded.mobileprovision" diff --git a/tests/XHarness/XHarness.Device.AppleRun.proj b/tests/XHarness/XHarness.Device.AppleRun.proj index 783e474c297..db3041c52c1 100644 --- a/tests/XHarness/XHarness.Device.AppleRun.proj +++ b/tests/XHarness/XHarness.Device.AppleRun.proj @@ -20,7 +20,7 @@ - ios-device + ios-device 00:05:00 00:04:00 00:03:00 diff --git a/tests/XHarness/XHarness.Simulator.AppleRun.proj b/tests/XHarness/XHarness.Simulator.AppleRun.proj index ae243e11185..c67a80201e5 100644 --- a/tests/XHarness/XHarness.Simulator.AppleRun.proj +++ b/tests/XHarness/XHarness.Simulator.AppleRun.proj @@ -20,7 +20,7 @@ - ios-simulator-64 + ios-simulator-64 00:12:00 00:08:00 00:05:00 diff --git a/tests/XHarness/XHarness.Simulator.AppleTest.proj b/tests/XHarness/XHarness.Simulator.AppleTest.proj index 63e90f432f0..49c9f339a8d 100644 --- a/tests/XHarness/XHarness.Simulator.AppleTest.proj +++ b/tests/XHarness/XHarness.Simulator.AppleTest.proj @@ -20,7 +20,7 @@ - ios-simulator-64 + ios-simulator-64 00:05:00 00:15:00 00:06:00 diff --git a/tests/XHarness/XHarness.Simulator.CustomCommands.proj b/tests/XHarness/XHarness.Simulator.CustomCommands.proj index acf82c3e966..7addd4e661e 100644 --- a/tests/XHarness/XHarness.Simulator.CustomCommands.proj +++ b/tests/XHarness/XHarness.Simulator.CustomCommands.proj @@ -20,19 +20,19 @@ - ios-simulator-64 + ios-simulator-64 00:15:00 00:05:00 00:05:00 set -ex - deviceId=`xharness apple device $targets` - xharness apple install -t=$targets --device="$deviceId" -o="$output_directory" --app="$app" -v + deviceId=`xharness apple device $target` + xharness apple install -t=$target --device="$deviceId" -o="$output_directory" --app="$app" -v set +e result=0 - xharness apple just-test -t=$targets --device="$deviceId" -o="$output_directory" --app="net.dot.$(XHarnessAppBundleName)" --launch-timeout=$launch_timeout --timeout=$timeout -v + xharness apple just-test -t=$target --device="$deviceId" -o="$output_directory" --app="net.dot.$(XHarnessAppBundleName)" --launch-timeout=$launch_timeout --timeout=$timeout -v ((result|=$?)) - xharness apple uninstall -t=$targets --device="$deviceId" -o="$output_directory" --app="net.dot.$(XHarnessAppBundleName)" -v + xharness apple uninstall -t=$target --device="$deviceId" -o="$output_directory" --app="net.dot.$(XHarnessAppBundleName)" -v ((result|=$?)) exit $result From 78da7776965b428ff31da8f1ff2cb073506212b7 Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Thu, 3 Jun 2021 17:37:36 +0000 Subject: [PATCH 134/699] [main] Update dependencies from dotnet/xharness dotnet/xliff-tasks dotnet/arcade mono/linker (#7459) [main] Update dependencies from dotnet/xharness dotnet/xliff-tasks dotnet/arcade mono/linker --- eng/Version.Details.xml | 28 ++++++++++++++-------------- eng/Versions.props | 10 +++++----- global.json | 4 ++-- 3 files changed, 21 insertions(+), 21 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index e01e9a8c605..78dc40dd4b2 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -11,25 +11,25 @@ - + https://github.com/dotnet/arcade - c3e0e4070f6cd3873b775e3f4136e29f4d66cb49 + 9945dc4ebbb511b027df34cb5ab579f6395d1dda - + https://github.com/dotnet/arcade - c3e0e4070f6cd3873b775e3f4136e29f4d66cb49 + 9945dc4ebbb511b027df34cb5ab579f6395d1dda - + https://github.com/dotnet/arcade - c3e0e4070f6cd3873b775e3f4136e29f4d66cb49 + 9945dc4ebbb511b027df34cb5ab579f6395d1dda - + https://github.com/dotnet/arcade - c3e0e4070f6cd3873b775e3f4136e29f4d66cb49 + 9945dc4ebbb511b027df34cb5ab579f6395d1dda - + https://github.com/dotnet/arcade - c3e0e4070f6cd3873b775e3f4136e29f4d66cb49 + 9945dc4ebbb511b027df34cb5ab579f6395d1dda https://github.com/dotnet/arcade-services @@ -47,9 +47,9 @@ https://github.com/dotnet/roslyn a408003c46b125f0c5fdc47472e5f0f5750f1e5d - + https://github.com/mono/linker - 50901f9ba5c8672c2758577a61f45fea3cc6cd76 + 0f3ea71923fdc93800103ec4d8f59bbe15e2813b https://github.com/dotnet/sourcelink @@ -68,9 +68,9 @@ https://github.com/dotnet/symreader-converter c5ba7c88f92e2dde156c324a8c8edc04d9fa4fe0 - + https://github.com/dotnet/xliff-tasks - 426214b8acf4ce48093e776d1a8ad35db8e72af2 + 988455b0e81c8b2a49bad5b488ebe8df6407924f diff --git a/eng/Versions.props b/eng/Versions.props index 6cce36ce8f0..31ae63f3cdc 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -35,7 +35,7 @@ 2.1.1 2.1.0 3.10.0-4.21273.6 - 6.0.100-preview.6.21277.2 + 6.0.100-preview.6.21302.1 16.7.1 4.8.3 5.3.0.1 @@ -65,8 +65,8 @@ 2.4.1 2.0.3 2.4.1 - 6.0.0-beta.21277.1 - 6.0.0-beta.21277.1 + 6.0.0-beta.21302.1 + 6.0.0-beta.21302.1 1.22.0 1.1.2 2.0.0 @@ -77,8 +77,8 @@ 1.1.0-beta.20258.6 1.1.0-beta-21228-01 1.1.0-beta-21228-01 - 6.0.0-beta.21277.1 - 1.0.0-beta.21277.1 + 6.0.0-beta.21302.1 + 1.0.0-beta.21301.1 1.1.0-beta.21228.1 1.0.0-prerelease.21303.1 1.1.156402 diff --git a/global.json b/global.json index 7e3a90e2fbe..e0678c1c0df 100644 --- a/global.json +++ b/global.json @@ -3,7 +3,7 @@ "dotnet": "6.0.100-preview.3.21202.5" }, "msbuild-sdks": { - "Microsoft.DotNet.Arcade.Sdk": "6.0.0-beta.21277.1", - "Microsoft.DotNet.Helix.Sdk": "6.0.0-beta.21277.1" + "Microsoft.DotNet.Arcade.Sdk": "6.0.0-beta.21302.1", + "Microsoft.DotNet.Helix.Sdk": "6.0.0-beta.21302.1" } } From 85a65ea1fca1d0867f699fed44d191358270bf6a Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Fri, 4 Jun 2021 15:08:01 +0000 Subject: [PATCH 135/699] [main] Update dependencies from dotnet/xliff-tasks dotnet/arcade mono/linker (#7467) [main] Update dependencies from dotnet/xliff-tasks dotnet/arcade mono/linker --- eng/Version.Details.xml | 28 ++++++++++++++-------------- eng/Versions.props | 10 +++++----- global.json | 4 ++-- 3 files changed, 21 insertions(+), 21 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index 78dc40dd4b2..6135ac47027 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -11,25 +11,25 @@ - + https://github.com/dotnet/arcade - 9945dc4ebbb511b027df34cb5ab579f6395d1dda + 78da7776965b428ff31da8f1ff2cb073506212b7 - + https://github.com/dotnet/arcade - 9945dc4ebbb511b027df34cb5ab579f6395d1dda + 78da7776965b428ff31da8f1ff2cb073506212b7 - + https://github.com/dotnet/arcade - 9945dc4ebbb511b027df34cb5ab579f6395d1dda + 78da7776965b428ff31da8f1ff2cb073506212b7 - + https://github.com/dotnet/arcade - 9945dc4ebbb511b027df34cb5ab579f6395d1dda + 78da7776965b428ff31da8f1ff2cb073506212b7 - + https://github.com/dotnet/arcade - 9945dc4ebbb511b027df34cb5ab579f6395d1dda + 78da7776965b428ff31da8f1ff2cb073506212b7 https://github.com/dotnet/arcade-services @@ -47,9 +47,9 @@ https://github.com/dotnet/roslyn a408003c46b125f0c5fdc47472e5f0f5750f1e5d - + https://github.com/mono/linker - 0f3ea71923fdc93800103ec4d8f59bbe15e2813b + a3f68c6510677317999de1f05d2e10ebfb903abe https://github.com/dotnet/sourcelink @@ -68,9 +68,9 @@ https://github.com/dotnet/symreader-converter c5ba7c88f92e2dde156c324a8c8edc04d9fa4fe0 - + https://github.com/dotnet/xliff-tasks - 988455b0e81c8b2a49bad5b488ebe8df6407924f + 5f46493770064a307090e24e315ca4d071d91b69 diff --git a/eng/Versions.props b/eng/Versions.props index 31ae63f3cdc..501438be9d8 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -35,7 +35,7 @@ 2.1.1 2.1.0 3.10.0-4.21273.6 - 6.0.100-preview.6.21302.1 + 6.0.100-preview.6.21304.1 16.7.1 4.8.3 5.3.0.1 @@ -65,8 +65,8 @@ 2.4.1 2.0.3 2.4.1 - 6.0.0-beta.21302.1 - 6.0.0-beta.21302.1 + 6.0.0-beta.21303.2 + 6.0.0-beta.21303.2 1.22.0 1.1.2 2.0.0 @@ -77,8 +77,8 @@ 1.1.0-beta.20258.6 1.1.0-beta-21228-01 1.1.0-beta-21228-01 - 6.0.0-beta.21302.1 - 1.0.0-beta.21301.1 + 6.0.0-beta.21303.2 + 1.0.0-beta.21303.1 1.1.0-beta.21228.1 1.0.0-prerelease.21303.1 1.1.156402 diff --git a/global.json b/global.json index e0678c1c0df..d1c0acdebfd 100644 --- a/global.json +++ b/global.json @@ -3,7 +3,7 @@ "dotnet": "6.0.100-preview.3.21202.5" }, "msbuild-sdks": { - "Microsoft.DotNet.Arcade.Sdk": "6.0.0-beta.21302.1", - "Microsoft.DotNet.Helix.Sdk": "6.0.0-beta.21302.1" + "Microsoft.DotNet.Arcade.Sdk": "6.0.0-beta.21303.2", + "Microsoft.DotNet.Helix.Sdk": "6.0.0-beta.21303.2" } } From 130a085011ed5d5ef0fd30e07fa16ce88c2df28a Mon Sep 17 00:00:00 2001 From: Manish Godse <61718172+mangod9@users.noreply.github.com> Date: Fri, 4 Jun 2021 15:07:29 -0700 Subject: [PATCH 136/699] update sdk to preview4 (#7469) * update sdk to preview4 * update asp.net sdk to preview4 Co-authored-by: Manish --- global.json | 2 +- src/Microsoft.DotNet.Helix/Sdk/tools/dotnet-cli/DotNetCli.props | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/global.json b/global.json index d1c0acdebfd..a3127be1474 100644 --- a/global.json +++ b/global.json @@ -1,6 +1,6 @@ { "tools": { - "dotnet": "6.0.100-preview.3.21202.5" + "dotnet": "6.0.100-preview.4.21255.9" }, "msbuild-sdks": { "Microsoft.DotNet.Arcade.Sdk": "6.0.0-beta.21303.2", diff --git a/src/Microsoft.DotNet.Helix/Sdk/tools/dotnet-cli/DotNetCli.props b/src/Microsoft.DotNet.Helix/Sdk/tools/dotnet-cli/DotNetCli.props index 4df8bcd3955..5c2539a9074 100644 --- a/src/Microsoft.DotNet.Helix/Sdk/tools/dotnet-cli/DotNetCli.props +++ b/src/Microsoft.DotNet.Helix/Sdk/tools/dotnet-cli/DotNetCli.props @@ -1,7 +1,7 @@ false - 6.0.0-preview.3.21201.13 + 6.0.0-preview.4.21253.5 runtime $(BundledNETCoreAppPackageVersion) From 4a02fbe0af3205b979a828a6e98931bed68781b5 Mon Sep 17 00:00:00 2001 From: Michael Stuckey Date: Fri, 4 Jun 2021 16:28:32 -0700 Subject: [PATCH 137/699] Specify LastExit scope (#7465) --- Documentation/Policy/PowershellBestPractices.md | 6 +++++- eng/common/sdl/execute-all-sdl-tools.ps1 | 2 +- eng/common/sdl/init-sdl.ps1 | 2 +- eng/common/sdl/run-sdl.ps1 | 2 +- 4 files changed, 8 insertions(+), 4 deletions(-) diff --git a/Documentation/Policy/PowershellBestPractices.md b/Documentation/Policy/PowershellBestPractices.md index a7f7e681cc6..114239d113f 100644 --- a/Documentation/Policy/PowershellBestPractices.md +++ b/Documentation/Policy/PowershellBestPractices.md @@ -101,7 +101,11 @@ if ($LASTEXITCODE -ne 0) { } ``` -*There is a known issue when using `$LASTEXITCODE` in release builds where PowerShell will report that the variable has not been set. As a workaround, simply set `$LASTEXITCODE = 0` at the top of your script.* +To set it in a PowerShell script, e.g. to ensure a known value at the start of a script, reference the variable in the global scope. + +```powershell +$global:LASTEXITCODE = 0 +``` ## Set StrictMode and ErrorActionPreference at the top of every file diff --git a/eng/common/sdl/execute-all-sdl-tools.ps1 b/eng/common/sdl/execute-all-sdl-tools.ps1 index 81b729f74a4..2881a56083c 100644 --- a/eng/common/sdl/execute-all-sdl-tools.ps1 +++ b/eng/common/sdl/execute-all-sdl-tools.ps1 @@ -32,7 +32,7 @@ try { $ErrorActionPreference = 'Stop' Set-StrictMode -Version 2.0 $disableConfigureToolsetImport = $true - $LASTEXITCODE = 0 + $global:LASTEXITCODE = 0 # `tools.ps1` checks $ci to perform some actions. Since the SDL # scripts don't necessarily execute in the same agent that run the diff --git a/eng/common/sdl/init-sdl.ps1 b/eng/common/sdl/init-sdl.ps1 index 1fe9271193c..3ac1d92b370 100644 --- a/eng/common/sdl/init-sdl.ps1 +++ b/eng/common/sdl/init-sdl.ps1 @@ -10,7 +10,7 @@ Param( $ErrorActionPreference = 'Stop' Set-StrictMode -Version 2.0 $disableConfigureToolsetImport = $true -$LASTEXITCODE = 0 +$global:LASTEXITCODE = 0 # `tools.ps1` checks $ci to perform some actions. Since the SDL # scripts don't necessarily execute in the same agent that run the diff --git a/eng/common/sdl/run-sdl.ps1 b/eng/common/sdl/run-sdl.ps1 index fe95ab35aa5..3d9c87aba6a 100644 --- a/eng/common/sdl/run-sdl.ps1 +++ b/eng/common/sdl/run-sdl.ps1 @@ -13,7 +13,7 @@ Param( $ErrorActionPreference = 'Stop' Set-StrictMode -Version 2.0 $disableConfigureToolsetImport = $true -$LASTEXITCODE = 0 +$global:LASTEXITCODE = 0 try { # `tools.ps1` checks $ci to perform some actions. Since the SDL From 582981cf4bc8de324d756b78c390c9610f20fb49 Mon Sep 17 00:00:00 2001 From: Eric StJohn Date: Fri, 4 Jun 2021 23:45:09 -0700 Subject: [PATCH 138/699] Ensure we test on TFMs that have unique RID-specific assets (#7470) --- .../GetCompatiblePackageTargetFrameworks.cs | 2 +- src/Microsoft.DotNet.PackageTesting/NupkgParser.cs | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/Microsoft.DotNet.PackageTesting/GetCompatiblePackageTargetFrameworks.cs b/src/Microsoft.DotNet.PackageTesting/GetCompatiblePackageTargetFrameworks.cs index fa10507cc1b..2fee0d7edfc 100644 --- a/src/Microsoft.DotNet.PackageTesting/GetCompatiblePackageTargetFrameworks.cs +++ b/src/Microsoft.DotNet.PackageTesting/GetCompatiblePackageTargetFrameworks.cs @@ -32,7 +32,7 @@ public override bool Execute() foreach (var packagePath in PackagePaths) { Package package = NupkgParser.CreatePackageObject(packagePath); - List packageTargetFrameworks = package.PackageAssets.Where(t => t.AssetType != AssetType.RuntimeAsset).Select(t => t.TargetFramework).Distinct().ToList(); + List packageTargetFrameworks = package.PackageAssets.Select(asset => asset.TargetFramework).Where(tfm => tfm != null).Distinct().ToList(); List frameworksToTest = GetTestFrameworks(packageTargetFrameworks); testProjects.AddRange(CreateItemFromTestFramework(package.PackageId, package.Version, frameworksToTest, GetRidsFromPackage(package))); diff --git a/src/Microsoft.DotNet.PackageTesting/NupkgParser.cs b/src/Microsoft.DotNet.PackageTesting/NupkgParser.cs index fe7ad03a382..bb1881c1657 100644 --- a/src/Microsoft.DotNet.PackageTesting/NupkgParser.cs +++ b/src/Microsoft.DotNet.PackageTesting/NupkgParser.cs @@ -54,7 +54,8 @@ public static PackageAsset ExtractAssetFromFile(string filePath) else if (filePath.StartsWith("runtimes")) { var stringParts = filePath.Split('/'); - asset = new PackageAsset(NuGetFramework.Parse(stringParts[3]), stringParts[1], filePath, AssetType.RuntimeAsset); + NuGetFramework framework = stringParts.Length > 3 ? NuGetFramework.Parse(stringParts[3]) : null; + asset = new PackageAsset(framework, stringParts[1], filePath, AssetType.RuntimeAsset); } return asset; From a80ce9ac7a4cbedeeb454e9e9d3758a9152aaf5a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C5=99emek=20Vysok=C3=BD?= Date: Mon, 7 Jun 2021 17:18:18 +0200 Subject: [PATCH 139/699] Reboot Apple queues when device not found (#7473) If we fail to find a real device, it is unexpected as device queues should have one. Reboot sometimes helps with this. --- .../tools/xharness-runner/xharness-runner.apple.sh | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/src/Microsoft.DotNet.Helix/Sdk/tools/xharness-runner/xharness-runner.apple.sh b/src/Microsoft.DotNet.Helix/Sdk/tools/xharness-runner/xharness-runner.apple.sh index 09e2d117e7d..6e67f9ef4a2 100644 --- a/src/Microsoft.DotNet.Helix/Sdk/tools/xharness-runner/xharness-runner.apple.sh +++ b/src/Microsoft.DotNet.Helix/Sdk/tools/xharness-runner/xharness-runner.apple.sh @@ -131,7 +131,7 @@ if [ "$target" == 'ios-device' ] || [ "$target" == 'tvos-device' ]; then # Sign the app /usr/bin/codesign -v --force --sign "Apple Development" --keychain "$keychain_name" --entitlements entitlements.plist "$app" -elif [[ "$targets" =~ "simulator" ]]; then +elif [[ "$target" =~ "simulator" ]]; then # Start the simulator if it is not running already simulator_app="$xcode_path/Contents/Developer/Applications/Simulator.app" open -a "$simulator_app" @@ -155,7 +155,7 @@ fi # If we fail to find a simulator and we are not targeting a specific version (e.g. `ios-simulator_13.5`), it is probably an issue because Xcode should always have at least one runtime version inside # 81 - simulator/device not found -if [ $exit_code -eq 81 ] && [[ "$targets" =~ "simulator" ]] && [[ ! "$targets" =~ "_" ]]; then +if [ $exit_code -eq 81 ] && [[ "$target" =~ "simulator" ]] && [[ ! "$target" =~ "_" ]]; then touch './.retry' touch './.reboot' fi @@ -163,7 +163,15 @@ fi # If we have a launch failure AND we are on simulators, we need to signal that we want a reboot+retry # The script that is running this one will notice and request Helix to do it # 83 - app launch failure -if [ $exit_code -eq 83 ] && [[ "$targets" =~ "simulator" ]]; then +if [ $exit_code -eq 83 ] && [[ "$target" =~ "simulator" ]]; then + touch './.retry' + touch './.reboot' +fi + +# If we fail to find a real device, it is unexpected as device queues should have one +# It can often be fixed with a reboot +# 81 - device not found +if [ $exit_code -eq 81 ] && [[ "$target" =~ "device" ]]; then touch './.retry' touch './.reboot' fi From 744b488544e79618b0286528d8eb15f98c71f724 Mon Sep 17 00:00:00 2001 From: Juan Hoyos Date: Mon, 7 Jun 2021 13:49:06 -0700 Subject: [PATCH 140/699] Add mibc to the PE family of signatures (#7419) --- src/Microsoft.DotNet.Arcade.Sdk/tools/Sign.props | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Microsoft.DotNet.Arcade.Sdk/tools/Sign.props b/src/Microsoft.DotNet.Arcade.Sdk/tools/Sign.props index 908cb7a9000..bdd8ebf8558 100644 --- a/src/Microsoft.DotNet.Arcade.Sdk/tools/Sign.props +++ b/src/Microsoft.DotNet.Arcade.Sdk/tools/Sign.props @@ -37,7 +37,7 @@ --> - + From e13fddd3f04a580a56199da7ed32fab61971de1d Mon Sep 17 00:00:00 2001 From: Manish Godse <61718172+mangod9@users.noreply.github.com> Date: Mon, 7 Jun 2021 17:10:50 -0700 Subject: [PATCH 141/699] enable cg2 by default in sharedfx (#7476) Co-authored-by: Manish --- .../targets/sharedfx.targets | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/Microsoft.DotNet.SharedFramework.Sdk/targets/sharedfx.targets b/src/Microsoft.DotNet.SharedFramework.Sdk/targets/sharedfx.targets index ed8fe84415b..395f2e3cbb0 100644 --- a/src/Microsoft.DotNet.SharedFramework.Sdk/targets/sharedfx.targets +++ b/src/Microsoft.DotNet.SharedFramework.Sdk/targets/sharedfx.targets @@ -3,6 +3,8 @@ $([System.IO.Path]::GetFileName('$(LicenseFile)')) true true + + true true true $(AllowedOutputExtensionsInSymbolsPackageBuildOutputFolder);.map;.dbg;.debug;.dwarf From 34c0409cb881239da3cf9762724da88e41cd8ec8 Mon Sep 17 00:00:00 2001 From: Dan Seefeldt Date: Tue, 8 Jun 2021 07:51:39 -0500 Subject: [PATCH 142/699] Add additional properties when reading source-build dependencies (#7468) --- ...dSourceBuildIntermediateNupkgDependencies.cs | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/src/Microsoft.DotNet.Arcade.Sdk/src/SourceBuild/ReadSourceBuildIntermediateNupkgDependencies.cs b/src/Microsoft.DotNet.Arcade.Sdk/src/SourceBuild/ReadSourceBuildIntermediateNupkgDependencies.cs index fe73e1c9f75..806fa0f9869 100644 --- a/src/Microsoft.DotNet.Arcade.Sdk/src/SourceBuild/ReadSourceBuildIntermediateNupkgDependencies.cs +++ b/src/Microsoft.DotNet.Arcade.Sdk/src/SourceBuild/ReadSourceBuildIntermediateNupkgDependencies.cs @@ -30,9 +30,14 @@ public class ReadSourceBuildIntermediateNupkgDependencies : Task /// /// %(Identity): NuGet package ID. + /// %(Name): The Name of the dependency from Version.Details.xml. /// %(ExactVersion): NuGet package version. This can be used to look up the restored package /// contents in a package cache. /// %(Version): NuGet package version, wrapped in "[version]" syntax for exact match. + /// %(Uri): The URI for the dependency repo. + /// %(Sha): The commit Sha for the dependency. + /// %(SourceBuildRepoName): The repo name for the dependency to use in source-build. + /// %(SourceBuildManagedOnly): Specifies whether the dependency is managed only code. /// [Output] public ITaskItem[] Dependencies { get; set; } @@ -77,6 +82,11 @@ XName CreateQualifiedName(string plainName) string dependencyVersion = d.Attribute("Version")?.Value; + string dependencyUri = d.Element(CreateQualifiedName("Uri"))?.Value; + string dependencySha = d.Element(CreateQualifiedName("Sha"))?.Value; + string sourceBuildRepoName = sourceBuildElement.Attribute("RepoName")?.Value; + string sourceBuildManagedOnly = sourceBuildElement.Attribute("ManagedOnly")?.Value; + if (string.IsNullOrEmpty(dependencyVersion)) { // We need a version to bring down an intermediate nupkg. Fail. @@ -110,8 +120,13 @@ XName CreateQualifiedName(string plainName) identity, new Dictionary { + ["Name"] = dependencyName, ["Version"] = $"[{dependencyVersion}]", - ["ExactVersion"] = dependencyVersion + ["ExactVersion"] = dependencyVersion, + ["Uri"] = dependencyUri, + ["Sha"] = dependencySha, + ["SourceBuildRepoName"] = sourceBuildRepoName, + ["SourceBuildManagedOnly"] = sourceBuildManagedOnly }); }) .Where(d => d != null) From 19954086fe5100a5765d34b0eefbd46492ea0fda Mon Sep 17 00:00:00 2001 From: Jon Fortescue Date: Tue, 8 Jun 2021 13:36:36 -0700 Subject: [PATCH 143/699] Add parameters for making PRs back to GitHub from OneLocBuild (#7479) --- Documentation/OneLocBuild.md | 17 ++++++++++------- eng/common/templates/job/onelocbuild.yml | 8 ++++++++ 2 files changed, 18 insertions(+), 7 deletions(-) diff --git a/Documentation/OneLocBuild.md b/Documentation/OneLocBuild.md index 159fef2d010..9d53e7c3463 100644 --- a/Documentation/OneLocBuild.md +++ b/Documentation/OneLocBuild.md @@ -33,16 +33,16 @@ Onboarding to OneLocBuild is a simple process: LclSource: lclFilesfromPackage LclPackageId: 'LCL-JUNO-PROD-YOURREPO' ``` -7. Merge the changes to your main branch and then open a +7. If using a mirrored repository (your code is mirrored to a trusted repository which your official build uses), + add the following parameter to your YAML (subbing e.g. `sdk` for the value): +```yaml + MirrorRepo: {{name of your GitHub repository}} +``` +8. Merge the changes to your main branch and then open a [repo modification ticket](https://ceapex.visualstudio.com/CEINTL/_workitems/create/Loc%20Request?templateId=415a0569-35ed-45c3-9321-8b1affff1f52&ownerId=c2e38d3d-0e9e-429f-955d-6e39fc6f0457) with the loc team to let them know to retarget the branch. -As of 12 May 2021, if your repository is mirrored to internal with Maestro, you will also need to keep -`CreatePr: false` in your YAML. Currently, OneLocBuild does not support our scenario. The step to create a PR back to -GitHub expects a GitHub repository with the same name as the internal repo, so the step to create PRs fails, -breaking the build. Thus, we turn off automated PR creation to skip this step and we are creating PRs manually prior to -releases as a workaround. Please [get a hold of Engineering Services](https://github.com/dotnet/core-eng/wiki/How-to-get-a-hold-of-Engineering-Servicing) -so that you can be updated when automated PR creation is supported. + ## Releasing with OneLocBuild Using Arcade @@ -134,6 +134,9 @@ The parameters that can be passed to the template are as follows: | `CreatePr` | `true` | When set to `true`, instructs the OneLocBuild task to make a PR back to the source repository containing the localized files. | | `AutoCompletePr` | `false` | When set to `true`, instructs the OneLocBuild task to autocomplete the created PR. Requires permissions to bypass any checks on the main branch. | | `UseLfLineEndings` | `true` | When set to `true`, instructs the OneLocBuild task to use LF line endings during check-in rather than CRLF. | +| `GitHubOrg` | `'dotnet'` | The GitHub org to be used when making a PR from a mirrored repository. | +| `MirrorRepo` | `''` | The name of the GitHub repository to make a PR to (when using a mirrored repository). | +| `MirrorBranch` | `'main'` | The branch on GitHub to make a PR to (when using a mirrored repository). | | `UseCheckedInLocProjectJson` | `false` | When set to `true`, instructs the LocProject.json generation script to use build-time validation rather than build-time generation, as described above. | | `LanguageSet` | `VS_Main_Languages` | This defines the `LanguageSet` of the LocProject.json as described in the [OneLocBuild task documentation](https://ceapex.visualstudio.com/CEINTL/_wiki/wikis/CEINTL.wiki/107/Localization-with-OneLocBuild-Task?anchor=languageset%2C-languages-(required)). | | `LclSource` | `LclFilesInRepo` | This passes the `LclSource` input to the OneLocBuild task as described in [its documentation](https://ceapex.visualstudio.com/CEINTL/_wiki/wikis/CEINTL.wiki/107/Localization-with-OneLocBuild-Task?anchor=languageset%2C-languages-(required)). For most repos, this should be set to `LclFilesfromPackage`. | diff --git a/eng/common/templates/job/onelocbuild.yml b/eng/common/templates/job/onelocbuild.yml index 2acdd5256dd..e8bc77d2ebb 100644 --- a/eng/common/templates/job/onelocbuild.yml +++ b/eng/common/templates/job/onelocbuild.yml @@ -18,6 +18,9 @@ parameters: LclSource: lclFilesInRepo LclPackageId: '' RepoType: gitHub + GitHubOrg: dotnet + MirrorRepo: '' + MirrorBranch: main condition: '' jobs: @@ -66,6 +69,11 @@ jobs: ${{ if eq(parameters.RepoType, 'gitHub') }}: repoType: ${{ parameters.RepoType }} gitHubPatVariable: "${{ parameters.GithubPat }}" + ${{ if ne(parameters.MirrorRepo, '') }}: + isMirrorRepoSelected: true + gitHubOrganization: ${{ parameters.GitHubOrg }} + mirrorRepo: ${{ parameters.MirrorRepo }} + mirrorBranch: ${{ parameters.MirrorBranch }} condition: ${{ parameters.condition }} - task: PublishBuildArtifacts@1 From cde36344adbc1c9808b1c3e7419f0ce3c3e5cd04 Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Tue, 8 Jun 2021 21:13:13 +0000 Subject: [PATCH 144/699] [main] Update dependencies from dotnet/xharness dotnet/xliff-tasks dotnet/arcade mono/linker (#7471) [main] Update dependencies from dotnet/xharness dotnet/xliff-tasks dotnet/arcade mono/linker --- eng/Version.Details.xml | 32 ++++++++++++++++---------------- eng/Versions.props | 12 ++++++------ global.json | 4 ++-- 3 files changed, 24 insertions(+), 24 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index 6135ac47027..ca4ea3a5d7a 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -11,25 +11,25 @@ - + https://github.com/dotnet/arcade - 78da7776965b428ff31da8f1ff2cb073506212b7 + 85a65ea1fca1d0867f699fed44d191358270bf6a - + https://github.com/dotnet/arcade - 78da7776965b428ff31da8f1ff2cb073506212b7 + 85a65ea1fca1d0867f699fed44d191358270bf6a - + https://github.com/dotnet/arcade - 78da7776965b428ff31da8f1ff2cb073506212b7 + 85a65ea1fca1d0867f699fed44d191358270bf6a - + https://github.com/dotnet/arcade - 78da7776965b428ff31da8f1ff2cb073506212b7 + 85a65ea1fca1d0867f699fed44d191358270bf6a - + https://github.com/dotnet/arcade - 78da7776965b428ff31da8f1ff2cb073506212b7 + 85a65ea1fca1d0867f699fed44d191358270bf6a https://github.com/dotnet/arcade-services @@ -39,17 +39,17 @@ https://github.com/dotnet/arcade-services cac955fe259cb611f6a29d09209bd717deb69037 - + https://github.com/dotnet/xharness - debdb2b11d810cea0435f5d086c0bf17b3ee6402 + 12e4fce4088efd078409ee2bb19e50d1c9177742 https://github.com/dotnet/roslyn a408003c46b125f0c5fdc47472e5f0f5750f1e5d - + https://github.com/mono/linker - a3f68c6510677317999de1f05d2e10ebfb903abe + 733795cbeaf9a3dc7450594bef39ab518ba52c98 https://github.com/dotnet/sourcelink @@ -68,9 +68,9 @@ https://github.com/dotnet/symreader-converter c5ba7c88f92e2dde156c324a8c8edc04d9fa4fe0 - + https://github.com/dotnet/xliff-tasks - 5f46493770064a307090e24e315ca4d071d91b69 + 256c21df01b1e95ff7514614bf6356bef0a01829 diff --git a/eng/Versions.props b/eng/Versions.props index 501438be9d8..8fd41eef767 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -35,7 +35,7 @@ 2.1.1 2.1.0 3.10.0-4.21273.6 - 6.0.100-preview.6.21304.1 + 6.0.100-preview.6.21307.1 16.7.1 4.8.3 5.3.0.1 @@ -65,8 +65,8 @@ 2.4.1 2.0.3 2.4.1 - 6.0.0-beta.21303.2 - 6.0.0-beta.21303.2 + 6.0.0-beta.21304.1 + 6.0.0-beta.21304.1 1.22.0 1.1.2 2.0.0 @@ -77,10 +77,10 @@ 1.1.0-beta.20258.6 1.1.0-beta-21228-01 1.1.0-beta-21228-01 - 6.0.0-beta.21303.2 - 1.0.0-beta.21303.1 + 6.0.0-beta.21304.1 + 1.0.0-beta.21305.1 1.1.0-beta.21228.1 - 1.0.0-prerelease.21303.1 + 1.0.0-prerelease.21304.1 1.1.156402 1.1.152002 6.0.100-preview.5.21254.11 diff --git a/global.json b/global.json index a3127be1474..e33ff368675 100644 --- a/global.json +++ b/global.json @@ -3,7 +3,7 @@ "dotnet": "6.0.100-preview.4.21255.9" }, "msbuild-sdks": { - "Microsoft.DotNet.Arcade.Sdk": "6.0.0-beta.21303.2", - "Microsoft.DotNet.Helix.Sdk": "6.0.0-beta.21303.2" + "Microsoft.DotNet.Arcade.Sdk": "6.0.0-beta.21304.1", + "Microsoft.DotNet.Helix.Sdk": "6.0.0-beta.21304.1" } } From 3edd05c1ee66142f5b015912034a2f3210e9cd9b Mon Sep 17 00:00:00 2001 From: Epsitha Ananth <47157394+epananth@users.noreply.github.com> Date: Tue, 8 Jun 2021 16:25:55 -0700 Subject: [PATCH 145/699] Setting maxClients for parallelism in yaml (#7481) * Set maxClients in yaml * test sdk * minor fix * test sdk * Revert image * revert test sdk * review comments fix * added tag to comment --- eng/publishing/v3/publish-assets.yml | 2 ++ .../tools/SdkTasks/PublishArtifactsInManifest.proj | 7 +++++-- .../src/PublishArtifactsInManifest.cs | 8 +++++++- .../src/PublishArtifactsInManifestBase.cs | 10 +++++++--- 4 files changed, 21 insertions(+), 6 deletions(-) diff --git a/eng/publishing/v3/publish-assets.yml b/eng/publishing/v3/publish-assets.yml index bdb0fe9e462..589ce5c5a1e 100644 --- a/eng/publishing/v3/publish-assets.yml +++ b/eng/publishing/v3/publish-assets.yml @@ -102,6 +102,8 @@ jobs: /p:AzureDevOpsOrg='$(AzDOAccount)' /p:AzureProject='$(AzDOProjectName)' /p:UseStreamingPublishing='true' + /p:StreamingPublishingMaxClients=16 + /p:NonStreamingPublishingMaxClients=12 - template: /eng/common/templates/steps/publish-logs.yml parameters: StageLabel: '${{ parameters.stageName }}' diff --git a/src/Microsoft.DotNet.Arcade.Sdk/tools/SdkTasks/PublishArtifactsInManifest.proj b/src/Microsoft.DotNet.Arcade.Sdk/tools/SdkTasks/PublishArtifactsInManifest.proj index fa4778f6aea..6aea96bc2a2 100644 --- a/src/Microsoft.DotNet.Arcade.Sdk/tools/SdkTasks/PublishArtifactsInManifest.proj +++ b/src/Microsoft.DotNet.Arcade.Sdk/tools/SdkTasks/PublishArtifactsInManifest.proj @@ -109,6 +109,8 @@ false false $(BlobBasePath) + 12 + 16 - + UseStreamingPublishing="$(UseStreamingPublishing)" + StreamingPublishingMaxClients="$(StreamingPublishingMaxClients)" + NonStreamingPublishingMaxClients="$(NonStreamingPublishingMaxClients)"/> diff --git a/src/Microsoft.DotNet.Build.Tasks.Feed/src/PublishArtifactsInManifest.cs b/src/Microsoft.DotNet.Build.Tasks.Feed/src/PublishArtifactsInManifest.cs index 0cdbd667c59..753ed3262cf 100644 --- a/src/Microsoft.DotNet.Build.Tasks.Feed/src/PublishArtifactsInManifest.cs +++ b/src/Microsoft.DotNet.Build.Tasks.Feed/src/PublishArtifactsInManifest.cs @@ -196,6 +196,10 @@ public string BuildQuality /// public bool UseStreamingPublishing { get; set; } = false; + public int StreamingPublishingMaxClients {get; set;} + + public int NonStreamingPublishingMaxClients {get; set;} + /// /// Just an internal flag to keep track whether we published assets via a V3 manifest or not. /// @@ -389,7 +393,9 @@ internal PublishArtifactsInManifestBase ConstructPublishingV3Task(BuildModel bui BuildId = this.BuildId, AzureProject = this.AzureProject, AzureDevOpsOrg = this.AzureDevOpsOrg, - UseStreamingPublishing = this.UseStreamingPublishing + UseStreamingPublishing = this.UseStreamingPublishing, + StreamingPublishingMaxClients = this.StreamingPublishingMaxClients, + NonStreamingPublishingMaxClients = this.NonStreamingPublishingMaxClients }; } } diff --git a/src/Microsoft.DotNet.Build.Tasks.Feed/src/PublishArtifactsInManifestBase.cs b/src/Microsoft.DotNet.Build.Tasks.Feed/src/PublishArtifactsInManifestBase.cs index c336a196ed9..ddbbadb383a 100644 --- a/src/Microsoft.DotNet.Build.Tasks.Feed/src/PublishArtifactsInManifestBase.cs +++ b/src/Microsoft.DotNet.Build.Tasks.Feed/src/PublishArtifactsInManifestBase.cs @@ -69,9 +69,13 @@ public abstract class PublishArtifactsInManifestBase : Microsoft.Build.Utilities /// [Required] public string NugetPath { get; set; } - - private const int StreamingPublishingMaxClients = 16; - private const int NonStreamingPublishingMaxClients = 12; + + /// + /// We are setting StreamingPublishingMaxClients=16 and NonStreamingPublishingMaxClients=12 through publish-asset.yml as we were hitting OOM issue + /// https://github.com/dotnet/core-eng/issues/13098 for more details. + /// + public int StreamingPublishingMaxClients {get; set;} + public int NonStreamingPublishingMaxClients {get; set;} /// /// Maximum number of parallel uploads for the upload tasks. From 172be04f72b6346e400f1ce1831bc3b57677fa8a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C5=99emek=20Vysok=C3=BD?= Date: Wed, 9 Jun 2021 13:16:58 +0200 Subject: [PATCH 146/699] Do not try to kill iOS Simulator when running MacCatalyst (#7487) --- .../Sdk/tools/xharness-runner/xharness-runner.apple.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Microsoft.DotNet.Helix/Sdk/tools/xharness-runner/xharness-runner.apple.sh b/src/Microsoft.DotNet.Helix/Sdk/tools/xharness-runner/xharness-runner.apple.sh index 6e67f9ef4a2..8cfdc978e99 100644 --- a/src/Microsoft.DotNet.Helix/Sdk/tools/xharness-runner/xharness-runner.apple.sh +++ b/src/Microsoft.DotNet.Helix/Sdk/tools/xharness-runner/xharness-runner.apple.sh @@ -149,7 +149,7 @@ exit_code=$? # Kill the simulator just in case when we fail to launch the app # 80 - app crash -if [ $exit_code -eq 80 ]; then +if [ $exit_code -eq 80 ] && [[ "$target" =~ "simulator" ]]; then sudo pkill -9 -f "$simulator_app" fi From ec667476c4c261307ca9b05b6edac7728a24ac7e Mon Sep 17 00:00:00 2001 From: Lukas Lansky Date: Wed, 9 Jun 2021 15:14:43 +0200 Subject: [PATCH 147/699] Retry for InitializeXCopyMSBuild (#7464) * Retry for InitializeXCopyMSBuild * Extract shared retry logic into Retry() function * Actually stop retrying --- eng/common/tools.ps1 | 84 +++++++++++++++++++------------------------- 1 file changed, 37 insertions(+), 47 deletions(-) diff --git a/eng/common/tools.ps1 b/eng/common/tools.ps1 index 2d8a74f7d9e..bc4eabe5211 100644 --- a/eng/common/tools.ps1 +++ b/eng/common/tools.ps1 @@ -193,38 +193,42 @@ function InitializeDotNetCli([bool]$install, [bool]$createSdkLocationFile) { return $global:_DotNetInstallDir = $dotnetRoot } +function Retry($downloadBlock, $maxRetries = 5) { + $retries = 1 + + while($true) { + try { + & $downloadBlock + break + } + catch { + Write-PipelineTelemetryError -Category 'InitializeToolset' -Message $_ + } + + if (++$retries -le $maxRetries) { + $delayInSeconds = [math]::Pow(2, $retries) - 1 # Exponential backoff + Write-Host "Retrying. Waiting for $delayInSeconds seconds before next attempt ($retries of $maxRetries)." + Start-Sleep -Seconds $delayInSeconds + } + else { + Write-PipelineTelemetryError -Category 'InitializeToolset' -Message "Unable to download file in $maxRetries attempts." + break + } + + } +} + function GetDotNetInstallScript([string] $dotnetRoot) { $installScript = Join-Path $dotnetRoot 'dotnet-install.ps1' if (!(Test-Path $installScript)) { Create-Directory $dotnetRoot $ProgressPreference = 'SilentlyContinue' # Don't display the console progress UI - it's a huge perf hit - - $maxRetries = 5 - $retries = 1 - $uri = "https://dot.net/$dotnetInstallScriptVersion/dotnet-install.ps1" - while($true) { - try { - Write-Host "GET $uri" - Invoke-WebRequest $uri -OutFile $installScript - break - } - catch { - Write-Host "Failed to download '$uri'" - Write-Error $_.Exception.Message -ErrorAction Continue - } - - if (++$retries -le $maxRetries) { - $delayInSeconds = [math]::Pow(2, $retries) - 1 # Exponential backoff - Write-Host "Retrying. Waiting for $delayInSeconds seconds before next attempt ($retries of $maxRetries)." - Start-Sleep -Seconds $delayInSeconds - } - else { - throw "Unable to download file in $maxRetries attempts." - } - - } + Retry({ + Write-Host "GET $uri" + Invoke-WebRequest $uri -OutFile $installScript + }) } return $installScript @@ -403,9 +407,13 @@ function InitializeXCopyMSBuild([string]$packageVersion, [bool]$install) { } Create-Directory $packageDir + Write-Host "Downloading $packageName $packageVersion" $ProgressPreference = 'SilentlyContinue' # Don't display the console progress UI - it's a huge perf hit - Invoke-WebRequest "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-eng/nuget/v3/flat2/$packageName/$packageVersion/$packageName.$packageVersion.nupkg" -OutFile $packagePath + Retry({ + Invoke-WebRequest "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-eng/nuget/v3/flat2/$packageName/$packageVersion/$packageName.$packageVersion.nupkg" -OutFile $packagePath + }) + Unzip $packagePath $packageDir } @@ -442,27 +450,9 @@ function LocateVisualStudio([object]$vsRequirements = $null){ if (!(Test-Path $vsWhereExe)) { Create-Directory $vsWhereDir Write-Host 'Downloading vswhere' - $maxRetries = 5 - $retries = 1 - - while($true) { - try { - Invoke-WebRequest "https://netcorenativeassets.blob.core.windows.net/resource-packages/external/windows/vswhere/$vswhereVersion/vswhere.exe" -OutFile $vswhereExe - break - } - catch{ - Write-PipelineTelemetryError -Category 'InitializeToolset' -Message $_ - } - - if (++$retries -le $maxRetries) { - $delayInSeconds = [math]::Pow(2, $retries) - 1 # Exponential backoff - Write-Host "Retrying. Waiting for $delayInSeconds seconds before next attempt ($retries of $maxRetries)." - Start-Sleep -Seconds $delayInSeconds - } - else { - Write-PipelineTelemetryError -Category 'InitializeToolset' -Message "Unable to download file in $maxRetries attempts." - } - } + Retry({ + Invoke-WebRequest "https://netcorenativeassets.blob.core.windows.net/resource-packages/external/windows/vswhere/$vswhereVersion/vswhere.exe" -OutFile $vswhereExe + }) } if (!$vsRequirements) { $vsRequirements = $GlobalJson.tools.vs } From 268ac9b989314393bcd9ebdd2556901e6841250a Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Wed, 9 Jun 2021 14:39:52 +0000 Subject: [PATCH 148/699] Update dependencies from https://github.com/mono/linker build 20210608.1 (#7488) [main] Update dependencies from mono/linker --- eng/Version.Details.xml | 4 ++-- eng/Versions.props | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index ca4ea3a5d7a..011aa73a628 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -47,9 +47,9 @@ https://github.com/dotnet/roslyn a408003c46b125f0c5fdc47472e5f0f5750f1e5d - + https://github.com/mono/linker - 733795cbeaf9a3dc7450594bef39ab518ba52c98 + 802aa459394baa2451ffacc02219ba54ef77ca44 https://github.com/dotnet/sourcelink diff --git a/eng/Versions.props b/eng/Versions.props index 8fd41eef767..cb464a29183 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -35,7 +35,7 @@ 2.1.1 2.1.0 3.10.0-4.21273.6 - 6.0.100-preview.6.21307.1 + 6.0.100-preview.6.21308.1 16.7.1 4.8.3 5.3.0.1 From 13bb7c843fac9ce3652b5f418ca27b9bf3b83754 Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Wed, 9 Jun 2021 16:58:24 +0200 Subject: [PATCH 149/699] Update dependencies from https://dev.azure.com/dnceng/internal/_git/dotnet-symuploader build 20210607.2 (#7489) Microsoft.SymbolUploader , Microsoft.SymbolUploader.Build.Task From Version 1.1.152002 -> To Version 1.1.230702 Co-authored-by: dotnet-maestro[bot] --- eng/Version.Details.xml | 8 ++++---- eng/Versions.props | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index 011aa73a628..ec0a7a574b3 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -1,13 +1,13 @@ - + https://dev.azure.com/dnceng/internal/_git/dotnet-symuploader - 861806bc0dc685441cb3e8f6bd1ce5ed31e6b32b + 284dce2eacfab975734c471c85316ccf8a1e46bf - + https://dev.azure.com/dnceng/internal/_git/dotnet-symuploader - 165896e7efeecb70f01bd011257ead0f56d32c95 + 284dce2eacfab975734c471c85316ccf8a1e46bf diff --git a/eng/Versions.props b/eng/Versions.props index cb464a29183..7c7e5b39b04 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -81,8 +81,8 @@ 1.0.0-beta.21305.1 1.1.0-beta.21228.1 1.0.0-prerelease.21304.1 - 1.1.156402 - 1.1.152002 + 1.1.230702 + 1.1.230702 6.0.100-preview.5.21254.11 From e81d8c9bdc1de22623657afb23fab210dd04ca82 Mon Sep 17 00:00:00 2001 From: John Luo Date: Wed, 9 Jun 2021 13:49:44 -0700 Subject: [PATCH 150/699] Migrate GenerateFileFromTemplate to Microsoft.DotNet.Build.Tasks.Templating (#7403) Co-authored-by: Viktor Hofer Co-authored-by: Doug Bunting <6431421+dougbu@users.noreply.github.com> Co-authored-by: Rainer Sigwald --- Arcade.sln | 29 ++++ .../src/GenerateFileFromTemplate.cs | 152 ++++++++++++++++++ .../src/MSBuildListSplitter.cs | 43 +++++ ...osoft.DotNet.Build.Tasks.Templating.csproj | 29 ++++ ...rosoft.DotNet.Build.Tasks.Templating.props | 10 ++ .../test/GenerateFileFromTemplateTests.cs | 102 ++++++++++++ ...DotNet.Build.Tasks.Templating.Tests.csproj | 22 +++ .../test/testassets/Directory.Build.props.in | 6 + .../Directory.Build.props.malformedbraces.in | 6 + .../Directory.Build.props.nobraces.in | 6 + 10 files changed, 405 insertions(+) create mode 100644 src/Microsoft.DotNet.Build.Tasks.Templating/src/GenerateFileFromTemplate.cs create mode 100644 src/Microsoft.DotNet.Build.Tasks.Templating/src/MSBuildListSplitter.cs create mode 100644 src/Microsoft.DotNet.Build.Tasks.Templating/src/Microsoft.DotNet.Build.Tasks.Templating.csproj create mode 100644 src/Microsoft.DotNet.Build.Tasks.Templating/src/build/Microsoft.DotNet.Build.Tasks.Templating.props create mode 100644 src/Microsoft.DotNet.Build.Tasks.Templating/test/GenerateFileFromTemplateTests.cs create mode 100644 src/Microsoft.DotNet.Build.Tasks.Templating/test/Microsoft.DotNet.Build.Tasks.Templating.Tests.csproj create mode 100644 src/Microsoft.DotNet.Build.Tasks.Templating/test/testassets/Directory.Build.props.in create mode 100644 src/Microsoft.DotNet.Build.Tasks.Templating/test/testassets/Directory.Build.props.malformedbraces.in create mode 100644 src/Microsoft.DotNet.Build.Tasks.Templating/test/testassets/Directory.Build.props.nobraces.in diff --git a/Arcade.sln b/Arcade.sln index 3f79659d1cc..4fb2e750292 100644 --- a/Arcade.sln +++ b/Arcade.sln @@ -139,6 +139,10 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.DotNet.Build.Task EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.DotNet.Build.Tasks.Workloads.Tests", "src\Microsoft.DotNet.Build.Tasks.Workloads.Tests\Microsoft.DotNet.Build.Tasks.Workloads.Tests.csproj", "{0B5D3C20-EB58-4A82-A3AA-2E626A17B35D}" EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.DotNet.Build.Tasks.Templating", "src\Microsoft.DotNet.Build.Tasks.Templating\src\Microsoft.DotNet.Build.Tasks.Templating.csproj", "{AED823B2-2167-408E-9732-ECAD854FDCA5}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.DotNet.Build.Tasks.Templating.Tests", "src\Microsoft.DotNet.Build.Tasks.Templating\test\Microsoft.DotNet.Build.Tasks.Templating.Tests.csproj", "{FB4168D5-6EA6-4777-AD4F-95758C177FE8}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -877,6 +881,30 @@ Global {0B5D3C20-EB58-4A82-A3AA-2E626A17B35D}.Release|x64.Build.0 = Release|Any CPU {0B5D3C20-EB58-4A82-A3AA-2E626A17B35D}.Release|x86.ActiveCfg = Release|Any CPU {0B5D3C20-EB58-4A82-A3AA-2E626A17B35D}.Release|x86.Build.0 = Release|Any CPU + {AED823B2-2167-408E-9732-ECAD854FDCA5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {AED823B2-2167-408E-9732-ECAD854FDCA5}.Debug|Any CPU.Build.0 = Debug|Any CPU + {AED823B2-2167-408E-9732-ECAD854FDCA5}.Debug|x64.ActiveCfg = Debug|Any CPU + {AED823B2-2167-408E-9732-ECAD854FDCA5}.Debug|x64.Build.0 = Debug|Any CPU + {AED823B2-2167-408E-9732-ECAD854FDCA5}.Debug|x86.ActiveCfg = Debug|Any CPU + {AED823B2-2167-408E-9732-ECAD854FDCA5}.Debug|x86.Build.0 = Debug|Any CPU + {AED823B2-2167-408E-9732-ECAD854FDCA5}.Release|Any CPU.ActiveCfg = Release|Any CPU + {AED823B2-2167-408E-9732-ECAD854FDCA5}.Release|Any CPU.Build.0 = Release|Any CPU + {AED823B2-2167-408E-9732-ECAD854FDCA5}.Release|x64.ActiveCfg = Release|Any CPU + {AED823B2-2167-408E-9732-ECAD854FDCA5}.Release|x64.Build.0 = Release|Any CPU + {AED823B2-2167-408E-9732-ECAD854FDCA5}.Release|x86.ActiveCfg = Release|Any CPU + {AED823B2-2167-408E-9732-ECAD854FDCA5}.Release|x86.Build.0 = Release|Any CPU + {FB4168D5-6EA6-4777-AD4F-95758C177FE8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {FB4168D5-6EA6-4777-AD4F-95758C177FE8}.Debug|Any CPU.Build.0 = Debug|Any CPU + {FB4168D5-6EA6-4777-AD4F-95758C177FE8}.Debug|x64.ActiveCfg = Debug|Any CPU + {FB4168D5-6EA6-4777-AD4F-95758C177FE8}.Debug|x64.Build.0 = Debug|Any CPU + {FB4168D5-6EA6-4777-AD4F-95758C177FE8}.Debug|x86.ActiveCfg = Debug|Any CPU + {FB4168D5-6EA6-4777-AD4F-95758C177FE8}.Debug|x86.Build.0 = Debug|Any CPU + {FB4168D5-6EA6-4777-AD4F-95758C177FE8}.Release|Any CPU.ActiveCfg = Release|Any CPU + {FB4168D5-6EA6-4777-AD4F-95758C177FE8}.Release|Any CPU.Build.0 = Release|Any CPU + {FB4168D5-6EA6-4777-AD4F-95758C177FE8}.Release|x64.ActiveCfg = Release|Any CPU + {FB4168D5-6EA6-4777-AD4F-95758C177FE8}.Release|x64.Build.0 = Release|Any CPU + {FB4168D5-6EA6-4777-AD4F-95758C177FE8}.Release|x86.ActiveCfg = Release|Any CPU + {FB4168D5-6EA6-4777-AD4F-95758C177FE8}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -913,6 +941,7 @@ Global {8BBF14AC-48F0-4282-910E-48E816021660} = {C53DD924-C212-49EA-9BC4-1827421361EF} {B5E9D9D8-59E0-49F8-9C3C-75138A2D452C} = {C53DD924-C212-49EA-9BC4-1827421361EF} {0B5D3C20-EB58-4A82-A3AA-2E626A17B35D} = {C53DD924-C212-49EA-9BC4-1827421361EF} + {FB4168D5-6EA6-4777-AD4F-95758C177FE8} = {C53DD924-C212-49EA-9BC4-1827421361EF} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {32B9C883-432E-4FC8-A1BF-090EB033DD5B} diff --git a/src/Microsoft.DotNet.Build.Tasks.Templating/src/GenerateFileFromTemplate.cs b/src/Microsoft.DotNet.Build.Tasks.Templating/src/GenerateFileFromTemplate.cs new file mode 100644 index 00000000000..140e1bd01a1 --- /dev/null +++ b/src/Microsoft.DotNet.Build.Tasks.Templating/src/GenerateFileFromTemplate.cs @@ -0,0 +1,152 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +using System.Collections.Generic; +using System.IO; +using System.Text; +using Microsoft.Build.Framework; +using Microsoft.Build.Utilities; + +namespace Microsoft.DotNet.Build.Tasks.Templating +{ + /// + /// + /// Generates a new file at . + /// + /// + /// The can define variables for substitution using . + /// + /// + /// The input file might look like this: + /// + /// 2 + 2 = ${Sum} + /// + /// When the task is invoked like this, it will produce "2 + 2 = 4" + /// + /// <GenerateFileFromTemplate Properties="Sum=4;OtherValue=123;" ... > + /// + /// + /// + public class GenerateFileFromTemplate : Task + { + /// + /// The template file using the variable syntax ${VarName}. + /// If your template file needs to output this format, you can escape the dollar sign with a backtick e.g. `${NotReplaced}. + /// + [Required] + public string TemplateFile { get; set; } + + /// + /// The destination for the generated file. + /// + [Required] + public string OutputPath { get; set; } + + /// + /// Key=Value pairs of values, separated by semicolons e.g. Properties="Sum=4;OtherValue=123;". + /// + [Required] + public string[] Properties { get; set; } + + /// + /// The destination for the generated file resolved by this task. + /// + [Output] + public string ResolvedOutputPath { get; set; } + + public override bool Execute() + { + ResolvedOutputPath = Path.GetFullPath(OutputPath.Replace('\\', '/')); + + if (!File.Exists(TemplateFile)) + { + Log.LogError($"File {TemplateFile} does not exist"); + return false; + } + + IDictionary values = MSBuildListSplitter.GetNamedProperties(Properties, Log); + string template = File.ReadAllText(TemplateFile); + + string result = Replace(template, values); + Directory.CreateDirectory(Path.GetDirectoryName(ResolvedOutputPath)); + File.WriteAllText(ResolvedOutputPath, result); + + return !Log.HasLoggedErrors; + } + + public string Replace(string template, IDictionary values) + { + StringBuilder sb = new(); + StringBuilder varNameSb = new(); + int line = 1; + for (int i = 0; i < template.Length; i++) + { + char templateChar = template[i]; + char nextTemplateChar = i + 1 >= template.Length + ? '\0' + : template[i + 1]; + + // count lines in the template file + if (templateChar == '\n') + { + line++; + } + + if (templateChar == '`' && (nextTemplateChar == '$' || nextTemplateChar == '`')) + { + // skip the backtick for known escape characters + i++; + sb.Append(nextTemplateChar); + continue; + } + + if (templateChar != '$' || nextTemplateChar != '{') + { + // variables begin with ${. Moving on. + sb.Append(templateChar); + continue; + } + + varNameSb.Clear(); + i += 2; + for (; i < template.Length; i++) + { + templateChar = template[i]; + if (templateChar != '}') + { + varNameSb.Append(templateChar); + } + else + { + // Found the end of the variable substitution + string varName = varNameSb.ToString(); + if (values.TryGetValue(varName, out string value)) + { + sb.Append(value); + } + else + { + Log.LogWarning(null, null, null, TemplateFile, + line, 0, 0, 0, + message: $"No property value is available for '{varName}'"); + } + + varNameSb.Clear(); + break; + } + } + + if (varNameSb.Length > 0) + { + Log.LogWarning(null, null, null, TemplateFile, + line, 0, 0, 0, + message: "Expected closing bracket for variable placeholder. No substitution will be made."); + sb.Append("${").Append(varNameSb.ToString()); + } + } + + return sb.ToString(); + } + } +} + diff --git a/src/Microsoft.DotNet.Build.Tasks.Templating/src/MSBuildListSplitter.cs b/src/Microsoft.DotNet.Build.Tasks.Templating/src/MSBuildListSplitter.cs new file mode 100644 index 00000000000..9f37e10fde7 --- /dev/null +++ b/src/Microsoft.DotNet.Build.Tasks.Templating/src/MSBuildListSplitter.cs @@ -0,0 +1,43 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +using System; +using System.Collections.Generic; +using Microsoft.Build.Utilities; + +namespace Microsoft.DotNet.Build.Tasks.Templating +{ + internal static class MSBuildListSplitter + { + public static IDictionary GetNamedProperties(string[] input, TaskLoggingHelper log) + { + Dictionary values = new(StringComparer.OrdinalIgnoreCase); + if (input == null) + { + return values; + } + + foreach (string item in input) + { + int splitIdx = item.IndexOf('='); + if (splitIdx < 0) + { + log.LogWarning($"Property: {item} does not have a valid '=' separator"); + continue; + } + + string key = item.Substring(0, splitIdx).Trim(); + if (string.IsNullOrEmpty(key)) + { + log.LogWarning($"Property: {item} does not have a valid property name"); + continue; + } + + string value = item.Substring(splitIdx + 1); + values[key] = value; + } + + return values; + } + } +} diff --git a/src/Microsoft.DotNet.Build.Tasks.Templating/src/Microsoft.DotNet.Build.Tasks.Templating.csproj b/src/Microsoft.DotNet.Build.Tasks.Templating/src/Microsoft.DotNet.Build.Tasks.Templating.csproj new file mode 100644 index 00000000000..5ff51a445ad --- /dev/null +++ b/src/Microsoft.DotNet.Build.Tasks.Templating/src/Microsoft.DotNet.Build.Tasks.Templating.csproj @@ -0,0 +1,29 @@ + + + + + netstandard2.0 + Templating task package + Arcade Build Tool Templating + false + false + true + tools\ + true + true + false + + + + + build + + + + + + + + + + \ No newline at end of file diff --git a/src/Microsoft.DotNet.Build.Tasks.Templating/src/build/Microsoft.DotNet.Build.Tasks.Templating.props b/src/Microsoft.DotNet.Build.Tasks.Templating/src/build/Microsoft.DotNet.Build.Tasks.Templating.props new file mode 100644 index 00000000000..4baeb5b308f --- /dev/null +++ b/src/Microsoft.DotNet.Build.Tasks.Templating/src/build/Microsoft.DotNet.Build.Tasks.Templating.props @@ -0,0 +1,10 @@ + + + + + $(MSBuildThisFileDirectory)..\tools\netstandard2.0\Microsoft.DotNet.Build.Tasks.Templating.dll + + + + + diff --git a/src/Microsoft.DotNet.Build.Tasks.Templating/test/GenerateFileFromTemplateTests.cs b/src/Microsoft.DotNet.Build.Tasks.Templating/test/GenerateFileFromTemplateTests.cs new file mode 100644 index 00000000000..204cbf55e04 --- /dev/null +++ b/src/Microsoft.DotNet.Build.Tasks.Templating/test/GenerateFileFromTemplateTests.cs @@ -0,0 +1,102 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +using System; +using System.IO; +using Microsoft.Arcade.Test.Common; +using Xunit; + +namespace Microsoft.DotNet.Build.Tasks.Templating.Tests +{ + public class GenerateFileFromTemplateTests + { + [Fact] + public void GenerateFileFromTemplate_SubstitutesValidProperties() + { + string tempDir = Path.Combine(Path.GetTempPath(), Guid.NewGuid().ToString()); + string filePath = Path.Combine(tempDir, "Directory.Build.props"); + + try + { + GenerateFileFromTemplate task = new(); + task.TemplateFile = GetFullPath("Directory.Build.props.in"); + task.OutputPath = filePath; + task.Properties = new[] { "DefaultNetCoreTargetFramework=net6.0" }; + + Assert.True(task.Execute()); + Assert.Equal(ReadAllText("Directory.Build.props.in").Replace("${DefaultNetCoreTargetFramework}", "net6.0"), File.ReadAllText(filePath)); + } + finally + { + Directory.Delete(tempDir, true); + } + } + + [Theory] + [InlineData("DefaultNetCoreTargetFramework=")] + [InlineData("=net6.0")] + [InlineData("net6.0")] + [InlineData("DefaultNetCoreTargetFramework:net6.0")] + [InlineData("Default_NetCore_Target_Framework=net6.0")] + public void GenerateFileFromTemplate_RemovesInvalidProperties(string invalidProperty) + { + string tempDir = Path.Combine(Path.GetTempPath(), Guid.NewGuid().ToString()); + string filePath = Path.Combine(tempDir, "Directory.Build.props"); + + try + { + GenerateFileFromTemplate task = new(); + task.BuildEngine = new MockBuildEngine(); + task.TemplateFile = GetFullPath("Directory.Build.props.in"); + task.OutputPath = filePath; + task.Properties = new[] { invalidProperty }; + + Assert.True(task.Execute()); + Assert.Equal(ReadAllText("Directory.Build.props.in").Replace("${DefaultNetCoreTargetFramework}", string.Empty), File.ReadAllText(filePath)); + } + finally + { + Directory.Delete(tempDir, true); + } + } + + [Theory] + [InlineData("Directory.Build.props.malformedbraces.in")] + [InlineData("Directory.Build.props.nobraces.in")] + public void GenerateFileFromTemplate_IgnoresMalformedTemplate(string filename) + { + string tempDir = Path.Combine(Path.GetTempPath(), Guid.NewGuid().ToString()); + string filePath = Path.Combine(tempDir, "Directory.Build.props"); + + try + { + GenerateFileFromTemplate task = new(); + task.BuildEngine = new MockBuildEngine(); + task.TemplateFile = GetFullPath(filename); + task.OutputPath = filePath; + task.Properties = new[] { "DefaultNetCoreTargetFramework=net6.0" }; + + Assert.True(task.Execute()); + Assert.Equal(ReadAllText(filename), File.ReadAllText(filePath)); + } + finally + { + Directory.Delete(tempDir, true); + } + } + + public static string GetFullPath(string relativeTestInputPath) + { + return Path.Combine( + Path.GetDirectoryName(typeof(GenerateFileFromTemplateTests).Assembly.Location), + "testassets", + relativeTestInputPath); + } + + public static string ReadAllText(string relativeTestInputPath) + { + string path = GetFullPath(relativeTestInputPath); + return File.ReadAllText(path); + } + } +} diff --git a/src/Microsoft.DotNet.Build.Tasks.Templating/test/Microsoft.DotNet.Build.Tasks.Templating.Tests.csproj b/src/Microsoft.DotNet.Build.Tasks.Templating/test/Microsoft.DotNet.Build.Tasks.Templating.Tests.csproj new file mode 100644 index 00000000000..6d74739e160 --- /dev/null +++ b/src/Microsoft.DotNet.Build.Tasks.Templating/test/Microsoft.DotNet.Build.Tasks.Templating.Tests.csproj @@ -0,0 +1,22 @@ + + + + net472;netcoreapp3.1 + + + + + + + + + + Always + + + + + + + + diff --git a/src/Microsoft.DotNet.Build.Tasks.Templating/test/testassets/Directory.Build.props.in b/src/Microsoft.DotNet.Build.Tasks.Templating/test/testassets/Directory.Build.props.in new file mode 100644 index 00000000000..53438eec736 --- /dev/null +++ b/src/Microsoft.DotNet.Build.Tasks.Templating/test/testassets/Directory.Build.props.in @@ -0,0 +1,6 @@ + + + ${DefaultNetCoreTargetFramework} + true + + \ No newline at end of file diff --git a/src/Microsoft.DotNet.Build.Tasks.Templating/test/testassets/Directory.Build.props.malformedbraces.in b/src/Microsoft.DotNet.Build.Tasks.Templating/test/testassets/Directory.Build.props.malformedbraces.in new file mode 100644 index 00000000000..ae2a552f86e --- /dev/null +++ b/src/Microsoft.DotNet.Build.Tasks.Templating/test/testassets/Directory.Build.props.malformedbraces.in @@ -0,0 +1,6 @@ + + + ${DefaultNetCoreTargetFramework + true + + \ No newline at end of file diff --git a/src/Microsoft.DotNet.Build.Tasks.Templating/test/testassets/Directory.Build.props.nobraces.in b/src/Microsoft.DotNet.Build.Tasks.Templating/test/testassets/Directory.Build.props.nobraces.in new file mode 100644 index 00000000000..fd0defc397e --- /dev/null +++ b/src/Microsoft.DotNet.Build.Tasks.Templating/test/testassets/Directory.Build.props.nobraces.in @@ -0,0 +1,6 @@ + + + DefaultNetCoreTargetFramework + true + + \ No newline at end of file From a4191734058802ac065b0f3270b76d2f0f3a60cd Mon Sep 17 00:00:00 2001 From: Viktor Hofer Date: Thu, 10 Jun 2021 17:41:41 +0200 Subject: [PATCH 151/699] Normalize RepoRoot to include trailing slash (#7498) * Normalize RepoRoot to include trailing slash The Arcade SDK defines the RepoRoot repository [with a trailing slash](https://github.com/dotnet/arcade/blob/e81d8c9bdc1de22623657afb23fab210dd04ca82/src/Microsoft.DotNet.Arcade.Sdk/tools/RepoLayout.props#L23) but the build scripts (build.ps1 and build.sh) pass in the property without a trailing slash which makes the use of it inconsistent and led to this source build patch: https://github.com/dotnet/runtime/blob/23e4735e5cc9956d3f3b351a252f0b1622a14cec/eng/source-build-patches/0004-Add-trailing-path-separator-to-repo_root.patch. Normalizing the variable in the build scripts so that the property always contains the trailing slash. --- eng/common/dotnet-install.sh | 2 +- eng/common/internal-feed-operations.ps1 | 6 +++--- eng/common/internal-feed-operations.sh | 2 +- eng/common/tools.ps1 | 7 +++++-- eng/common/tools.sh | 9 +++++---- src/Microsoft.DotNet.Arcade.Sdk/tools/Build.proj | 9 +++------ 6 files changed, 18 insertions(+), 17 deletions(-) diff --git a/eng/common/dotnet-install.sh b/eng/common/dotnet-install.sh index d6efeb44340..fdfeea66e7d 100755 --- a/eng/common/dotnet-install.sh +++ b/eng/common/dotnet-install.sh @@ -70,7 +70,7 @@ case $cpuname in ;; esac -dotnetRoot="$repo_root/.dotnet" +dotnetRoot="${repo_root}.dotnet" if [[ $architecture != "" ]] && [[ $architecture != $buildarch ]]; then dotnetRoot="$dotnetRoot/$architecture" fi diff --git a/eng/common/internal-feed-operations.ps1 b/eng/common/internal-feed-operations.ps1 index 418c09930cf..92b77347d99 100644 --- a/eng/common/internal-feed-operations.ps1 +++ b/eng/common/internal-feed-operations.ps1 @@ -45,11 +45,11 @@ function SetupCredProvider { # Then, we set the 'VSS_NUGET_EXTERNAL_FEED_ENDPOINTS' environment variable to restore from the stable # feeds successfully - $nugetConfigPath = "$RepoRoot\NuGet.config" + $nugetConfigPath = Join-Path $RepoRoot "NuGet.config" if (-Not (Test-Path -Path $nugetConfigPath)) { Write-PipelineTelemetryError -Category 'Build' -Message 'NuGet.config file not found in repo root!' - ExitWithExitCode 1 + ExitWithExitCode 1 } $endpoints = New-Object System.Collections.ArrayList @@ -85,7 +85,7 @@ function SetupCredProvider { #Workaround for https://github.com/microsoft/msbuild/issues/4430 function InstallDotNetSdkAndRestoreArcade { - $dotnetTempDir = "$RepoRoot\dotnet" + $dotnetTempDir = Join-Path $RepoRoot "dotnet" $dotnetSdkVersion="2.1.507" # After experimentation we know this version works when restoring the SDK (compared to 3.0.*) $dotnet = "$dotnetTempDir\dotnet.exe" $restoreProjPath = "$PSScriptRoot\restore.proj" diff --git a/eng/common/internal-feed-operations.sh b/eng/common/internal-feed-operations.sh index e2233e78122..9378223ba09 100755 --- a/eng/common/internal-feed-operations.sh +++ b/eng/common/internal-feed-operations.sh @@ -39,7 +39,7 @@ function SetupCredProvider { # Then, we set the 'VSS_NUGET_EXTERNAL_FEED_ENDPOINTS' environment variable to restore from the stable # feeds successfully - local nugetConfigPath="$repo_root/NuGet.config" + local nugetConfigPath="{$repo_root}NuGet.config" if [ ! "$nugetConfigPath" ]; then Write-PipelineTelemetryError -category 'Build' "NuGet.config file not found in repo's root!" diff --git a/eng/common/tools.ps1 b/eng/common/tools.ps1 index bc4eabe5211..06871599323 100644 --- a/eng/common/tools.ps1 +++ b/eng/common/tools.ps1 @@ -702,7 +702,10 @@ function MSBuild-Core() { } foreach ($arg in $args) { - if ($arg -ne $null -and $arg.Trim() -ne "") { + if ($null -ne $arg -and $arg.Trim() -ne "") { + if ($arg.EndsWith('\')) { + $arg = $arg + "\" + } $cmdArgs += " `"$arg`"" } } @@ -774,7 +777,7 @@ function Get-Darc($version) { . $PSScriptRoot\pipeline-logging-functions.ps1 -$RepoRoot = Resolve-Path (Join-Path $PSScriptRoot '..\..') +$RepoRoot = Resolve-Path (Join-Path $PSScriptRoot '..\..\') $EngRoot = Resolve-Path (Join-Path $PSScriptRoot '..') $ArtifactsDir = Join-Path $RepoRoot 'artifacts' $ToolsetDir = Join-Path $ArtifactsDir 'toolset' diff --git a/eng/common/tools.sh b/eng/common/tools.sh index 5fad1846e5a..05ca99c6b28 100755 --- a/eng/common/tools.sh +++ b/eng/common/tools.sh @@ -485,13 +485,14 @@ _script_dir=`dirname "$_ResolvePath"` eng_root=`cd -P "$_script_dir/.." && pwd` repo_root=`cd -P "$_script_dir/../.." && pwd` -artifacts_dir="$repo_root/artifacts" +repo_root="${repo_root}/" +artifacts_dir="${repo_root}artifacts" toolset_dir="$artifacts_dir/toolset" -tools_dir="$repo_root/.tools" +tools_dir="${repo_root}.tools" log_dir="$artifacts_dir/log/$configuration" temp_dir="$artifacts_dir/tmp/$configuration" -global_json_file="$repo_root/global.json" +global_json_file="${repo_root}global.json" # determine if global.json contains a "runtimes" entry global_json_has_runtimes=false if command -v jq &> /dev/null; then @@ -504,7 +505,7 @@ fi # HOME may not be defined in some scenarios, but it is required by NuGet if [[ -z $HOME ]]; then - export HOME="$repo_root/artifacts/.home/" + export HOME="${repo_root}artifacts/.home/" mkdir -p "$HOME" fi diff --git a/src/Microsoft.DotNet.Arcade.Sdk/tools/Build.proj b/src/Microsoft.DotNet.Arcade.Sdk/tools/Build.proj index 5d67c1c7f62..8c8fa7ef037 100644 --- a/src/Microsoft.DotNet.Arcade.Sdk/tools/Build.proj +++ b/src/Microsoft.DotNet.Arcade.Sdk/tools/Build.proj @@ -1,5 +1,5 @@ - + - <_RepoRootOriginal>$(RepoRoot) - $([System.IO.Path]::GetFullPath('$(RepoRoot)/')) - <_OriginalProjectsValue>$(Projects) @@ -80,8 +77,8 @@ - - + + From f6bb0b1b86b33f961686c6bc9da94b93fa7faee1 Mon Sep 17 00:00:00 2001 From: Matt Mitchell Date: Thu, 10 Jun 2021 12:58:36 -0700 Subject: [PATCH 152/699] Add new channels (#7501) P6/P7 internal, and RC1/RC2 public and internal. --- .../src/model/PublishingConstants.cs | 202 +++++++++++++++++- 1 file changed, 201 insertions(+), 1 deletion(-) diff --git a/src/Microsoft.DotNet.Build.Tasks.Feed/src/model/PublishingConstants.cs b/src/Microsoft.DotNet.Build.Tasks.Feed/src/model/PublishingConstants.cs index b8ab1b7c0c0..8d2b6673f70 100644 --- a/src/Microsoft.DotNet.Build.Tasks.Feed/src/model/PublishingConstants.cs +++ b/src/Microsoft.DotNet.Build.Tasks.Feed/src/model/PublishingConstants.cs @@ -96,6 +96,10 @@ public enum BuildQuality private const string FeedDotNet6Transport = "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet6-transport/nuget/v3/index.json"; private const string FeedDotNet6Symbols = "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet6-symbols/nuget/v3/index.json"; + private const string FeedDotNet6InternalShipping = "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet6-internal/nuget/v3/index.json"; + private const string FeedDotNet6InternalTransport = "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet6-internal-transport/nuget/v3/index.json"; + private const string FeedDotNet6InternalSymbols = "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet6-internal-symbols/nuget/v3/index.json"; + private const string FeedDotNet5InternalShipping = "https://pkgs.dev.azure.com/dnceng/internal/_packaging/dotnet5-internal/nuget/v3/index.json"; private const string FeedDotNet5InternalTransport = "https://pkgs.dev.azure.com/dnceng/internal/_packaging/dotnet5-internal-transport/nuget/v3/index.json"; private const string FeedDotNet5InternalSymbols = "https://pkgs.dev.azure.com/dnceng/internal/_packaging/dotnet5-internal-symbols/nuget/v3/index.json"; @@ -143,6 +147,20 @@ public enum BuildQuality PublicAndInternalSymbolTargets, filenamesToExclude: FilenamesToExclude), + // ".NET 6 Internal", + new TargetChannelConfig( + 2097, + true, + PublishingInfraVersion.All, + "internal/6.0", + FeedDotNet6InternalShipping, + FeedDotNet6InternalTransport, + FeedDotNet6InternalSymbols, + FeedInternalForChecksums, + FeedInternalForInstallers, + InternalSymbolTargets, + filenamesToExclude: FilenamesToExclude), + // ".NET 6 SDK 6.0.1xx", new TargetChannelConfig( 1792, @@ -157,6 +175,20 @@ public enum BuildQuality PublicAndInternalSymbolTargets, filenamesToExclude: FilenamesToExclude), + // ".NET 6 SDK 6.0.1xx Internal", + new TargetChannelConfig( + 2098, + true, + PublishingInfraVersion.All, + "internal/6.0.1xx", + FeedDotNet6InternalShipping, + FeedDotNet6InternalTransport, + FeedDotNet6InternalSymbols, + FeedInternalForChecksums, + FeedInternalForInstallers, + InternalSymbolTargets, + filenamesToExclude: FilenamesToExclude), + // ".NET 6 Preview 1", new TargetChannelConfig( 1670, @@ -297,6 +329,20 @@ public enum BuildQuality PublicAndInternalSymbolTargets, filenamesToExclude: FilenamesToExclude), + // ".NET 6 Preview 6 Internal" , + new TargetChannelConfig( + 2092, + true, + PublishingInfraVersion.All, + "internal/6.0-preview6", + FeedDotNet6InternalShipping, + FeedDotNet6InternalTransport, + FeedDotNet6InternalSymbols, + FeedInternalForChecksums, + FeedInternalForInstallers, + InternalSymbolTargets, + filenamesToExclude: FilenamesToExclude), + // ".NET 6.0.1xx SDK Preview 6", new TargetChannelConfig( 1965, @@ -311,6 +357,20 @@ public enum BuildQuality PublicAndInternalSymbolTargets, filenamesToExclude: FilenamesToExclude), + // ".NET 6.0.1xx SDK Preview 6 Internal", + new TargetChannelConfig( + 2086, + true, + PublishingInfraVersion.All, + "internal/6.0.1xx-preview6", + FeedDotNet6InternalShipping, + FeedDotNet6InternalTransport, + FeedDotNet6InternalSymbols, + FeedInternalForChecksums, + FeedInternalForInstallers, + InternalSymbolTargets, + filenamesToExclude: FilenamesToExclude), + // ".NET 6 Preview 7" , new TargetChannelConfig( 1964, @@ -325,6 +385,20 @@ public enum BuildQuality PublicAndInternalSymbolTargets, filenamesToExclude: FilenamesToExclude), + // ".NET 6 Preview 7 Internal", + new TargetChannelConfig( + 2091, + true, + PublishingInfraVersion.All, + "internal/6.0-preview7", + FeedDotNet6InternalShipping, + FeedDotNet6InternalTransport, + FeedDotNet6InternalSymbols, + FeedInternalForChecksums, + FeedInternalForInstallers, + InternalSymbolTargets, + filenamesToExclude: FilenamesToExclude), + // ".NET 6.0.1xx SDK Preview 7", new TargetChannelConfig( 1966, @@ -339,6 +413,132 @@ public enum BuildQuality PublicAndInternalSymbolTargets, filenamesToExclude: FilenamesToExclude), + // ".NET 6.0.1xx SDK Preview 7 Internal", + new TargetChannelConfig( + 2085, + true, + PublishingInfraVersion.All, + "internal/6.0.1xx-preview7", + FeedDotNet6InternalShipping, + FeedDotNet6InternalTransport, + FeedDotNet6InternalSymbols, + FeedInternalForChecksums, + FeedInternalForInstallers, + InternalSymbolTargets, + filenamesToExclude: FilenamesToExclude), + + // ".NET 6 RC 1" , + new TargetChannelConfig( + 2095, + false, + PublishingInfraVersion.All, + "6.0-rc1", + FeedDotNet6Shipping, + FeedDotNet6Transport, + FeedDotNet6Symbols, + FeedForChecksums, + FeedForInstallers, + PublicAndInternalSymbolTargets, + filenamesToExclude: FilenamesToExclude), + + // ".NET 6 RC 1 Internal", + new TargetChannelConfig( + 2093, + true, + PublishingInfraVersion.All, + "internal/6.0-rc1", + FeedDotNet6InternalShipping, + FeedDotNet6InternalTransport, + FeedDotNet6InternalSymbols, + FeedInternalForChecksums, + FeedInternalForInstallers, + InternalSymbolTargets, + filenamesToExclude: FilenamesToExclude), + + // ".NET 6.0.1xx SDK RC 1", + new TargetChannelConfig( + 2087, + false, + PublishingInfraVersion.All, + "6.0.1xx-rc1", + FeedDotNet6Shipping, + FeedDotNet6Transport, + FeedDotNet6Symbols, + FeedForChecksums, + FeedForInstallers, + PublicAndInternalSymbolTargets, + filenamesToExclude: FilenamesToExclude), + + // ".NET 6.0.1xx SDK RC 1 Internal", + new TargetChannelConfig( + 2088, + true, + PublishingInfraVersion.All, + "internal/6.0.1xx-rc1", + FeedDotNet6InternalShipping, + FeedDotNet6InternalTransport, + FeedDotNet6InternalSymbols, + FeedInternalForChecksums, + FeedInternalForInstallers, + InternalSymbolTargets, + filenamesToExclude: FilenamesToExclude), + + // ".NET 6 RC 2" , + new TargetChannelConfig( + 2096, + false, + PublishingInfraVersion.All, + "6.0-rc2", + FeedDotNet6Shipping, + FeedDotNet6Transport, + FeedDotNet6Symbols, + FeedForChecksums, + FeedForInstallers, + PublicAndInternalSymbolTargets, + filenamesToExclude: FilenamesToExclude), + + // ".NET 6 RC 2 Internal", + new TargetChannelConfig( + 2094, + true, + PublishingInfraVersion.All, + "internal/6.0-rc2", + FeedDotNet6InternalShipping, + FeedDotNet6InternalTransport, + FeedDotNet6InternalSymbols, + FeedInternalForChecksums, + FeedInternalForInstallers, + InternalSymbolTargets, + filenamesToExclude: FilenamesToExclude), + + // ".NET 6.0.1xx SDK RC 2", + new TargetChannelConfig( + 2090, + false, + PublishingInfraVersion.All, + "6.0.1xx-rc2", + FeedDotNet6Shipping, + FeedDotNet6Transport, + FeedDotNet6Symbols, + FeedForChecksums, + FeedForInstallers, + PublicAndInternalSymbolTargets, + filenamesToExclude: FilenamesToExclude), + + // ".NET 6.0.1xx SDK RC 2 Internal", + new TargetChannelConfig( + 2089, + true, + PublishingInfraVersion.All, + "internal/6.0.1xx-rc2", + FeedDotNet6InternalShipping, + FeedDotNet6InternalTransport, + FeedDotNet6InternalSymbols, + FeedInternalForChecksums, + FeedInternalForInstallers, + InternalSymbolTargets, + filenamesToExclude: FilenamesToExclude), + // ".NET 5" (public), new TargetChannelConfig( 1299, @@ -392,7 +592,7 @@ public enum BuildQuality FeedDotNet5InternalSymbols, FeedInternalForChecksums, FeedInternalForInstallers, - PublicAndInternalSymbolTargets, + InternalSymbolTargets, filenamesToExclude: FilenamesToExclude), // ".NET 5 SDK 5.0.2xx" (public), From 9068ce37e9cfef348f194994f1b9f78e6854e325 Mon Sep 17 00:00:00 2001 From: Matt Mitchell Date: Thu, 10 Jun 2021 13:11:53 -0700 Subject: [PATCH 153/699] Add flow from emsdk->runtime (#7455) --- scripts/create-net6-preview-flow.ps1 | 1 + 1 file changed, 1 insertion(+) diff --git a/scripts/create-net6-preview-flow.ps1 b/scripts/create-net6-preview-flow.ps1 index d5850f60fd8..d67150a11d7 100644 --- a/scripts/create-net6-preview-flow.ps1 +++ b/scripts/create-net6-preview-flow.ps1 @@ -66,6 +66,7 @@ Write-Host "Add runtime -> runtime flow" AddFlow https://dev.azure.com/dnceng/internal/_git/dotnet-wpf-int $RuntimeChannel https://github.com/dotnet/wpf $RuntimeBranch EveryBuild AddFlow https://github.com/dotnet/efcore $RuntimeChannel https://github.com/dotnet/aspnetcore $RuntimeBranch EveryBuild AddFlow https://github.com/dotnet/emsdk $RuntimeChannel https://github.com/dotnet/aspnetcore $RuntimeBranch EveryBuild +AddFlow https://github.com/dotnet/emsdk $RuntimeChannel https://github.com/dotnet/runtime $RuntimeBranch EveryBuild AddFlow https://github.com/dotnet/icu $RuntimeChannel https://github.com/dotnet/runtime $RuntimeBranch EveryBuild AddFlow https://github.com/dotnet/runtime $RuntimeChannel https://github.com/dotnet/aspnetcore $RuntimeBranch EveryBuild AddFlow https://github.com/dotnet/runtime $RuntimeChannel https://github.com/dotnet/efcore $RuntimeBranch EveryBuild From a565e0c890d0a325775882542cff7e775db8f8e6 Mon Sep 17 00:00:00 2001 From: Viktor Hofer Date: Thu, 10 Jun 2021 22:56:10 +0200 Subject: [PATCH 154/699] Fix sdk-task invocation by not escaping manually (#7508) Fixes broken official builds and avoid the revert in https://github.com/dotnet/arcade/pull/7507. Msbuild-task escaped the output path manually which conflicted with the escaping mechanism that I added to tools.ps1 in https://github.com/dotnet/arcade/commit/a4191734058802ac065b0f3270b76d2f0f3a60cd. --- eng/common/sdk-task.ps1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/eng/common/sdk-task.ps1 b/eng/common/sdk-task.ps1 index 65f1d75f3d3..af61d35f1d6 100644 --- a/eng/common/sdk-task.ps1 +++ b/eng/common/sdk-task.ps1 @@ -34,7 +34,7 @@ function Print-Usage() { function Build([string]$target) { $logSuffix = if ($target -eq 'Execute') { '' } else { ".$target" } $log = Join-Path $LogDir "$task$logSuffix.binlog" - $outputPath = Join-Path $ToolsetDir "$task\\" + $outputPath = Join-Path $ToolsetDir "$task\" MSBuild $taskProject ` /bl:$log ` From 2189e1dbec35bf817320a0e935d05b20fcc1cca8 Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Thu, 10 Jun 2021 23:22:47 +0000 Subject: [PATCH 155/699] Update dependencies from https://github.com/dotnet/sourcelink build 20210609.1 (#7499) [main] Update dependencies from dotnet/sourcelink --- eng/Version.Details.xml | 4 ++-- eng/Versions.props | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index ec0a7a574b3..80c7898e55d 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -51,12 +51,12 @@ https://github.com/mono/linker 802aa459394baa2451ffacc02219ba54ef77ca44 - + https://github.com/dotnet/sourcelink 4b584dbc392bb1aad49c2eb1ab84d8b489b6dccc - + https://github.com/dotnet/sourcelink 4b584dbc392bb1aad49c2eb1ab84d8b489b6dccc diff --git a/eng/Versions.props b/eng/Versions.props index 7c7e5b39b04..26a7da0350a 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -75,8 +75,8 @@ 2.0.4 1.1.0-beta2-19575-01 1.1.0-beta.20258.6 - 1.1.0-beta-21228-01 - 1.1.0-beta-21228-01 + 1.1.0-beta-21309-01 + 1.1.0-beta-21309-01 6.0.0-beta.21304.1 1.0.0-beta.21305.1 1.1.0-beta.21228.1 From 4d187122a9a667afc05cabd5817dded67c862423 Mon Sep 17 00:00:00 2001 From: Jon Fortescue Date: Fri, 11 Jun 2021 10:11:23 -0700 Subject: [PATCH 156/699] Update OneLocBuild doc (#7496) --- Documentation/OneLocBuild.md | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/Documentation/OneLocBuild.md b/Documentation/OneLocBuild.md index 9d53e7c3463..9a5b7b4f890 100644 --- a/Documentation/OneLocBuild.md +++ b/Documentation/OneLocBuild.md @@ -28,10 +28,11 @@ Onboarding to OneLocBuild is a simple process: `LCL-JUNO-PROD-YOURREPO`. 6. Change your YAML (subbing `'LCL-JUNO-PROD-YOURREPO'` for the package ID given to you) to: ```yaml -- template: /eng/common/templates/job/onelocbuild.yml - parameters: - LclSource: lclFilesfromPackage - LclPackageId: 'LCL-JUNO-PROD-YOURREPO' +- {{ if eq(variables['Build.SourceBranch'], 'refs/heads/main') }}: + - template: /eng/common/templates/job/onelocbuild.yml + parameters: + LclSource: lclFilesfromPackage + LclPackageId: 'LCL-JUNO-PROD-YOURREPO' ``` 7. If using a mirrored repository (your code is mirrored to a trusted repository which your official build uses), add the following parameter to your YAML (subbing e.g. `sdk` for the value): @@ -134,9 +135,9 @@ The parameters that can be passed to the template are as follows: | `CreatePr` | `true` | When set to `true`, instructs the OneLocBuild task to make a PR back to the source repository containing the localized files. | | `AutoCompletePr` | `false` | When set to `true`, instructs the OneLocBuild task to autocomplete the created PR. Requires permissions to bypass any checks on the main branch. | | `UseLfLineEndings` | `true` | When set to `true`, instructs the OneLocBuild task to use LF line endings during check-in rather than CRLF. | -| `GitHubOrg` | `'dotnet'` | The GitHub org to be used when making a PR from a mirrored repository. | -| `MirrorRepo` | `''` | The name of the GitHub repository to make a PR to (when using a mirrored repository). | -| `MirrorBranch` | `'main'` | The branch on GitHub to make a PR to (when using a mirrored repository). | +| `GitHubOrg` | `'dotnet'` | The GitHub organization to be used when making a PR (only used when using a mirrored repository). | +| `MirrorRepo` | `''` | The name of the GitHub repository to make a PR to (only used when using a mirrored repository). | +| `MirrorBranch` | `'main'` | The branch on GitHub to make a PR to (only used when using a mirrored repository). | | `UseCheckedInLocProjectJson` | `false` | When set to `true`, instructs the LocProject.json generation script to use build-time validation rather than build-time generation, as described above. | | `LanguageSet` | `VS_Main_Languages` | This defines the `LanguageSet` of the LocProject.json as described in the [OneLocBuild task documentation](https://ceapex.visualstudio.com/CEINTL/_wiki/wikis/CEINTL.wiki/107/Localization-with-OneLocBuild-Task?anchor=languageset%2C-languages-(required)). | | `LclSource` | `LclFilesInRepo` | This passes the `LclSource` input to the OneLocBuild task as described in [its documentation](https://ceapex.visualstudio.com/CEINTL/_wiki/wikis/CEINTL.wiki/107/Localization-with-OneLocBuild-Task?anchor=languageset%2C-languages-(required)). For most repos, this should be set to `LclFilesfromPackage`. | From b9491777de0b9db454bbb9c6d26fc55df67ff864 Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Fri, 11 Jun 2021 17:40:42 +0000 Subject: [PATCH 157/699] Update dependencies from https://github.com/mono/linker build 20210610.3 (#7512) [main] Update dependencies from mono/linker --- eng/Version.Details.xml | 4 ++-- eng/Versions.props | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index 80c7898e55d..e8fd8ad0990 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -47,9 +47,9 @@ https://github.com/dotnet/roslyn a408003c46b125f0c5fdc47472e5f0f5750f1e5d - + https://github.com/mono/linker - 802aa459394baa2451ffacc02219ba54ef77ca44 + caeaf2a3fb3f636805fdd4881df4f9a539fff8f6 https://github.com/dotnet/sourcelink diff --git a/eng/Versions.props b/eng/Versions.props index 26a7da0350a..eb87c1027a5 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -35,7 +35,7 @@ 2.1.1 2.1.0 3.10.0-4.21273.6 - 6.0.100-preview.6.21308.1 + 6.0.100-preview.6.21310.3 16.7.1 4.8.3 5.3.0.1 From 4a2b475948d498b89fedef7cf890883f49bc1ea3 Mon Sep 17 00:00:00 2001 From: Ricardo Arenas Date: Fri, 11 Jun 2021 11:24:28 -0700 Subject: [PATCH 158/699] update xcopy-msbuild to 16.10.0-preview2 (#7513) --- eng/common/sdk-task.ps1 | 2 +- eng/common/tools.ps1 | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/eng/common/sdk-task.ps1 b/eng/common/sdk-task.ps1 index af61d35f1d6..b1bca63ab1d 100644 --- a/eng/common/sdk-task.ps1 +++ b/eng/common/sdk-task.ps1 @@ -64,7 +64,7 @@ try { $GlobalJson.tools | Add-Member -Name "vs" -Value (ConvertFrom-Json "{ `"version`": `"16.5`" }") -MemberType NoteProperty } if( -not ($GlobalJson.tools.PSObject.Properties.Name -match "xcopy-msbuild" )) { - $GlobalJson.tools | Add-Member -Name "xcopy-msbuild" -Value "16.8.0-preview3" -MemberType NoteProperty + $GlobalJson.tools | Add-Member -Name "xcopy-msbuild" -Value "16.10.0-preview2" -MemberType NoteProperty } if ($GlobalJson.tools."xcopy-msbuild".Trim() -ine "none") { $xcopyMSBuildToolsFolder = InitializeXCopyMSBuild $GlobalJson.tools."xcopy-msbuild" -install $true diff --git a/eng/common/tools.ps1 b/eng/common/tools.ps1 index 06871599323..5619c7aaee1 100644 --- a/eng/common/tools.ps1 +++ b/eng/common/tools.ps1 @@ -312,8 +312,8 @@ function InitializeVisualStudioMSBuild([bool]$install, [object]$vsRequirements = # If the version of msbuild is going to be xcopied, # use this version. Version matches a package here: - # https://dev.azure.com/dnceng/public/_packaging?_a=package&feed=dotnet-eng&package=RoslynTools.MSBuild&protocolType=NuGet&version=16.8.0-preview3&view=overview - $defaultXCopyMSBuildVersion = '16.8.0-preview3' + # https://dev.azure.com/dnceng/public/_packaging?_a=package&feed=dotnet-eng&package=RoslynTools.MSBuild&protocolType=NuGet&version=16.10.0-preview2&view=overview + $defaultXCopyMSBuildVersion = '16.10.0-preview2' if (!$vsRequirements) { $vsRequirements = $GlobalJson.tools.vs } $vsMinVersionStr = if ($vsRequirements.version) { $vsRequirements.version } else { $vsMinVersionReqdStr } @@ -407,7 +407,7 @@ function InitializeXCopyMSBuild([string]$packageVersion, [bool]$install) { } Create-Directory $packageDir - + Write-Host "Downloading $packageName $packageVersion" $ProgressPreference = 'SilentlyContinue' # Don't display the console progress UI - it's a huge perf hit Retry({ @@ -488,7 +488,7 @@ function InitializeBuildTool() { if (Test-Path variable:global:_BuildTool) { # If the requested msbuild parameters do not match, clear the cached variables. if($global:_BuildTool.Contains('ExcludePrereleaseVS') -and $global:_BuildTool.ExcludePrereleaseVS -ne $excludePrereleaseVS) { - Remove-Item variable:global:_BuildTool + Remove-Item variable:global:_BuildTool Remove-Item variable:global:_MSBuildExe } else { return $global:_BuildTool @@ -545,7 +545,7 @@ function GetDefaultMSBuildEngine() { function GetNuGetPackageCachePath() { if ($env:NUGET_PACKAGES -eq $null) { - # Use local cache on CI to ensure deterministic build. + # Use local cache on CI to ensure deterministic build. # Avoid using the http cache as workaround for https://github.com/NuGet/Home/issues/3116 # use global cache in dev builds to avoid cost of downloading packages. # For directory normalization, see also: https://github.com/NuGet/Home/issues/7968 From fc067a0928f1c8ca4ab3471e9f8edb592e96dec4 Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Mon, 14 Jun 2021 12:06:21 +0000 Subject: [PATCH 159/699] [main] Update dependencies from dotnet/xliff-tasks dotnet/arcade (#7518) [main] Update dependencies from dotnet/xliff-tasks dotnet/arcade --- eng/Version.Details.xml | 24 ++++++++++++------------ eng/Versions.props | 8 ++++---- global.json | 4 ++-- 3 files changed, 18 insertions(+), 18 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index e8fd8ad0990..a95a6ae8ff0 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -11,25 +11,25 @@ - + https://github.com/dotnet/arcade - 85a65ea1fca1d0867f699fed44d191358270bf6a + 4a2b475948d498b89fedef7cf890883f49bc1ea3 - + https://github.com/dotnet/arcade - 85a65ea1fca1d0867f699fed44d191358270bf6a + 4a2b475948d498b89fedef7cf890883f49bc1ea3 - + https://github.com/dotnet/arcade - 85a65ea1fca1d0867f699fed44d191358270bf6a + 4a2b475948d498b89fedef7cf890883f49bc1ea3 - + https://github.com/dotnet/arcade - 85a65ea1fca1d0867f699fed44d191358270bf6a + 4a2b475948d498b89fedef7cf890883f49bc1ea3 - + https://github.com/dotnet/arcade - 85a65ea1fca1d0867f699fed44d191358270bf6a + 4a2b475948d498b89fedef7cf890883f49bc1ea3 https://github.com/dotnet/arcade-services @@ -68,9 +68,9 @@ https://github.com/dotnet/symreader-converter c5ba7c88f92e2dde156c324a8c8edc04d9fa4fe0 - + https://github.com/dotnet/xliff-tasks - 256c21df01b1e95ff7514614bf6356bef0a01829 + d4e95f2cca463823ce9c8e3394554883b6e3c091 diff --git a/eng/Versions.props b/eng/Versions.props index eb87c1027a5..14899d18dca 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -65,8 +65,8 @@ 2.4.1 2.0.3 2.4.1 - 6.0.0-beta.21304.1 - 6.0.0-beta.21304.1 + 6.0.0-beta.21311.3 + 6.0.0-beta.21311.3 1.22.0 1.1.2 2.0.0 @@ -77,8 +77,8 @@ 1.1.0-beta.20258.6 1.1.0-beta-21309-01 1.1.0-beta-21309-01 - 6.0.0-beta.21304.1 - 1.0.0-beta.21305.1 + 6.0.0-beta.21311.3 + 1.0.0-beta.21312.1 1.1.0-beta.21228.1 1.0.0-prerelease.21304.1 1.1.230702 diff --git a/global.json b/global.json index e33ff368675..660e274f7a7 100644 --- a/global.json +++ b/global.json @@ -3,7 +3,7 @@ "dotnet": "6.0.100-preview.4.21255.9" }, "msbuild-sdks": { - "Microsoft.DotNet.Arcade.Sdk": "6.0.0-beta.21304.1", - "Microsoft.DotNet.Helix.Sdk": "6.0.0-beta.21304.1" + "Microsoft.DotNet.Arcade.Sdk": "6.0.0-beta.21311.3", + "Microsoft.DotNet.Helix.Sdk": "6.0.0-beta.21311.3" } } From 7f3213cab69f98ade10ac2e8f7d0e1f38a7144b5 Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Mon, 14 Jun 2021 13:20:24 +0000 Subject: [PATCH 160/699] [main] Update dependencies from dotnet/roslyn dotnet/xharness (#7519) [main] Update dependencies from dotnet/roslyn dotnet/xharness --- eng/Version.Details.xml | 8 ++++---- eng/Versions.props | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index a95a6ae8ff0..33ed4abd1bd 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -39,13 +39,13 @@ https://github.com/dotnet/arcade-services cac955fe259cb611f6a29d09209bd717deb69037 - + https://github.com/dotnet/xharness - 12e4fce4088efd078409ee2bb19e50d1c9177742 + d6f8a4ad30908fb210390380eae97264e4fbe8ce - + https://github.com/dotnet/roslyn - a408003c46b125f0c5fdc47472e5f0f5750f1e5d + 473e349f86b0f5c9dd47330cba22e0ea225c85a5 https://github.com/mono/linker diff --git a/eng/Versions.props b/eng/Versions.props index 14899d18dca..2c16860f403 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -34,7 +34,7 @@ 2.0.0 2.1.1 2.1.0 - 3.10.0-4.21273.6 + 3.10.0-4.21310.5 6.0.100-preview.6.21310.3 16.7.1 4.8.3 @@ -80,7 +80,7 @@ 6.0.0-beta.21311.3 1.0.0-beta.21312.1 1.1.0-beta.21228.1 - 1.0.0-prerelease.21304.1 + 1.0.0-prerelease.21314.1 1.1.230702 1.1.230702 6.0.100-preview.5.21254.11 From 1b37bbfcf3bfbec7b7a1405b886dea8c772a008c Mon Sep 17 00:00:00 2001 From: Alex Perovich Date: Mon, 14 Jun 2021 13:44:18 -0700 Subject: [PATCH 161/699] Update sourceIndexPackageVersion (#7520) --- eng/common/templates/job/source-index-stage1.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/eng/common/templates/job/source-index-stage1.yml b/eng/common/templates/job/source-index-stage1.yml index a649d2b5990..6e8aa9f7f21 100644 --- a/eng/common/templates/job/source-index-stage1.yml +++ b/eng/common/templates/job/source-index-stage1.yml @@ -1,6 +1,6 @@ parameters: runAsPublic: false - sourceIndexPackageVersion: 1.0.1-20210421.1 + sourceIndexPackageVersion: 1.0.1-20210614.1 sourceIndexPackageSource: https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-tools/nuget/v3/index.json sourceIndexBuildCommand: powershell -NoLogo -NoProfile -ExecutionPolicy Bypass -Command "eng/common/build.ps1 -restore -build -binarylog -ci" preSteps: [] From 398bdff17042af6ae8131a661860b13ef247ecff Mon Sep 17 00:00:00 2001 From: Anirudh Agnihotry Date: Mon, 14 Jun 2021 13:52:17 -0700 Subject: [PATCH 162/699] Change Object mode for package testing & remove older frameworks & rids (#7510) * use nuget package model and remove old frameworks and rids * some more formatting * fix netcoreapp tests * automatic calculate the min supported dotnet version, add input for all supported frameworks and add min dotnet version for packages contatining netstandard config * add default supported test frameworks item * breaking and grouping SupportedTestFramework --- ...CompatibilePackageTargetFrameworksTests.cs | 140 +++++++++++++++--- ...crosoft.DotNet.PackageTesting.Tests.csproj | 3 +- .../GetCompatiblePackageTargetFrameworks.cs | 101 ++++--------- .../NupkgParser.cs | 46 +----- .../Package.cs | 31 ++-- .../PackageAsset.cs | 30 ---- .../Microsoft.DotNet.PackageTesting.props | 19 +++ 7 files changed, 191 insertions(+), 179 deletions(-) delete mode 100644 src/Microsoft.DotNet.PackageTesting/PackageAsset.cs diff --git a/src/Microsoft.DotNet.PackageTesting.Tests/GetCompatibilePackageTargetFrameworksTests.cs b/src/Microsoft.DotNet.PackageTesting.Tests/GetCompatibilePackageTargetFrameworksTests.cs index 10b0c3bbd42..949b15ceccc 100644 --- a/src/Microsoft.DotNet.PackageTesting.Tests/GetCompatibilePackageTargetFrameworksTests.cs +++ b/src/Microsoft.DotNet.PackageTesting.Tests/GetCompatibilePackageTargetFrameworksTests.cs @@ -1,8 +1,8 @@ // Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. -using NuGet.Frameworks; using System.Collections.Generic; +using NuGet.Frameworks; using Xunit; namespace Microsoft.DotNet.PackageTesting.Tests @@ -11,34 +11,132 @@ public class GetCompatibilePackageTargetFrameworksTests { public GetCompatibilePackageTargetFrameworksTests() { - GetCompatiblePackageTargetFrameworks.Initialize(); + GetCompatiblePackageTargetFrameworks.Initialize("netcoreapp3.1;net5.0;net6.0;net461;net462;net471;net472;netstandard2.0;netstandard2.1"); } - public static IEnumerable PackageTFMData => new List + public static IEnumerable PackageTfmData => new List { // single target framework in package - new object[] { new List { FrameworkConstants.CommonFrameworks.NetStandard20}, new List { FrameworkConstants.CommonFrameworks.NetStandard20, FrameworkConstants.CommonFrameworks.NetCoreApp20, FrameworkConstants.CommonFrameworks.Net463, FrameworkConstants.CommonFrameworks.Net461, FrameworkConstants.CommonFrameworks.Net462} }, - new object[] { new List { FrameworkConstants.CommonFrameworks.NetCoreApp20}, new List { FrameworkConstants.CommonFrameworks.NetCoreApp20} }, - new object[] { new List { FrameworkConstants.CommonFrameworks.NetCoreApp21}, new List { FrameworkConstants.CommonFrameworks.NetCoreApp21} }, - new object[] { new List { FrameworkConstants.CommonFrameworks.Net461}, new List { FrameworkConstants.CommonFrameworks.Net461} }, - new object[] { new List { FrameworkConstants.CommonFrameworks.Net45}, new List { FrameworkConstants.CommonFrameworks.Net45} }, - new object[] { new List { FrameworkConstants.CommonFrameworks.NetCoreApp30}, new List { FrameworkConstants.CommonFrameworks.NetCoreApp30} }, - new object[] { new List { FrameworkConstants.CommonFrameworks.NetCoreApp31}, new List { FrameworkConstants.CommonFrameworks.NetCoreApp31} }, - new object[] { new List { FrameworkConstants.CommonFrameworks.NetStandard21}, new List { FrameworkConstants.CommonFrameworks.NetStandard21, FrameworkConstants.CommonFrameworks.NetCoreApp30 } }, - new object[] { new List { FrameworkConstants.CommonFrameworks.NetStandard12}, new List { FrameworkConstants.CommonFrameworks.NetStandard12, FrameworkConstants.CommonFrameworks.Net451 } }, - - // two target frameworks in package - new object[] { new List { FrameworkConstants.CommonFrameworks.NetStandard20, FrameworkConstants.CommonFrameworks.Net461}, new List { FrameworkConstants.CommonFrameworks.NetStandard20, FrameworkConstants.CommonFrameworks.NetCoreApp20, FrameworkConstants.CommonFrameworks.Net463, FrameworkConstants.CommonFrameworks.Net461, FrameworkConstants.CommonFrameworks.Net462} }, - new object[] { new List { FrameworkConstants.CommonFrameworks.NetStandard20, FrameworkConstants.CommonFrameworks.NetCoreApp30}, new List { FrameworkConstants.CommonFrameworks.NetStandard20, FrameworkConstants.CommonFrameworks.NetCoreApp30, FrameworkConstants.CommonFrameworks.NetCoreApp20, FrameworkConstants.CommonFrameworks.Net463, FrameworkConstants.CommonFrameworks.Net461, FrameworkConstants.CommonFrameworks.Net462} }, - new object[] { new List { FrameworkConstants.CommonFrameworks.NetCoreApp30, FrameworkConstants.CommonFrameworks.Net461}, new List { FrameworkConstants.CommonFrameworks.NetCoreApp30, FrameworkConstants.CommonFrameworks.Net461} }, - new object[] { new List { FrameworkConstants.CommonFrameworks.NetCoreApp30, FrameworkConstants.CommonFrameworks.Net50}, new List { FrameworkConstants.CommonFrameworks.NetCoreApp30, FrameworkConstants.CommonFrameworks.Net50} }, + new object[] + { + new List + { + @"lib/netstandard2.0/TestPackage.dll" + }, + new List + { + FrameworkConstants.CommonFrameworks.NetStandard20, + FrameworkConstants.CommonFrameworks.Net461, + FrameworkConstants.CommonFrameworks.Net462, + FrameworkConstants.CommonFrameworks.NetCoreApp31 + } + }, + new object[] + { + new List + { + @"runtimes/win/lib/netstandard2.0/TestPackage.dll", + }, + new List + { + FrameworkConstants.CommonFrameworks.NetStandard20, + FrameworkConstants.CommonFrameworks.Net461, + FrameworkConstants.CommonFrameworks.Net462, + FrameworkConstants.CommonFrameworks.NetCoreApp31 + } + }, + new object[] + { + new List + { + @"lib/net5.0/TestPackage.dll", + @"runtimes/win/lib/netstandard2.0/TestPackage.dll" + }, + new List + { + FrameworkConstants.CommonFrameworks.NetStandard20, + FrameworkConstants.CommonFrameworks.Net461, + FrameworkConstants.CommonFrameworks.Net462, + FrameworkConstants.CommonFrameworks.NetCoreApp31, + FrameworkConstants.CommonFrameworks.Net50 + } + }, + new object[] + { + new List + { + @"lib/netcoreapp3.1/TestPackage.dll" + }, + new List + { + FrameworkConstants.CommonFrameworks.NetCoreApp31 + } + }, + new object[] + { + new List + { + @"lib/netcoreapp3.1/TestPackage.dll", + @"lib/net461/TestPackage.dll" + }, + new List + { + FrameworkConstants.CommonFrameworks.NetCoreApp31, + FrameworkConstants.CommonFrameworks.Net461 + } + }, + new object[] + { + new List + { + @"runtimes/unix/lib/netcoreapp3.1/TestPackage.dll", + @"runtimes/win/lib/netstandard2.0/TestPackage.dll" + }, + new List + { + FrameworkConstants.CommonFrameworks.NetCoreApp31, + FrameworkConstants.CommonFrameworks.NetStandard20, + FrameworkConstants.CommonFrameworks.Net461, + FrameworkConstants.CommonFrameworks.Net462 + } + }, + new object[] + { + new List + { + @"lib/net5.0/TestPackage.dll", + @"lib/net472/TestPackage.dll", + @"runtimes/win/lib/netstandard2.0/TestPackage.dll" + }, + new List + { + FrameworkConstants.CommonFrameworks.NetStandard20, + FrameworkConstants.CommonFrameworks.Net461, + FrameworkConstants.CommonFrameworks.Net462, + NuGetFramework.Parse("net472"), + FrameworkConstants.CommonFrameworks.NetCoreApp31, + FrameworkConstants.CommonFrameworks.Net50 + } + }, + new object[] + { + new List + { + @"lib/net461/TestPackage.dll" + }, + new List + { + FrameworkConstants.CommonFrameworks.Net461, + } + }, }; [Theory] - [MemberData(nameof(PackageTFMData))] - public void GetCompatibleFrameworks(List packageFrameworks, List expectedTestFrameworks) + [MemberData(nameof(PackageTfmData))] + public void GetCompatibleFrameworks(List filePaths, List expectedTestFrameworks) { - List actualTestFrameworks = GetCompatiblePackageTargetFrameworks.GetTestFrameworks(packageFrameworks); + Package package = new("TestPackage", "1.0.0", filePaths); + IEnumerable actualTestFrameworks = GetCompatiblePackageTargetFrameworks.GetTestFrameworks(package, "netcoreapp3.1"); CollectionsEqual(expectedTestFrameworks, actualTestFrameworks); } diff --git a/src/Microsoft.DotNet.PackageTesting.Tests/Microsoft.DotNet.PackageTesting.Tests.csproj b/src/Microsoft.DotNet.PackageTesting.Tests/Microsoft.DotNet.PackageTesting.Tests.csproj index 21973221994..fb54391f150 100644 --- a/src/Microsoft.DotNet.PackageTesting.Tests/Microsoft.DotNet.PackageTesting.Tests.csproj +++ b/src/Microsoft.DotNet.PackageTesting.Tests/Microsoft.DotNet.PackageTesting.Tests.csproj @@ -1,4 +1,4 @@ - + netcoreapp3.1;net472 @@ -8,6 +8,7 @@ + diff --git a/src/Microsoft.DotNet.PackageTesting/GetCompatiblePackageTargetFrameworks.cs b/src/Microsoft.DotNet.PackageTesting/GetCompatiblePackageTargetFrameworks.cs index 2fee0d7edfc..ff00124037e 100644 --- a/src/Microsoft.DotNet.PackageTesting/GetCompatiblePackageTargetFrameworks.cs +++ b/src/Microsoft.DotNet.PackageTesting/GetCompatiblePackageTargetFrameworks.cs @@ -19,6 +19,9 @@ public class GetCompatiblePackageTargetFrameworks : BuildTask [Required] public string[] PackagePaths { get; set; } + [Required] + public string SupportedTestFrameworks { get; set; } + [Output] public ITaskItem[] TestProjects { get; set; } @@ -28,16 +31,17 @@ public override bool Execute() List testProjects = new List(); try { - Initialize(); + Initialize(SupportedTestFrameworks); + string minDotnetTargetFramework = allTargetFrameworks.Where(t => t.Framework == ".NETCoreApp").OrderBy(t => t.Version).FirstOrDefault()?.GetShortFolderName(); + foreach (var packagePath in PackagePaths) { Package package = NupkgParser.CreatePackageObject(packagePath); - List packageTargetFrameworks = package.PackageAssets.Select(asset => asset.TargetFramework).Where(tfm => tfm != null).Distinct().ToList(); - List frameworksToTest = GetTestFrameworks(packageTargetFrameworks); - testProjects.AddRange(CreateItemFromTestFramework(package.PackageId, package.Version, frameworksToTest, GetRidsFromPackage(package))); + IEnumerable testFrameworks = GetTestFrameworks(package, minDotnetTargetFramework); + testProjects.AddRange(CreateItemFromTestFramework(package.PackageId, package.Version, testFrameworks)); } - + // Removing empty items. TestProjects = testProjects.Where(tfm => tfm.ItemSpec != "").ToArray(); } @@ -45,56 +49,37 @@ public override bool Execute() { Log.LogErrorFromException(e, showStackTrace: false); } - + return result && !Log.HasLoggedErrors; } - public static List GetTestFrameworks(List packageTargetFrameworks) + public static IEnumerable GetTestFrameworks(Package package, string minDotnetTargetFramework) { - List frameworksToTest = new List(); + List frameworksToTest= new List(); + IEnumerable packageTargetFrameworks = package.FrameworksInPackage; // Testing the package installation on all tfms linked with package targetframeworks. foreach (var item in packageTargetFrameworks) { if (packageTfmMapping.ContainsKey(item)) - frameworksToTest.AddRange(packageTfmMapping[item].ToList()); + frameworksToTest.AddRange(packageTfmMapping[item]); + // Adding the frameworks in the packages to the test matrix. + frameworksToTest.Add(item); } - // Pruning the test matrix by removing the frameworks we dont want to test. - frameworksToTest = frameworksToTest.Where(tfm => allTargetFrameworks.Contains(tfm)).ToList(); + if (!string.IsNullOrEmpty(minDotnetTargetFramework) && frameworksToTest.Any(t => t.Framework == ".NETStandard")) + frameworksToTest.Add(NuGetFramework.Parse(minDotnetTargetFramework)); - // Adding the frameworks in the packages to the test matrix; - frameworksToTest.AddRange(packageTargetFrameworks); - frameworksToTest = frameworksToTest.Distinct().ToList(); - return frameworksToTest; + return frameworksToTest.Where(tfm => allTargetFrameworks.Contains(tfm)).Distinct(); } - public static void Initialize() + public static void Initialize(string targetFrameworks) { // Defining the set of known frameworks that we care to test - allTargetFrameworks.Add(FrameworkConstants.CommonFrameworks.NetCoreApp20); - allTargetFrameworks.Add(FrameworkConstants.CommonFrameworks.NetCoreApp21); - allTargetFrameworks.Add(FrameworkConstants.CommonFrameworks.NetCoreApp30); - allTargetFrameworks.Add(FrameworkConstants.CommonFrameworks.NetCoreApp31); - allTargetFrameworks.Add(FrameworkConstants.CommonFrameworks.Net50); - allTargetFrameworks.Add(FrameworkConstants.CommonFrameworks.Net45); - allTargetFrameworks.Add(FrameworkConstants.CommonFrameworks.Net451); - allTargetFrameworks.Add(FrameworkConstants.CommonFrameworks.Net452); - allTargetFrameworks.Add(FrameworkConstants.CommonFrameworks.Net46); - allTargetFrameworks.Add(FrameworkConstants.CommonFrameworks.Net461); - allTargetFrameworks.Add(FrameworkConstants.CommonFrameworks.Net462); - allTargetFrameworks.Add(FrameworkConstants.CommonFrameworks.Net463); - allTargetFrameworks.Add(FrameworkConstants.CommonFrameworks.NetStandard10); - allTargetFrameworks.Add(FrameworkConstants.CommonFrameworks.NetStandard11); - allTargetFrameworks.Add(FrameworkConstants.CommonFrameworks.NetStandard12); - allTargetFrameworks.Add(FrameworkConstants.CommonFrameworks.NetStandard13); - allTargetFrameworks.Add(FrameworkConstants.CommonFrameworks.NetStandard14); - allTargetFrameworks.Add(FrameworkConstants.CommonFrameworks.NetStandard15); - allTargetFrameworks.Add(FrameworkConstants.CommonFrameworks.NetStandard16); - allTargetFrameworks.Add(FrameworkConstants.CommonFrameworks.NetStandard17); - allTargetFrameworks.Add(FrameworkConstants.CommonFrameworks.NetStandard20); - allTargetFrameworks.Add(FrameworkConstants.CommonFrameworks.NetStandard21); - allTargetFrameworks.Add(FrameworkConstants.CommonFrameworks.UAP10); + foreach (var tfm in targetFrameworks.Split(';')) + { + allTargetFrameworks.Add(NuGetFramework.Parse(tfm)); + } // creating a map framework in package => frameworks to test based on default compatibilty mapping. foreach (var item in DefaultFrameworkMappings.Instance.CompatibilityMappings) @@ -111,8 +96,8 @@ public static void Initialize() } } } - - public List CreateItemFromTestFramework(string packageId, string version, List testFrameworks, string rids) + + public List CreateItemFromTestFramework(string packageId, string version, IEnumerable testFrameworks) { List testprojects = new List(); foreach (var framework in testFrameworks) @@ -121,42 +106,10 @@ public List CreateItemFromTestFramework(string packageId, string vers supportedPackage.SetMetadata("Version", version); supportedPackage.SetMetadata("TargetFramework", framework.ToString()); supportedPackage.SetMetadata("TargetFrameworkShort", framework.GetShortFolderName()); - - if (!String.IsNullOrEmpty(rids)) - { - supportedPackage.SetMetadata("RuntimeIdentifiers", rids); - } testprojects.Add(supportedPackage); } return testprojects; } - - public string GetRidsFromPackage(Package package) - { - List rids = new List(); - foreach (var item in package.PackageAssets) - { - if (item.AssetType == AssetType.RuntimeAsset) - { - string testRid = item.Rid; - string testArch = testRid == "browser" ? "-wasm" : "-x64"; - if (testRid == "unix") - { - if (!rids.Contains("linux" + testArch)) - rids.Add("linux" + testArch); - - if (!rids.Contains("osx" + testArch)) - rids.Add("osx" + testArch); - } - else - { - if (!rids.Contains(testRid + testArch)) - rids.Add(testRid + testArch); - } - } - } - return string.Join(";", rids); - } - } + } } diff --git a/src/Microsoft.DotNet.PackageTesting/NupkgParser.cs b/src/Microsoft.DotNet.PackageTesting/NupkgParser.cs index bb1881c1657..9832e3f592a 100644 --- a/src/Microsoft.DotNet.PackageTesting/NupkgParser.cs +++ b/src/Microsoft.DotNet.PackageTesting/NupkgParser.cs @@ -1,11 +1,8 @@ // Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. -using NuGet.Frameworks; -using NuGet.Packaging; -using NuGet.Packaging.Core; -using System.Collections.Generic; using System.Linq; +using NuGet.Packaging; namespace Microsoft.DotNet.PackageTesting { @@ -13,52 +10,13 @@ public class NupkgParser { public static Package CreatePackageObject(string packagePath) { - List packageAssets = new List(); - Dictionary> packageDependencies = new Dictionary>(); - PackageArchiveReader nupkgReader = new PackageArchiveReader(packagePath); NuspecReader nuspecReader = nupkgReader.NuspecReader; string packageId = nuspecReader.GetId(); string version = nuspecReader.GetVersion().ToString(); - IEnumerable dependencyGroups = nuspecReader.GetDependencyGroups(); - - foreach (var item in dependencyGroups) - { - packageDependencies.Add(item.TargetFramework, item.Packages.ToList()); - } - - var files = nupkgReader.GetFiles().ToList().Where(t => t.EndsWith(".dll")).Where(t => t.Contains(packageId + ".dll")); - foreach (var file in files) - { - packageAssets.Add(ExtractAssetFromFile(file)); - } - - return new Package(packageId, version, packageAssets, packageDependencies); - } - - public static PackageAsset ExtractAssetFromFile(string filePath) - { - PackageAsset asset = null; - if (filePath.StartsWith("ref")) - { - var stringParts = filePath.Split('/'); - asset = new PackageAsset(NuGetFramework.Parse(stringParts[1]), null, filePath, AssetType.RefAsset); - } - else if (filePath.StartsWith("lib")) - { - var stringParts = filePath.Split('/'); - asset = new PackageAsset(NuGetFramework.Parse(stringParts[1]), null, filePath, AssetType.LibAsset); - - } - else if (filePath.StartsWith("runtimes")) - { - var stringParts = filePath.Split('/'); - NuGetFramework framework = stringParts.Length > 3 ? NuGetFramework.Parse(stringParts[3]) : null; - asset = new PackageAsset(framework, stringParts[1], filePath, AssetType.RuntimeAsset); - } - return asset; + return new Package(packageId, version, nupkgReader.GetFiles()?.Where(t => t.EndsWith(packageId + ".dll"))); } } } diff --git a/src/Microsoft.DotNet.PackageTesting/Package.cs b/src/Microsoft.DotNet.PackageTesting/Package.cs index 1e4b7b291e9..8574dea2e3a 100644 --- a/src/Microsoft.DotNet.PackageTesting/Package.cs +++ b/src/Microsoft.DotNet.PackageTesting/Package.cs @@ -1,24 +1,37 @@ // Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. -using NuGet.Frameworks; -using NuGet.Packaging.Core; using System.Collections.Generic; +using System.Linq; +using NuGet.Client; +using NuGet.ContentModel; +using NuGet.Frameworks; namespace Microsoft.DotNet.PackageTesting { public class Package { - public List PackageAssets { get; set; } - public string PackageId { get; set; } - public string Version { get; set; } - public Dictionary> PackageDependencies { get; set; } - public Package(string packageId, string version, List packageAssets, Dictionary> packageDependencies) + public Package(string packageId, string version, IEnumerable packageAssetPaths) { PackageId = packageId; Version = version; - PackageAssets = packageAssets; - PackageDependencies = packageDependencies; + + ContentItemCollection packageAssets = new(); + packageAssets.Load(packageAssetPaths); + ManagedCodeConventions conventions = new ManagedCodeConventions(null); + + IEnumerable RefAssets = packageAssets.FindItems(conventions.Patterns.CompileRefAssemblies); + IEnumerable LibAssets = packageAssets.FindItems(conventions.Patterns.CompileLibAssemblies); + IEnumerable CompileAssets = RefAssets.Any() ? RefAssets : LibAssets; + List FrameworksInPackageList = CompileAssets.Select(t => (NuGetFramework)t.Properties["tfm"]).ToList(); + + IEnumerable RuntimeAssets = packageAssets.FindItems(conventions.Patterns.RuntimeAssemblies); + FrameworksInPackageList.AddRange(RuntimeAssets.Select(t => (NuGetFramework)t.Properties["tfm"]).Distinct()); + FrameworksInPackage = FrameworksInPackageList.Distinct(); } + + public string PackageId { get; set; } + public string Version { get; set; } + public IEnumerable FrameworksInPackage { get; private set; } } } diff --git a/src/Microsoft.DotNet.PackageTesting/PackageAsset.cs b/src/Microsoft.DotNet.PackageTesting/PackageAsset.cs deleted file mode 100644 index 825a4dad481..00000000000 --- a/src/Microsoft.DotNet.PackageTesting/PackageAsset.cs +++ /dev/null @@ -1,30 +0,0 @@ -// Licensed to the .NET Foundation under one or more agreements. -// The .NET Foundation licenses this file to you under the MIT license. - -using NuGet.Frameworks; - -namespace Microsoft.DotNet.PackageTesting -{ - public class PackageAsset - { - public NuGetFramework TargetFramework { get; set; } - public string Rid { get; set; } - public string PackagePath { get; set; } - public AssetType AssetType { get; set; } - - public PackageAsset(NuGetFramework targetFramework, string runtimeIdentifier, string packagePath, AssetType assetType) - { - TargetFramework = targetFramework; - Rid = runtimeIdentifier; - PackagePath = packagePath; - AssetType = assetType; - } - } - - public enum AssetType - { - RefAsset = 0, - LibAsset = 1, - RuntimeAsset = 2 - } -} diff --git a/src/Microsoft.DotNet.PackageTesting/build/Microsoft.DotNet.PackageTesting.props b/src/Microsoft.DotNet.PackageTesting/build/Microsoft.DotNet.PackageTesting.props index 052e1689aa2..5ecea08caeb 100644 --- a/src/Microsoft.DotNet.PackageTesting/build/Microsoft.DotNet.PackageTesting.props +++ b/src/Microsoft.DotNet.PackageTesting/build/Microsoft.DotNet.PackageTesting.props @@ -3,4 +3,23 @@ $(MSBuildThisFileDirectory)..\tools\net472\Microsoft.DotNet.PackageTesting.dll $(MSBuildThisFileDirectory)..\tools\netcoreapp3.1\Microsoft.DotNet.PackageTesting.dll + + + + + + + + + + + + + + + + + + + From dcfb0935ad47f657b70d53a1efedfaac50b857b6 Mon Sep 17 00:00:00 2001 From: Michelle McDaniel Date: Tue, 15 Jun 2021 10:36:05 -0700 Subject: [PATCH 163/699] Normalize Uris when writing manifests (#7521) * Normalize Uris when writing manifests For each manifest, we should normalize the Azure DevOps uris, so that differences between machine state do not affect merging the manifests down the line. We will normalize the AzureDevOpsRepository and the InitialAssetsLocations, if found in the attributes. * The .* is unnecessary * Fix xml comment * Update tests with normalization * Rename function to specify Azure DevOps urls --- .../BuildModelFactoryTests.cs | 11 +++-- .../src/BuildModelFactory.cs | 48 +++++++++++++++++++ 2 files changed, 56 insertions(+), 3 deletions(-) diff --git a/src/Microsoft.DotNet.Build.Tasks.Feed.Tests/BuildModelFactoryTests.cs b/src/Microsoft.DotNet.Build.Tasks.Feed.Tests/BuildModelFactoryTests.cs index 0906695c73a..7420d9e661f 100644 --- a/src/Microsoft.DotNet.Build.Tasks.Feed.Tests/BuildModelFactoryTests.cs +++ b/src/Microsoft.DotNet.Build.Tasks.Feed.Tests/BuildModelFactoryTests.cs @@ -23,13 +23,16 @@ public class BuildModelFactoryTests #region Standard test values private const string _testAzdoRepoUri = "https://dnceng@dev.azure.com/dnceng/internal/_git/dotnet-buildtest"; + private const string _normalizedTestAzdoRepoUri = "https://dev.azure.com/dnceng/internal/_git/dotnet-buildtest"; private const string _testBuildBranch = "foobranch"; private const string _testBuildCommit = "664996a16fa9228cfd7a55d767deb31f62a65f51"; private const string _testAzdoBuildId = "89999999"; - private const string _testInitialLocation = "As they say....Location Location Location!"; + private const string _testInitialLocation = "https://dnceng.visualstudio.com/project/_apis/build/builds/id/artifacts"; + private const string _normalizedTestInitialLocation = "https://dev.azure.com/dnceng/project/_apis/build/builds/id/artifacts"; private static readonly string[] _defaultManifestBuildData = new string[] { - $"InitialAssetsLocation={_testInitialLocation}" + $"InitialAssetsLocation={_testInitialLocation}", + $"AzureDevOpsRepository={_testAzdoRepoUri}" }; #endregion @@ -165,6 +168,8 @@ public void ManifestArtifactParsingTest() package.Attributes.Should().Contain("Id", "test-package-a"); package.Attributes.Should().Contain("Version", "1.0.0"); }); + + model.Identity.Attributes.Should().Contain("AzureDevOpsRepository", _normalizedTestAzdoRepoUri); } /// @@ -290,7 +295,7 @@ public void InitialLocationInformationAttributesAreAccepted(string attributeName _taskLoggingHelper.HasLoggedErrors.Should().BeFalse(); // Check that the build model has the initial assets location - model.Identity.Attributes.Should().Contain(attributeName, _testInitialLocation); + model.Identity.Attributes.Should().Contain(attributeName, _normalizedTestInitialLocation); } #endregion diff --git a/src/Microsoft.DotNet.Build.Tasks.Feed/src/BuildModelFactory.cs b/src/Microsoft.DotNet.Build.Tasks.Feed/src/BuildModelFactory.cs index f15f8442c27..e72224383c5 100644 --- a/src/Microsoft.DotNet.Build.Tasks.Feed/src/BuildModelFactory.cs +++ b/src/Microsoft.DotNet.Build.Tasks.Feed/src/BuildModelFactory.cs @@ -8,6 +8,8 @@ using System; using System.Collections.Generic; using System.IO; +using System.Linq; +using System.Text.RegularExpressions; using System.Xml.Linq; namespace Microsoft.DotNet.Build.Tasks.Feed @@ -71,6 +73,11 @@ public BuildModelFactory( private const string AssetsVirtualDir = "assets/"; + private static readonly string AzureDevOpsHostPattern = @"dev\.azure\.com\"; + + private readonly Regex LegacyRepositoryUriPattern = new Regex( + @"^https://(?[a-zA-Z0-9]+)\.visualstudio\.com/"); + /// /// Create a build manifest for packages, blobs, and associated signing information /// @@ -204,6 +211,9 @@ private BuildModel CreateModel( { _log.LogError("Missing 'location' property from ManifestBuildData"); } + + NormalizeUrisInBuildData(attributes); + BuildModel buildModel = new BuildModel( new BuildIdentity { @@ -241,5 +251,43 @@ private bool ManifestBuildDataHasLocationInformation(IDictionary { return attributes.ContainsKey("Location") || attributes.ContainsKey("InitialAssetsLocation"); } + + private void NormalizeUrisInBuildData(IDictionary attributes) + { + foreach(var attribute in attributes.ToList()) + { + attributes[attribute.Key] = NormalizeAzureDevOpsUrl(attribute.Value); + } + } + + /// + // If repoUri includes the user in the account we remove it from URIs like + // https://dnceng@dev.azure.com/dnceng/internal/_git/repo + // If the URL host is of the form "dnceng.visualstudio.com" like + // https://dnceng.visualstudio.com/internal/_git/repo we replace it to "dev.azure.com/dnceng" + // for consistency + /// + /// The original url + /// Transformed url + private string NormalizeAzureDevOpsUrl(string repoUri) + { + if (Uri.TryCreate(repoUri, UriKind.Absolute, out Uri parsedUri)) + { + if (!string.IsNullOrEmpty(parsedUri.UserInfo)) + { + repoUri = repoUri.Replace($"{parsedUri.UserInfo}@", string.Empty); + } + + Match m = LegacyRepositoryUriPattern.Match(repoUri); + + if (m.Success) + { + string replacementUri = $"{Regex.Unescape(AzureDevOpsHostPattern)}/{m.Groups["account"].Value}"; + repoUri = repoUri.Replace(parsedUri.Host, replacementUri); + } + } + + return repoUri; + } } } From 52476e9119685f8effc7f79f0a5982e9d98ef086 Mon Sep 17 00:00:00 2001 From: Jon Fortescue Date: Tue, 15 Jun 2021 13:09:16 -0700 Subject: [PATCH 164/699] Incorporate feedback on OneLocBuild doc (#7522) --- Documentation/OneLocBuild.md | 24 ++++++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/Documentation/OneLocBuild.md b/Documentation/OneLocBuild.md index 9a5b7b4f890..edcd824c5dc 100644 --- a/Documentation/OneLocBuild.md +++ b/Documentation/OneLocBuild.md @@ -20,6 +20,12 @@ Onboarding to OneLocBuild is a simple process: parameters: CreatePr: false ``` +Note: If you are running your PR builds and official builds off of the same definition and are on dnceng, +you will want to conditionalize this step with the following: +```yaml +- ${{ if and(ne(variables['System.TeamProject'], 'public'), notin(variables['Build.Reason'], 'PullRequest')) }}: +``` +To prevent OneLocBuild from running in the public project where it will fail. 3. Run the pipeline you want to use OneLocBuild on your test branch. 4. Open a ticket with the localization team using [this template](https://ceapex.visualstudio.com/CEINTL/_workitems/create/Loc%20Request?templateId=60b0dcf9-9892-4910-934e-d5becddd1bc1&ownerId=c2e38d3d-0e9e-429f-955d-6e39fc6f0457). @@ -28,17 +34,31 @@ Onboarding to OneLocBuild is a simple process: `LCL-JUNO-PROD-YOURREPO`. 6. Change your YAML (subbing `'LCL-JUNO-PROD-YOURREPO'` for the package ID given to you) to: ```yaml -- {{ if eq(variables['Build.SourceBranch'], 'refs/heads/main') }}: +- ${{ if eq(variables['Build.SourceBranch'], 'refs/heads/main') }}: - template: /eng/common/templates/job/onelocbuild.yml parameters: LclSource: lclFilesfromPackage LclPackageId: 'LCL-JUNO-PROD-YOURREPO' ``` +Make sure to remove the `CreatePr: false` line from step 2. Additionally, if you added the YAML condition from step +2, make sure that your new YAML condition now looks like: +```yaml +- ${{ if and(and(ne(variables['System.TeamProject'], 'public'), notin(variables['Build.Reason'], 'PullRequest')), eq(variables['Build.SourceBranch'], 'refs/heads/main')) }}: +``` + 7. If using a mirrored repository (your code is mirrored to a trusted repository which your official build uses), add the following parameter to your YAML (subbing e.g. `sdk` for the value): ```yaml - MirrorRepo: {{name of your GitHub repository}} + MirrorRepo: name of your GitHub repository, e.g. 'sdk' ``` +This naming might be confusing for repositories using code mirroring through Maestro, as typically the +"mirror repository" refers to the trusted Azure DevOps repository our GitHub repositories mirror to. +In this case, however, it refers to the repository that _mirrors to_ the Azure DevOps repository +that the official build is based on. + +As a further note, the template by default assumes that your mirror repository is located in the dotnet GitHub +organization. If that is not the case, you will need to specify `GitHubOrg` as well. + 8. Merge the changes to your main branch and then open a [repo modification ticket](https://ceapex.visualstudio.com/CEINTL/_workitems/create/Loc%20Request?templateId=415a0569-35ed-45c3-9321-8b1affff1f52&ownerId=c2e38d3d-0e9e-429f-955d-6e39fc6f0457) with the loc team to let them know to retarget the branch. From d25fc69e0541c8c7be06d5c8802c07941d55c5fa Mon Sep 17 00:00:00 2001 From: Matt Galbraith Date: Tue, 15 Jun 2021 14:13:30 -0700 Subject: [PATCH 165/699] Reenable physical android testing for XHarness SDK (#7528) * Reenable physical android testing for XHarness SDK https://github.com/dotnet/core-eng/issues/12238 - we should have sufficient capacity to have these tests back. * indenting error --- azure-pipelines.yml | 30 ++++++++++++++---------------- 1 file changed, 14 insertions(+), 16 deletions(-) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 3c3b4de3868..4d76282f96f 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -130,22 +130,20 @@ stages: env: SYSTEM_ACCESSTOKEN: $(System.AccessToken) HelixAccessToken: '' - # We don't have enough hardware to run these tests on Arcade PR given the Arcade XHarness SDK changes infrequently. (https://github.com/dotnet/core-eng/issues/12238) - # Until the above issue is resolved, if you are editing the Xharness SDK's Windows side, please exercise this manually. Contact dnceng for assistance. - # - powershell: eng\common\build.ps1 - # -configuration $(_BuildConfig) - # -prepareMachine - # -ci - # -restore - # -test - # -projects $(Build.SourcesDirectory)\tests\UnitTests.XHarness.Android.WindowsQueues.proj - # /bl:$(Build.SourcesDirectory)\artifacts\log\$(_BuildConfig)\Helix.XHarness.Android.WindowsQueues.binlog - # /p:RestoreUsingNuGetTargets=false - # /p:XharnessTestARM64_V8A=true - # displayName: XHarness Android Helix Testing (Windows) - # env: - # SYSTEM_ACCESSTOKEN: $(System.AccessToken) - # HelixAccessToken: '' + - powershell: eng\common\build.ps1 + -configuration $(_BuildConfig) + -prepareMachine + -ci + -restore + -test + -projects $(Build.SourcesDirectory)\tests\UnitTests.XHarness.Android.WindowsQueues.proj + /bl:$(Build.SourcesDirectory)\artifacts\log\$(_BuildConfig)\Helix.XHarness.Android.WindowsQueues.binlog + /p:RestoreUsingNuGetTargets=false + /p:XharnessTestARM64_V8A=true + displayName: XHarness Android Helix Testing (Windows) + env: + SYSTEM_ACCESSTOKEN: $(System.AccessToken) + HelixAccessToken: '' - job: Linux timeoutInMinutes: 90 container: LinuxContainer From 12956a100f3d7897456f8d1b8572b2329478aa52 Mon Sep 17 00:00:00 2001 From: Jacques Eloff Date: Tue, 15 Jun 2021 14:29:01 -0700 Subject: [PATCH 166/699] Workloads: Tooling changes to MSI and SWIX generation (#7525) Support for abstract workload, minimum versions for SWIX dependencies and changes to the MSI manifest to include the MSI filename so that it can be verified when doing caching operations that requires moving files into protective folders. --- .../GenerateVisualStudioWorkloadTests.cs | 13 +++-- .../VisualStudioDependencyTests.cs | 29 ++++++++++++ .../src/GenerateMsiBase.cs | 3 +- .../src/GenerateVisualStudioWorkload.cs | 8 ---- .../src/MsiProperties.cs | 6 +++ .../src/SwixTemplate/component.swixproj | 5 +- .../src/SwixTemplate/component.swr | 2 +- .../src/VisualStudioComponent.cs | 47 ++++++++++++++++--- .../src/VisualStudioDependency.cs | 47 ++++++++++++++++--- 9 files changed, 128 insertions(+), 32 deletions(-) create mode 100644 src/Microsoft.DotNet.Build.Tasks.Workloads.Tests/VisualStudioDependencyTests.cs diff --git a/src/Microsoft.DotNet.Build.Tasks.Workloads.Tests/GenerateVisualStudioWorkloadTests.cs b/src/Microsoft.DotNet.Build.Tasks.Workloads.Tests/GenerateVisualStudioWorkloadTests.cs index 9d84c83e341..da88129a328 100644 --- a/src/Microsoft.DotNet.Build.Tasks.Workloads.Tests/GenerateVisualStudioWorkloadTests.cs +++ b/src/Microsoft.DotNet.Build.Tasks.Workloads.Tests/GenerateVisualStudioWorkloadTests.cs @@ -117,7 +117,7 @@ public void ItGeneratesASwixProjectFromAWorkloadManifestPackage() } [Fact] - public void ItSkipsAbstractManifests() + public void ItIncludesAbstractManifests() { var buildTask = new GenerateVisualStudioWorkload() { @@ -132,11 +132,14 @@ public void ItSkipsAbstractManifests() }; Assert.True(buildTask.Execute()); - string outputPath = Path.GetDirectoryName(buildTask.SwixProjects[0].GetMetadata("FullPath")); - string componentSwr = File.ReadAllText(Path.Combine(outputPath, "component.swr")); - Assert.Single(buildTask.SwixProjects); + string blazorOutputPath = Path.GetDirectoryName(buildTask.SwixProjects[0].GetMetadata("FullPath")); + string blazorComponentSwr = File.ReadAllText(Path.Combine(blazorOutputPath, "component.swr")); Assert.Contains(@"package name=microsoft.net.sdk.blazorwebassembly.aot - version=6.0.0.0", componentSwr); + version=6.0.0.0", blazorComponentSwr); + string androidOutputPath = Path.GetDirectoryName(buildTask.SwixProjects[1].GetMetadata("FullPath")); + string androidComponentSwr = File.ReadAllText(Path.Combine(androidOutputPath, "component.swr")); + Assert.Contains(@"package name=microsoft.net.runtime.android + version=6.0.0.0", androidComponentSwr); } [Fact] diff --git a/src/Microsoft.DotNet.Build.Tasks.Workloads.Tests/VisualStudioDependencyTests.cs b/src/Microsoft.DotNet.Build.Tasks.Workloads.Tests/VisualStudioDependencyTests.cs new file mode 100644 index 00000000000..be810f26e5b --- /dev/null +++ b/src/Microsoft.DotNet.Build.Tasks.Workloads.Tests/VisualStudioDependencyTests.cs @@ -0,0 +1,29 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Xunit; + +namespace Microsoft.DotNet.Build.Tasks.Workloads.Tests +{ + public class VisualStudioDependencyTests + { + [Theory] + [InlineData("1.0.0", null, "[1.0.0,)")] + [InlineData("1.0.0", "2.0.0", "[1.0.0,2.0.0)")] + [InlineData("1.0.0", "1.0.0", "[1.0.0]")] + public void ItGeneratesVersionRanges(string minVersion, string maxVersion, string expectedVersionRange) + { + Version v1 = string.IsNullOrWhiteSpace(minVersion) ? null : new Version(minVersion); + Version v2 = string.IsNullOrWhiteSpace(maxVersion) ? null : new Version(maxVersion); + + VisualStudioDependency dep = new VisualStudioDependency("foo", v1, v2); + + Assert.Equal(expectedVersionRange, dep.GetVersion()); + } + } +} diff --git a/src/Microsoft.DotNet.Build.Tasks.Workloads/src/GenerateMsiBase.cs b/src/Microsoft.DotNet.Build.Tasks.Workloads/src/GenerateMsiBase.cs index 4a8db6efd96..947f863a8ea 100644 --- a/src/Microsoft.DotNet.Build.Tasks.Workloads/src/GenerateMsiBase.cs +++ b/src/Microsoft.DotNet.Build.Tasks.Workloads/src/GenerateMsiBase.cs @@ -236,6 +236,7 @@ protected IEnumerable Generate(string sourcePackage, string swixPacka MsiProperties msiProps = new MsiProperties { InstallSize = MsiUtils.GetInstallSize(msiPath), + Payload = Path.GetFileName(msiPath), ProductCode = MsiUtils.GetProperty(msiPath, "ProductCode"), ProductVersion = MsiUtils.GetProperty(msiPath, "ProductVersion"), ProviderKeyName = $"{nupkg.Id},{nupkg.Version},{platform}", @@ -330,7 +331,7 @@ private string GeneratePackageProject(string msiPath, string msiJsonPath, string writer.WriteStartElement("ItemGroup"); WriteItem(writer, "None", msiPath, @"\data"); - WriteItem(writer, "None", msiJsonPath, @"\data"); + WriteItem(writer, "None", msiJsonPath, @"\data\msi.json"); WriteItem(writer, "None", licenseTextPath, @"\"); writer.WriteEndElement(); diff --git a/src/Microsoft.DotNet.Build.Tasks.Workloads/src/GenerateVisualStudioWorkload.cs b/src/Microsoft.DotNet.Build.Tasks.Workloads/src/GenerateVisualStudioWorkload.cs index 92f9a43eb5f..a3eb28d860c 100644 --- a/src/Microsoft.DotNet.Build.Tasks.Workloads/src/GenerateVisualStudioWorkload.cs +++ b/src/Microsoft.DotNet.Build.Tasks.Workloads/src/GenerateVisualStudioWorkload.cs @@ -222,14 +222,6 @@ internal IEnumerable ProcessWorkloadManifestFile(string workloadManif foreach (WorkloadDefinition workloadDefinition in manifest.Workloads.Values) { - // Abstract workloads can only be extended, so we can't generate items for this yet. Might need to do a second pass - // if there are other manifests that extend the workload. - if (workloadDefinition.IsAbstract) - { - Log?.LogMessage(MessageImportance.High, $"{workloadDefinition.Id} is abstract and will be skipped."); - continue; - } - if ((workloadDefinition.Platforms?.Count > 0) && (!workloadDefinition.Platforms.Any(p => p.StartsWith("win")))) { Log?.LogMessage(MessageImportance.High, $"{workloadDefinition.Id} platforms does not support Windows and will be skipped ({string.Join(", ", workloadDefinition.Platforms)})."); diff --git a/src/Microsoft.DotNet.Build.Tasks.Workloads/src/MsiProperties.cs b/src/Microsoft.DotNet.Build.Tasks.Workloads/src/MsiProperties.cs index 2bacc28619a..b3f4ab15d23 100644 --- a/src/Microsoft.DotNet.Build.Tasks.Workloads/src/MsiProperties.cs +++ b/src/Microsoft.DotNet.Build.Tasks.Workloads/src/MsiProperties.cs @@ -17,6 +17,12 @@ public long InstallSize set; } + public string Payload + { + get; + set; + } + public string ProductCode { get; diff --git a/src/Microsoft.DotNet.Build.Tasks.Workloads/src/SwixTemplate/component.swixproj b/src/Microsoft.DotNet.Build.Tasks.Workloads/src/SwixTemplate/component.swixproj index df5c7962909..1408da52e9b 100644 --- a/src/Microsoft.DotNet.Build.Tasks.Workloads/src/SwixTemplate/component.swixproj +++ b/src/Microsoft.DotNet.Build.Tasks.Workloads/src/SwixTemplate/component.swixproj @@ -5,13 +5,10 @@ false manifest $(ManifestOutputPath) - - - no - $(PackagePreprocessorDefinitions);IsUIGroup=$(IsUIGroup) + $(PackagePreprocessorDefinitions) diff --git a/src/Microsoft.DotNet.Build.Tasks.Workloads/src/SwixTemplate/component.swr b/src/Microsoft.DotNet.Build.Tasks.Workloads/src/SwixTemplate/component.swr index 3ae9a504aa0..771ec0b7c68 100644 --- a/src/Microsoft.DotNet.Build.Tasks.Workloads/src/SwixTemplate/component.swr +++ b/src/Microsoft.DotNet.Build.Tasks.Workloads/src/SwixTemplate/component.swr @@ -5,6 +5,6 @@ package name=__VS_PACKAGE_NAME__ vs.package.type=component vs.properties - isUiGroup=$(IsUIGroup) + isUiGroup=__VS_IS_UI_GROUP__ vs.dependencies diff --git a/src/Microsoft.DotNet.Build.Tasks.Workloads/src/VisualStudioComponent.cs b/src/Microsoft.DotNet.Build.Tasks.Workloads/src/VisualStudioComponent.cs index 1728ac61216..ee7e9d6d39c 100644 --- a/src/Microsoft.DotNet.Build.Tasks.Workloads/src/VisualStudioComponent.cs +++ b/src/Microsoft.DotNet.Build.Tasks.Workloads/src/VisualStudioComponent.cs @@ -39,6 +39,15 @@ public string Description /// public bool HasDependencies => Dependencies.Count > 0; + /// + /// When "no", the component is visible in both the workloads and individual components tab. + /// When "yes", the component is only visible in the workloads tab. + /// + public string IsUiGroup + { + get; + } = "no"; + /// /// The component name (ID). /// @@ -74,7 +83,7 @@ public Version Version private ICollection Dependencies = new List(); - public VisualStudioComponent(string name, string description, string title, Version version, ITaskItem[] shortNames, + public VisualStudioComponent(string name, string description, string title, Version version, string isUiGroup, ITaskItem[] shortNames, string category) { Name = name; @@ -83,6 +92,17 @@ public VisualStudioComponent(string name, string description, string title, Vers Version = version; ShortNames = shortNames; Category = category; + IsUiGroup = isUiGroup; + } + + /// + /// Add a component dependency using the provided name and version. + /// + /// The name (ID) of the dependency. + /// The version of the dependency. + public void AddDependency(string name, Version exactVersion) + { + AddDependency(new VisualStudioDependency(name, exactVersion, exactVersion)); } /// @@ -90,9 +110,9 @@ public VisualStudioComponent(string name, string description, string title, Vers /// /// The name (ID) of the dependency. /// The version of the dependency. - public void AddDependency(string name, Version version) + public void AddDependency(string name, Version minVersion, Version maxVersion) { - AddDependency(new VisualStudioDependency(name, version)); + AddDependency(new VisualStudioDependency(name, minVersion, maxVersion)); } /// @@ -119,7 +139,7 @@ public void AddDependency(ITaskItem dependency) /// The dependency to add to this component. public void AddDependency(WorkloadPack pack) { - AddDependency($"{pack.Id.ToString().Replace(ShortNames)}.{pack.Version}", new NuGetVersion(pack.Version).Version); + AddDependency($"{pack.Id.ToString().Replace(ShortNames)}.{pack.Version}", new NuGetVersion(pack.Version).Version, maxVersion: null); } public IEnumerable GetAliasedDependencies(WorkloadPack pack) @@ -164,7 +184,7 @@ public TaskItem Generate(string projectPath) // version=[1.2.3.4] swrWriter.WriteLine($" vs.dependency id={dependency.Id}"); - swrWriter.WriteLine($" version=[{dependency.Version}]"); + swrWriter.WriteLine($" version={dependency.GetVersion()}"); swrWriter.WriteLine($" behaviors=IgnoreApplicabilityFailures"); } @@ -179,7 +199,8 @@ private Dictionary GetReplacementTokens() {"__VS_PACKAGE_VERSION__", Version.ToString() }, {"__VS_COMPONENT_TITLE__", Title }, {"__VS_COMPONENT_DESCRIPTION__", Description }, - {"__VS_COMPONENT_CATEGORY__", Category ?? ".NET" } + {"__VS_COMPONENT_CATEGORY__", Category ?? ".NET" }, + {"__VS_IS_UI_GROUP__", IsUiGroup ?? "no" } }; } @@ -214,13 +235,25 @@ public static VisualStudioComponent Create(TaskLoggingHelper log, WorkloadManife string title = resourceItem?.GetMetadata(Metadata.Title) ?? workload.Description; string description = resourceItem?.GetMetadata(Metadata.Description) ?? workload.Description; string category = resourceItem?.GetMetadata(Metadata.Category) ?? ".NET"; + string isUiGroup = workload.IsAbstract ? "yes" : "no"; VisualStudioComponent component = new(Utils.ToSafeId(workloadId), description, - title, version, shortNames, category); + title, version, isUiGroup, shortNames, category); IEnumerable missingPackIds = missingPacks.Select(p => p.ItemSpec); log?.LogMessage(MessageImportance.Low, $"Missing packs: {string.Join(", ", missingPackIds)}"); + // If the work extends other workloads, we add those as component dependencies before + // processing direct pack dependencies + if (workload.Extends?.Count() > 0) + { + foreach (WorkloadDefinitionId dependency in workload.Extends) + { + // Component dependencies, aka. workload extensions only have minimum version dependencies. + component.AddDependency($"{Utils.ToSafeId(dependency.ToString())}", new Version("1.0.0.0"), maxVersion: null); + } + } + // Visual Studio is case-insensitive. IEnumerable packIds = workload.Packs.Where(p => !missingPackIds.Contains($"{p}", StringComparer.OrdinalIgnoreCase)); log?.LogMessage(MessageImportance.Low, $"Packs: {string.Join(", ", packIds.Select(p=>$"{p}"))}"); diff --git a/src/Microsoft.DotNet.Build.Tasks.Workloads/src/VisualStudioDependency.cs b/src/Microsoft.DotNet.Build.Tasks.Workloads/src/VisualStudioDependency.cs index db80a3d70fe..0f26d13e0c0 100644 --- a/src/Microsoft.DotNet.Build.Tasks.Workloads/src/VisualStudioDependency.cs +++ b/src/Microsoft.DotNet.Build.Tasks.Workloads/src/VisualStudioDependency.cs @@ -18,18 +18,53 @@ public string Id get; } - /// - /// The version of the dependent. - /// - public Version Version + public Version MinVersion { get; } - public VisualStudioDependency(string id, Version version) + public Version MaxVersion + { + get; + } + + /// + /// Creates a dependency with an exact version. + /// + /// + /// + public VisualStudioDependency(string id, Version version) : this(id, version, version) + { + + } + + /// + /// Creates a dependency with a minimum and maximum versions. + /// + /// The Visual Studio package ID. The ID applies to packages, components, component groups, etc. + /// The minimum required version, inclusive. + /// The maximum version, exclusive. May be if there is only a minimum requirement. If + /// equal to , an exact version requirement is created, e.g. [1.2.0]. + public VisualStudioDependency(string id, Version minVersion, Version maxVersion) { Id = id; - Version = version; + MinVersion = minVersion; + MaxVersion = maxVersion; + } + + public string GetVersion() + { + if ((MaxVersion != null) && (MinVersion == MaxVersion)) + { + return $"[{MinVersion}]"; + } + + if (MaxVersion == null) + { + return $"[{MinVersion},)"; + } + + return $"[{MinVersion},{MaxVersion})"; } } } From bdcc258d0d4a547be51703795a140fa6b1f68c57 Mon Sep 17 00:00:00 2001 From: Juan Hoyos Date: Wed, 16 Jun 2021 07:49:55 -0700 Subject: [PATCH 167/699] Revert symuploader to 1.1.156602 (#7534) --- eng/Version.Details.xml | 8 ++++---- eng/Versions.props | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index 33ed4abd1bd..435bb20778a 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -1,13 +1,13 @@ - + https://dev.azure.com/dnceng/internal/_git/dotnet-symuploader - 284dce2eacfab975734c471c85316ccf8a1e46bf + 5528b1c7c946f0923e8becab4d12bcb76c985b91 - + https://dev.azure.com/dnceng/internal/_git/dotnet-symuploader - 284dce2eacfab975734c471c85316ccf8a1e46bf + 5528b1c7c946f0923e8becab4d12bcb76c985b91 diff --git a/eng/Versions.props b/eng/Versions.props index 2c16860f403..ada88fc99c2 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -81,8 +81,8 @@ 1.0.0-beta.21312.1 1.1.0-beta.21228.1 1.0.0-prerelease.21314.1 - 1.1.230702 - 1.1.230702 + 1.1.156602 + 1.1.156602 6.0.100-preview.5.21254.11 From 6655bbbdb406d9cd97bde818963399f01fd9b9a4 Mon Sep 17 00:00:00 2001 From: Alex Perovich Date: Wed, 16 Jun 2021 12:05:30 -0700 Subject: [PATCH 168/699] Add dependsOn and condition parameters to source-index job (#7038) --- eng/common/templates/job/source-index-stage1.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/eng/common/templates/job/source-index-stage1.yml b/eng/common/templates/job/source-index-stage1.yml index 6e8aa9f7f21..b58d42364b9 100644 --- a/eng/common/templates/job/source-index-stage1.yml +++ b/eng/common/templates/job/source-index-stage1.yml @@ -7,9 +7,13 @@ parameters: binlogPath: artifacts/log/Debug/Build.binlog pool: vmImage: vs2017-win2016 + condition: '' + dependsOn: '' jobs: - job: SourceIndexStage1 + dependsOn: ${{ parameters.dependsOn }} + condition: ${{ parameters.condition }} variables: - name: SourceIndexPackageVersion value: ${{ parameters.sourceIndexPackageVersion }} From 6f94f31642e61c19f26498db9b321ce73d31dddd Mon Sep 17 00:00:00 2001 From: Jacques Eloff Date: Wed, 16 Jun 2021 12:49:14 -0700 Subject: [PATCH 169/699] Fix template, library pack generation (#7533) --- .../src/GenerateMsi.cs | 2 +- .../src/GenerateMsiBase.cs | 28 ++++++++++++++++--- .../src/GenerateWorkloadMsis.cs | 8 ++---- 3 files changed, 28 insertions(+), 10 deletions(-) diff --git a/src/Microsoft.DotNet.Build.Tasks.Workloads/src/GenerateMsi.cs b/src/Microsoft.DotNet.Build.Tasks.Workloads/src/GenerateMsi.cs index 8cbf2202242..0c34271f6fe 100644 --- a/src/Microsoft.DotNet.Build.Tasks.Workloads/src/GenerateMsi.cs +++ b/src/Microsoft.DotNet.Build.Tasks.Workloads/src/GenerateMsi.cs @@ -66,7 +66,7 @@ public override bool Execute() // For a single MSI we always generate all platforms and simply use the ID of the source package for // the SWIX projects. List msis = new(); - msis.AddRange(Generate(SourcePackage, null, OutputPath, GetInstallDir(kind), platforms)); + msis.AddRange(Generate(SourcePackage, null, OutputPath, kind, platforms)); Msis = msis.ToArray(); } catch (Exception e) diff --git a/src/Microsoft.DotNet.Build.Tasks.Workloads/src/GenerateMsiBase.cs b/src/Microsoft.DotNet.Build.Tasks.Workloads/src/GenerateMsiBase.cs index 947f863a8ea..246e6d52b31 100644 --- a/src/Microsoft.DotNet.Build.Tasks.Workloads/src/GenerateMsiBase.cs +++ b/src/Microsoft.DotNet.Build.Tasks.Workloads/src/GenerateMsiBase.cs @@ -116,7 +116,7 @@ public string SuppressIces /// The NuGet package to convert into an MSI. /// The output path of the generated MSI. /// - protected IEnumerable Generate(string sourcePackage, string swixPackageId, string outputPath, string installDir, params string[] platforms) + protected IEnumerable Generate(string sourcePackage, string swixPackageId, string outputPath, WorkloadPackKind kind, params string[] platforms) { NugetPackage nupkg = new(sourcePackage, Log); List msis = new(); @@ -133,8 +133,28 @@ protected IEnumerable Generate(string sourcePackage, string swixPacka // Extract once, but harvest multiple times because some generated attributes are platform dependent. string packageContentsDirectory = Path.Combine(PackageDirectory, $"{nupkg.Identity}"); IEnumerable exclusions = GetExlusionPatterns(); - Log.LogMessage(MessageImportance.Low, $"Extracting '{sourcePackage}' to '{packageContentsDirectory}'"); - nupkg.Extract(packageContentsDirectory, exclusions); + string installDir = GetInstallDir(kind); + + if ((kind != WorkloadPackKind.Library) && (kind != WorkloadPackKind.Template)) + { + Log.LogMessage(MessageImportance.Low, $"Extracting '{sourcePackage}' to '{packageContentsDirectory}'"); + nupkg.Extract(packageContentsDirectory, exclusions); + } + else + { + // Library and template packs are not extracted. We want to harvest the nupkg itself, + // instead of the contents. The package is still copied to a separate folder for harvesting + // to avoid accidentally pulling in additional files and directories. + Log.LogMessage(MessageImportance.Low, $"Copying '{sourcePackage}' to '{packageContentsDirectory}'"); + + if (Directory.Exists(packageContentsDirectory)) + { + Directory.Delete(packageContentsDirectory, recursive: true); + } + Directory.CreateDirectory(packageContentsDirectory); + + File.Copy(sourcePackage, Path.Combine(packageContentsDirectory, Path.GetFileName(sourcePackage))); + } foreach (string platform in platforms) { @@ -407,7 +427,7 @@ internal static string GetInstallDir(WorkloadPackKind kind) { WorkloadPackKind.Framework or WorkloadPackKind.Sdk => "packs", WorkloadPackKind.Library => "library-packs", - WorkloadPackKind.Template => "templates", + WorkloadPackKind.Template => "template-packs", WorkloadPackKind.Tool => "tool-packs", _ => throw new ArgumentException($"Unknown package kind: {kind}"), }; diff --git a/src/Microsoft.DotNet.Build.Tasks.Workloads/src/GenerateWorkloadMsis.cs b/src/Microsoft.DotNet.Build.Tasks.Workloads/src/GenerateWorkloadMsis.cs index 43518c7c7d1..f55d7355f6a 100644 --- a/src/Microsoft.DotNet.Build.Tasks.Workloads/src/GenerateWorkloadMsis.cs +++ b/src/Microsoft.DotNet.Build.Tasks.Workloads/src/GenerateWorkloadMsis.cs @@ -89,7 +89,7 @@ public override bool Execute() // Always select the pack ID for the VS MSI package, even when aliased. msis.AddRange(Generate(sourcePackage, swixPackageId, - OutputPath, GetInstallDir(pack.Kind), platforms)); + OutputPath, pack.Kind, platforms)); } } @@ -111,12 +111,10 @@ private IEnumerable GetWorkloadPacks() IEnumerable manifests = WorkloadManifests.Select( w => WorkloadManifestReader.ReadWorkloadManifest(Path.GetFileNameWithoutExtension(w.ItemSpec), File.OpenRead(w.ItemSpec))); - // We want all workloads in all manifests iff - // 1. The workload isn't abstract - // 2. The workload has no platform or at least one platform includes Windows + // We want all workloads in all manifests iff the workload has no platform or at least one + // platform includes Windows var workloads = manifests.SelectMany(m => m.Workloads). Select(w => w.Value). - Where(wd => !wd.IsAbstract). Where(wd => (wd.Platforms == null) || wd.Platforms.Any(p => p.StartsWith("win"))); var packIds = workloads.SelectMany(w => w.Packs).Distinct(); From d8967a1e57275aa682c7639ef95b4d148722ba4e Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Wed, 16 Jun 2021 12:49:53 -0700 Subject: [PATCH 170/699] [main] Update dependencies from mono/linker dotnet/arcade (#7526) * Update dependencies from https://github.com/dotnet/arcade build 20210614.1 Microsoft.DotNet.Build.Tasks.Feed , Microsoft.DotNet.Arcade.Sdk , Microsoft.DotNet.SwaggerGenerator.MSBuild , Microsoft.DotNet.SignTool , Microsoft.DotNet.Helix.Sdk From Version 6.0.0-beta.21311.3 -> To Version 6.0.0-beta.21314.1 * Update dependencies from https://github.com/mono/linker build 20210614.2 Microsoft.NET.ILLink.Tasks From Version 6.0.100-preview.6.21310.3 -> To Version 6.0.100-preview.6.21314.2 * Update dependencies from https://github.com/dotnet/arcade build 20210616.1 Microsoft.DotNet.Build.Tasks.Feed , Microsoft.DotNet.Arcade.Sdk , Microsoft.DotNet.SwaggerGenerator.MSBuild , Microsoft.DotNet.SignTool , Microsoft.DotNet.Helix.Sdk From Version 6.0.0-beta.21311.3 -> To Version 6.0.0-beta.21316.1 Co-authored-by: dotnet-maestro[bot] --- eng/Version.Details.xml | 24 ++++++++++++------------ eng/Versions.props | 8 ++++---- global.json | 4 ++-- 3 files changed, 18 insertions(+), 18 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index 435bb20778a..aca16ef78d5 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -11,25 +11,25 @@ - + https://github.com/dotnet/arcade - 4a2b475948d498b89fedef7cf890883f49bc1ea3 + bdcc258d0d4a547be51703795a140fa6b1f68c57 - + https://github.com/dotnet/arcade - 4a2b475948d498b89fedef7cf890883f49bc1ea3 + bdcc258d0d4a547be51703795a140fa6b1f68c57 - + https://github.com/dotnet/arcade - 4a2b475948d498b89fedef7cf890883f49bc1ea3 + bdcc258d0d4a547be51703795a140fa6b1f68c57 - + https://github.com/dotnet/arcade - 4a2b475948d498b89fedef7cf890883f49bc1ea3 + bdcc258d0d4a547be51703795a140fa6b1f68c57 - + https://github.com/dotnet/arcade - 4a2b475948d498b89fedef7cf890883f49bc1ea3 + bdcc258d0d4a547be51703795a140fa6b1f68c57 https://github.com/dotnet/arcade-services @@ -47,9 +47,9 @@ https://github.com/dotnet/roslyn 473e349f86b0f5c9dd47330cba22e0ea225c85a5 - + https://github.com/mono/linker - caeaf2a3fb3f636805fdd4881df4f9a539fff8f6 + f90f5c929054d4b4b69da0a21db4f69aa64d63af https://github.com/dotnet/sourcelink diff --git a/eng/Versions.props b/eng/Versions.props index ada88fc99c2..0d7fe6de34d 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -35,7 +35,7 @@ 2.1.1 2.1.0 3.10.0-4.21310.5 - 6.0.100-preview.6.21310.3 + 6.0.100-preview.6.21314.2 16.7.1 4.8.3 5.3.0.1 @@ -65,8 +65,8 @@ 2.4.1 2.0.3 2.4.1 - 6.0.0-beta.21311.3 - 6.0.0-beta.21311.3 + 6.0.0-beta.21316.1 + 6.0.0-beta.21316.1 1.22.0 1.1.2 2.0.0 @@ -77,7 +77,7 @@ 1.1.0-beta.20258.6 1.1.0-beta-21309-01 1.1.0-beta-21309-01 - 6.0.0-beta.21311.3 + 6.0.0-beta.21316.1 1.0.0-beta.21312.1 1.1.0-beta.21228.1 1.0.0-prerelease.21314.1 diff --git a/global.json b/global.json index 660e274f7a7..50a1019d7f9 100644 --- a/global.json +++ b/global.json @@ -3,7 +3,7 @@ "dotnet": "6.0.100-preview.4.21255.9" }, "msbuild-sdks": { - "Microsoft.DotNet.Arcade.Sdk": "6.0.0-beta.21311.3", - "Microsoft.DotNet.Helix.Sdk": "6.0.0-beta.21311.3" + "Microsoft.DotNet.Arcade.Sdk": "6.0.0-beta.21316.1", + "Microsoft.DotNet.Helix.Sdk": "6.0.0-beta.21316.1" } } From 5619c32997ab2d6a5ddf6d2e488c572b882f891b Mon Sep 17 00:00:00 2001 From: Jon Fortescue Date: Thu, 17 Jun 2021 16:25:58 -0700 Subject: [PATCH 171/699] Simplify OneLocBuild conditional expression (#7537) --- Documentation/OneLocBuild.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Documentation/OneLocBuild.md b/Documentation/OneLocBuild.md index edcd824c5dc..9f53e5c7fd9 100644 --- a/Documentation/OneLocBuild.md +++ b/Documentation/OneLocBuild.md @@ -43,7 +43,7 @@ To prevent OneLocBuild from running in the public project where it will fail. Make sure to remove the `CreatePr: false` line from step 2. Additionally, if you added the YAML condition from step 2, make sure that your new YAML condition now looks like: ```yaml -- ${{ if and(and(ne(variables['System.TeamProject'], 'public'), notin(variables['Build.Reason'], 'PullRequest')), eq(variables['Build.SourceBranch'], 'refs/heads/main')) }}: +- ${{ if and(ne(variables['System.TeamProject'], 'public'), notin(variables['Build.Reason'], 'PullRequest'), eq(variables['Build.SourceBranch'], 'refs/heads/main')) }}: ``` 7. If using a mirrored repository (your code is mirrored to a trusted repository which your official build uses), From fa7990b1fa5aded5d355b46d8da47c8d8ece7c8f Mon Sep 17 00:00:00 2001 From: Mark Wilkie Date: Fri, 18 Jun 2021 08:38:42 -0700 Subject: [PATCH 172/699] Create ArcadeServicing.md (#7540) --- Documentation/Policy/ArcadeServicing.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/Documentation/Policy/ArcadeServicing.md b/Documentation/Policy/ArcadeServicing.md index 088db0ddcf6..901464061b1 100644 --- a/Documentation/Policy/ArcadeServicing.md +++ b/Documentation/Policy/ArcadeServicing.md @@ -10,7 +10,7 @@ Mechanically, this is done in two ways: - Branch our tools (Arcade) with the product. - Rev the APIs of our services as needed. -**For those inserting into Visual Studio, careful consideration should be given to which Arcade to take a dependency on. If latest features are needed, then 'n' (or master) might make sense, otherwise 'n-1' (servicing) will be more stable and have much less churn.** +**For those inserting into Visual Studio, careful consideration should be given to which Arcade to take a dependency on. If latest features are needed, then 'n' (or main) might make sense, otherwise 'n-1' (servicing) will be more stable and have much less churn.** **It's important to note that we *must* continue to validate any supported versions of Arcade or services.** @@ -18,14 +18,14 @@ of Arcade or services.** ## Details ### Where do we do work on Arcade SDK? -- `master` for future releases +- `main` for future releases - `release/` for servicing -### How do I get my servicing fix into master? -- Fixes that apply to both master as well as servicing releases must be first checked into - master and then cherry picked into the appropriate servicing branches. -- Code flow happens from servicing branches back into master for the purposes of completeness, - but developers must **not** rely on this to get fixes into master. +### How do I get my servicing fix into main? +- Fixes that apply to both main as well as servicing releases must be first checked into + main and then cherry picked into the appropriate servicing branches. +- Code flow happens from servicing branches back into main for the purposes of completeness, + but developers must **not** rely on this to get fixes into main. ### When do we branch? - Major releases of .NET Core, not minor From 4a2adbaf2da67d8951fbc19d4c257a6fd51741c2 Mon Sep 17 00:00:00 2001 From: Jon Fortescue Date: Fri, 18 Jun 2021 09:39:19 -0700 Subject: [PATCH 173/699] Change templating support to new system (#7536) --- eng/common/generate-locproject.ps1 | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/eng/common/generate-locproject.ps1 b/eng/common/generate-locproject.ps1 index de348a2e225..25e97ac0077 100644 --- a/eng/common/generate-locproject.ps1 +++ b/eng/common/generate-locproject.ps1 @@ -25,8 +25,15 @@ Push-Location "$SourcesDirectory" # push location for Resolve-Path -Relative to # Template files $jsonFiles = @() -$jsonFiles += Get-ChildItem -Recurse -Path "$SourcesDirectory" | Where-Object { $_.FullName -Match "\.template\.config\\localize\\en\..+\.json" } # .NET templating pattern -$jsonFiles += Get-ChildItem -Recurse -Path "$SourcesDirectory" | Where-Object { $_.FullName -Match "en\\strings\.json" } # current winforms pattern +$jsonTemplateFiles = Get-ChildItem -Recurse -Path "$SourcesDirectory" | Where-Object { $_.FullName -Match "\.template\.config\\localize\\.+\.en\.json" } # .NET templating pattern +$jsonTemplateFiles | ForEach-Object { + $null = $_.Name -Match "(.+)\.[\w-]+\.json" # matches '[filename].[langcode].json + + $destinationFile = "$($_.Directory.FullName)\$($Matches.1).json" + $jsonFiles += Copy-Item "$($_.FullName)" -Destination $destinationFile -PassThru +} + +$jsonWinformsTemplateFiles = Get-ChildItem -Recurse -Path "$SourcesDirectory" | Where-Object { $_.FullName -Match "en\\strings\.json" } # current winforms pattern $xlfFiles = @() @@ -44,7 +51,7 @@ $langXlfFiles | ForEach-Object { $xlfFiles += Copy-Item "$($_.FullName)" -Destination $destinationFile -PassThru } -$locFiles = $jsonFiles + $xlfFiles +$locFiles = $jsonFiles + $jsonWinformsTemplateFiles + $xlfFiles $locJson = @{ Projects = @( From 2820b35c3b0158e84ebe2459864ace40e781df15 Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Sat, 19 Jun 2021 14:07:20 +0000 Subject: [PATCH 174/699] [main] Update dependencies from dotnet/xliff-tasks dotnet/arcade mono/linker (#7535) [main] Update dependencies from dotnet/xliff-tasks dotnet/arcade mono/linker --- eng/Version.Details.xml | 28 ++++++++++++++-------------- eng/Versions.props | 10 +++++----- global.json | 4 ++-- 3 files changed, 21 insertions(+), 21 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index aca16ef78d5..8eef83f963c 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -11,25 +11,25 @@ - + https://github.com/dotnet/arcade - bdcc258d0d4a547be51703795a140fa6b1f68c57 + 4a2adbaf2da67d8951fbc19d4c257a6fd51741c2 - + https://github.com/dotnet/arcade - bdcc258d0d4a547be51703795a140fa6b1f68c57 + 4a2adbaf2da67d8951fbc19d4c257a6fd51741c2 - + https://github.com/dotnet/arcade - bdcc258d0d4a547be51703795a140fa6b1f68c57 + 4a2adbaf2da67d8951fbc19d4c257a6fd51741c2 - + https://github.com/dotnet/arcade - bdcc258d0d4a547be51703795a140fa6b1f68c57 + 4a2adbaf2da67d8951fbc19d4c257a6fd51741c2 - + https://github.com/dotnet/arcade - bdcc258d0d4a547be51703795a140fa6b1f68c57 + 4a2adbaf2da67d8951fbc19d4c257a6fd51741c2 https://github.com/dotnet/arcade-services @@ -47,9 +47,9 @@ https://github.com/dotnet/roslyn 473e349f86b0f5c9dd47330cba22e0ea225c85a5 - + https://github.com/mono/linker - f90f5c929054d4b4b69da0a21db4f69aa64d63af + c739a81ba553b00df1cb2f5b9974deae996b757a https://github.com/dotnet/sourcelink @@ -68,9 +68,9 @@ https://github.com/dotnet/symreader-converter c5ba7c88f92e2dde156c324a8c8edc04d9fa4fe0 - + https://github.com/dotnet/xliff-tasks - d4e95f2cca463823ce9c8e3394554883b6e3c091 + 134daa7f10735efb489cc7c816967da831b22926 diff --git a/eng/Versions.props b/eng/Versions.props index 0d7fe6de34d..3fd083ae99c 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -35,7 +35,7 @@ 2.1.1 2.1.0 3.10.0-4.21310.5 - 6.0.100-preview.6.21314.2 + 6.0.100-preview.6.21317.4 16.7.1 4.8.3 5.3.0.1 @@ -65,8 +65,8 @@ 2.4.1 2.0.3 2.4.1 - 6.0.0-beta.21316.1 - 6.0.0-beta.21316.1 + 6.0.0-beta.21318.2 + 6.0.0-beta.21318.2 1.22.0 1.1.2 2.0.0 @@ -77,8 +77,8 @@ 1.1.0-beta.20258.6 1.1.0-beta-21309-01 1.1.0-beta-21309-01 - 6.0.0-beta.21316.1 - 1.0.0-beta.21312.1 + 6.0.0-beta.21318.2 + 1.0.0-beta.21318.1 1.1.0-beta.21228.1 1.0.0-prerelease.21314.1 1.1.156602 diff --git a/global.json b/global.json index 50a1019d7f9..70e500b770d 100644 --- a/global.json +++ b/global.json @@ -3,7 +3,7 @@ "dotnet": "6.0.100-preview.4.21255.9" }, "msbuild-sdks": { - "Microsoft.DotNet.Arcade.Sdk": "6.0.0-beta.21316.1", - "Microsoft.DotNet.Helix.Sdk": "6.0.0-beta.21316.1" + "Microsoft.DotNet.Arcade.Sdk": "6.0.0-beta.21318.2", + "Microsoft.DotNet.Helix.Sdk": "6.0.0-beta.21318.2" } } From a3377cccde8639089f99107e2ba5df2c8cbe6394 Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Sat, 19 Jun 2021 15:19:23 +0000 Subject: [PATCH 175/699] Update dependencies from https://github.com/dotnet/xharness build 20210618.2 (#7541) [main] Update dependencies from dotnet/xharness --- eng/Version.Details.xml | 4 ++-- eng/Versions.props | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index 8eef83f963c..e3ada449567 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -39,9 +39,9 @@ https://github.com/dotnet/arcade-services cac955fe259cb611f6a29d09209bd717deb69037 - + https://github.com/dotnet/xharness - d6f8a4ad30908fb210390380eae97264e4fbe8ce + c1f8287aa98f6975a18bdc60692343d638540dec https://github.com/dotnet/roslyn diff --git a/eng/Versions.props b/eng/Versions.props index 3fd083ae99c..137f5781cba 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -80,7 +80,7 @@ 6.0.0-beta.21318.2 1.0.0-beta.21318.1 1.1.0-beta.21228.1 - 1.0.0-prerelease.21314.1 + 1.0.0-prerelease.21318.2 1.1.156602 1.1.156602 6.0.100-preview.5.21254.11 From 36b148348ee8312f6369c0c56b0d0fe07deec603 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C5=99emek=20Vysok=C3=BD?= Date: Mon, 21 Jun 2021 12:26:52 +0200 Subject: [PATCH 176/699] Enable app end signal workaround for iOS/tvOS 14+ devices (+ enable device E2E tests) (#7544) --- azure-pipelines.yml | 27 +++++++++---------- .../Sdk/CreateXHarnessAppleWorkItems.cs | 1 + tests/UnitTests.XHarness.iOS.Device.proj | 2 +- ...un.proj => XHarness.Device.AppleTest.proj} | 12 ++++----- 4 files changed, 20 insertions(+), 22 deletions(-) rename tests/XHarness/{XHarness.Device.AppleRun.proj => XHarness.Device.AppleTest.proj} (77%) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 4d76282f96f..0bba4f3181d 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -185,20 +185,19 @@ stages: env: SYSTEM_ACCESSTOKEN: $(System.AccessToken) HelixAccessToken: '' - # TODO (prvysoky): This will be enabled once we get a better app to test with (core-eng/11893) - # - script: eng/common/build.sh - # -configuration $(_BuildConfig) - # -prepareMachine - # -ci - # -restore - # -test - # -projects $(Build.SourcesDirectory)/tests/UnitTests.XHarness.iOS.Device.proj - # /bl:$(Build.SourcesDirectory)/artifacts/log/$(_BuildConfig)/Helix.XHarness.iOS.Device.binlog - # /p:RestoreUsingNuGetTargets=false - # displayName: XHarness iOS Device Helix Testing - # env: - # SYSTEM_ACCESSTOKEN: $(System.AccessToken) - # HelixAccessToken: '' + - script: eng/common/build.sh + -configuration $(_BuildConfig) + -prepareMachine + -ci + -restore + -test + -projects $(Build.SourcesDirectory)/tests/UnitTests.XHarness.iOS.Device.proj + /bl:$(Build.SourcesDirectory)/artifacts/log/$(_BuildConfig)/Helix.XHarness.iOS.Device.binlog + /p:RestoreUsingNuGetTargets=false + displayName: XHarness iOS Device Helix Testing + env: + SYSTEM_ACCESSTOKEN: $(System.AccessToken) + HelixAccessToken: '' - script: eng/common/build.sh -configuration $(_BuildConfig) -prepareMachine diff --git a/src/Microsoft.DotNet.Helix/Sdk/CreateXHarnessAppleWorkItems.cs b/src/Microsoft.DotNet.Helix/Sdk/CreateXHarnessAppleWorkItems.cs index d61f7db5660..1cd81e66846 100644 --- a/src/Microsoft.DotNet.Helix/Sdk/CreateXHarnessAppleWorkItems.cs +++ b/src/Microsoft.DotNet.Helix/Sdk/CreateXHarnessAppleWorkItems.cs @@ -157,6 +157,7 @@ private async Task PrepareWorkItem( ? $"--launch-timeout \"$launch_timeout\" " : $"--expected-exit-code $expected_exit_code ") + (resetSimulator ? $"--reset-simulator " : string.Empty) + + (target.Contains("device") ? $"--signal-app-end " : string.Empty) + // iOS/tvOS 14+ workaround "--xcode \"$xcode_path\" " + "-v " + (!string.IsNullOrEmpty(AppArguments) ? "-- " + AppArguments : string.Empty); diff --git a/tests/UnitTests.XHarness.iOS.Device.proj b/tests/UnitTests.XHarness.iOS.Device.proj index 917fc076e2a..0e78ad60d95 100644 --- a/tests/UnitTests.XHarness.iOS.Device.proj +++ b/tests/UnitTests.XHarness.iOS.Device.proj @@ -24,7 +24,7 @@ - + diff --git a/tests/XHarness/XHarness.Device.AppleRun.proj b/tests/XHarness/XHarness.Device.AppleTest.proj similarity index 77% rename from tests/XHarness/XHarness.Device.AppleRun.proj rename to tests/XHarness/XHarness.Device.AppleTest.proj index db3041c52c1..dc3c9a83c61 100644 --- a/tests/XHarness/XHarness.Device.AppleRun.proj +++ b/tests/XHarness/XHarness.Device.AppleTest.proj @@ -3,8 +3,8 @@ - HelloiOS.app - https://netcorenativeassets.blob.core.windows.net/resource-packages/external/ios/test-app/ios-device/$(XHarnessRunAppBundleName).unsigned.zip + System.Buffers.Tests.app + https://netcorenativeassets.blob.core.windows.net/resource-packages/external/ios/test-app/ios-device/$(XHarnessRunAppBundleName).zip @@ -21,11 +21,9 @@ ios-device - 00:05:00 - 00:04:00 - 00:03:00 - false - 200 + 00:12:00 + 00:10:00 + 00:07:00 From 28a6403ee97077256fcdc60f599f0ad9e38e3cfa Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Mon, 21 Jun 2021 17:56:59 +0000 Subject: [PATCH 177/699] [main] Update dependencies from dotnet/roslyn dotnet/xliff-tasks dotnet/arcade (#7542) [main] Update dependencies from dotnet/roslyn dotnet/xliff-tasks dotnet/arcade --- eng/Version.Details.xml | 28 ++++++++++++++-------------- eng/Versions.props | 10 +++++----- global.json | 4 ++-- 3 files changed, 21 insertions(+), 21 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index e3ada449567..a8e3f83a6a2 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -11,25 +11,25 @@ - + https://github.com/dotnet/arcade - 4a2adbaf2da67d8951fbc19d4c257a6fd51741c2 + a3377cccde8639089f99107e2ba5df2c8cbe6394 - + https://github.com/dotnet/arcade - 4a2adbaf2da67d8951fbc19d4c257a6fd51741c2 + a3377cccde8639089f99107e2ba5df2c8cbe6394 - + https://github.com/dotnet/arcade - 4a2adbaf2da67d8951fbc19d4c257a6fd51741c2 + a3377cccde8639089f99107e2ba5df2c8cbe6394 - + https://github.com/dotnet/arcade - 4a2adbaf2da67d8951fbc19d4c257a6fd51741c2 + a3377cccde8639089f99107e2ba5df2c8cbe6394 - + https://github.com/dotnet/arcade - 4a2adbaf2da67d8951fbc19d4c257a6fd51741c2 + a3377cccde8639089f99107e2ba5df2c8cbe6394 https://github.com/dotnet/arcade-services @@ -43,9 +43,9 @@ https://github.com/dotnet/xharness c1f8287aa98f6975a18bdc60692343d638540dec - + https://github.com/dotnet/roslyn - 473e349f86b0f5c9dd47330cba22e0ea225c85a5 + 7ceb633154acb9d716fd3eb2b6df1a0468d8e416 https://github.com/mono/linker @@ -68,9 +68,9 @@ https://github.com/dotnet/symreader-converter c5ba7c88f92e2dde156c324a8c8edc04d9fa4fe0 - + https://github.com/dotnet/xliff-tasks - 134daa7f10735efb489cc7c816967da831b22926 + 5836ac11931b8e663c5cf81027dc834cbf41ecdd diff --git a/eng/Versions.props b/eng/Versions.props index 137f5781cba..114d883d657 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -34,7 +34,7 @@ 2.0.0 2.1.1 2.1.0 - 3.10.0-4.21310.5 + 3.10.0-4.21318.11 6.0.100-preview.6.21317.4 16.7.1 4.8.3 @@ -65,8 +65,8 @@ 2.4.1 2.0.3 2.4.1 - 6.0.0-beta.21318.2 - 6.0.0-beta.21318.2 + 6.0.0-beta.21319.2 + 6.0.0-beta.21319.2 1.22.0 1.1.2 2.0.0 @@ -77,8 +77,8 @@ 1.1.0-beta.20258.6 1.1.0-beta-21309-01 1.1.0-beta-21309-01 - 6.0.0-beta.21318.2 - 1.0.0-beta.21318.1 + 6.0.0-beta.21319.2 + 1.0.0-beta.21320.1 1.1.0-beta.21228.1 1.0.0-prerelease.21318.2 1.1.156602 diff --git a/global.json b/global.json index 70e500b770d..2f92b79576a 100644 --- a/global.json +++ b/global.json @@ -3,7 +3,7 @@ "dotnet": "6.0.100-preview.4.21255.9" }, "msbuild-sdks": { - "Microsoft.DotNet.Arcade.Sdk": "6.0.0-beta.21318.2", - "Microsoft.DotNet.Helix.Sdk": "6.0.0-beta.21318.2" + "Microsoft.DotNet.Arcade.Sdk": "6.0.0-beta.21319.2", + "Microsoft.DotNet.Helix.Sdk": "6.0.0-beta.21319.2" } } From f925a9e0fad79e87dd1c46205b252c12b685cfa0 Mon Sep 17 00:00:00 2001 From: Igor Velikorossov Date: Tue, 22 Jun 2021 10:58:32 +1000 Subject: [PATCH 178/699] Correctly determine VS16 by setting lower boundary in vswhere (#7543) --- .../build/Microsoft.DotNet.CMake.Sdk.targets | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Microsoft.DotNet.CMake.Sdk/build/Microsoft.DotNet.CMake.Sdk.targets b/src/Microsoft.DotNet.CMake.Sdk/build/Microsoft.DotNet.CMake.Sdk.targets index 89299a0672d..50567ff2682 100644 --- a/src/Microsoft.DotNet.CMake.Sdk/build/Microsoft.DotNet.CMake.Sdk.targets +++ b/src/Microsoft.DotNet.CMake.Sdk/build/Microsoft.DotNet.CMake.Sdk.targets @@ -31,7 +31,7 @@ <_CMakeMultiConfigurationGenerator>true <_CMakePassArchitectureToGenerator>true - [,17.0) + [15,17.0) Win32 From 1685a12f35cfb396f9352d63736eb675673b0e20 Mon Sep 17 00:00:00 2001 From: Jon Fortescue Date: Wed, 23 Jun 2021 09:45:42 -0700 Subject: [PATCH 179/699] Update OneLocBuild doc to include info on specifying MirrorBranch (#7547) --- Documentation/OneLocBuild.md | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/Documentation/OneLocBuild.md b/Documentation/OneLocBuild.md index 9f53e5c7fd9..6ff500455d2 100644 --- a/Documentation/OneLocBuild.md +++ b/Documentation/OneLocBuild.md @@ -76,11 +76,15 @@ PRs from OneLocBuild as they are made and that you allow the translator SLA for ### If You're Releasing from a Branch Other Than `main` (Including Servicing Branches) If you're releasing from any other branch (including servicing branches), you must do the following: -1. Add the OneLocBuild job template to the pipeline YAML of the release branch +1. Add the OneLocBuild job template to the pipeline YAML of the release branch. When you do this, you have to change the YAML of both the main branch and the target branch to include a conditional specifying + the target branch rather than main (as above). Additionally, your YAML should include the following line (substituting your target branch for `target-branch`): +```yaml + MirrorBranch: target-branch +``` 2. Open a [repo modification ticket](https://ceapex.visualstudio.com/CEINTL/_workitems/create/Loc%20Request?templateId=415a0569-35ed-45c3-9321-8b1affff1f52&ownerId=c2e38d3d-0e9e-429f-955d-6e39fc6f0457) with the loc team at least two weeks before the release and request that they re-target your repository to the release branch. -4. Merge the OneLocBuild PRs to your release branch. -5. After the release, open another repo modification ticket to re-target your repository to the `main` branch again. +3. Merge the OneLocBuild PRs to your release branch. +4. After the release, open another repo modification ticket to re-target your repository to the `main` branch again. ## Filing Issues for Translation Issues From 66fbc0009e910492c0344f25f99af78bdd8171aa Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Wed, 23 Jun 2021 19:23:21 +0000 Subject: [PATCH 180/699] [main] Update dependencies from dotnet/arcade mono/linker (#7546) [main] Update dependencies from dotnet/arcade mono/linker --- eng/Version.Details.xml | 24 ++++++++++++------------ eng/Versions.props | 8 ++++---- global.json | 4 ++-- 3 files changed, 18 insertions(+), 18 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index a8e3f83a6a2..e7896f5ebb1 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -11,25 +11,25 @@ - + https://github.com/dotnet/arcade - a3377cccde8639089f99107e2ba5df2c8cbe6394 + 28a6403ee97077256fcdc60f599f0ad9e38e3cfa - + https://github.com/dotnet/arcade - a3377cccde8639089f99107e2ba5df2c8cbe6394 + 28a6403ee97077256fcdc60f599f0ad9e38e3cfa - + https://github.com/dotnet/arcade - a3377cccde8639089f99107e2ba5df2c8cbe6394 + 28a6403ee97077256fcdc60f599f0ad9e38e3cfa - + https://github.com/dotnet/arcade - a3377cccde8639089f99107e2ba5df2c8cbe6394 + 28a6403ee97077256fcdc60f599f0ad9e38e3cfa - + https://github.com/dotnet/arcade - a3377cccde8639089f99107e2ba5df2c8cbe6394 + 28a6403ee97077256fcdc60f599f0ad9e38e3cfa https://github.com/dotnet/arcade-services @@ -47,9 +47,9 @@ https://github.com/dotnet/roslyn 7ceb633154acb9d716fd3eb2b6df1a0468d8e416 - + https://github.com/mono/linker - c739a81ba553b00df1cb2f5b9974deae996b757a + a07cab7b71a1321a9e68571c0b6095144a177b4e https://github.com/dotnet/sourcelink diff --git a/eng/Versions.props b/eng/Versions.props index 114d883d657..6e00a378108 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -35,7 +35,7 @@ 2.1.1 2.1.0 3.10.0-4.21318.11 - 6.0.100-preview.6.21317.4 + 6.0.100-preview.6.21322.1 16.7.1 4.8.3 5.3.0.1 @@ -65,8 +65,8 @@ 2.4.1 2.0.3 2.4.1 - 6.0.0-beta.21319.2 - 6.0.0-beta.21319.2 + 6.0.0-beta.21321.2 + 6.0.0-beta.21321.2 1.22.0 1.1.2 2.0.0 @@ -77,7 +77,7 @@ 1.1.0-beta.20258.6 1.1.0-beta-21309-01 1.1.0-beta-21309-01 - 6.0.0-beta.21319.2 + 6.0.0-beta.21321.2 1.0.0-beta.21320.1 1.1.0-beta.21228.1 1.0.0-prerelease.21318.2 diff --git a/global.json b/global.json index 2f92b79576a..1bde2a6ca3d 100644 --- a/global.json +++ b/global.json @@ -3,7 +3,7 @@ "dotnet": "6.0.100-preview.4.21255.9" }, "msbuild-sdks": { - "Microsoft.DotNet.Arcade.Sdk": "6.0.0-beta.21319.2", - "Microsoft.DotNet.Helix.Sdk": "6.0.0-beta.21319.2" + "Microsoft.DotNet.Arcade.Sdk": "6.0.0-beta.21321.2", + "Microsoft.DotNet.Helix.Sdk": "6.0.0-beta.21321.2" } } From ef5f83815c9e43e56e4c4e525948bb018247de38 Mon Sep 17 00:00:00 2001 From: Jacques Eloff Date: Wed, 23 Jun 2021 16:21:55 -0700 Subject: [PATCH 181/699] Add support to generate workload manifest MSIs (#7548) --- eng/Versions.props | 1 + .../src/EmbeddedTemplates.cs | 1 + .../src/GenerateManifestMsi.cs | 348 ++++++++++++++++++ ...rosoft.DotNet.Build.Tasks.Workloads.csproj | 1 + .../src/MsiTemplate/Directories.wxs | 8 +- .../src/MsiTemplate/ManifestProduct.wxs | 53 +++ .../src/MsiTemplate/Variables.wxi | 3 + 7 files changed, 410 insertions(+), 5 deletions(-) create mode 100644 src/Microsoft.DotNet.Build.Tasks.Workloads/src/GenerateManifestMsi.cs create mode 100644 src/Microsoft.DotNet.Build.Tasks.Workloads/src/MsiTemplate/ManifestProduct.wxs diff --git a/eng/Versions.props b/eng/Versions.props index 6e00a378108..5db161c31e5 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -84,5 +84,6 @@ 1.1.156602 1.1.156602 6.0.100-preview.5.21254.11 + 1.0.0-preview1.1.21116.1 diff --git a/src/Microsoft.DotNet.Build.Tasks.Workloads/src/EmbeddedTemplates.cs b/src/Microsoft.DotNet.Build.Tasks.Workloads/src/EmbeddedTemplates.cs index ffb6b3739e9..1ad0d3a7662 100644 --- a/src/Microsoft.DotNet.Build.Tasks.Workloads/src/EmbeddedTemplates.cs +++ b/src/Microsoft.DotNet.Build.Tasks.Workloads/src/EmbeddedTemplates.cs @@ -64,6 +64,7 @@ static EmbeddedTemplates() { { "DependencyProvider.wxs", $"{s_namespace}.MsiTemplate.DependencyProvider.wxs" }, { "Directories.wxs", $"{s_namespace}.MsiTemplate.Directories.wxs" }, + { "ManifestProduct.wxs", $"{s_namespace}.MsiTemplate.ManifestProduct.wxs" }, { "Product.wxs", $"{s_namespace}.MsiTemplate.Product.wxs" }, { "Registry.wxs", $"{s_namespace}.MsiTemplate.Registry.wxs" }, { "Variables.wxi", $"{s_namespace}.MsiTemplate.Variables.wxi" }, diff --git a/src/Microsoft.DotNet.Build.Tasks.Workloads/src/GenerateManifestMsi.cs b/src/Microsoft.DotNet.Build.Tasks.Workloads/src/GenerateManifestMsi.cs new file mode 100644 index 00000000000..899f010c8b2 --- /dev/null +++ b/src/Microsoft.DotNet.Build.Tasks.Workloads/src/GenerateManifestMsi.cs @@ -0,0 +1,348 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text.Json; +using System.Xml; +using Microsoft.Build.Framework; +using Microsoft.Build.Utilities; +using Microsoft.Deployment.DotNet.Releases; + +namespace Microsoft.DotNet.Build.Tasks.Workloads +{ + public class GenerateManifestMsi : GenerateTaskBase + { + private Version _sdkFeaureBandVersion; + + /// + /// The path where the generated MSIs will be placed. + /// + [Required] + public string OutputPath + { + get; + set; + } + + /// + /// The ID of the workload manifest. + /// + [Required] + public string ManifestId + { + get; + set; + } + + /// + /// The set of MSIs that were produced. + /// + [Output] + public ITaskItem[] Msis + { + get; + protected set; + } + + private Version SdkFeatureBandVersion + { + get + { + if (_sdkFeaureBandVersion == null) + { + ReleaseVersion sdkReleaseVersion = new ReleaseVersion(SdkVersion); + + _sdkFeaureBandVersion = new($"{sdkReleaseVersion.Major}.{sdkReleaseVersion.Minor}.{sdkReleaseVersion.SdkFeatureBand}"); + } + + return _sdkFeaureBandVersion; + } + } + + /// + /// The SDK version, e.g. 6.0.107. + /// + [Required] + public string SdkVersion + { + get; + set; + } + + /// + /// Semicolon sepearate list of ICEs to suppress. + /// + public string SuppressIces + { + get; + set; + } + + /// + /// The version of the MSI. + /// + [Required] + public string MsiVersion + { + get; + set; + } + + [Required] + public string WorkloadManifestPackage + { + get; + set; + } + + public override bool Execute() + { + try + { + Log.LogMessage($"Generating workload manifest installer for {SdkFeatureBandVersion}"); + + NugetPackage nupkg = new(WorkloadManifestPackage, Log); + List msis = new(); + + // MSI ProductName defaults to the package title and fallback to the package ID with a warning. + string productName = nupkg.Title; + + if (string.IsNullOrWhiteSpace(nupkg.Title)) + { + Log?.LogMessage(MessageImportance.High, $"'{WorkloadManifestPackage}' should have a non-empty title. The MSI ProductName will be set to the package ID instead."); + productName = nupkg.Id; + } + + // Extract once, but harvest multiple times because some generated attributes are platform dependent. + string packageContentsDirectory = Path.Combine(PackageDirectory, $"{nupkg.Identity}"); + nupkg.Extract(packageContentsDirectory, Enumerable.Empty()); + string packageContentsDataDirectory = Path.Combine(packageContentsDirectory, "data"); + + foreach (string platform in GenerateMsiBase.SupportedPlatforms) + { + // Extract the MSI template and add it to the list of source files. + List sourceFiles = new(); + string msiSourcePath = Path.Combine(MsiDirectory, $"{nupkg.Id}", $"{nupkg.Version}", platform); + sourceFiles.Add(EmbeddedTemplates.Extract("DependencyProvider.wxs", msiSourcePath)); + sourceFiles.Add(EmbeddedTemplates.Extract("ManifestProduct.wxs", msiSourcePath)); + + string EulaRtfPath = Path.Combine(msiSourcePath, "eula.rtf"); + File.WriteAllText(EulaRtfPath, GenerateMsiBase.Eula.Replace("__LICENSE_URL__", nupkg.LicenseUrl)); + EmbeddedTemplates.Extract("Variables.wxi", msiSourcePath); + + // Harvest the package contents and add it to the source files we need to compile. + string packageContentWxs = Path.Combine(msiSourcePath, "PackageContent.wxs"); + sourceFiles.Add(packageContentWxs); + + HarvestToolTask heat = new(BuildEngine, WixToolsetPath) + { + ComponentGroupName = GenerateMsiBase.PackageContentComponentGroupName, + DirectoryReference = "ManifestIdDir", + OutputFile = packageContentWxs, + Platform = platform, + SourceDirectory = packageContentsDataDirectory + }; + + if (!heat.Execute()) + { + throw new Exception($"Failed to harvest package contents."); + } + + // To support upgrades, the UpgradeCode must be stable withing a feature band. + // For example, 6.0.101 and 6.0.108 will generate the same GUID for the same platform. + var upgradeCode = Utils.CreateUuid(GenerateMsiBase.UpgradeCodeNamespaceUuid, $"{SdkFeatureBandVersion};{platform}"); + var productCode = Guid.NewGuid(); + Log.LogMessage($"UC: {upgradeCode}, PC: {productCode}, {SdkFeatureBandVersion}, {SdkVersion}, {platform}"); + + // Compile the MSI sources + string candleIntermediateOutputPath = Path.Combine(IntermediateBaseOutputPath, "wixobj", + $"{nupkg.Id}", $"{nupkg.Version}", platform); + + CompileToolTask candle = new(BuildEngine, WixToolsetPath) + { + // Candle expects the output path to end with a single '\' + OutputPath = candleIntermediateOutputPath.TrimEnd(Path.DirectorySeparatorChar) + Path.DirectorySeparatorChar, + SourceFiles = sourceFiles, + Arch = platform + }; + + // Configure preprocessor definitions. + string manufacturer = "Microsoft Corporation"; + + if (!string.IsNullOrWhiteSpace(nupkg.Authors) && (nupkg.Authors.IndexOf("Microsoft", StringComparison.OrdinalIgnoreCase) < 0)) + { + manufacturer = nupkg.Authors; + } + Log.LogMessage(MessageImportance.Low, $"Setting Manufacturer to '{manufacturer}'"); + + candle.PreprocessorDefinitions.Add($@"PackageId={nupkg.Id}"); + candle.PreprocessorDefinitions.Add($@"PackageVersion={nupkg.Version}"); + candle.PreprocessorDefinitions.Add($@"ProductVersion={MsiVersion}"); + candle.PreprocessorDefinitions.Add($@"ProductCode={productCode}"); + candle.PreprocessorDefinitions.Add($@"UpgradeCode={upgradeCode}"); + // Override the default provider key + candle.PreprocessorDefinitions.Add($@"DependencyProviderKey={nupkg.Id},{platform}"); + candle.PreprocessorDefinitions.Add($@"ProductName={productName}"); + candle.PreprocessorDefinitions.Add($@"Platform={platform}"); + candle.PreprocessorDefinitions.Add($@"SourceDir={packageContentsDataDirectory}"); + candle.PreprocessorDefinitions.Add($@"Manufacturer={manufacturer}"); + candle.PreprocessorDefinitions.Add($@"EulaRtf={EulaRtfPath}"); + candle.PreprocessorDefinitions.Add($@"SdkFeatureBandVersion={SdkFeatureBandVersion}"); + + // The temporary installer in the SDK used lower invariants of the manifest ID. + // We have to do the same to ensure the keypath generation produces stable GUIDs so that + // the manifests/targets get the same component GUIDs. + candle.PreprocessorDefinitions.Add($@"ManifestId={ManifestId.ToLowerInvariant()}"); + + // Compiler extension to process dependency provider authoring for package reference counting. + candle.Extensions.Add("WixDependencyExtension"); + + if (!candle.Execute()) + { + throw new Exception($"Failed to compile MSI."); + } + + // Link the MSI. The generated filename contains a the semantic version (excluding build metadata) and platform. + // If the source package already contains a platform, e.g. an aliased package that has a RID, then we don't add + // the platform again. + + string shortPackageName = Path.GetFileNameWithoutExtension(WorkloadManifestPackage); + + string outputFile = Path.Combine(OutputPath, shortPackageName + $"-{platform}.msi"); + + LinkToolTask light = new(BuildEngine, WixToolsetPath) + { + OutputFile = Path.Combine(OutputPath, outputFile), + SourceFiles = Directory.EnumerateFiles(candleIntermediateOutputPath, "*.wixobj"), + SuppressIces = this.SuppressIces + }; + + // Add WiX extensions + light.Extensions.Add("WixDependencyExtension"); + light.Extensions.Add("WixUIExtension"); + + if (!light.Execute()) + { + throw new Exception($"Failed to link MSI."); + } + + // Generate metadata used for CLI based installations. + string msiPath = light.OutputFile; + MsiProperties msiProps = new MsiProperties + { + InstallSize = MsiUtils.GetInstallSize(msiPath), + Payload = Path.GetFileName(msiPath), + ProductCode = MsiUtils.GetProperty(msiPath, "ProductCode"), + ProductVersion = MsiUtils.GetProperty(msiPath, "ProductVersion"), + ProviderKeyName = $"{nupkg.Id},{nupkg.Version},{platform}", + UpgradeCode = MsiUtils.GetProperty(msiPath, "UpgradeCode") + }; + + string msiJsonPath = Path.Combine(Path.GetDirectoryName(msiPath), Path.GetFileNameWithoutExtension(msiPath) + ".json"); + File.WriteAllText(msiJsonPath, JsonSerializer.Serialize(msiProps)); + + TaskItem msi = new(light.OutputFile); + msi.SetMetadata(Metadata.Platform, platform); + msi.SetMetadata(Metadata.Version, nupkg.ProductVersion); + msi.SetMetadata(Metadata.JsonProperties, msiJsonPath); + msi.SetMetadata(Metadata.WixObj, candleIntermediateOutputPath); + + // Generate a .csproj to build a NuGet payload package to carry the MSI and JSON manifest + msi.SetMetadata(Metadata.PackageProject, GeneratePackageProject(msi.ItemSpec, msiJsonPath, platform, nupkg)); + + msis.Add(msi); + } + + Msis = msis.ToArray(); + } + catch (Exception e) + { + Log.LogErrorFromException(e); + } + + return !Log.HasLoggedErrors; + } + + + private string GeneratePackageProject(string msiPath, string msiJsonPath, string platform, NugetPackage nupkg) + { + string msiPackageProject = Path.Combine(MsiPackageDirectory, platform, nupkg.Id, "msi.csproj"); + string msiPackageProjectDir = Path.GetDirectoryName(msiPackageProject); + + Log?.LogMessage($"Generating package project: '{msiPackageProject}'"); + + if (Directory.Exists(msiPackageProjectDir)) + { + Directory.Delete(msiPackageProjectDir, recursive: true); + } + + Directory.CreateDirectory(msiPackageProjectDir); + + EmbeddedTemplates.Extract("Icon.png", msiPackageProjectDir); + EmbeddedTemplates.Extract("LICENSE.TXT", msiPackageProjectDir); + + string licenseTextPath = Path.Combine(msiPackageProjectDir, "LICENSE.TXT"); + + XmlWriterSettings settings = new XmlWriterSettings + { + Indent = true, + IndentChars = " ", + }; + + XmlWriter writer = XmlWriter.Create(msiPackageProject, settings); + + writer.WriteStartElement("Project"); + writer.WriteAttributeString("Sdk", "Microsoft.NET.Sdk"); + + writer.WriteStartElement("PropertyGroup"); + writer.WriteElementString("TargetFramework", "net5.0"); + writer.WriteElementString("GeneratePackageOnBuild", "true"); + writer.WriteElementString("IncludeBuildOutput", "false"); + writer.WriteElementString("IsPackable", "true"); + writer.WriteElementString("PackageType", "DotnetPlatform"); + writer.WriteElementString("SuppressDependenciesWhenPacking", "true"); + writer.WriteElementString("NoWarn", "$(NoWarn);NU5128"); + writer.WriteElementString("PackageId", $"{nupkg.Id}.Msi.{platform}"); + writer.WriteElementString("PackageVersion", $"{nupkg.Version}"); + writer.WriteElementString("Description", nupkg.Description); + writer.WriteElementString("PackageIcon", "Icon.png"); + + if (!string.IsNullOrWhiteSpace(nupkg.Authors)) + { + writer.WriteElementString("Authors", nupkg.Authors); + } + + if (!string.IsNullOrWhiteSpace(nupkg.Copyright)) + { + writer.WriteElementString("Copyright", nupkg.Copyright); + } + + writer.WriteElementString("PackageLicenseExpression", "MIT"); + writer.WriteEndElement(); + + writer.WriteStartElement("ItemGroup"); + WriteItem(writer, "None", msiPath, @"\data"); + WriteItem(writer, "None", msiJsonPath, @"\data\msi.json"); + WriteItem(writer, "None", licenseTextPath, @"\"); + writer.WriteEndElement(); + + writer.WriteEndElement(); + writer.Flush(); + writer.Close(); + + return msiPackageProject; + } + + private void WriteItem(XmlWriter writer, string itemName, string include, string packagePath) + { + writer.WriteStartElement(itemName); + writer.WriteAttributeString("Include", include); + writer.WriteAttributeString("Pack", "true"); + writer.WriteAttributeString("PackagePath", packagePath); + writer.WriteEndElement(); + } + } +} diff --git a/src/Microsoft.DotNet.Build.Tasks.Workloads/src/Microsoft.DotNet.Build.Tasks.Workloads.csproj b/src/Microsoft.DotNet.Build.Tasks.Workloads/src/Microsoft.DotNet.Build.Tasks.Workloads.csproj index ae34705aed9..161b0654020 100644 --- a/src/Microsoft.DotNet.Build.Tasks.Workloads/src/Microsoft.DotNet.Build.Tasks.Workloads.csproj +++ b/src/Microsoft.DotNet.Build.Tasks.Workloads/src/Microsoft.DotNet.Build.Tasks.Workloads.csproj @@ -22,6 +22,7 @@ + diff --git a/src/Microsoft.DotNet.Build.Tasks.Workloads/src/MsiTemplate/Directories.wxs b/src/Microsoft.DotNet.Build.Tasks.Workloads/src/MsiTemplate/Directories.wxs index e3bc884ceee..66cbae46436 100644 --- a/src/Microsoft.DotNet.Build.Tasks.Workloads/src/MsiTemplate/Directories.wxs +++ b/src/Microsoft.DotNet.Build.Tasks.Workloads/src/MsiTemplate/Directories.wxs @@ -6,11 +6,9 @@ - - - - - + + + diff --git a/src/Microsoft.DotNet.Build.Tasks.Workloads/src/MsiTemplate/ManifestProduct.wxs b/src/Microsoft.DotNet.Build.Tasks.Workloads/src/MsiTemplate/ManifestProduct.wxs new file mode 100644 index 00000000000..b5556c28d19 --- /dev/null +++ b/src/Microsoft.DotNet.Build.Tasks.Workloads/src/MsiTemplate/ManifestProduct.wxs @@ -0,0 +1,53 @@ + + + + + + + + + + + + + + + + + + + + + + NOT WIX_DOWNGRADE_DETECTED + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/Microsoft.DotNet.Build.Tasks.Workloads/src/MsiTemplate/Variables.wxi b/src/Microsoft.DotNet.Build.Tasks.Workloads/src/MsiTemplate/Variables.wxi index 72c0e6d4c9b..0c5e3b07d49 100644 --- a/src/Microsoft.DotNet.Build.Tasks.Workloads/src/MsiTemplate/Variables.wxi +++ b/src/Microsoft.DotNet.Build.Tasks.Workloads/src/MsiTemplate/Variables.wxi @@ -17,5 +17,8 @@ + + + From 13040ff54ecdb347b70f51d75b0f3f84a348c6b0 Mon Sep 17 00:00:00 2001 From: Doug Bunting <6431421+dougbu@users.noreply.github.com> Date: Thu, 24 Jun 2021 09:52:42 -0700 Subject: [PATCH 182/699] [main] Add option to prefer 64bit `msbuild` (#7559) - cherry-pick of a5dbede4615c / #7531 --- eng/common/tools.ps1 | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/eng/common/tools.ps1 b/eng/common/tools.ps1 index 5619c7aaee1..7942ffaf4cb 100644 --- a/eng/common/tools.ps1 +++ b/eng/common/tools.ps1 @@ -378,7 +378,16 @@ function InitializeVisualStudioMSBuild([bool]$install, [object]$vsRequirements = } $msbuildVersionDir = if ([int]$vsMajorVersion -lt 16) { "$vsMajorVersion.0" } else { "Current" } - return $global:_MSBuildExe = Join-Path $vsInstallDir "MSBuild\$msbuildVersionDir\Bin\msbuild.exe" + + $local:BinFolder = Join-Path $vsInstallDir "MSBuild\$msbuildVersionDir\Bin" + $local:Prefer64bit = if ($vsRequirements.Prefer64bit) { $vsRequirements.Prefer64bit } else { $false } + if ($local:Prefer64bit -and (Test-Path(Join-Path $local:BinFolder "amd64"))) { + $global:_MSBuildExe = Join-Path $local:BinFolder "amd64\msbuild.exe" + } else { + $global:_MSBuildExe = Join-Path $local:BinFolder "msbuild.exe" + } + + return $global:_MSBuildExe } function InitializeVisualStudioEnvironmentVariables([string] $vsInstallDir, [string] $vsMajorVersion) { From a68ec1edf328e737b31a09cb49e1929c28e91d0c Mon Sep 17 00:00:00 2001 From: Eric StJohn Date: Thu, 24 Jun 2021 11:12:01 -0700 Subject: [PATCH 183/699] Make ModifierComparer use type references instead of definition (#7557) When comparing definitions this was failing if the type couldn't be resolved, for instance if a type-forwarded dependency was missing or references were specified at all. This was inconsistent with our other parameter comparisons which just evaluate the compare the type reference as a string without considering assembly. This does raise a concerning issue, that APICompat doesn't actually evaluate assembly equivalence of parameters but that's an existing problem. --- .../src/Rules/Compat/ParameterModifiersCannotChange.cs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Microsoft.DotNet.ApiCompat/src/Rules/Compat/ParameterModifiersCannotChange.cs b/src/Microsoft.DotNet.ApiCompat/src/Rules/Compat/ParameterModifiersCannotChange.cs index 03fa47e2f88..bcda21f01c0 100644 --- a/src/Microsoft.DotNet.ApiCompat/src/Rules/Compat/ParameterModifiersCannotChange.cs +++ b/src/Microsoft.DotNet.ApiCompat/src/Rules/Compat/ParameterModifiersCannotChange.cs @@ -129,8 +129,8 @@ private string GetReturnValueModifier(IMethodDefinition method) private class ModifierComparer : IEqualityComparer { - private readonly static IEqualityComparer TypeComparer = - CciComparers.Default.GetEqualityComparer(); + private readonly static IEqualityComparer TypeComparer = + CciComparers.Default.GetEqualityComparer(); private ModifierComparer() { } @@ -144,7 +144,7 @@ public bool Equals(ICustomModifier x, ICustomModifier y) } return x.IsOptional == y.IsOptional && - TypeComparer.Equals(x.Modifier.ResolvedType, y.Modifier.ResolvedType); + TypeComparer.Equals(x.Modifier, y.Modifier); } public int GetHashCode(ICustomModifier obj) @@ -154,7 +154,7 @@ public int GetHashCode(ICustomModifier obj) return 0; } - return (obj.IsOptional ? 1 : 0) | TypeComparer.GetHashCode(obj.Modifier.ResolvedType) << 1; + return (obj.IsOptional ? 1 : 0) | TypeComparer.GetHashCode(obj.Modifier) << 1; } } } From 5fb184c2e49ee6608baf237ddb77bf2e30fb3ecd Mon Sep 17 00:00:00 2001 From: Doug Bunting <6431421+dougbu@users.noreply.github.com> Date: Fri, 25 Jun 2021 17:33:32 -0700 Subject: [PATCH 184/699] [main] Fix strict-mode break (#7564) - use `Get-Member` instead of assuming `$null` property value - fixes build break I caused in 13040ff54ecd --- eng/common/tools.ps1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/eng/common/tools.ps1 b/eng/common/tools.ps1 index 7942ffaf4cb..4b255203249 100644 --- a/eng/common/tools.ps1 +++ b/eng/common/tools.ps1 @@ -380,7 +380,7 @@ function InitializeVisualStudioMSBuild([bool]$install, [object]$vsRequirements = $msbuildVersionDir = if ([int]$vsMajorVersion -lt 16) { "$vsMajorVersion.0" } else { "Current" } $local:BinFolder = Join-Path $vsInstallDir "MSBuild\$msbuildVersionDir\Bin" - $local:Prefer64bit = if ($vsRequirements.Prefer64bit) { $vsRequirements.Prefer64bit } else { $false } + $local:Prefer64bit = if (Get-Member -InputObject $vsRequirements -Name 'Prefer64bit') { $vsRequirements.Prefer64bit } else { $false } if ($local:Prefer64bit -and (Test-Path(Join-Path $local:BinFolder "amd64"))) { $global:_MSBuildExe = Join-Path $local:BinFolder "amd64\msbuild.exe" } else { From 39999f6999c8966e9915f8a916581c34cbfada4d Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Fri, 25 Jun 2021 18:01:17 -0700 Subject: [PATCH 185/699] [main] Update dependencies from dotnet/xliff-tasks dotnet/arcade (#7553) * Update dependencies from https://github.com/dotnet/arcade build 20210623.1 Microsoft.DotNet.Build.Tasks.Feed , Microsoft.DotNet.Arcade.Sdk , Microsoft.DotNet.SwaggerGenerator.MSBuild , Microsoft.DotNet.SignTool , Microsoft.DotNet.Helix.Sdk From Version 6.0.0-beta.21321.2 -> To Version 6.0.0-beta.21323.1 * Update dependencies from https://github.com/dotnet/xliff-tasks build 20210623.1 XliffTasks From Version 1.0.0-beta.21320.1 -> To Version 1.0.0-beta.21323.1 * Update dependencies from https://github.com/dotnet/xliff-tasks build 20210624.1 XliffTasks From Version 1.0.0-beta.21320.1 -> To Version 1.0.0-beta.21324.1 * Update dependencies from https://github.com/dotnet/arcade build 20210624.3 Microsoft.DotNet.Build.Tasks.Feed , Microsoft.DotNet.Arcade.Sdk , Microsoft.DotNet.SwaggerGenerator.MSBuild , Microsoft.DotNet.SignTool , Microsoft.DotNet.Helix.Sdk From Version 6.0.0-beta.21321.2 -> To Version 6.0.0-beta.21324.3 Co-authored-by: dotnet-maestro[bot] --- eng/Version.Details.xml | 24 ++++++++++++------------ eng/Versions.props | 8 ++++---- global.json | 4 ++-- 3 files changed, 18 insertions(+), 18 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index e7896f5ebb1..eaa4fa7edbe 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -11,25 +11,25 @@ - + https://github.com/dotnet/arcade - 28a6403ee97077256fcdc60f599f0ad9e38e3cfa + a68ec1edf328e737b31a09cb49e1929c28e91d0c - + https://github.com/dotnet/arcade - 28a6403ee97077256fcdc60f599f0ad9e38e3cfa + a68ec1edf328e737b31a09cb49e1929c28e91d0c - + https://github.com/dotnet/arcade - 28a6403ee97077256fcdc60f599f0ad9e38e3cfa + a68ec1edf328e737b31a09cb49e1929c28e91d0c - + https://github.com/dotnet/arcade - 28a6403ee97077256fcdc60f599f0ad9e38e3cfa + a68ec1edf328e737b31a09cb49e1929c28e91d0c - + https://github.com/dotnet/arcade - 28a6403ee97077256fcdc60f599f0ad9e38e3cfa + a68ec1edf328e737b31a09cb49e1929c28e91d0c https://github.com/dotnet/arcade-services @@ -68,9 +68,9 @@ https://github.com/dotnet/symreader-converter c5ba7c88f92e2dde156c324a8c8edc04d9fa4fe0 - + https://github.com/dotnet/xliff-tasks - 5836ac11931b8e663c5cf81027dc834cbf41ecdd + 5c56aad48295a8f8e81d5041f06d32b4a0aec14d diff --git a/eng/Versions.props b/eng/Versions.props index 5db161c31e5..d2e37dcb0fd 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -65,8 +65,8 @@ 2.4.1 2.0.3 2.4.1 - 6.0.0-beta.21321.2 - 6.0.0-beta.21321.2 + 6.0.0-beta.21324.3 + 6.0.0-beta.21324.3 1.22.0 1.1.2 2.0.0 @@ -77,8 +77,8 @@ 1.1.0-beta.20258.6 1.1.0-beta-21309-01 1.1.0-beta-21309-01 - 6.0.0-beta.21321.2 - 1.0.0-beta.21320.1 + 6.0.0-beta.21324.3 + 1.0.0-beta.21324.1 1.1.0-beta.21228.1 1.0.0-prerelease.21318.2 1.1.156602 diff --git a/global.json b/global.json index 1bde2a6ca3d..42eee1cae04 100644 --- a/global.json +++ b/global.json @@ -3,7 +3,7 @@ "dotnet": "6.0.100-preview.4.21255.9" }, "msbuild-sdks": { - "Microsoft.DotNet.Arcade.Sdk": "6.0.0-beta.21321.2", - "Microsoft.DotNet.Helix.Sdk": "6.0.0-beta.21321.2" + "Microsoft.DotNet.Arcade.Sdk": "6.0.0-beta.21324.3", + "Microsoft.DotNet.Helix.Sdk": "6.0.0-beta.21324.3" } } From 65fc9af050cbb59b0d2c56b0b1436ba09f3237ac Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Mon, 28 Jun 2021 13:11:58 +0000 Subject: [PATCH 186/699] [main] Update dependencies from dotnet/xliff-tasks dotnet/xharness (#7565) [main] Update dependencies from dotnet/xliff-tasks dotnet/xharness --- eng/Version.Details.xml | 8 ++++---- eng/Versions.props | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index eaa4fa7edbe..96d3e8269eb 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -39,9 +39,9 @@ https://github.com/dotnet/arcade-services cac955fe259cb611f6a29d09209bd717deb69037 - + https://github.com/dotnet/xharness - c1f8287aa98f6975a18bdc60692343d638540dec + 0bc5e50dff0583fda68f52cfcd39c253e0dacbbe https://github.com/dotnet/roslyn @@ -68,9 +68,9 @@ https://github.com/dotnet/symreader-converter c5ba7c88f92e2dde156c324a8c8edc04d9fa4fe0 - + https://github.com/dotnet/xliff-tasks - 5c56aad48295a8f8e81d5041f06d32b4a0aec14d + 71c811561ad4dcf46825a5077fbcc668ab74754f diff --git a/eng/Versions.props b/eng/Versions.props index d2e37dcb0fd..efff2b5f587 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -78,9 +78,9 @@ 1.1.0-beta-21309-01 1.1.0-beta-21309-01 6.0.0-beta.21324.3 - 1.0.0-beta.21324.1 + 1.0.0-beta.21325.1 1.1.0-beta.21228.1 - 1.0.0-prerelease.21318.2 + 1.0.0-prerelease.21328.2 1.1.156602 1.1.156602 6.0.100-preview.5.21254.11 From 685c1a4fa207d81e881a402a32ffa1c0fb191b42 Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Mon, 28 Jun 2021 14:14:05 +0000 Subject: [PATCH 187/699] Update dependencies from https://github.com/mono/linker build 20210627.1 (#7566) [main] Update dependencies from mono/linker --- eng/Version.Details.xml | 4 ++-- eng/Versions.props | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index 96d3e8269eb..39f757d7cac 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -47,9 +47,9 @@ https://github.com/dotnet/roslyn 7ceb633154acb9d716fd3eb2b6df1a0468d8e416 - + https://github.com/mono/linker - a07cab7b71a1321a9e68571c0b6095144a177b4e + 1c0138c71850bdab14d740e9c4c8808ed034dc51 https://github.com/dotnet/sourcelink diff --git a/eng/Versions.props b/eng/Versions.props index efff2b5f587..2b1ab748514 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -35,7 +35,7 @@ 2.1.1 2.1.0 3.10.0-4.21318.11 - 6.0.100-preview.6.21322.1 + 6.0.100-preview.6.21327.1 16.7.1 4.8.3 5.3.0.1 From 695b2415681884b2afc316877af35018f78b52f5 Mon Sep 17 00:00:00 2001 From: Eric StJohn Date: Tue, 29 Jun 2021 05:19:36 -0700 Subject: [PATCH 188/699] Recognize files in ref-pack under "analyzers" as analyzers and write them to the frameworkList (#7561) * Recognize files in ref-pack under "analyzers" as analyzers and write them to the frameworkList * Fixes to support analyzer packaging Platform manifest creation uses a dictionary to map template items to files in the package, but didn't account for duplicate file names (as is the case with .resources.dll). Handle this by taking the first file of a particular name. Include `analyzer/` prefixed files in framework list. Allow for analyzers to be excluded from closure and type validation with ExcludeFromValidation metadata. This metadata is necessary because analyzers will be missing dependencies provided by the compiler, and their resource.dll will have duplicate files, both which would result in errors. --- .../src/CreateFrameworkListFile.cs | 30 +++++++++++++++++++ ...ratePlatformManifestEntriesFromTemplate.cs | 2 +- .../targets/sharedfx.targets | 6 ++-- 3 files changed, 34 insertions(+), 4 deletions(-) diff --git a/src/Microsoft.DotNet.SharedFramework.Sdk/src/CreateFrameworkListFile.cs b/src/Microsoft.DotNet.SharedFramework.Sdk/src/CreateFrameworkListFile.cs index 984fee0faa3..be0e8b2b6ec 100644 --- a/src/Microsoft.DotNet.SharedFramework.Sdk/src/CreateFrameworkListFile.cs +++ b/src/Microsoft.DotNet.SharedFramework.Sdk/src/CreateFrameworkListFile.cs @@ -131,11 +131,41 @@ public override bool Execute() } } + string analyzerLanguage = null; + + if (path.StartsWith("analyzers/")) + { + type = "Analyzer"; + + if (path.EndsWith(".resources.dll")) + { + // omit analyzer resources + continue; + } + + var pathParts = path.Split('/'); + + if (pathParts.Length < 3 || !pathParts[1].Equals("dotnet", StringComparison.Ordinal) || pathParts.Length > 4) + { + Log.LogError($"Unexpected analyzer path format {path}. Expected 'analyzers/dotnet(/language)/analyzer.dll"); + } + + if (pathParts.Length > 3) + { + analyzerLanguage = pathParts[2]; + } + } + var element = new XElement( "File", new XAttribute("Type", type), new XAttribute("Path", path)); + if (analyzerLanguage != null) + { + element.Add(new XAttribute("Language", analyzerLanguage)); + } + if (f.IsResourceFile) { element.Add( diff --git a/src/Microsoft.DotNet.SharedFramework.Sdk/src/GeneratePlatformManifestEntriesFromTemplate.cs b/src/Microsoft.DotNet.SharedFramework.Sdk/src/GeneratePlatformManifestEntriesFromTemplate.cs index fc798d6e028..e8346c2b79a 100644 --- a/src/Microsoft.DotNet.SharedFramework.Sdk/src/GeneratePlatformManifestEntriesFromTemplate.cs +++ b/src/Microsoft.DotNet.SharedFramework.Sdk/src/GeneratePlatformManifestEntriesFromTemplate.cs @@ -30,7 +30,7 @@ public class GeneratePlatformManifestEntriesFromTemplate : BuildTask public override bool Execute() { List entries = new List(); - var files = Files.ToDictionary(file => Path.GetFileName(file.ItemSpec)); + var files = Files.ToLookup(file => Path.GetFileName(file.ItemSpec)).ToDictionary(l => l.Key, l=> l.First()); foreach (var entryTemplate in PlatformManifestEntryTemplates) { if (files.TryGetValue(entryTemplate.ItemSpec, out ITaskItem existingFile)) diff --git a/src/Microsoft.DotNet.SharedFramework.Sdk/targets/sharedfx.targets b/src/Microsoft.DotNet.SharedFramework.Sdk/targets/sharedfx.targets index 395f2e3cbb0..df74bf08695 100644 --- a/src/Microsoft.DotNet.SharedFramework.Sdk/targets/sharedfx.targets +++ b/src/Microsoft.DotNet.SharedFramework.Sdk/targets/sharedfx.targets @@ -385,7 +385,7 @@ <_FrameworkListRootAttribute Include="TargetFrameworkVersion" Value="$(TargetFrameworkVersion.TrimStart('vV'))" /> <_FrameworkListRootAttribute Include="FrameworkName" Value="$(SharedFrameworkName)" /> <_FrameworkListRootAttribute Include="Name" Value="$(SharedFrameworkFriendlyName)" /> - <_FrameworkListTargetFilePrefix Include="ref/;runtimes/" /> + <_FrameworkListTargetFilePrefix Include="ref/;runtimes/;analyzers/" /> <_FrameworkListTargetFilePrefix Condition="'$(PlatformPackageType)' == 'RuntimePack'" Include="PgoData" /> @@ -448,7 +448,7 @@ <_closureFiles Include="@(FilesToPackage)" - Condition="('%(Extension)' == '.dll' or '%(Extension)' == '$(LibraryFileExtension)') and '%(FilesToPackage.Culture)' == ''" /> + Condition="('%(Extension)' == '.dll' or '%(Extension)' == '$(LibraryFileExtension)') and '%(FilesToPackage.Culture)' == '' and '%(FilesToPackage.ExcludeFromValidation)' != 'true'" /> <_closureFileNames Include="@(_closureFiles->'%(FileName)')" Original="%(Identity)" /> <_closureFileNamesFiltered Include="@(_closureFileNames)" Exclude="@(ExcludeFromClosure)"/> @@ -478,7 +478,7 @@ <_dupTypeFiles Include="@(FilesToPackage)" - Condition="('%(Extension)' == '.dll' or '%(Extension)' == '$(LibraryFileExtension)') and '%(FilesToPackage.Culture)' == ''" /> + Condition="('%(Extension)' == '.dll' or '%(Extension)' == '$(LibraryFileExtension)') and '%(FilesToPackage.Culture)' == '' and '%(FilesToPackage.ExcludeFromValidation)' != 'true'" /> <_dupTypeFileName Include="@(_dupTypeFiles->'%(FileName)')" Original="%(Identity)" /> <_dupTypeFileNamesFiltered Include="@(_dupTypeFileName)" Exclude="@(ExcludeFromDuplicateTypes)"/> From 16f6776217a3929b6a808b8dcdb9916fb1b5ef7e Mon Sep 17 00:00:00 2001 From: Matt Mitchell Date: Tue, 29 Jun 2021 08:09:01 -0700 Subject: [PATCH 189/699] Add preview/RC internal flow (#7505) * Add preview/RC internal flow * Add preview/RC internal flow * Add a script that flips between preview+ and preview * Bug fixes --- scripts/create-net6-preview-flow.ps1 | 100 ++++++++++++++++++++++++--- scripts/flip-previewplus-flow.ps1 | 50 ++++++++++++++ 2 files changed, 141 insertions(+), 9 deletions(-) create mode 100644 scripts/flip-previewplus-flow.ps1 diff --git a/scripts/create-net6-preview-flow.ps1 b/scripts/create-net6-preview-flow.ps1 index d67150a11d7..c5a25d9f562 100644 --- a/scripts/create-net6-preview-flow.ps1 +++ b/scripts/create-net6-preview-flow.ps1 @@ -4,7 +4,10 @@ param [Parameter(Mandatory=$true)][string]$SdkChannel, [Parameter(Mandatory=$true)][string]$RuntimeBranch, [Parameter(Mandatory=$true)][string]$SdkBranch, - [Parameter(Mandatory=$true)][string]$VSChannel + [Parameter(Mandatory=$true)][string]$VSChannel, + [switch]$AddInternalFlow, + [string]$InternalRuntimeChannel, + [string]$InternalSdkChannel ) function MakeDefaultChannel($repo, $branch, $channel) @@ -13,18 +16,37 @@ function MakeDefaultChannel($repo, $branch, $channel) & darc add-default-channel --repo "$repo" --branch "$branch" --channel "$channel" --quiet } +function DisableFlow($channel) +{ + Write-Host "Disabling flow on $channel" + & darc subscription-status --disable --channel "$channel" --quiet --exact +} + function AddFlow($sourceRepo, $sourceChannel, $targetRepo, $targetBranch, $frequency) { Write-Host "Adding flow - $sourceRepo @ $sourceChannel -> $targetRepo @ $targetBranch ($frequency)" & darc add-subscription --source-repo "$sourceRepo" --channel "$sourceChannel" --target-repo "$targetRepo" --target-branch "$targetBranch" --update-frequency "$frequency" --quiet --no-trigger --standard-automerge } +function AddBatchedFlow($sourceRepo, $sourceChannel, $targetRepo, $targetBranch, $frequency) +{ + Write-Host "Adding flow - $sourceRepo @ $sourceChannel -> $targetRepo @ $targetBranch ($frequency)" + & darc add-subscription --source-repo "$sourceRepo" --channel "$sourceChannel" --target-repo "$targetRepo" --target-branch "$targetBranch" --update-frequency "$frequency" --quiet --no-trigger --batchable +} + +function AddBatchedMergePolicy($targetRepo, $targetBranch) +{ + Write-Host "Setting batched merge policy for $targetRepo @ $targetBranch" + & darc set-repository-policies --repo "$targetRepo" --branch "$targetBranch" --standard-automerge --quiet +} + function AddArcadeFlow($targetRepo, $targetBranch) { AddFlow https://github.com/dotnet/arcade ".NET Eng - Latest" $targetRepo $targetBranch None } -# Make default channels +$InternalRuntimeBranch = "internal/$RuntimeBranch" +$InternalSdkBranch = "internal/$SdkBranch" Write-Host "Making default channels for runtime repos" MakeDefaultChannel https://dev.azure.com/dnceng/internal/_git/dotnet-wpf-int $RuntimeBranch $RuntimeChannel @@ -38,15 +60,42 @@ MakeDefaultChannel https://github.com/dotnet/wpf $RuntimeBranch $RuntimeChannel MakeDefaultChannel https://github.com/dotnet/winforms $RuntimeBranch $RuntimeChannel MakeDefaultChannel https://github.com/mono/linker $RuntimeBranch $RuntimeChannel +if ($AddInternalFlow) { + # Because of where internal fixes tend to be, we eliminate some leaves in the graph + # and flow them through the normal public channels: emsdk, icu, linker. + # wpf-int gets assigned to the internal channel in addition (since there is no public->internal merge) + Write-Host "Making default channels for internal branches of runtime repos" + MakeDefaultChannel https://dev.azure.com/dnceng/internal/_git/dotnet-wpf-int $RuntimeBranch $InternalRuntimeChannel + MakeDefaultChannel https://dev.azure.com/dnceng/internal/_git/dotnet-aspnetcore $InternalRuntimeBranch $InternalRuntimeChannel + MakeDefaultChannel https://dev.azure.com/dnceng/internal/_git/dotnet-efcore $InternalRuntimeBranch $InternalRuntimeChannel + MakeDefaultChannel https://dev.azure.com/dnceng/internal/_git/dotnet-runtime $InternalRuntimeBranch $InternalRuntimeChannel + MakeDefaultChannel https://dev.azure.com/dnceng/internal/_git/dotnet-windowsdesktop $InternalRuntimeBranch $InternalRuntimeChannel + MakeDefaultChannel https://dev.azure.com/dnceng/internal/_git/dotnet-wpf $InternalRuntimeBranch $InternalRuntimeChannel + MakeDefaultChannel https://dev.azure.com/dnceng/internal/_git/dotnet-winforms $InternalRuntimeBranch $InternalRuntimeChannel +} + Write-Host "Making default channels for SDK repos" MakeDefaultChannel https://github.com/dotnet/installer $SdkBranch $SdkChannel MakeDefaultChannel https://github.com/dotnet/sdk $SdkBranch $SdkChannel MakeDefaultChannel https://github.com/dotnet/roslyn-analyzers $SdkBranch $SdkChannel MakeDefaultChannel https://github.com/dotnet/templating $SdkBranch $SdkChannel -# Make dependency flow +if ($AddInternalFlow) { + # Because of where internal fixes tend to be, we eliminate some leaves in the sdk graph + # and flow them through the normal public channels: templating, roslyn-analyzers + Write-Host "Making default channels for SDK repos" + MakeDefaultChannel https://dev.azure.com/dnceng/internal/_git/dotnet-installer $InternalSdkBranch $InternalSdkChannel + MakeDefaultChannel https://dev.azure.com/dnceng/internal/_git/dotnet-sdk $InternalSdkBranch $InternalSdkChannel +} + +Write-Host "Setting up batched merge policies" +AddBatchedMergePolicy https://github.com/dotnet/aspnetcore $RuntimeBranch -Write-Host "Add arcade flow" +if ($AddInternalFlow) { + AddBatchedMergePolicy https://dev.azure.com/dnceng/internal/_git/dotnet-aspnetcore $InternalRuntimeBranch +} + +Write-Host "Adding arcade flow" AddArcadeFlow https://dev.azure.com/dnceng/internal/_git/dotnet-wpf-int $RuntimeBranch AddArcadeFlow https://github.com/dotnet/aspnetcore $RuntimeBranch AddArcadeFlow https://github.com/dotnet/efcore $RuntimeBranch @@ -62,31 +111,64 @@ AddArcadeFlow https://github.com/dotnet/sdk $SdkBranch AddArcadeFlow https://github.com/dotnet/roslyn-analyzers $SdkBranch AddArcadeFlow https://github.com/dotnet/templating $SdkBranch -Write-Host "Add runtime -> runtime flow" +Write-Host "Adding runtime -> runtime flow" AddFlow https://dev.azure.com/dnceng/internal/_git/dotnet-wpf-int $RuntimeChannel https://github.com/dotnet/wpf $RuntimeBranch EveryBuild -AddFlow https://github.com/dotnet/efcore $RuntimeChannel https://github.com/dotnet/aspnetcore $RuntimeBranch EveryBuild -AddFlow https://github.com/dotnet/emsdk $RuntimeChannel https://github.com/dotnet/aspnetcore $RuntimeBranch EveryBuild +AddBatchedFlow https://github.com/dotnet/efcore $RuntimeChannel https://github.com/dotnet/aspnetcore $RuntimeBranch EveryBuild +AddBatchedFlow https://github.com/dotnet/emsdk $RuntimeChannel https://github.com/dotnet/aspnetcore $RuntimeBranch EveryBuild AddFlow https://github.com/dotnet/emsdk $RuntimeChannel https://github.com/dotnet/runtime $RuntimeBranch EveryBuild AddFlow https://github.com/dotnet/icu $RuntimeChannel https://github.com/dotnet/runtime $RuntimeBranch EveryBuild -AddFlow https://github.com/dotnet/runtime $RuntimeChannel https://github.com/dotnet/aspnetcore $RuntimeBranch EveryBuild +AddBatchedFlow https://github.com/dotnet/runtime $RuntimeChannel https://github.com/dotnet/aspnetcore $RuntimeBranch EveryBuild AddFlow https://github.com/dotnet/runtime $RuntimeChannel https://github.com/dotnet/efcore $RuntimeBranch EveryBuild AddFlow https://github.com/dotnet/runtime $RuntimeChannel https://github.com/dotnet/winforms $RuntimeBranch EveryBuild AddFlow https://github.com/dotnet/winforms $RuntimeChannel https://github.com/dotnet/wpf $RuntimeBranch EveryBuild AddFlow https://github.com/dotnet/wpf $RuntimeChannel https://github.com/dotnet/windowsdesktop $RuntimeBranch EveryBuild AddFlow https://github.com/mono/linker $RuntimeChannel https://github.com/dotnet/runtime $RuntimeBranch EveryBuild +if ($AddInternalFlow) { + Write-Host "Adding internal runtime -> internal runtime flow" + AddBatchedFlow https://dev.azure.com/dnceng/internal/_git/dotnet-efcore $InternalRuntimeChannel https://dev.azure.com/dnceng/internal/_git/dotnet-aspnetcore $InternalRuntimeBranch EveryBuild + AddBatchedFlow https://dev.azure.com/dnceng/internal/_git/dotnet-runtime $InternalRuntimeChannel https://dev.azure.com/dnceng/internal/_git/dotnet-aspnetcore $InternalRuntimeBranch EveryBuild + AddFlow https://dev.azure.com/dnceng/internal/_git/dotnet-wpf-int $InternalRuntimeChannel https://dev.azure.com/dnceng/internal/_git/dotnet-wpf $InternalRuntimeBranch EveryBuild + AddFlow https://dev.azure.com/dnceng/internal/_git/dotnet-runtime $InternalRuntimeChannel https://dev.azure.com/dnceng/internal/_git/dotnet-efcore $InternalRuntimeBranch EveryBuild + AddFlow https://dev.azure.com/dnceng/internal/_git/dotnet-runtime $InternalRuntimeChannel https://dev.azure.com/dnceng/internal/_git/dotnet-winforms $InternalRuntimeBranch EveryBuild + AddFlow https://dev.azure.com/dnceng/internal/_git/dotnet-winforms $InternalRuntimeChannel https://dev.azure.com/dnceng/internal/_git/dotnet-wpf $InternalRuntimeBranch EveryBuild + AddFlow https://dev.azure.com/dnceng/internal/_git/dotnet-wpf $InternalRuntimeChannel https://dev.azure.com/dnceng/internal/_git/dotnet-windowsdesktop $InternalRuntimeBranch EveryBuild + + Write-Host "Disabling internal runtime -> internal runtime flow" + DisableFlow $InternalRuntimeChannel +} + Write-Host "Add runtime->sdk flow" AddFlow https://github.com/dotnet/aspnetcore $RuntimeChannel https://github.com/dotnet/sdk $SdkBranch EveryBuild AddFlow https://github.com/dotnet/windowsdesktop $RuntimeChannel https://github.com/dotnet/sdk $SdkBranch EveryBuild AddFlow https://github.com/dotnet/runtime $RuntimeChannel https://github.com/dotnet/sdk $SdkBranch EveryBuild AddFlow https://github.com/mono/linker $RuntimeChannel https://github.com/dotnet/sdk $SdkBranch EveryBuild +if ($AddInternalFlow) { + Write-Host "Adding internal runtime->internal sdk flow" + AddFlow https://dev.azure.com/dnceng/internal/_git/dotnet-aspnetcore $InternalRuntimeChannel https://dev.azure.com/dnceng/internal/_git/dotnet-sdk $InternalSdkBranch EveryBuild + AddFlow https://dev.azure.com/dnceng/internal/_git/dotnet-windowsdesktop $InternalRuntimeChannel https://dev.azure.com/dnceng/internal/_git/dotnet-sdk $InternalSdkBranch EveryBuild + AddFlow https://dev.azure.com/dnceng/internal/_git/dotnet-runtime $InternalRuntimeChannel https://dev.azure.com/dnceng/internal/_git/dotnet-sdk $InternalSdkBranch EveryBuild + + Write-Host "Disabling internal runtime->internal sdk flow" + DisableFlow $InternalRuntimeChannel +} + Write-Host "Add sdk->sdk flow" AddFlow https://github.com/dotnet/sdk $SdkChannel https://github.com/dotnet/installer $SdkBranch EveryBuild AddFlow https://github.com/dotnet/roslyn-analyzers $SdkChannel https://github.com/dotnet/sdk $SdkBranch EveryBuild AddFlow https://github.com/dotnet/templating $SdkChannel https://github.com/dotnet/sdk $SdkBranch EveryBuild -Write-Host "Add tooling->sdk flow" +if ($AddInternalFlow) { + Write-Host "Adding internal sdk->internal sdk flow" + # Nothing but SDK->installer flows internally + AddFlow https://dev.azure.com/dnceng/internal/_git/dotnet-sdk $InternalSdkChannel https://dev.azure.com/dnceng/internal/_git/dotnet-installer $InternalSdkBranch EveryBuild + + Write-Host "Disabling internal sdk->internal sdk flow" + DisableFlow $InternalSdkChannel +} + +Write-Host "Adding tooling->sdk flow" AddFlow https://github.com/nuget/nuget.client $VSChannel https://github.com/dotnet/sdk $SdkBranch EveryBuild AddFlow https://github.com/dotnet/roslyn $VSChannel https://github.com/dotnet/sdk $SdkBranch EveryBuild AddFlow https://github.com/dotnet/fsharp $VSChannel https://github.com/dotnet/sdk $SdkBranch EveryBuild diff --git a/scripts/flip-previewplus-flow.ps1 b/scripts/flip-previewplus-flow.ps1 new file mode 100644 index 00000000000..00ab240dd8f --- /dev/null +++ b/scripts/flip-previewplus-flow.ps1 @@ -0,0 +1,50 @@ +param +( + [Parameter(Mandatory=$true)][string]"$RuntimeChannel", + [Parameter(Mandatory=$true)][string]"$SdkChannel", + [Parameter(Mandatory=$true)][string]"$InternalRuntimeChannel", + [Parameter(Mandatory=$true)][string]"$InternalSdkChannel", + [Parameter(Mandatory=$true)][ValidateSet('Preview','Preview+')][string]$FlowType, + [switch]$TriggerSubscriptions +) + +Write-Host "Switching flow to $FlowType" + +switch ( $FlowType ) +{ + 'Preview' { + # Switching to public flow is easy. Enable all the subscriptions in the public runtime and SDK channels + # and disable any on the internal channels + & darc subscription-status --disable --channel "$InternalRuntimeChannel" --quiet --exact + & darc subscription-status --disable --channel "$InternalSdkChannel" --quiet --exact + & darc subscription-status --enable --channel "$RuntimeChannel" --quiet --exact + & darc subscription-status --enable --channel "$SdkChannel" --quiet --exact + + # Trigger public subscriptions + if ($TriggerSubscriptions) { + & darc trigger-subscriptions --channel "$RuntimeChannel" --quiet --exact + & darc trigger-subscriptions --channel "$SdkChannel" --quiet --exact + } + } + 'Preview+' { + # Switching to internal flow is a little more subtle. Enable the internal subscriptions, + # then disable the corresponding public subscriptions, which is a subset of the full public channel + & darc subscription-status --enable --channel "$InternalRuntimeChannel" --quiet --exact + & darc subscription-status --enable --channel "$InternalSdkChannel" --quiet --exact + + & darc subscription-status --disable --source-repo https://github.com/dotnet/runtime --channel "$RuntimeChannel" --quiet --exact + & darc subscription-status --disable --source-repo https://github.com/dotnet/winforms --channel "$RuntimeChannel" --quiet --exact + & darc subscription-status --disable --source-repo https://github.com/dotnet/wpf --channel "$RuntimeChannel" --quiet --exact + & darc subscription-status --disable --source-repo https://github.com/dotnet/windowsdesktop --channel "$RuntimeChannel" --quiet --exact + & darc subscription-status --disable --source-repo https://github.com/dotnet/aspnetcore --channel "$RuntimeChannel" --quiet --exact + & darc subscription-status --disable --source-repo https://github.com/dotnet/efcore --channel "$RuntimeChannel" --quiet --exact + & darc subscription-status --disable --source-repo https://github.com/dotnet/sdk --channel "$SdkChannel" --quiet --exact + + # Trigger internal subscriptions + if ($TriggerSubscriptions) { + & darc trigger-subscriptions --channel "$InternalRuntimeChannel" --quiet --exact + & darc trigger-subscriptions --channel "$InternalSdkChannel" --quiet --exact + } + } + default { Write-Error "Unknown flow type $FlowType" } +} \ No newline at end of file From 8e41a0fda18e6580b72494a40243975949185335 Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Tue, 29 Jun 2021 16:01:00 +0000 Subject: [PATCH 190/699] [main] Update dependencies from dotnet/arcade mono/linker (#7569) [main] Update dependencies from dotnet/arcade mono/linker --- eng/Version.Details.xml | 24 ++++++++++++------------ eng/Versions.props | 8 ++++---- global.json | 4 ++-- 3 files changed, 18 insertions(+), 18 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index 39f757d7cac..9f49705ff3c 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -11,25 +11,25 @@ - + https://github.com/dotnet/arcade - a68ec1edf328e737b31a09cb49e1929c28e91d0c + 685c1a4fa207d81e881a402a32ffa1c0fb191b42 - + https://github.com/dotnet/arcade - a68ec1edf328e737b31a09cb49e1929c28e91d0c + 685c1a4fa207d81e881a402a32ffa1c0fb191b42 - + https://github.com/dotnet/arcade - a68ec1edf328e737b31a09cb49e1929c28e91d0c + 685c1a4fa207d81e881a402a32ffa1c0fb191b42 - + https://github.com/dotnet/arcade - a68ec1edf328e737b31a09cb49e1929c28e91d0c + 685c1a4fa207d81e881a402a32ffa1c0fb191b42 - + https://github.com/dotnet/arcade - a68ec1edf328e737b31a09cb49e1929c28e91d0c + 685c1a4fa207d81e881a402a32ffa1c0fb191b42 https://github.com/dotnet/arcade-services @@ -47,9 +47,9 @@ https://github.com/dotnet/roslyn 7ceb633154acb9d716fd3eb2b6df1a0468d8e416 - + https://github.com/mono/linker - 1c0138c71850bdab14d740e9c4c8808ed034dc51 + 84338086c5f36f4847b85242b1c8c2d3ea7177ac https://github.com/dotnet/sourcelink diff --git a/eng/Versions.props b/eng/Versions.props index 2b1ab748514..41d331ec613 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -35,7 +35,7 @@ 2.1.1 2.1.0 3.10.0-4.21318.11 - 6.0.100-preview.6.21327.1 + 6.0.100-preview.6.21328.2 16.7.1 4.8.3 5.3.0.1 @@ -65,8 +65,8 @@ 2.4.1 2.0.3 2.4.1 - 6.0.0-beta.21324.3 - 6.0.0-beta.21324.3 + 6.0.0-beta.21328.2 + 6.0.0-beta.21328.2 1.22.0 1.1.2 2.0.0 @@ -77,7 +77,7 @@ 1.1.0-beta.20258.6 1.1.0-beta-21309-01 1.1.0-beta-21309-01 - 6.0.0-beta.21324.3 + 6.0.0-beta.21328.2 1.0.0-beta.21325.1 1.1.0-beta.21228.1 1.0.0-prerelease.21328.2 diff --git a/global.json b/global.json index 42eee1cae04..b856f91e20a 100644 --- a/global.json +++ b/global.json @@ -3,7 +3,7 @@ "dotnet": "6.0.100-preview.4.21255.9" }, "msbuild-sdks": { - "Microsoft.DotNet.Arcade.Sdk": "6.0.0-beta.21324.3", - "Microsoft.DotNet.Helix.Sdk": "6.0.0-beta.21324.3" + "Microsoft.DotNet.Arcade.Sdk": "6.0.0-beta.21328.2", + "Microsoft.DotNet.Helix.Sdk": "6.0.0-beta.21328.2" } } From b2d90da95f13dbdf44f98b30fd26180e4bd1098c Mon Sep 17 00:00:00 2001 From: Alitzel Mendez <6895254+AlitzelMendez@users.noreply.github.com> Date: Tue, 29 Jun 2021 12:52:22 -0700 Subject: [PATCH 191/699] Build Retry Documentation (#7571) --- .../Build Analysis/BuildRetryOnboard.md | 106 ++++++++++++++++++ .../Resources/BuildRetryWorkflow.png | Bin 0 -> 238113 bytes .../Resources/JobNameErrorsExample.PNG | Bin 0 -> 41595 bytes .../Resources/PipelineErrorsExample.PNG | Bin 0 -> 85685 bytes .../Resources/StageNameExample.PNG | Bin 0 -> 5073 bytes 5 files changed, 106 insertions(+) create mode 100644 Documentation/Projects/Build Analysis/BuildRetryOnboard.md create mode 100644 Documentation/Projects/Build Analysis/Resources/BuildRetryWorkflow.png create mode 100644 Documentation/Projects/Build Analysis/Resources/JobNameErrorsExample.PNG create mode 100644 Documentation/Projects/Build Analysis/Resources/PipelineErrorsExample.PNG create mode 100644 Documentation/Projects/Build Analysis/Resources/StageNameExample.PNG diff --git a/Documentation/Projects/Build Analysis/BuildRetryOnboard.md b/Documentation/Projects/Build Analysis/BuildRetryOnboard.md new file mode 100644 index 00000000000..b13ca0a1cb2 --- /dev/null +++ b/Documentation/Projects/Build Analysis/BuildRetryOnboard.md @@ -0,0 +1,106 @@ +# Build Retry + +## How it works? +![](./Resources/BuildRetryWorkflow.png?raw=true) + +The build retry feature is composed of two parts. + +The first one is having the build configuration file as part of the build artifacts. In order to have this in place it is necessary to follow the [onboarding process](#how-to-onboard). + +The second part is what is done by the Build Result Analysis. When the build finishes, it starts getting processed. If it failed, the build is analyzed to see if it can be retried. In order to be retried, at least one of the rules specified in a build configuration file needs to be met. +## How to onboard? +1. In order to use the Build Retry feature it's necessary to have the `.NET Helix` GitHub application installed in the repo in which you intend to use the feature.
+If you want to get the application installed, you can contact the [.NET Core Engineering Services team](https://github.com/dotnet/core-eng/wiki/How-to-get-a-hold-of-Engineering-Servicing) + + +1. Create the [build configuration file](#Build-configuration-file-structure). The name of the file should be: `build-configuration.json` and you can create the file inside any folder. That folder is the one that you are going to publish.
+Ex. \eng\BuildConfiguration\build-configuration.json +1. [Publish an artifact having the `build-configuration.json` file to Azure Pipeline](https://docs.microsoft.com/en-us/azure/devops/pipelines/artifacts/pipeline-artifacts) in the repo that you are expecting to get retry. The name of the artifact should be: `BuildConfiguration` + + Ex. + ``` + - publish: $(Build.SourcesDirectory)\eng\BuildConfiguration + artifact: BuildConfiguration + ``` + +## Build configuration file structure +```json +{ + "RetryCountLimit":1, + "RetryByAnyError":false, + "RetryByErrors":[ + { + "ErrorRegex":"Regex" + } + ], + "RetryByPipeline":{ + "RetryJobs":[ + { + "JobName":"JobName" + } + ], + "RetryStages":[ + { + "StageName":"StageName" + } + ] + } +} +``` + +- **RetryCountLimit:** Number of retries that can be done on your build.
+Ex. "RetryCountLimit": 1 means is going to be retried 1 time by the Build Result Analysis giving a total of 2 executions.
+Default value: 0. Max internal value: 10. + +- **RetryByAnyError:** The build is going to be retried independently of which was the reason of the failure.
+Default value: False. + +- **RetryByErrors:** List of 'ErrorRegex' (.NET flavor) that will look for a match on the build pipeline errors. In case there is an error matching the regex the build is going to be retried. + + Ex.
+ In order to retry a build with the following pipeline errors + ![](./Resources/PipelineErrorsExample.png?raw=true) + you could have a file with the following information: + ```json + { + "RetryCountLimit":1, + "RetryByErrors":[ + { + "ErrorRegex":"Vstest failed with error.*" + } + ] + } + ``` + +- **RetryByPipeline:** The retry by pipeline is expecting a list of Jobs or/and Stages names which in case on fail should cause a retry by the Build Result Analysis. + + The job names reference are the ones on the pipeline:
+ Ex. + ![](./Resources/JobNameErrorsExample.png?raw=true) + ```json + { + "RetryCountLimit":1, + "RetryByPipeline":{ + "RetryJobs":[ + { + "JobName":"Validate_Test_Failing" + } + ] + } + } + ``` + The stage name references are the ones on the yaml
+ Ex. + ![](./Resources/StageNameExample.png?raw=true) + ```json + { + "RetryCountLimit":1, + "RetryByPipeline":{ + "RetryStages":[ + { + "StageName":"Build" + } + ] + } + } + ``` diff --git a/Documentation/Projects/Build Analysis/Resources/BuildRetryWorkflow.png b/Documentation/Projects/Build Analysis/Resources/BuildRetryWorkflow.png new file mode 100644 index 0000000000000000000000000000000000000000..d0c28da1740a5a489e39cc096a003f0a3ec8298a GIT binary patch literal 238113 zcmeEucT|&E_ih+I1*JL`M5?2Rf)u6KFrqMmfQkrGMU)PS^d6KpihzQE)F`M(2kA8u zRHPev50TzGfe?~=-k>w;%=f$Zue;V=>&}{4vy|}WJ^Sqa>}NlFpY!0dwmQq+BYR;m z7|X>!&R>PWetidn?QUTF1^mqv;_+_qKRV~D>gQlNE!vF^W0OS>IKyAFXjUIzvOC(7Qkcm7m!&D?Dz=gP&%<6r;18ZIyHAy5A7&P#u8=Od;H z;vS?nzIjEWGaSApG4t({;8!-MEn=%&7NWKZ4DaqRGt$w1!D}!{hg+KG>0h6FSxHRK zMD0@w`|Qt7`^0m1t%H_u*EO*ezEgjHbEH#W8G388K#VPjZx0tcWPTWI^=$&LGW)jp zcOQE?<40}e3jX*y6n;RO|39>kO%ER&oDNU+^_-OYx>Elkmz#?&tL?}B{<5px*L)aXd^MJenAc?4y~#B7zrW>W z&J+<-N%-ywGZ_Imorv$gW3a>S+Z$9(Emydy!{z_}{o}5>xt!mYdV>Dk-`_kvZ<=|Q zpZjq9K&9O^+Ao|+n3GrJr5vJ%`3E0n*ZAupSKWzy_vx`x3E{rW4@GbQuVVI)myZ$--iY+`8^zHPu9>fccX*_HnzpK^sfr=&F#dx- zJyk)1zj8Xc3RkydvgOV?QE!_JaU*gCD-33P_NRCL;*abmEKSnyys+nNiy$jzsc{ho z>#$Tg`M2=~2kk!45wzI&{#54Q`SLntw_Z&I`K%%gRwSj!UparzwIxtUXj@#U(jKcRU@YvL!_x85|wxW(edfcd=Nd zqkY-S#NwI74K9@VFEACBZ+j0b`#kF}PSV}^1i9F=d-5NjxcPMr2hIYweiQXAMpZ<= z88--uvFY0?j5{9vm}z(5jwOx)7xtI`=1H*8`*bg8_PqKDgxquOzhC12!dK+U(qq|7 z%9pzI7zAjm?ZcUwm57ik{*;&aXzF#~9Zl4{Xr}Q;{#T*zv2MwV79W8+QK0AJI63Cn` zT#yOfpf{xb^Jy3Dd!F|n2H{zl@cmvu$Tav7GVCDjk0gi}gZ|Uvw>=4oW4U{3AX8&46!5pn$J#K7LV;)Z}VZON9xn{F{kxhXDV4 z)!;9#{{MfvJMjOuHN;ij_(bgG6nQ8REBJhp{@mMI|I3kA@2EUG_WiCtJDSUSfa3At zQ+vg0EDGX5M{cS7;Re9yY6df-^ZV~3OJX$o9u`x!cD^mc!OsmqH!Mto|F{A(qrfS> z-GOqqz7GgaCrg!QF2s)y7So{E(D-i_5Lazr2)rnx>@DO2J_q}w*8lM=NMbLqak7v9 z`F%iIewv}j8fiauUz=W`gz* z-?Z<0cxig9zk4rV*&Po*GasbO=&HRe1Ql;S{MQ%x;}xBGo7Ft0oLgHk#C4|syTM)p z_n(S#Pwat9?q`K~q|kpi*i~PZXRGxJ+R&zjLmMF^{tx52#4)gio%SBv*wwmDCD3nU zyzzuv3#M+Pi8CV)`7~HHSt;Wyb@K|yTg3cxrGW0LtRH5#{3J{t#D+g>Totjs_`bYK zmjJ=v&7=RYoquJ&o~&!*@H+xfj7+K|g%4cA(cVEu%H$5f+Pasyg$R|RpuZ;f3hViRww=`$T`_ATulyImATyf}Q zKcuj*P6>icp(dv7@UQOed;WBJgce2w{6;UMRx6p3#{H zON#SfBK27a>S*;sJn~%vGh;m~;8+^bbmrk8cYS8!-5Q!w5aV7zLeAc7t;}85ysW+<^41^3r3OZ2;V?3YMUu zNXvmDO{wXp05)j_SjI2*dfXDBc#KeDSQY;4l46@BHZU{yA0v0Ut9}>`ha4 zBac~Ay6=-@5}lpR6j$t=F|NcHRuM_eh|^)%{Tyn}HM=xfnFOKt{0N?1%yNlJXjau) z$Mpxx%o0Z+C-sW|*-FU}2U;KWwtZg2#(Nr3Uy!RtkI^o)9}b1{F(PsugPMg?vTwe! zEY4w`01v2o51wpzmjCqns5aaekgwkluiqk?fm6udgR^wE(*96%3rc z&<*TlfNL7|75JOyu|Gxc*H>;IsnbbR*tk`=YNxB2j6XC-lJ9$auiu?5sKg`$yV8BZ zs7B+Uv?v?R4mFU4*L0{gY{7>8?%m-!txZ8X;GJPrHUH`(0o9n9Nx8<|F*$?#M7H}n zBIgoDu9$@wNh9ahQwh!8=A;^(^F}p672^)hsUcW70JCi30CwD%8KXqErh3v((cIh% z!>T0QKK;h)b7jv9tl1Ygv!>LAf zS1ZLciS{&QvIPSb!{5;gY~LIg@aGSMg5k-DEa*MJ8s-1)aBjxlNPa`MLv~xiNb1K) z3DH{|xm?U8sWEXTnJL-B_q9a5>jpM(NPt$KJ0Up92I#x8pqNkfIO=m2Ja^LcM|4cM zi!98uZ=V$8RUoxG%5R{}s&ovW`mK$tqLw!DjZAsD6s7i8OWiAhDx^<;^6@IWwJh)I z3i!}he$@D_uk-5Ep_1I3O!ozus_FaIqNO*3iedxzgJtCa3^>|PN`r3%yeM8@I#^q8 zwFk`xt?cO!JAn-z#8{B^t5N*%P8UOa;1yHD1tBM}GAA!XgrA>@cUEC(zG0^3)?7ck zsHdONYT2QxJD9_JOI~M`)#K{#Ec`ispUI`UUoj9ssMkHPKQ1@H{yZ@XG3!~F0Eh&0 zk@zth!pc_52-Xz>cV2?!G2vgUJOH8mF2&pDX5qM3o`l9fvK!Dkfyxn0O11Y zj65@^U|LFkh_#Eo}g-)>&< z^;A`i%Pfd-VBCUmcY2qF;1(&SoFXC~6xNtpHv9|Cnl1|T*bhrsO1dU5PuRFmXj`Y9 zjy6DqSSV|l{D=tVhG-LKMMK+*oU_v`#|TD;plZ}Wk&X9=oK>$%VQeNQ#-1@M^n7fy zapP`YzN`_<`-3M0W2=stGPg9Uf}ng3N>;ay)uw@w+)L!mK|$p_vWFY#V@Cec4n~xR z{J4RIEmak8+V|~`@ciGcJdV3c{Q0$ykOGne^aJve6y&dPc;-Br2$vMk* z6r>AgMupM$Q@si@iKG%Z_rs6goKq`s-hAjs&+UH1&`UGGIrv11UNW!S!4UtshW4nBH(>|j>ZRFl>?E3(F7ooJfAttUOd=R zgYC4_RtupWtC`cQnA{g{cxv#nnX+yNnY5=zLQJt3BC&C_iU5M8-?Yj&G!Bzw3rCd+#)F~MkM zv6hwS&DOajzDeReCtHAUkmcR+@@yGpDdM7-HWhqRil?b4sfR7Zjg^MLj}bq)<3mfs ztI`tuflg4c@wnkX=R3!g%q|5WYooxg@qMSCXyV9_|*V3ZLxzN{PUs#ELW{fq$#i0zOast%~f`3{Hz&5Rsk{S&;4T& z@$9-}d*oYS^{0@qG5IpRtQQX_wSlbFdZR0u#r%dQLaB1KMHR<4Uhcf0m^knbDJ=Yq z3od`Rxj*H@%>gOIS1Mxi-ak*OcwGlIV`YKCkUhE!-6nn`laUif)dxVb=2#CzQyPmQ~c7nOt zu)=w{0M7fM%Y6{HouCsU)5|-e>uj`@wlL%|ogpRII#7FoQxwW}Ky&^++r2*6T$r&c zjE5t;i=zV4EU|H)16k;!&>pMSt4h}ezHR!M4|QyZKs_-r;LLAWmu|VH7>F!J=|W~6 z6|o9R1=LjZmP*g_rS!5b88juTKLka6Jz_E-GNThDGq5*Ar%4fmn4S+y6ZP{bY|A#P zs0EP-^SAtwL0uA#x6zx9#gtHot&b+si!Aqc)}<~KYH+fjlY@dPTyABf=5v<_PF{O$ zwNs0p5PV&_=*xih8Cgtk&Ag`?0KUtBAomgWOLQwsQ5a;{wuiLpykCqqLx?1UZVRu$ z>X^lq-q}tUgDV^`6OvL6@vG8-J`e7vJ0+c)0}_@3}S`-zY%vXEWdKZevX zQkQ}#-t{d)la^jRF~NC>+e}5Uo`-C*kTc6vQuH=m0nZ__JM~1aueU5nJCh)Hb|%Uy zZKZ~#8A^pUdZX^PF1}XP%`}zsT_G)j9a*kPh)`!JJP!6628*})p&o!xNbeN=xjvww z96{c0ZQ?;G3~hEnO^>SE)@~%I0$ID+CfCT2Vv{&M%TZ@X{?(GOIgHAG-Toe4iFW zlqrfle6FI@bZWf%Ri>L*Z{fQfr<$0`w|4+0rz#W|BNPX|?A>c8_TW&!-R{b{qWjbe z;0GW{6YK&kB!o?6*Pa+fsB0Dv%`&k)Qe0i0sui@v4tfgHb_K}8-)mRqhPX?aS9b>% z0DP20x@?8C$0N zr9@dNE=R3hc;DsQE{=^fq5C;dalaQQ+Cj4VYv-VRHMb5$!`}JCEh0wl%}i1Z+i8=E zW1d@xGA@=5jQP}bQvEKJ`yI2=4}XQK=UNRCZ6|gIe)gBy9cYn+7}S7E zGQhmBsoTe(#6iP{gmURdkfcQvyCDnsZ@~D)#_Zzy;%!~YXVjjHoo+|I09dx zk?33Ewm>xs-gz<5pc)zpA`T)8)4Zt57Wj>+$?3WMwP}{MCf1Oi>B)g`s1IdEGXwZI z@=p@;9efa**x)iaZY|V83$%`MtczlM2m+uL*B0}}u5QU@BBAWW#;SmdeXzI^} zn_gn7SQ{lEQ-x0gZc%vnQM~bbIPxU4V^yH>^-)JX6=ztoo`0|oLv5-@FWB|!d|?4} z6$W)gz88wWw-F3%l7BI2a#|JlJV#4p8+WgOhqz zg0x0~^^avJL@}Tn7vZ3w+|K?pAnvP#E_%=c=Y@@2^Sy zIWgTOHumMf_|Fo!!=TL8TYeT2sz!|wEQ}QkO980DFB?)i;n{c@IVlN_q1y^H|Aaby z|20tQE0{`5#QQdrx1R9D)58WA#&GRRSvf2sRcpw?^vt0)hV={j*6Nzl4q?iO1o_Kv zmQV)Trd#XQXAaZEK4|ZqtEBkJv-E;36$ERJ)hX`~gtwnh>ykE=adTR*E=9j>d1nKF zOz{)P`)dRIA)2=}P`>3MnQ5o4$=Ac-Fr85Xl_UoZhuRd_E}#p2l@#Q-9o={7x>t(< zK!=hIBz-&OgzOHSA!;R;%v$GEY&?0QUXsMiov;UyK9XaqaH#5K3}jN6%D<)Yzm3n~ zxIKewA2;Df2J z^-b9SdI^;0!XiRUA-;mr%obr*l@wS zppp>i>(E2guQvlL7zy&hpSjG`*Am?H#UX*>%wehRPifc}U~MgH4gSdO>UzAX^t03! zD(-W3YXky*mS;#sy7CPFBQsk&?^|0_i}e5vo?rPNondc@pJm|+o{!`S1) zjp)jj$qyx!=pDe8{O@4o58Cl4skY7JvUUg%=ZP=$l01GPK&svB;DP38p)QcQvO`9M z3-i3&vN;nLG>=ta=W?Ep`y-cMy9Yt=OnVcv0fhtE9dAFQDb|x8T?NhN6ZYnwWuwKx z|AdA9_e_EksJ1U@TOcB-EVqJ9CM@#39d%z&;9i*NyEa%*1+?pr6UBuBIt~%a78P4F zggIy@dMbYdQ30(_rF)V>N1!*--tHnY6tv?NJ%01N7@|G8oQBcQ<_sOu{y)gyfO)}{ zAS={DR)~?4m*2d%piJGY@Ox6kN!XfK;+~u7>yC8IJ>OWqDdKrY)8%@jrt*c=i~T0e zbcCj^Xy6qM(3Y30#j-J`S&l3F^ylNrl;JPyl!ORVN&!yLUF(rfOOSqyj(!e!DZ~G> zm!dj-HO)0{_Ct*wkMf*#_yZ0c9~TW%<`C$%j@`{g_2MvMML+!#HU z4*<6l}&_pHWc|LxP>1uDseqYvSzB-#L?HUg`x#E zsp@=srqew#mp(RPi3POw2vji&eS;8^`$50O*kefxHjwwag63mf{604im1l)69|#39 z7;dfEnAtv;mhG+7WBu1w(-kf^)0xv)`AxtqfwC9o$jh$X+~hl1Y=K$Yu3;s{ZH1sJ z$2w~En{2EM3U@!cfG8eQa-?AyDAT+fifdD22dK8o)L?4jncab*dK9Wke6n!plC>T4Y6-wWMMQiSmL~EC(V;-)p4L2CQ$zX zM<;U1^CDsY)8nXLd7^r+4z`9D8RQE2Y-{wbvP3PNUEa2*wV1zW4*ry+pfR*Oj>g3g zWk~X$F8)&j3nxvburPAGdR4+3-sQ_PxdT-+)>xHl#}Jt0Ngl3qgj1^0>P!{I4=UT0 z(D*Erp1m95K<_cDnUUkJN~x2BS<(eT%e>6_UI{&qModZOc(pLMek7ib5GSTfe<4<0 zm!4QaFEXFG7yTAU9B&%juWZq}z&~&c6>1As3*`qaU4#V@VI4P3kG&Oo_856Y(92Gx z^rQ}drL8@xbnxJTTEE7|N*vHZVhSuJ%MXeyEa}sD zm30iAxz2;#fgj#V95c?MGnagyVdImMSAifC*3?sGZokx0P{%TfTpYUTa_O3E&ha#Q zY@u1*r<$5}+^$e5BwXS1m+FkgQ<}_-q0EfwE&gANOKf4VAZeW$gDe+6M3FcM5tO0B z?5yrIf)q5($$n^N@zLUatF4g-CME7})L`r3?s-QgPg&p{P)>wW+K7<6D4CP<(~yAP~y zhu7)KnH;W|EhG9+9-#a_kci=0JWQyDb5L2it-vHh=|xU>F9YfTQ)%pg^Pld@=OpOM zFsp5q=OF5bv~cfo2bElG#i8|pg+NT#)b;nj)-$v?TW=lHg+zJG;1-mmiX9OV6mbRG zpaN8wtV2EFTcHX&YY{AaRaAjcEFb?8Q<=Qj&~U!)d{BVKvMj$nWyZiprRUxDtV-xs z26jUD4F73R`pW;kh8qQl%?b3z#0TC!PtOhALr?)aiN8|1glGA>7j3MJp{_U8JhtXv zSetdPB~`gV*vY*0bts{b`bV(AEr>AfqChkaVt)Z?dGud`-*5Ju-M z{M5D%>1T06-H|?Wy+HBY?hYt4n z*+<~Nee%c1AC?|KYY+id;*pJ_iWj|8$O>W56WJlU0Ha2YIanEEmAudPz3lAulwmeq z?)g+}q{D)aXX*Zu{Vlm-ldn$r=NU{`1#)t-=k&`LIyvCUk#Kx5!rtc=;RUvKCgQxl z>3dez>dg{0upAk<7r#8e5Vv6)4?T9!cch-L3$I6ob~&A)G2HTKvCdgq{# zY>?$Efpv~yIlsSR-Vu_B=rP4^^TVM8HGOf=bBzf2A4ux)j>nhiZzRoZyfCX6lg2$x|nerma`iU+cEvA=P5>hFfzoa|k+dC8ra4hHztr*y0d=Pz#Kj`xs#aU3I& zvAA1=bApT%BLzH4*-mmoM%4o+RAt)s5f`R8=@fz@Ac zX2et;9qM-Vh0-nrs8ijqAu$IOnn8l1kH+s`iIS-j=7xg63_!n_p9`4H36~tOq{kXo zS9wX6+lWAO2r&O~P5?hApjVYS*3|8fr1)4PJRTji$K z(3F5CM%on!VBj5fgYtZZ zcpE&9M*{1^!Wf0!BLD#rDot44nHss1eF*A7bS8iQqdT zS;<&2O+b5X@gVG@B(TKOe1ERH4&s}Ac{~^iA>j^tN=om84y(1OECwrqXNE-S&2A-n z>@f=o+yN0VeIxZ(p{(>OXvbC7fofgmkq?spe&08i=`C8WNDq1emf4yvd-<5e=z)8; zDz-jG!5=8QF5d!t>mubP+27KZ=%42y5p{KtJlPs5pl?v(IypQ%^`%OK0IhCNJd$$N<$ut~K!UiL$F z9%>se(5rP@<-D|_w#uxr!p8*xNpHNye9gNiWD4x`peD*EOwJK@(JII1am^m13ksN1Idv=JpSRkq!Ihj}j*Nuw;Y+acNx4i76gxGiFPA>v zEqoWb=+bP&!76f!8f-J?{YXPJxv~+S5DGFR4YagK>70OzN6a5#H&yt22{=ZTGJm2w-f(Azw^@RJ_LRdBU`{`^XGA&z zM5E}&q$FfCyd7oVyd38j=hg?g2ig4E0vGJ?d;OUYzw1l5Keu$?VGkCLxrTugo<~Zc zOr1Bc7XpUXbgGj{@M#A*BfDSz0Bg2t2GL`D*kS7U}zQd^LYyvB#w^ZJ*`z zRvG07{PR+*o*;pC51j4jqr>cNS|7uk$&1dl-IRU{+qe4YI7Z?DFdvZwiX=^`V*|=( zIU{DgUXIagt~)-wjuNrAc9RE!^lLuyc}b2(@rHLDcck$_32b5mGbG8d~*x||48U37<{@~O^v;d}?Y0knD+ z6wk~l90*JST9U$-QHM89hXo^DN}| zG)M6M;kuL}p^5Qo==;Z}m%7!4fYv+Nv443ADTxs0f7u8iYYX>5FhwqLdSMH#=r?=^ z!%qiOdI6=YwN^&d#C)}faW|KU$=!`v3JY#ASHPF>J{;*ReCm?6@k%iyr~q9BDGsvM zL1spLlYbsKRPn8L0h1U8S^1pi)w=@&YL`-u$@6E#m0js`uKiu0Gwserz=z`Na(i7) zbH{%qvlwjuyzBw;tikYtMf;*ZlzbFYxfD%yB;~b z(YeAKl~ZojdS51wyr%C-x26~(9)NFM1EV!y!1inP(>LMBkV0^+z$ORhj{i!8%uK=UZoD4oGSzVJgTI| za6V{6BZChGHWqvL&g;De^*8E6TDaF2Nyk=XY@U!7RGN=$$#>l-y>)SIYd@>dgO7-j z{XxrhUjR(r+ssvblIS}AOe08DGovzNG%7e?=&^BSTk{P7o=r8lkOpDi%NLpO7H#At z(`DbH;TfIkZC2KgD6{y=XOnqv?ET=~=9Yq1^l6(xeM$=|I>I}n3dJaigB%G8$?jHj*g zQ?asZYC{%IMM&#AD)uw${aqsau0dZbQITTq~k|SRoBxgp{#wL%#TBk!2IpG(21Vpv6^T&eBgG8auJ-gHTNN-;nCtT z_*8_ItCF6kOrU<)99v0IBzE+@6e9E+D>3eUpxYi%Dar1OS<}XQ-tHFB=_>C8$}q@E z2*7)HPNS6F1a$S#9S}#!oaP@H0_)LGz;q70soYe^Ax)^+w6ZWnU*o$h0C^KPy0RU4 z`C@Ykdc+_qm1oHnidwOy1~4r~)-H^iC!pG+6(x@K)$b{JXyfWrB(AA>>l#i1 zkAlwogmTkNS1xR`t_7j^x;U8m0Am4Wgg8WSs_-Ax7vMgF!IPo=0o!8^Vj&8@z+iFR z7wECLxB`p}E!CJ%-v8m!Za9>ozXP~XX@BEAh~8-l>?3AI-E>rVwA+6SOm{$s0Re%I zP+cpkvLCR1+!?0g;qi>1fXq#^y3rtk?%aY&+be{J0-Xz1vXj}ieh*(RJ@BC4&%=HY z!1QWHih}O;hwdAtT}DM@CAD0i3~_H@=oE`X_LS3$kal44@Xq?rS!cSK4<+6AL2m&o zwZNSqe@NR=8xY*KwAP0?=u|+#y~J{rdFIBh4bkJ3&6OBoa?3!yoD@r`$U?v?B`P~* zE;To8e{8PWX2;G%oUU5=3=OYz`P*!bUY^4kC4dSWnxn9%zDBz2GNFnXTJe$RR|w%i z;U0JG^k2+cSd(ej+#OhC{MAwxxruwf^|*j*`2yE!dnE2okF6opYt+8n%$|J+BoSEV zvVF-Lh{!2viQ=#|dJ<-J=hxH;Ak}2xTalOJrd!7p+KYXcFf-*OQ&H|~SEuwYxLX2> z@1jBD1u(4_yZpWH~On;u)8uaD^2Sc=XyK0tBi8o+F~S##(Y zgt(dV0vkCcO*U+T-lS=s#rFFm>iT3SALq3Wi|+82OGa$Js3d3kj#;nje>Q1H6NMVlpxSjPYx47*{p8P)IOrVHMRxvm|0BXxmiu70+3H~f-s0(Q9 zZzTE2VPe@^Rl*~Dvlm6|DUZY>boeh_I%qlLX?vq@-%Zc2kyZ&snh+11TH_e)c7qAR zYeHea!0m53*!xl_=nJT7_#OyDcsqQ=xOpuPZ8 zD5pp$`30bE{0bY@+4Ns*MGRIhPlRyIccrbP%R0VXw~;phMahTwUiL09^n(3324yTz z6EUmnySliXC0WiqarB*5*~qCLU!%$lfN{}Jm4L%iNJLUXy?@?ogz}kRLCyTN3v`H^ zU37EC6@%(bfWL|9)8Bj~4m7cp>4-ed43xYSrf?z{xCPr#Bp|WT;bsM=lJ~zfyd>q! zVB1CRK2v_vlkjKcG*JRL$;vqT)ZA^FyXsn@*}F@E!sXW{N(*9+wNi!Lf_ zkE*K+wi?^!XDIV1)~W)6TX{5VbED?{ zsMZ2)?nS9onY;O13hFf$4e}SL3#);+sRecBVWa0>(Gj+CDW01Vt1qS3fULiSOLE$f)M$BctzH{f@?_)I2tyPAol~jm zR(^|97PzN54E@W2eAV|HAoCr z(f+|ASa1yXC7!(O#dWTzXnE@96}8=gYgzuF+LJ~-jh2=5ke6Qu@b#7FmM!e9i@qkW zd_+h4pk*q3Mt2j>n_hCRMfA~0vZLRsic8Hh_Mm3uNGg2;6G&=sS)oMTwv60matQk& z0khAe3UczL$=FQ+C`HK_Ek_tF-r?<$Y($)X9}8hTJs*q>LIYE@7z1+oK&bN-NMbo!PT9=qds0Lm9yj|ek1&*d0Z``N|}@-4@A2wlg3 zJ1xr~R1B^`v`xbnI2~3_AbVR#5aR!np|WO9D$Qy8f>kv^VyO)=y6s^vU+#A`=10Y& zVbC9017(Fg$LTDO;>Z`*09?3enn-W8+>xydokd40i#`S;JEtrNAN8(Jj4)WOXR`=i z1~ac4p)Y2YQ^QbRUFQQvPtc zbXCGRm6kT}C$S#V0z_n+#CyX)-c@COU488IPYx2@1YC5F7E0p^bfl+i^PwrI~1S8(tW#rwZ zIgDi-EkA&xEM3ur|71WXMEKKy7`%b;Ey<0O20OhRhEDqP$C?k+#)a)QztLkgUMa}{ zM&OJ;7%rUd;v-qAasDf`jbp;~_WlHIU4GHR(LOPoX1(vBD(;g+&@pJu3C6@u-JhKv zESUt-oT%|iOM6g0(q;ekYNsnMW5NA?%qBA#23$QZIUowzPY1Cf>C+3dyvnwmy=x#kd4H}`NZ`~`ePvS877aMng zK8KDV<=b31^_WW0t%XL(h}lI-<+PLV(3JA}Q&wh1t_0RYob1 zygd_e{Oe{LLGk6e(#SONv~WGsxL}j`wblw^iv{GU z1$8F6>k*3#Rre(+`64T8T6E!}QOYAl0!t{!Z6IU-_1niugiDgr|0eJFYb>jN6E!=>?-!bM1 zIFF^x(CTq>0XmkLvd_fSko2xP2En*6aJ`$YU~hu{dDWU-36MT~4_wmn3+%Bjkcemb zk~a0bSEV2!%#7Om0CWf{ckW^UBbGoTCiv$S?XZE=8oe)||1tSYq8YvctOGjVkTtB` z3_AL3Zh+=N!xHGf0)X&JX6o*#_(LzstZw>WP-E?YZ(NrH&qLOe5MsP08c++AxI_zn zatF}Nvb`1S0)Rn7dyin6B%psL*#dgKlFG$f)04v*w7j9sdzc;T6E#u*dIXCJ7-v~C zlcjsrN(s|m!_2V9W}(XbO`lvAA06!1Ie)BN(UnRm>rQ@h)J}2cpYJ^OV7BDlK{~nZHRv{+m*Sp0!@hVff17G4RROtnK?k)1gU)&Bb z=9ukUC*#}3(sxS-f~jFKr|l=BCj$Ggn3y|(xxmyH;3y}2;{kH7D>P;UvZ}p`M=8`@ z^0H7lj4$b;-FE_wXL@Ty(PP)OfR!ZqjSHrFHs1dd8Z;g74pMHyg$uw4g?v^|d3L8? z*^3=mp@D1$9~`A5r6|qAM_(Ay_fS3-H~ z^zUeJgrBs*1A~2T8AVsfW8T)o9qXAi!*eM*ccgzJpA>)bIY2!QGWfA<)M!pXwv#Zb zhRO;yJ=>ZP_7k)wo=~fJ6X+Sdc_|J~cu5IXFAdf9F2uu+$i9{F`yvVZ91YaZXT2Z^ zfs?L}cDs6JOtBD(5+Xvlu4tOi3E(ax2|1qqvo~i@(IvDK)Q@%lp`RY%WiR%YH+Tv{ zcd=)6c=7hDlqY&+LKUeJ0{V>Vu@@;&LV3tw?An^VIrARe-?S>&tkc*4x-!?`el>S2 zmiIQIUG%3+xWVWKrIyQ3wltpVYESr33z1Vaq`2;s?wh$zPC<(VnRzPUC<%N@>^xD0 z!~De!!T`St7nDxm|5#!0doUW7xT$_Z$TOh6{FGS2k8ybi1x8$e?O1f) zv)#&`axu?Jo}g2kdEZ~`BQJlmW*mMlFBFWnit`6f`?n^7IlFU z_FPY1k-v!oV$x2APYmBNmUTip5N~X@;DvA(( zzQ&<<&)=kd_wK-?IMzdVZmaY>^Xdw?2n~NEUM>NKa=KoqXzyou-4x)`_!3hKf2MGC z=%ix_5-CNU>A{AEeCy!F%M?ItW(9~FAk!hDeRj1TpiE|Gpx_~Zyb^h%ctLB7yZrIe z18khkSrq+^r#=f8x*uh@?9Z?!{@BRsyz{NOvVXPdYbc6#P!TRRfDyK8JEy&i3)Pl=JyPr%Dp{_o8u(XS!bO2lwG~EN{ zIzT{Pw};;a=OAVDJvW86gBMFoJ=Uht-CO&^%3cia@2(U%vRAYRoK~xXh+m3LB+YXF zs9^;3RlFVP-*S2-qlgSkhy&P<7P`` z=sHVIim;%e#}e`bkjexBF>Y;E)CF?TX6`cJeS7${Q%l1`MfD&<`+`Ovn8!ITb}I4l z5N#@LBDUzq>~>a}f56MdRq|CPMiZ?pZ2Zbm*sSbi`KS9V;R`IFf4a$z9ThleSu1mU zyP$TtzzH0Sn$914u#~&K{vyk@`$Jt81Ksm(=p=O=h`b0s#m(fgvO)GC=iym!a!t5K z!*{YL=3bl^m1}ZfbP|YX@y|*Q8b7xil2+&;nSGhtM@#(Iz|aM?JCjw0*8ZWa{!{?D zvN9@w0>}{XgND5k)|qwSYCL!R25pS!MuEIc;8<;178rGijOEaNlR-8qL?92E$l<>8 zDtUxuKJY5d>IR!`cc`NgvDDlv=ahAZOqsYap6M$b6F;kmTA8Ew>x zJDcxZ39IExJ~O{caVZW{ZrEpuK6(D8H4t$V3_9E64%>keiJlJ=K|SJk~49TT8-bQFYKswPI3 zB(8h&EBu5_o+>>}0GkGj$Jz;ou00aub1tO&N`))SNUV`mnQPWH?Hy<$&7nM(`xoFo zQwUz;Ro?QqyCPy4V9Rf`=&|#lxV-D+G;aZ~pK)fib7Vxw$Bko>Ufp2RhR&RYg8TL$ z;$#BONW|*%IGzB~Nj0f`|BvG^;94Tld0?h|Fv!~v3}fFX7g-4U=gZWbUYD%4=~J64 z(RN$Yi5?JtBC%;}c>8#QTxIIEWO5*LSv2wp<-8PtE4SIwtAl7uN6QNM6({7TeuhDY z@PU~gZ{xhtfk~qrgJm6Er=`i^!aEaNWyyaJ6r`VKV@yDg?nq~@N=33uJ@c8V?Hu;4 zi%f*T5?jCd(whkpibs@x2UDQugy_9r=a4Vs^-&|kzpanXElJdalW@3YI`dd9hDKjR z`(j1xn3I};jp_!tp`%YR`it4VXSPbRWwSiaBZHespTV^94^%quWH?V^+~EW!D(FGW ze;ozA@r?D*+Bmpc>d1G)Y7Mjgd3xTJ(9oBD*4V?fg|L<+Jn;9-h836*=yZlr3#D`Yt$KUWioj_|oB00yuAvtoWu;$(s5~rLiPRbt7oM z0=NSxQ06*%iUGb4bOR-!d6+OYXf6nlUNBiq7Srdk{knMsi1MQCx!BOm&nH;slWtV` zd}(2-3su^fYv=5DKMZakISaHMtKES&X!ZWLo4aT;cwAshG8@rE z?#WAL3Jb$IENQh9pbHPKA+lI!*76;t+_QcWyFKJP@q#Oa1TNF5?SG?d?nHW`b76mt z5RE|o)(qXUv?I&F%{<@4nL;@}63wchKtv~( z$bphsfYPPra&I?O5KAf$6f^^an@&*cUf61JG7o!;R(Q*-p`L;J*o+ct5L{Zacu&%= z(qgv6vA+4yVhLi#tStK@sw7FQ>j<_$bg9x+vH4ejQ*=sQoYikO4CXO z;5^|wN|~3j61eUJx;skmUyf@E0Ue?XQZqm`5|Sx)d*z9G>IlayM0ob-W%rgS%IDuB zeRQHSRe-75%A%5_QjaN$+v+xa4u1D|sLu0UutS<`tc*aj4YNd8#h0)6hABN1&v)wY zSr~Xy#!2u-a9Izh2VBT)Jq=D?yM$&u)A%l z^`c@fcqjaB8|Lh-6v=5@qg!FF&@34qLNAb>H>!0{EWRSaqcGJ{hSy1?1Gd&z6d``47c z^C}rIzJ1{CxSL>3{~xCML!P)8VKR^gYQC1p|XqV$rd+(EJYkTn?(;ZS%^t*U}p zgmx~5sk^eE<<+f^z+*BiD=o>9&P3GItgpyah?(rwXUhS+F#aw(dTcL6YiZfx1vm}D zEGT(grEasg12 zpMeR%yyvD|>|NBGRq4@uiCpj_+IAf^1gw-8GYZ0`@$ThFox3A3g#Sg_mxn{W_WutG zB}*wPF*+^ES}A0kIdxiXMMbtDN@dNyk3vofm5_u=64@&|laXX6*|+TbJ{ZjMdw-~t zmh(K%_5J@hr{AT-#E4EXlpk0O@tL zorrr1{sEdMpRkNHYW*#B{ff)53!(#-hQAK-$11b44!KgkKoiPA=;?Z_F*`gCMPcDG z@$vFgeKm};P}op?sb&Oyer?)`a3iMEV~^&WEXN4_^|MkfQS}_&rVOaE8XG2}UuhRr zr)OtKuF<8T601u!QnM;cG2MDR!X{_Q)qEyo(3U^8N+ITcB`q z1OAE(#snk|UtSXxtEV_8KV;vE!UE;QuhIlp*8s>#+-*L-|KZAJ*Y0Xaa+OB7sM$79 z#N8+LI{LGw{c<a{=IT+l`_E5i@nrQVSwW$V!Tl`-zV}DK3SV zp$I)u;u)H0w(o&$k7W)nP^T8eDebeLYeGUsTPLP8I+Rf!CC*k@8ENOsNb<`j!x@?U z4%K@_JUeM=Vf`j~=Kd|yHlEyaXJGj}#DiW~N+X zh$f7vejq3P)gTeUAPG&2k;(bb*r}Xs^GW{bonU+6Q>op*)-c2k+SnR+Rch=-Cxrs!E%6 z9a5*#o|~B0V2LDHKvToBbPYT*=VMy!{u8>c$^nm-mdN63?)n~lL;sb3*>yz`>8umQ z;MpEIC&VkLo==|k85NJ1gsgHDCzJS z-i6kS8}ZMY&~PiDhC03zMcw69kP{RYMp%gMD%C<{T~d0-%Hr}YLPweCq(kBvv;<+Q z9M<6zKX&YUl!Q)_sZ!?SQ1voBogZ?J{Rp5tg^X!qvN5Xlva920zGbBU2Y2(q9w9S? zf#Wyq2C+xbTxs1Co=0Xa3HxQE)r+GCbvbvktC76bs_rHn(>w-UdDhA@S-#LY9aMrh zPgm!USj#cXJ4%_n$ER33>+LW?>mB1iPQ!%ZdxgHBuvZln1(l&uzP*fl?moie(s7H; z1m^xlE|mfGoof4Rb^n1F^TCQ)Wa{Nw_>v{HtM;&ZK2BelxxT2eN&!n>GR}rkWXP&} zuhj<}W@!pn0Hl(BV$ofU5X9!8g$0D8cFSZf;Yd6oSe`F={xECyUU0Vi172JEF1-DH{x$tM||Z3bJaQ-JZZWjwx1BdyZr^DXRrn7mzj*&PMY z26WQR$d1Z5B*}8_FCnSM>-WSuKB?>~Q`Mg*ov#k^tvz_B42Dv(kQ1zn+_V*S*Nxe$ zr}smEDrBiI|5a~XGwb$doMJZ;)=|zr5&@JX2x;r6D~=Q!HuxwVcn1dZJ$;v|rQcg2 zHt*4JGzaHV{W2-AmD)2w0m~cEb>G+)=g6SWIrE zUkM8Kv*Xw{1>d=7kgrI>4X2iQSmlMfnIa5u0-xVLgLBNw6Vi3)0qK*PaV0k9n-|{# zF1kS9?IBld17Y|QI7VBlM#p!bhk>*oV(q(i&ytpoGWWx8jxuv2*9+~&#o?+L>6Q{r z@zuQMO*c5V4tIXHQ_WhJU}_R-;^LRV@{hmwu8vPsQ2|Z}08gS)z)1jz&^6a2 Nw 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
sY;Or? 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¾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 Sn}!gx&YqM#k#bDu&;JF7=h?3S literal 0 HcmV?d00001 diff --git a/Documentation/Projects/Build Analysis/Resources/JobNameErrorsExample.PNG b/Documentation/Projects/Build Analysis/Resources/JobNameErrorsExample.PNG new file mode 100644 index 0000000000000000000000000000000000000000..3762a96ae63d2bb7b9752a9c44f60291194f4e58 GIT binary patch literal 41595 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%0A7ZQTe7${irHBL4Uc8yd+|<^~nqRO=g{-|& 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 literal 0 HcmV?d00001 diff --git a/Documentation/Projects/Build Analysis/Resources/StageNameExample.PNG b/Documentation/Projects/Build Analysis/Resources/StageNameExample.PNG new file mode 100644 index 0000000000000000000000000000000000000000..35141ed2fb87a236064e3b1f2585d7ec53f2f8d0 GIT binary patch literal 5073 zcma)AXFyX~(?(qcL19@1MVh;aK9BQbj@OG4v8d1QaPELZk~Kz4soM zND)FJ5`vTvBSL^sLJ3JAkdLtM`@O%u^5fn)W$xTLcji3jnfvmt>CIyTrv-R;c#atx zT{q|9IfU42+wdRWyO&;&%ij|R;N~~4@>F6a=l43lxm~$)g@>mmNs#T#yVpPBYh(-O z;SrPLUI&cL&(e5!j=LIPzhW8WutcQ7PxyEC!gl$@h|x=vMt>bR*b-~kXW)G1$dMFX zg%?Pp&&ux=uK#WvANBen{4b-+=YR8O1nE-URVvGGsNBe-RNE-`~%gs>6l8uE#+ojOWH@zUvc4(_?bb5^ZOm@D5*KI`f-Kd|3CN#^59 zWA7`sZpCq1JYQbX4(*AjXKymODwp5Lvbn=&zKC#F&-3~hKZq-ho(Kck=9#!Jnts=) z0iFRsA?_&ip;*}Fm|I2y7Hiro+#S~-D;aaQoysV+?ltJ?hZT-@*Ynvf#|T^ZGHs#EAH!6|TE|2`{>2$+#* z$=8C2tkk?+G=GeH*l;w7*A2UC;uVFg4=4kd%m&^Zgx(S^&F5r{<32|qT|CpI@7k^e zZidk&IVCa62K{kB#_Q)19`W^!VElaqVq3o`RdZ01>mepp_ZZ5L}kP*ZEkJ!wZRc0?1>t0ZG{ExVl!OV#BQ<`=a<10?rBWqLR^jvI=n z+wMYWHND2P^wkr=lY?pM!-tej)Mfwsml zjR#hS#;<6$W5Y^-MW@zwAek5i>c!QDxU%)><(j(Nmu`0-{Y=*nR3IMJLH9vsThXO+ z9p`*JnbA2skDkoHI zkk*@$maP`}hce~~!`cEO6S_8LsVz&-q+Zm(oz2L|ZnAz21i{RQK|nJ1oFU7B3$PRMr@UQErcD@VNvwg_yth$meGbG6}HV3XFAu2jD5`S(7@ZrJbRJI@z@B3f-tx;-H;^x)DDiI$HEhe*ZuV?u?viE$?V zwge)SvD~0W_0!{mKhHave}mvZD0Wu&U&t!?FE~y7KQRE=r_PBPR`zJBQF?_FwritNJtfvN#D zvGhObPP^sLM2xto_G8E;HkY)59HriQrv+w;AWXZ+40_s&(b_a>G}fDVD*Wd0o8jY^ z_YshhDuuAZ=t}vy49dGOKSJnb?Tm<#09U(A5Yu+bVsvI+{9Avj1?Rg?Tw*CAsO!>l zk4}hvgVaZ}-0U}P5LTP&qn(!%3+gUII(mh7dQlMKD>Ws}!9UMEX(|iihdjM z-XG3V8xJ+E$YUik2H~VoOI_XNy!*d4i`U)-UqW;4KDJMs#t@$ffVSyh4T5XP6fu{S z^^UJAkk8k^H!2zCGS($g3;)YQIp+2pcL=SZ3(hw}A&O#I=1J4qEbrkerP6Z;YhYOVC zTrHFB(lVbNK8g1>EY=!rU4eX*{~fFe6F|+hh%T&*mDLO}O$=lTX?6K4V@QXQC9@_I z$Pw;wivcsvvg6+#G?>CyMkgd}-63E&ceT?}J(9H?@8!vrz&XOy?vGy3M~L10XAcv5 zRR#hbAiZ;7_qoaZjjsZB3j(=Tf!WqxZt%%=xgisSCE7%Utv@jw>X21+0!}a*glx`o ztm?!wJM+MAGY#mwixf5Y6!GU?JF@*MQ14EV{o@<@knzB4Qjs#2O9}D)0y9e}@0@L~ z;LQysH%QD*i2Kw!V6g>I#nPn)UUG?WV;ZEaG(>5vih^7o*GSjx<}6U_FQQqDR^qgd zMy(?yS1~b^e}EX{h`+6HkfO{cF#X21u*n@;%^!@q^Ekq36vF)U6)P_HP>&#H(grGq zy8JU2ze8&9hNRp9?9+9qCgJ&s80 z_IO5aDn8Sz^?N-27y$UFA}e|sCDC4xf!sQ0{WWV6!kk$#H^#~BQJgW7NU*M}CsSnt z)}5sxTfg$wYBtuIy;+Rmq;vpmIevq`%FP&&8HY6OLfq|_TkglKn>#f~5Jp2k8;|i_?47K~PBvRlJvJ#5Bj{%a-cTvtNsucrwLxtBRj| z4Mq&>yVV0V?`!)BnbtYOMG-H31yI$brC@Y?(WUSq4f;6xBqG$W^}?pzKK5XIfRo+P zQjrNoc&EdeE0`OiqP?6b&=4&&fBlViIz036Zt;l6GX~SPs?B~Oy@l@ME;wmLttm?Z z)9Z897ie#>G_>n@Xc9m(lG!rqDujyKs(-iuL?f*cbUZ$b{yKHj?b-xrvX?e7IxG>0 zNQ-Zkr>lVJzwIp+Xvj=2kF7ef!IoVhD-ozAN{yw>D}`Yntm_MvcV*ayBQJomuFV}0 zH$=S>DkJ|0^NkmO;Uj4kkmihVEId!xEUu^2iU$pmPa+N$uXI#dT2jpd%vz`v=+O_h zH+GtqQjKv+J7yG6%63C`R7Vm?n_^-h(dJM?@nMCJXL#+7J(!_>!V&{E#u&U)y)>mM zLWRb9XfIzb1PsfF-|+Mj%x(%--9Kn%6}xa3hyj9WcXlnHv$PW?vi@ZR$(JOA{+xW=>Bl3`4tc+^IpwC;djP{jo2x%~)T%}^)w$nH@IRwUvspr|HM1#-?D+bnQpv39 zmHAiy)NHHBkkf{ZwH*gWWZD#0=AMV0TcJU;{8r4YLNH<1nIA`vm1whbl5_EsI{9|7 zCdLVv!G2Qs6>4nnRSL{RA}K8IXG~o4n7Zsp(a$FDVwYc`Bg{z(ca=aWKWLa3lk2QJ z8b`DqaqhV{*)IC@rs3P;;t>JNgfjZ~KzG6GsNS52?dIBql3-c?y8gpGA7;DS56MEs zG$gurbAC`lg>&P#Zgb5gRfhh7FuWBh?c+Y$)nmAG&SRFT{-5Jk6UWi6x*}M?S_|9J zj%>EI8+XO20c>W2CSN-LDz3&sQ{gtNg1l)f7*R-L6Mz^G++*^El((m22S;&JR_HqV z>bljhV~D)2ttTHdDA^9W1tA`neD8?f5h0l|@(f6;gd-0r558B4i_1Y9SKqn|3AM%K zCT~8wwNt)Nr(Oj3bg4BN3XXaS^w@p@^rjn`#A)Bgf*Jv*^t_MCTA)fiN2`Dia6|`U z=ko^H?Nk{($R()L@YQiUUbrBLx^2DG=G|+*GrS5*C2Y1pD?U*TN;hbM(N^s7Dd|M$ zkqemVbTvBxZ}Fj#OZ1Rkm=-UFrVlfFSmA%mn3ly&mQP zpC(lNw*acoYLzE_Gtl%V3ADf8G=Gp) zRVUGE_k#JnCy*foFU9zfB)PB>x9we>A}fkr7p~KDqd{iT#DJQc$SF56#KHmdsK+>M zgOf1M8Scw5Pib(n7$R*$9_NwLa4>MIwqIUmx%L*AxvP-0Q=KLQA&SAO?$1f1(yWCQ zJRpfX8Oe|jqV}ZkNO(XN+dNpLEVkrcCw?pHz|83Ac&-=jo^aqiyNB(7G%>6YZ`}J? zw6_WOUZP>o6z|a!-JFV_aR2+KzJ4KLR9I1V%>k&-K9@x~1S-}(_szU%hX^D5)Q8)C z)Szf8{tW$&<%Z?*DKh1LD@{)aGW-!5()w-F~?(7A1_(uc0jJ-J(mMSm-WKDaErlRuw}D$^TAVExnwi%QAZ5x#UL4MkEA46^sD$rEGYg{o%vp6wy4Jg zMNtn8kptK4xXwCtR{u9}UMlIT(suH&@rxerN; oBL+n-T=l1{$p5{%!kce!hC4T|#c^EDaUU?gVS2sts?)Ro0?I-Cg#Z8m literal 0 HcmV?d00001 From 1ad5927d51aa519256b6184eeb9b35d7fa6f11e4 Mon Sep 17 00:00:00 2001 From: Matt Mitchell Date: Tue, 29 Jun 2021 15:14:06 -0700 Subject: [PATCH 192/699] Fixup the project name for the .NET 6 internal feeds (#7572) --- .../src/model/PublishingConstants.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Microsoft.DotNet.Build.Tasks.Feed/src/model/PublishingConstants.cs b/src/Microsoft.DotNet.Build.Tasks.Feed/src/model/PublishingConstants.cs index 8d2b6673f70..488ca7ee6a5 100644 --- a/src/Microsoft.DotNet.Build.Tasks.Feed/src/model/PublishingConstants.cs +++ b/src/Microsoft.DotNet.Build.Tasks.Feed/src/model/PublishingConstants.cs @@ -96,9 +96,9 @@ public enum BuildQuality private const string FeedDotNet6Transport = "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet6-transport/nuget/v3/index.json"; private const string FeedDotNet6Symbols = "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet6-symbols/nuget/v3/index.json"; - private const string FeedDotNet6InternalShipping = "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet6-internal/nuget/v3/index.json"; - private const string FeedDotNet6InternalTransport = "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet6-internal-transport/nuget/v3/index.json"; - private const string FeedDotNet6InternalSymbols = "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet6-internal-symbols/nuget/v3/index.json"; + private const string FeedDotNet6InternalShipping = "https://pkgs.dev.azure.com/dnceng/internal/_packaging/dotnet6-internal/nuget/v3/index.json"; + private const string FeedDotNet6InternalTransport = "https://pkgs.dev.azure.com/dnceng/internal/_packaging/dotnet6-internal-transport/nuget/v3/index.json"; + private const string FeedDotNet6InternalSymbols = "https://pkgs.dev.azure.com/dnceng/internal/_packaging/dotnet6-internal-symbols/nuget/v3/index.json"; private const string FeedDotNet5InternalShipping = "https://pkgs.dev.azure.com/dnceng/internal/_packaging/dotnet5-internal/nuget/v3/index.json"; private const string FeedDotNet5InternalTransport = "https://pkgs.dev.azure.com/dnceng/internal/_packaging/dotnet5-internal-transport/nuget/v3/index.json"; From 6b9d24236d8d1906284e6cb6c28e3fe93a69b7d2 Mon Sep 17 00:00:00 2001 From: Jon Fortescue Date: Tue, 29 Jun 2021 16:06:36 -0700 Subject: [PATCH 193/699] Onboard Arcade to OneLocBuild (#7573) --- Documentation/OneLocBuild.md | 1 + azure-pipelines.yml | 6 ++++++ 2 files changed, 7 insertions(+) diff --git a/Documentation/OneLocBuild.md b/Documentation/OneLocBuild.md index 6ff500455d2..0cc4f6858a9 100644 --- a/Documentation/OneLocBuild.md +++ b/Documentation/OneLocBuild.md @@ -26,6 +26,7 @@ you will want to conditionalize this step with the following: - ${{ if and(ne(variables['System.TeamProject'], 'public'), notin(variables['Build.Reason'], 'PullRequest')) }}: ``` To prevent OneLocBuild from running in the public project where it will fail. + 3. Run the pipeline you want to use OneLocBuild on your test branch. 4. Open a ticket with the localization team using [this template](https://ceapex.visualstudio.com/CEINTL/_workitems/create/Loc%20Request?templateId=60b0dcf9-9892-4910-934e-d5becddd1bc1&ownerId=c2e38d3d-0e9e-429f-955d-6e39fc6f0457). diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 0bba4f3181d..31e3239b4d1 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -26,6 +26,12 @@ stages: - stage: build displayName: Build jobs: + - ${{ if and(ne(variables['System.TeamProject'], 'public'), notin(variables['Build.Reason'], 'PullRequest'), eq(variables['Build.SourceBranch'], 'refs/heads/main')) }}: + - template: /eng/common/templates/job/onelocbuild.yml + parameters: + MirrorRepo: arcade + LclSource: lclFilesFromPackage + LclPackageId: 'LCL-JUNO-PROD-ARCADE' - template: /eng/common/templates/jobs/jobs.yml parameters: artifacts: From a5e3fe11a61563eabdc30faba3757ef461d42120 Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Wed, 30 Jun 2021 14:36:39 +0000 Subject: [PATCH 194/699] [main] Update dependencies from dotnet/xliff-tasks dotnet/arcade mono/linker (#7576) [main] Update dependencies from dotnet/xliff-tasks dotnet/arcade mono/linker --- eng/Version.Details.xml | 28 ++++++++++++++-------------- eng/Versions.props | 10 +++++----- global.json | 4 ++-- 3 files changed, 21 insertions(+), 21 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index 9f49705ff3c..46e0acda34d 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -11,25 +11,25 @@ - + https://github.com/dotnet/arcade - 685c1a4fa207d81e881a402a32ffa1c0fb191b42 + 6b9d24236d8d1906284e6cb6c28e3fe93a69b7d2 - + https://github.com/dotnet/arcade - 685c1a4fa207d81e881a402a32ffa1c0fb191b42 + 6b9d24236d8d1906284e6cb6c28e3fe93a69b7d2 - + https://github.com/dotnet/arcade - 685c1a4fa207d81e881a402a32ffa1c0fb191b42 + 6b9d24236d8d1906284e6cb6c28e3fe93a69b7d2 - + https://github.com/dotnet/arcade - 685c1a4fa207d81e881a402a32ffa1c0fb191b42 + 6b9d24236d8d1906284e6cb6c28e3fe93a69b7d2 - + https://github.com/dotnet/arcade - 685c1a4fa207d81e881a402a32ffa1c0fb191b42 + 6b9d24236d8d1906284e6cb6c28e3fe93a69b7d2 https://github.com/dotnet/arcade-services @@ -47,9 +47,9 @@ https://github.com/dotnet/roslyn 7ceb633154acb9d716fd3eb2b6df1a0468d8e416 - + https://github.com/mono/linker - 84338086c5f36f4847b85242b1c8c2d3ea7177ac + f549b4e8bfdf07c31f2540d05f55b50af0e2f391 https://github.com/dotnet/sourcelink @@ -68,9 +68,9 @@ https://github.com/dotnet/symreader-converter c5ba7c88f92e2dde156c324a8c8edc04d9fa4fe0 - + https://github.com/dotnet/xliff-tasks - 71c811561ad4dcf46825a5077fbcc668ab74754f + 45e08da009cf96a72c6b177a7e8f1fe6e6cac72c diff --git a/eng/Versions.props b/eng/Versions.props index 41d331ec613..dd340805dc6 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -35,7 +35,7 @@ 2.1.1 2.1.0 3.10.0-4.21318.11 - 6.0.100-preview.6.21328.2 + 6.0.100-preview.6.21329.2 16.7.1 4.8.3 5.3.0.1 @@ -65,8 +65,8 @@ 2.4.1 2.0.3 2.4.1 - 6.0.0-beta.21328.2 - 6.0.0-beta.21328.2 + 6.0.0-beta.21329.8 + 6.0.0-beta.21329.8 1.22.0 1.1.2 2.0.0 @@ -77,8 +77,8 @@ 1.1.0-beta.20258.6 1.1.0-beta-21309-01 1.1.0-beta-21309-01 - 6.0.0-beta.21328.2 - 1.0.0-beta.21325.1 + 6.0.0-beta.21329.8 + 1.0.0-beta.21329.1 1.1.0-beta.21228.1 1.0.0-prerelease.21328.2 1.1.156602 diff --git a/global.json b/global.json index b856f91e20a..a6e42772766 100644 --- a/global.json +++ b/global.json @@ -3,7 +3,7 @@ "dotnet": "6.0.100-preview.4.21255.9" }, "msbuild-sdks": { - "Microsoft.DotNet.Arcade.Sdk": "6.0.0-beta.21328.2", - "Microsoft.DotNet.Helix.Sdk": "6.0.0-beta.21328.2" + "Microsoft.DotNet.Arcade.Sdk": "6.0.0-beta.21329.8", + "Microsoft.DotNet.Helix.Sdk": "6.0.0-beta.21329.8" } } From 26345756f99087811b1fe4d02ff213eb172ec506 Mon Sep 17 00:00:00 2001 From: dotnet bot Date: Wed, 30 Jun 2021 07:50:04 -0700 Subject: [PATCH 195/699] Localized file check-in by OneLocBuild Task (#7575) --- src/Microsoft.DotNet.AsmDiff/xlf/Resources.de.xlf | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Microsoft.DotNet.AsmDiff/xlf/Resources.de.xlf b/src/Microsoft.DotNet.AsmDiff/xlf/Resources.de.xlf index 934bce41566..c1a0a1f85e7 100644 --- a/src/Microsoft.DotNet.AsmDiff/xlf/Resources.de.xlf +++ b/src/Microsoft.DotNet.AsmDiff/xlf/Resources.de.xlf @@ -4,19 +4,19 @@ # API List of {0} - # API Liste von {0} + # API List of {0} API listing follows standard diff formatting. Lines preceded by a '+' are additions and a '-' indicates removal. - Die Änderungen sind im standard diff-Format aufgezählt. -Die API-Zeilen, die mit einem '+' beginnen wurden hinzugefügt und die mit einem '-' wurden entfernt. + API listing follows standard diff formatting. +Lines preceded by a '+' are additions and a '-' indicates removal. # API Difference {0} vs {1} - # API Änderungen von {0} zu {1} + # API Difference {0} vs {1} From ff3e7d23139c30feefe36d3d4e8d41a06160f254 Mon Sep 17 00:00:00 2001 From: Eric StJohn Date: Wed, 30 Jun 2021 11:24:11 -0700 Subject: [PATCH 196/699] Make it easier to binplace to a simple directory (#7578) --- .../README.md | 6 ++++++ .../src/build/BinPlace.targets | 3 ++- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/src/Microsoft.DotNet.Build.Tasks.TargetFramework.Sdk/README.md b/src/Microsoft.DotNet.Build.Tasks.TargetFramework.Sdk/README.md index 87b98b118c8..38c17756484 100644 --- a/src/Microsoft.DotNet.Build.Tasks.TargetFramework.Sdk/README.md +++ b/src/Microsoft.DotNet.Build.Tasks.TargetFramework.Sdk/README.md @@ -12,6 +12,12 @@ Supports copying to additional paths based on which `TargetFramework` among `Tar - Metadata: - TargetPath: when specified can indicate the relative path, including filename, to place the item. +- BinPlaceDir + - Typically specified by the repository to control the output directories of projects. Unlike `BinPlaceTargetFramework` no conditions are applied. + - Identity: diretory to copy `BinPlaceItem`s to. + - Metadata: + - ItemName: An item name to use instead of `BinPlaceItem` for the source of items for this `BinPlaceDir`. + - BinPlaceTargetFramework - Typically specified by the repository to control the output directories of projects. - Identity: `TargetFramework` to binplace for. A `BinPlaceTargetFramework` is *active* if it is the best `TargetFramework` for the currently building project `TargetFramework`. When active it's behavior is defined by the metaadata below. diff --git a/src/Microsoft.DotNet.Build.Tasks.TargetFramework.Sdk/src/build/BinPlace.targets b/src/Microsoft.DotNet.Build.Tasks.TargetFramework.Sdk/src/build/BinPlace.targets index 6cfaee82e47..940d771be58 100644 --- a/src/Microsoft.DotNet.Build.Tasks.TargetFramework.Sdk/src/build/BinPlace.targets +++ b/src/Microsoft.DotNet.Build.Tasks.TargetFramework.Sdk/src/build/BinPlace.targets @@ -9,7 +9,7 @@ + Condition="'$(EnableBinPlacing)' == 'true' OR '@(BinPlaceDir)' != ''" /> + From 812a32434d9e42fb9e27edbf8ab16eb7bf499759 Mon Sep 17 00:00:00 2001 From: Jacques Eloff Date: Wed, 30 Jun 2021 14:07:45 -0700 Subject: [PATCH 197/699] Fixes null reference when there are no packs in a workload definition (#7568) --- ...ft.DotNet.Build.Tasks.Workloads.Tests.csproj | 4 ++++ .../VisualStudioComponentTests.cs | 17 +++++++++++++++++ .../testassets/mauiWorkloadManifest.json | 12 ++++++++++++ .../src/GenerateWorkloadMsis.cs | 2 +- .../src/MsiTemplate/Directories.wxs | 6 ++++-- .../src/VisualStudioComponent.cs | 17 ++++++++++------- 6 files changed, 48 insertions(+), 10 deletions(-) create mode 100644 src/Microsoft.DotNet.Build.Tasks.Workloads.Tests/testassets/mauiWorkloadManifest.json diff --git a/src/Microsoft.DotNet.Build.Tasks.Workloads.Tests/Microsoft.DotNet.Build.Tasks.Workloads.Tests.csproj b/src/Microsoft.DotNet.Build.Tasks.Workloads.Tests/Microsoft.DotNet.Build.Tasks.Workloads.Tests.csproj index 74c5c5e2d05..978754b5ee5 100644 --- a/src/Microsoft.DotNet.Build.Tasks.Workloads.Tests/Microsoft.DotNet.Build.Tasks.Workloads.Tests.csproj +++ b/src/Microsoft.DotNet.Build.Tasks.Workloads.Tests/Microsoft.DotNet.Build.Tasks.Workloads.Tests.csproj @@ -19,4 +19,8 @@ + + + + diff --git a/src/Microsoft.DotNet.Build.Tasks.Workloads.Tests/VisualStudioComponentTests.cs b/src/Microsoft.DotNet.Build.Tasks.Workloads.Tests/VisualStudioComponentTests.cs index f7e2c9e0a29..2e4c8c1518a 100644 --- a/src/Microsoft.DotNet.Build.Tasks.Workloads.Tests/VisualStudioComponentTests.cs +++ b/src/Microsoft.DotNet.Build.Tasks.Workloads.Tests/VisualStudioComponentTests.cs @@ -80,6 +80,23 @@ public void ItCreatesSafeComponentIds() Assert.Contains(@"microsoft.net.sdk.blazorwebassembly.aot", componentSwr); } + [Fact] + public void ItCreatesComponentsWhenWorkloadsDoNotIncludePacks() + { + WorkloadManifest manifest = Create("mauiWorkloadManifest.json"); + WorkloadDefinition definition = manifest.Workloads.FirstOrDefault().Value; + VisualStudioComponent component = VisualStudioComponent.Create(null, manifest, definition, NoItems, NoItems, NoItems, NoItems); + + string swixProjDirectory = RandomPath; + Directory.CreateDirectory(swixProjDirectory); + component.Generate(swixProjDirectory); + + string componentSwr = File.ReadAllText(Path.Combine(swixProjDirectory, "component.swr")); + + Assert.Contains(@"vs.dependency id=maui.mobile", componentSwr); + Assert.Contains(@"vs.dependency id=maui.desktop", componentSwr); + } + private static WorkloadManifest Create(string filename) { return WorkloadManifestReader.ReadWorkloadManifest(Path.GetFileNameWithoutExtension(filename), diff --git a/src/Microsoft.DotNet.Build.Tasks.Workloads.Tests/testassets/mauiWorkloadManifest.json b/src/Microsoft.DotNet.Build.Tasks.Workloads.Tests/testassets/mauiWorkloadManifest.json new file mode 100644 index 00000000000..03e0b1a5285 --- /dev/null +++ b/src/Microsoft.DotNet.Build.Tasks.Workloads.Tests/testassets/mauiWorkloadManifest.json @@ -0,0 +1,12 @@ +{ + "version": "6.0.100-preview.6.891", + "workloads": { + "maui": { + "description": ".NET MAUI SDK for all platforms", + "extends": [ + "maui-mobile", + "maui-desktop" + ] + } + } +} diff --git a/src/Microsoft.DotNet.Build.Tasks.Workloads/src/GenerateWorkloadMsis.cs b/src/Microsoft.DotNet.Build.Tasks.Workloads/src/GenerateWorkloadMsis.cs index f55d7355f6a..6f34c971a29 100644 --- a/src/Microsoft.DotNet.Build.Tasks.Workloads/src/GenerateWorkloadMsis.cs +++ b/src/Microsoft.DotNet.Build.Tasks.Workloads/src/GenerateWorkloadMsis.cs @@ -117,7 +117,7 @@ private IEnumerable GetWorkloadPacks() Select(w => w.Value). Where(wd => (wd.Platforms == null) || wd.Platforms.Any(p => p.StartsWith("win"))); - var packIds = workloads.SelectMany(w => w.Packs).Distinct(); + var packIds = workloads.Where(w => w.Packs != null).SelectMany(w => w.Packs).Distinct(); return manifests.SelectMany(m => m.Packs.Values). Where(p => packIds.Contains(p.Id)). diff --git a/src/Microsoft.DotNet.Build.Tasks.Workloads/src/MsiTemplate/Directories.wxs b/src/Microsoft.DotNet.Build.Tasks.Workloads/src/MsiTemplate/Directories.wxs index 66cbae46436..574cbe373b1 100644 --- a/src/Microsoft.DotNet.Build.Tasks.Workloads/src/MsiTemplate/Directories.wxs +++ b/src/Microsoft.DotNet.Build.Tasks.Workloads/src/MsiTemplate/Directories.wxs @@ -6,8 +6,10 @@ - - + + + + diff --git a/src/Microsoft.DotNet.Build.Tasks.Workloads/src/VisualStudioComponent.cs b/src/Microsoft.DotNet.Build.Tasks.Workloads/src/VisualStudioComponent.cs index ee7e9d6d39c..b6d523fb38e 100644 --- a/src/Microsoft.DotNet.Build.Tasks.Workloads/src/VisualStudioComponent.cs +++ b/src/Microsoft.DotNet.Build.Tasks.Workloads/src/VisualStudioComponent.cs @@ -254,14 +254,17 @@ public static VisualStudioComponent Create(TaskLoggingHelper log, WorkloadManife } } - // Visual Studio is case-insensitive. - IEnumerable packIds = workload.Packs.Where(p => !missingPackIds.Contains($"{p}", StringComparer.OrdinalIgnoreCase)); - log?.LogMessage(MessageImportance.Low, $"Packs: {string.Join(", ", packIds.Select(p=>$"{p}"))}"); - - foreach (WorkloadPackId packId in packIds) + if (workload.Packs != null) { - log?.LogMessage(MessageImportance.Low, $"Adding component dependency for {packId} "); - component.AddDependency(manifest.Packs[packId]); + // Visual Studio is case-insensitive. + IEnumerable packIds = workload.Packs.Where(p => !missingPackIds.Contains($"{p}", StringComparer.OrdinalIgnoreCase)); + log?.LogMessage(MessageImportance.Low, $"Packs: {string.Join(", ", packIds.Select(p => $"{p}"))}"); + + foreach (WorkloadPackId packId in packIds) + { + log?.LogMessage(MessageImportance.Low, $"Adding component dependency for {packId} "); + component.AddDependency(manifest.Packs[packId]); + } } return component; From c206f6f604fa6369604000d3df409f7136040877 Mon Sep 17 00:00:00 2001 From: Epsitha Ananth <47157394+epananth@users.noreply.github.com> Date: Wed, 30 Jun 2021 20:40:08 -0700 Subject: [PATCH 198/699] Tests for publishing (#7346) * tests * remove unwanted using * addressed feedback * change response * comments * Revert some changes * changed it cos, the test were timing out * few nits * review comment --- ...osoft.DotNet.Build.Tasks.Feed.Tests.csproj | 1 + .../PublishToSymbolServerTest.cs | 229 +++++++++++++++++- .../TestInputs/Symbols/test.txt | 35 +++ .../src/PublishArtifactsInManifestBase.cs | 22 +- 4 files changed, 277 insertions(+), 10 deletions(-) create mode 100644 src/Microsoft.DotNet.Build.Tasks.Feed.Tests/TestInputs/Symbols/test.txt diff --git a/src/Microsoft.DotNet.Build.Tasks.Feed.Tests/Microsoft.DotNet.Build.Tasks.Feed.Tests.csproj b/src/Microsoft.DotNet.Build.Tasks.Feed.Tests/Microsoft.DotNet.Build.Tasks.Feed.Tests.csproj index d100e0d8321..548fac7ecdb 100644 --- a/src/Microsoft.DotNet.Build.Tasks.Feed.Tests/Microsoft.DotNet.Build.Tasks.Feed.Tests.csproj +++ b/src/Microsoft.DotNet.Build.Tasks.Feed.Tests/Microsoft.DotNet.Build.Tasks.Feed.Tests.csproj @@ -38,4 +38,5 @@ Always + diff --git a/src/Microsoft.DotNet.Build.Tasks.Feed.Tests/PublishToSymbolServerTest.cs b/src/Microsoft.DotNet.Build.Tasks.Feed.Tests/PublishToSymbolServerTest.cs index 4b2784921bb..9e08f09b226 100644 --- a/src/Microsoft.DotNet.Build.Tasks.Feed.Tests/PublishToSymbolServerTest.cs +++ b/src/Microsoft.DotNet.Build.Tasks.Feed.Tests/PublishToSymbolServerTest.cs @@ -1,6 +1,12 @@ +using System; using System.Collections.Generic; using System.IO; +using System.Net; +using System.Net.Http; +using System.Threading.Tasks; +using Microsoft.Arcade.Common; using Microsoft.Arcade.Test.Common; +using Microsoft.DotNet.Arcade.Test.Common; using Microsoft.DotNet.Build.Tasks.Feed.Model; using Microsoft.DotNet.Maestro.Client.Models; using Xunit; @@ -40,7 +46,6 @@ public void PublishToSymbolServersTest(SymbolTargetType symbolTargetType , strin Assert.True(test.Count == 1); } - [Fact] public void PublishToBothSymbolServerTest() { @@ -139,5 +144,227 @@ public void PublishSymbolApiIsCalledTest() false, false).IsCompleted); } + + [Fact] + public void DownloadFileAsyncSucceedsForValidUrl() + { + var buildEngine = new MockBuildEngine(); + var publishTask = new PublishArtifactsInManifestV3 + { + BuildEngine = buildEngine, + }; + + var testFile = Path.Combine("Symbols", "test.txt"); + var responseContent = TestInputs.ReadAllBytes(testFile); + var response = new HttpResponseMessage(HttpStatusCode.OK) + { + Content = new ByteArrayContent(responseContent) + }; + + using HttpClient client = FakeHttpClient.WithResponses(response); + var path = TestInputs.GetFullPath(Guid.NewGuid().ToString()); + + var test = publishTask.DownloadFileAsync( + client, + PublishArtifactsInManifestBase.ArtifactName.BlobArtifacts, + "1234", + "test.txt", + path); + + Assert.True(File.Exists(path)); + publishTask.DeleteTemporaryFiles(path); + publishTask.DeleteTemporaryDirectory(path); + } + + [Theory] + [InlineData(HttpStatusCode.BadRequest)] + [InlineData(HttpStatusCode.NotFound)] + [InlineData(HttpStatusCode.GatewayTimeout)] + public async Task DownloadFileAsyncFailsForInValidUrlTest(HttpStatusCode httpStatus) + { + var buildEngine = new MockBuildEngine(); + var publishTask = new PublishArtifactsInManifestV3 + { + BuildEngine = buildEngine, + }; + var testFile = Path.Combine("Symbols", "test.txt"); + var responseContent = TestInputs.ReadAllBytes(testFile); + publishTask.RetryHandler = new ExponentialRetry() { MaxAttempts = 3, DelayBase = 1 }; + + var responses = new[] + { + new HttpResponseMessage(httpStatus) + { + Content = new ByteArrayContent(responseContent) + }, + new HttpResponseMessage(httpStatus) + { + Content = new ByteArrayContent(responseContent) + }, + new HttpResponseMessage(httpStatus) + { + Content = new ByteArrayContent(responseContent) + } + }; + using HttpClient client = FakeHttpClient.WithResponses(responses); + var path = TestInputs.GetFullPath(Guid.NewGuid().ToString()); + + var actualError = await Assert.ThrowsAsync(() => + publishTask.DownloadFileAsync( + client, + PublishArtifactsInManifestBase.ArtifactName.BlobArtifacts, + "1234", + "test.txt", + path)); + Assert.Contains($"Failed to download local file '{path}' after {publishTask.RetryHandler.MaxAttempts} attempts. See inner exception for details,", actualError.Message); + } + + [Theory] + [InlineData(HttpStatusCode.BadRequest)] + [InlineData(HttpStatusCode.NotFound)] + [InlineData(HttpStatusCode.GatewayTimeout)] + public async Task DownloadFailureWhenStatusCodeIsInvalid(HttpStatusCode httpStatus) + { + var buildEngine = new MockBuildEngine(); + var publishTask = new PublishArtifactsInManifestV3 + { + BuildEngine = buildEngine, + }; + var testFile = Path.Combine("Symbols", "test.txt"); + var responseContent = TestInputs.ReadAllBytes(testFile); + publishTask.RetryHandler = new ExponentialRetry() { MaxAttempts = 3, DelayBase = 1 }; + + var responses = new[] + { + new HttpResponseMessage(httpStatus) + { + Content = new ByteArrayContent(responseContent) + }, + new HttpResponseMessage(httpStatus) + { + Content = new ByteArrayContent(responseContent) + }, + new HttpResponseMessage(httpStatus) + { + Content = new ByteArrayContent(responseContent) + } + }; + using HttpClient client = FakeHttpClient.WithResponses(responses); + var path = TestInputs.GetFullPath(Guid.NewGuid().ToString()); + + var actualError = await Assert.ThrowsAsync(() => + publishTask.DownloadFileAsync( + client, + PublishArtifactsInManifestBase.ArtifactName.BlobArtifacts, + "1234", + "test.txt", + path)); + Assert.Contains($"Failed to download local file '{path}' after {publishTask.RetryHandler.MaxAttempts} attempts. See inner exception for details,", actualError.Message); + } + + [Theory] + [InlineData(HttpStatusCode.BadRequest)] + [InlineData(HttpStatusCode.NotFound)] + [InlineData(HttpStatusCode.GatewayTimeout)] + public async Task DownloadFileSuccessfulAfterRetryTest(HttpStatusCode httpStatus) + { + var buildEngine = new MockBuildEngine(); + var publishTask = new PublishArtifactsInManifestV3 + { + BuildEngine = buildEngine, + }; + var testFile = Path.Combine("Symbols", "test.txt"); + var responseContent = TestInputs.ReadAllBytes(testFile); + publishTask.RetryHandler = new ExponentialRetry() { MaxAttempts = 2, DelayBase = 1 }; + + var responses = new[] + { + new HttpResponseMessage(httpStatus) + { + Content = new ByteArrayContent(responseContent) + }, + new HttpResponseMessage(HttpStatusCode.OK) + { + Content = new ByteArrayContent(responseContent) + } + }; + using HttpClient client = FakeHttpClient.WithResponses(responses); + var path = TestInputs.GetFullPath(Guid.NewGuid().ToString()); + + await publishTask.DownloadFileAsync( + client, + PublishArtifactsInManifestBase.ArtifactName.BlobArtifacts, + "1234", + "test.txt", + path); + Assert.True(File.Exists(path)); + publishTask.DeleteTemporaryFiles(path); + publishTask.DeleteTemporaryDirectory(path); + } + + [Theory] + [InlineData(PublishArtifactsInManifestBase.ArtifactName.BlobArtifacts, "1")] + [InlineData(PublishArtifactsInManifestBase.ArtifactName.PackageArtifacts, "1234")] + public async Task GetContainerIdToDownloadArtifactAsync(PublishArtifactsInManifestBase.ArtifactName artifactName, string containerId) + { + var buildEngine = new MockBuildEngine(); + var publishTask = new PublishArtifactsInManifestV3 + { + BuildEngine = buildEngine, + }; + publishTask.BuildId = "1243456"; + var testPackageName = Path.Combine("Symbols", "test.txt"); + var responseContent = TestInputs.ReadAllBytes(testPackageName); + var responses = new HttpResponseMessage(HttpStatusCode.OK) + { + Content = new ByteArrayContent(responseContent) + }; + + using HttpClient client = FakeHttpClient.WithResponses(responses); + var test = await publishTask.GetContainerIdAsync( + client, + artifactName); + Assert.Equal(containerId, test); + } + + [Theory] + [InlineData(HttpStatusCode.BadRequest)] + [InlineData(HttpStatusCode.NotFound)] + public async Task ErrorAfterMaxRetriesToGetContainerId(HttpStatusCode httpStatus) + { + var buildEngine = new MockBuildEngine(); + var publishTask = new PublishArtifactsInManifestV3 + { + BuildEngine = buildEngine, + }; + publishTask.BuildId = "1243456"; + publishTask.RetryHandler = new ExponentialRetry() {MaxAttempts = 3, DelayBase = 1}; + + var testPackageName = Path.Combine("Symbols", "test.txt"); + var responseContent = TestInputs.ReadAllBytes(testPackageName); + var responses = new[] + { + new HttpResponseMessage(httpStatus) + { + Content = new ByteArrayContent(responseContent) + }, + new HttpResponseMessage(httpStatus) + { + Content = new ByteArrayContent(responseContent) + }, + new HttpResponseMessage(httpStatus) + { + Content = new ByteArrayContent(responseContent) + } + }; + + using HttpClient client = FakeHttpClient.WithResponses(responses); + + var actualError = await Assert.ThrowsAsync(() => + publishTask.GetContainerIdAsync( + client, + PublishArtifactsInManifestBase.ArtifactName.BlobArtifacts)); + Assert.Contains($"Failed to get container id after {publishTask.RetryHandler.MaxAttempts} attempts. See inner exception for details,", actualError.Message); + } } } diff --git a/src/Microsoft.DotNet.Build.Tasks.Feed.Tests/TestInputs/Symbols/test.txt b/src/Microsoft.DotNet.Build.Tasks.Feed.Tests/TestInputs/Symbols/test.txt new file mode 100644 index 00000000000..5a604136aeb --- /dev/null +++ b/src/Microsoft.DotNet.Build.Tasks.Feed.Tests/TestInputs/Symbols/test.txt @@ -0,0 +1,35 @@ +{ + "count":1, + "value":[ + { + "id":2124, + "name":"PackageArtifacts", + "source":"testSource", + "resource":{ + "type":"Container", + "data":"#/1234/PackageArtifacts", + "properties":{ + "localpath":"D:\\workspace\\_work\\1\\s\\artifacts\\output\\packages", + "artifactsize":"7644905" + }, + "url":"https://dev.azure.com/dnceng/url", + "downloadUrl":"https://dev.azure.com/dnceng/_apis/build/builds/buildId/artifacts?artifactName=PackageArtifacts&api-version=6.0&%24format=zip" + } + }, + { + "id":2123, + "name":"BlobArtifacts", + "source":"testSource", + "resource":{ + "type":"Container", + "data":"#/1/BlobArtifacts", + "properties":{ + "localpath":"D:\\workspace\\_work\\1\\s\\artifacts\\output\\packages", + "artifactsize":"7644905" + }, + "url":"https://dev.azure.com/dnceng/_apis/build/builds/buildId/artifacts?artifactName=BlobArtifacts&api-version=6.0", + "downloadUrl":"https://dev.azure.com/dnceng/_apis/build/builds/buildId/artifacts?artifactName=PackageArtifacts&api-version=6.0&%24format=zip" + } + } + ] +} diff --git a/src/Microsoft.DotNet.Build.Tasks.Feed/src/PublishArtifactsInManifestBase.cs b/src/Microsoft.DotNet.Build.Tasks.Feed/src/PublishArtifactsInManifestBase.cs index ddbbadb383a..8670e955c83 100644 --- a/src/Microsoft.DotNet.Build.Tasks.Feed/src/PublishArtifactsInManifestBase.cs +++ b/src/Microsoft.DotNet.Build.Tasks.Feed/src/PublishArtifactsInManifestBase.cs @@ -185,13 +185,13 @@ public abstract class PublishArtifactsInManifestBase : Microsoft.Build.Utilities ///

public int RetryDelayMilliseconds { get; set; } = 5000; - public readonly ExponentialRetry RetryHandler = new ExponentialRetry + public ExponentialRetry RetryHandler = new ExponentialRetry { MaxAttempts = 5, DelayBase = 2.5 // 2.5 ^ 5 = ~1.5 minutes max wait between retries }; - private enum ArtifactName + public enum ArtifactName { [Description("PackageArtifacts")] PackageArtifacts, @@ -401,7 +401,9 @@ public async Task PublishSymbolsUsingStreamingAsync( Log.LogMessage(MessageImportance.High, $"Performing symbol publishing... \nExpirationInDays : {ExpirationInDays} \nConvertPortablePdbsToWindowsPdb : false \ndryRun: false "); var symbolCategory = TargetFeedContentType.Symbols; - string containerId = await GetContainerIdAsync(ArtifactName.BlobArtifacts); + + using HttpClient httpClient = CreateAzdoClient(AzureDevOpsOrg, false, AzureProject); + string containerId = await GetContainerIdAsync(httpClient, ArtifactName.BlobArtifacts); if (Log.HasLoggedErrors) { @@ -830,7 +832,7 @@ public HttpClient CreateAzdoClient( ///
/// If it is PackageArtifacts or BlobArtifacts /// ContainerId - private async Task GetContainerIdAsync(ArtifactName artifactName) + public async Task GetContainerIdAsync(HttpClient client, ArtifactName artifactName) { string uri = $"{AzureDevOpsBaseUrl}/{AzureDevOpsOrg}/{AzureProject}/_apis/build/builds/{BuildId}/artifacts?api-version={AzureDevOpsFeedsApiVersion}"; @@ -843,7 +845,6 @@ private async Task GetContainerIdAsync(ArtifactName artifactName) CancellationTokenSource timeoutTokenSource = new CancellationTokenSource(TimeSpan.FromMinutes(TimeoutInMinutes)); - using HttpClient client = CreateAzdoClient(AzureDevOpsOrg, false, AzureProject); using HttpRequestMessage getMessage = new HttpRequestMessage(HttpMethod.Get, uri); using HttpResponseMessage response = await client.GetAsync(uri, timeoutTokenSource.Token); @@ -892,7 +893,7 @@ private async Task GetContainerIdAsync(ArtifactName artifactName) /// ContainerId where the packageArtifact and BlobArtifacts are stored /// Name the file we are trying to download /// Path where the file is being downloaded - private async Task DownloadFileAsync( + public async Task DownloadFileAsync( HttpClient client, ArtifactName artifactName, string containerId, @@ -1136,7 +1137,8 @@ private async Task PublishPackagesUsingStreamingToAzdoNugetAsync( TargetFeedConfig feedConfig, SemaphoreSlim clientThrottle) { - string containerId = await GetContainerIdAsync(ArtifactName.PackageArtifacts); + using HttpClient httpClient = CreateAzdoClient(AzureDevOpsOrg, false, AzureProject); + string containerId = await GetContainerIdAsync(httpClient, ArtifactName.PackageArtifacts); if (Log.HasLoggedErrors) { @@ -1491,7 +1493,8 @@ private async Task PublishBlobsUsingStreamingToAzDoNugetAsync( TargetFeedConfig feedConfig, SemaphoreSlim clientThrottle) { - string containerId = await GetContainerIdAsync(ArtifactName.BlobArtifacts); + using HttpClient httpClient = CreateAzdoClient(AzureDevOpsOrg, false, AzureProject); + string containerId = await GetContainerIdAsync(httpClient, ArtifactName.BlobArtifacts); if (Log.HasLoggedErrors) { @@ -1654,7 +1657,8 @@ private async Task PublishBlobsToAzureStorageNugetUsingStreamingPublishingAsync( TargetFeedConfig feedConfig, SemaphoreSlim clientThrottle) { - string containerId = await GetContainerIdAsync(ArtifactName.BlobArtifacts); + using HttpClient httpClient = CreateAzdoClient(AzureDevOpsOrg, false, AzureProject); + string containerId = await GetContainerIdAsync(httpClient, ArtifactName.BlobArtifacts); if (Log.HasLoggedErrors) { From e86516235f385009db25416929ef0491ee90f50e Mon Sep 17 00:00:00 2001 From: Peter Collins Date: Thu, 1 Jul 2021 12:47:30 -0400 Subject: [PATCH 199/699] [Workloads] Fix license and icon paths in msi proj (#7579) I was running into a couple of issues when building `msi.csproj` files generated by the `GenerateVisualStudioWorkload` task: C:\Program Files\dotnet\sdk\5.0.301\Sdks\NuGet.Build.Tasks.Pack\build\NuGet.Build.Tasks.Pack.targets(221,5): error : Could not find a part of the path 'C:\Users\peter\source\yaml-templates\nuget-msi-convert\msbuild\obj\Debug\src\msiPackage\x86\Microsoft.Android.Sdk.Windows\obj\Debug\src\msiPackage\x86\Microsoft.Android.Sdk.Windows'. C:\Program Files\dotnet\sdk\5.0.301\Sdks\NuGet.Build.Tasks.Pack\build\NuGet.Build.Tasks.Pack.targets(221,5): error NU5046: The icon file 'Icon.png' does not exist in the package. The first error was a result of the following relative path being included in the `LICENSE.TXT` item: Since `LICENSE.TXT` is created in the same directory as `msi.proj`, we can exclude this relative path. The second error appears to be a result of a missing `Icon.png` item, which has been added. The generated pack item content should now look like this: --- .../src/GenerateManifestMsi.cs | 11 ++++++----- .../src/GenerateMsiBase.cs | 11 ++++++----- 2 files changed, 12 insertions(+), 10 deletions(-) diff --git a/src/Microsoft.DotNet.Build.Tasks.Workloads/src/GenerateManifestMsi.cs b/src/Microsoft.DotNet.Build.Tasks.Workloads/src/GenerateManifestMsi.cs index 899f010c8b2..2345987c8aa 100644 --- a/src/Microsoft.DotNet.Build.Tasks.Workloads/src/GenerateManifestMsi.cs +++ b/src/Microsoft.DotNet.Build.Tasks.Workloads/src/GenerateManifestMsi.cs @@ -281,10 +281,10 @@ private string GeneratePackageProject(string msiPath, string msiJsonPath, string Directory.CreateDirectory(msiPackageProjectDir); - EmbeddedTemplates.Extract("Icon.png", msiPackageProjectDir); - EmbeddedTemplates.Extract("LICENSE.TXT", msiPackageProjectDir); - - string licenseTextPath = Path.Combine(msiPackageProjectDir, "LICENSE.TXT"); + string iconFileName = "Icon.png"; + string licenseFileName = "LICENSE.TXT"; + EmbeddedTemplates.Extract(iconFileName, msiPackageProjectDir); + EmbeddedTemplates.Extract(licenseFileName, msiPackageProjectDir); XmlWriterSettings settings = new XmlWriterSettings { @@ -326,7 +326,8 @@ private string GeneratePackageProject(string msiPath, string msiJsonPath, string writer.WriteStartElement("ItemGroup"); WriteItem(writer, "None", msiPath, @"\data"); WriteItem(writer, "None", msiJsonPath, @"\data\msi.json"); - WriteItem(writer, "None", licenseTextPath, @"\"); + WriteItem(writer, "None", iconFileName, string.Empty); + WriteItem(writer, "None", licenseFileName, @"\"); writer.WriteEndElement(); writer.WriteEndElement(); diff --git a/src/Microsoft.DotNet.Build.Tasks.Workloads/src/GenerateMsiBase.cs b/src/Microsoft.DotNet.Build.Tasks.Workloads/src/GenerateMsiBase.cs index 246e6d52b31..62fcf789438 100644 --- a/src/Microsoft.DotNet.Build.Tasks.Workloads/src/GenerateMsiBase.cs +++ b/src/Microsoft.DotNet.Build.Tasks.Workloads/src/GenerateMsiBase.cs @@ -307,10 +307,10 @@ private string GeneratePackageProject(string msiPath, string msiJsonPath, string Directory.CreateDirectory(msiPackageProjectDir); - EmbeddedTemplates.Extract("Icon.png", msiPackageProjectDir); - EmbeddedTemplates.Extract("LICENSE.TXT", msiPackageProjectDir); - - string licenseTextPath = Path.Combine(msiPackageProjectDir, "LICENSE.TXT"); + string iconFileName = "Icon.png"; + string licenseFileName = "LICENSE.TXT"; + EmbeddedTemplates.Extract(iconFileName, msiPackageProjectDir); + EmbeddedTemplates.Extract(licenseFileName, msiPackageProjectDir); XmlWriterSettings settings = new XmlWriterSettings { @@ -352,7 +352,8 @@ private string GeneratePackageProject(string msiPath, string msiJsonPath, string writer.WriteStartElement("ItemGroup"); WriteItem(writer, "None", msiPath, @"\data"); WriteItem(writer, "None", msiJsonPath, @"\data\msi.json"); - WriteItem(writer, "None", licenseTextPath, @"\"); + WriteItem(writer, "None", iconFileName, string.Empty); + WriteItem(writer, "None", licenseFileName, @"\"); writer.WriteEndElement(); writer.WriteEndElement(); From 7f52af24016a4b749a2c1f219105c0f5a7100028 Mon Sep 17 00:00:00 2001 From: Chad Nedzlek Date: Thu, 1 Jul 2021 11:32:51 -0700 Subject: [PATCH 200/699] Use helix reporting (#7383) * Send results using helix.public reporting * Test target queue * Use open test queue * Put Creator back * Get rid of the venv so we can load helix.public * Forgot an import * Correct HELIX_PYTHONPATH * Add rerun configuration * Try a flaky test * Allow for non-archive payloads * Wrong branch * Reset fake queue targeting * Ignore .env file --- .gitignore | 6 + eng/test-configuration.json | 5 + .../HelpersTests.cs | 16 + .../Sdk/SendHelixJob.cs | 35 ++- ...crosoft.DotNet.Helix.Sdk.MonoQueue.targets | 10 +- .../AzurePipelines.MonoQueue.targets | 4 +- .../reporter/azure_devops_result_publisher.py | 273 ------------------ .../tools/azure-pipelines/reporter/defs.py | 98 ------- .../azure-pipelines/reporter/formats/junit.py | 2 +- .../reporter/formats/result_format.py | 10 +- .../azure-pipelines/reporter/formats/trx.py | 2 +- .../azure-pipelines/reporter/formats/xunit.py | 2 +- .../tools/azure-pipelines/reporter/run.bat | 40 --- .../Sdk/tools/azure-pipelines/reporter/run.py | 173 ++--------- .../Sdk/tools/azure-pipelines/reporter/run.sh | 42 --- .../reporter/test_results_reader/__init__.py | 2 +- 16 files changed, 108 insertions(+), 612 deletions(-) create mode 100644 eng/test-configuration.json delete mode 100644 src/Microsoft.DotNet.Helix/Sdk/tools/azure-pipelines/reporter/azure_devops_result_publisher.py delete mode 100644 src/Microsoft.DotNet.Helix/Sdk/tools/azure-pipelines/reporter/defs.py delete mode 100644 src/Microsoft.DotNet.Helix/Sdk/tools/azure-pipelines/reporter/run.bat delete mode 100755 src/Microsoft.DotNet.Helix/Sdk/tools/azure-pipelines/reporter/run.sh diff --git a/.gitignore b/.gitignore index 19c954ea8f3..aae2dbd6cf1 100644 --- a/.gitignore +++ b/.gitignore @@ -131,3 +131,9 @@ node_modules/ # Python Compile Outputs *.pyc + +# IntelliJ +.idea/ + +# vscode python env files +.env \ No newline at end of file diff --git a/eng/test-configuration.json b/eng/test-configuration.json new file mode 100644 index 00000000000..27fdfceca0d --- /dev/null +++ b/eng/test-configuration.json @@ -0,0 +1,5 @@ +{ + "version": 1, + "defaultOnFailure": "rerun", + "localRerunCount": 1 +} \ No newline at end of file diff --git a/src/Microsoft.DotNet.Helix/Sdk.Tests/Microsoft.DotNet.Helix.Sdk.Tests/HelpersTests.cs b/src/Microsoft.DotNet.Helix/Sdk.Tests/Microsoft.DotNet.Helix.Sdk.Tests/HelpersTests.cs index a971acd4da5..86c53ddee40 100644 --- a/src/Microsoft.DotNet.Helix/Sdk.Tests/Microsoft.DotNet.Helix.Sdk.Tests/HelpersTests.cs +++ b/src/Microsoft.DotNet.Helix/Sdk.Tests/Microsoft.DotNet.Helix.Sdk.Tests/HelpersTests.cs @@ -1,5 +1,8 @@ +using System; +using System.IO; using Xunit; using System.Net; +using Newtonsoft.Json; namespace Microsoft.DotNet.Helix.Sdk.Tests { @@ -35,5 +38,18 @@ public void VerifyNonEncodedFowardSlashIsConverted() Assert.Equal(workItemNameExpected, actual); } + + [Fact] + public void FailOnceThenPass() + { + var target = Path.Combine(Path.GetTempPath(), "my-test-file-123456.snt"); + bool exists = File.Exists(target); + if (!exists) + { + File.WriteAllText(target, "Test failed once"); + } + + Assert.True(exists, $"File should exist: {target}"); + } } } diff --git a/src/Microsoft.DotNet.Helix/Sdk/SendHelixJob.cs b/src/Microsoft.DotNet.Helix/Sdk/SendHelixJob.cs index 6212882bbea..cf1cede9a45 100644 --- a/src/Microsoft.DotNet.Helix/Sdk/SendHelixJob.cs +++ b/src/Microsoft.DotNet.Helix/Sdk/SendHelixJob.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.Globalization; using System.IO; +using System.IO.Compression; using System.Linq; using System.Text; using System.Threading; @@ -33,6 +34,7 @@ public static class MetadataNames public const string Uri = "Uri"; public const string Destination = "Destination"; public const string IncludeDirectoryName = "IncludeDirectoryName"; + public const string AsArchive = "AsArchive"; } /// @@ -521,16 +523,41 @@ private IJobDefinition AddCorrelationPayload(IJobDefinition def, ITaskItem corre if (Directory.Exists(path)) { string includeDirectoryNameStr = correlationPayload.GetMetadata(MetadataNames.IncludeDirectoryName); - bool.TryParse(includeDirectoryNameStr, out bool includeDirectoryName); + if (!bool.TryParse(includeDirectoryNameStr, out bool includeDirectoryName)) + { + includeDirectoryName = false; + } - Log.LogMessage(MessageImportance.Low, $"Adding Correlation Payload Directory '{path}', destination '{destination}'"); + Log.LogMessage( + MessageImportance.Low, + $"Adding Correlation Payload Directory '{path}', destination '{destination}'" + ); return def.WithCorrelationPayloadDirectory(path, includeDirectoryName, destination); + } if (File.Exists(path)) { - Log.LogMessage(MessageImportance.Low, $"Adding Correlation Payload Archive '{path}', destination '{destination}'"); - return def.WithCorrelationPayloadArchive(path, destination); + string asArchiveStr = correlationPayload.GetMetadata(MetadataNames.AsArchive); + if (!bool.TryParse(asArchiveStr, out bool asArchive)) + { + asArchive = false; + } + + if (asArchive) + { + Log.LogMessage( + MessageImportance.Low, + $"Adding Correlation Payload Archive '{path}', destination '{destination}'" + ); + return def.WithCorrelationPayloadArchive(path, destination); + } + + Log.LogMessage( + MessageImportance.Low, + $"Adding Correlation Payload File '{path}', destination '{destination}'" + ); + return def.WithCorrelationPayloadFiles(path); } Log.LogError(FailureCategory.Build, $"Correlation Payload '{path}' not found."); diff --git a/src/Microsoft.DotNet.Helix/Sdk/tools/Microsoft.DotNet.Helix.Sdk.MonoQueue.targets b/src/Microsoft.DotNet.Helix/Sdk/tools/Microsoft.DotNet.Helix.Sdk.MonoQueue.targets index b271e821239..7f8604a40fa 100644 --- a/src/Microsoft.DotNet.Helix/Sdk/tools/Microsoft.DotNet.Helix.Sdk.MonoQueue.targets +++ b/src/Microsoft.DotNet.Helix/Sdk/tools/Microsoft.DotNet.Helix.Sdk.MonoQueue.targets @@ -3,7 +3,11 @@ false - + + + $(RepositoryEngineeringDir)/test-configuration.json + + @@ -36,6 +40,10 @@ + + + + diff --git a/src/Microsoft.DotNet.Helix/Sdk/tools/azure-pipelines/AzurePipelines.MonoQueue.targets b/src/Microsoft.DotNet.Helix/Sdk/tools/azure-pipelines/AzurePipelines.MonoQueue.targets index 9dc488962f1..d5fbcb4569f 100644 --- a/src/Microsoft.DotNet.Helix/Sdk/tools/azure-pipelines/AzurePipelines.MonoQueue.targets +++ b/src/Microsoft.DotNet.Helix/Sdk/tools/azure-pipelines/AzurePipelines.MonoQueue.targets @@ -7,11 +7,11 @@ $(HelixPostCommands); - /bin/sh $HELIX_CORRELATION_PAYLOAD/reporter/run.sh $(SYSTEM_TEAMFOUNDATIONCOLLECTIONURI) $(SYSTEM_TEAMPROJECT) $(TestRunId) $(SYSTEM_ACCESSTOKEN) || exit $? + $HELIX_PYTHONPATH $HELIX_CORRELATION_PAYLOAD/reporter/run.py $(SYSTEM_TEAMFOUNDATIONCOLLECTIONURI) $(SYSTEM_TEAMPROJECT) $(TestRunId) $(SYSTEM_ACCESSTOKEN) || exit $? $(HelixPostCommands); - call %HELIX_CORRELATION_PAYLOAD%\reporter\run.bat $(SYSTEM_TEAMFOUNDATIONCOLLECTIONURI) $(SYSTEM_TEAMPROJECT) $(TestRunId) $(SYSTEM_ACCESSTOKEN) || exit /b + %HELIX_PYTHONPATH% %HELIX_CORRELATION_PAYLOAD%\reporter\run.py $(SYSTEM_TEAMFOUNDATIONCOLLECTIONURI) $(SYSTEM_TEAMPROJECT) $(TestRunId) $(SYSTEM_ACCESSTOKEN) || exit /b diff --git a/src/Microsoft.DotNet.Helix/Sdk/tools/azure-pipelines/reporter/azure_devops_result_publisher.py b/src/Microsoft.DotNet.Helix/Sdk/tools/azure-pipelines/reporter/azure_devops_result_publisher.py deleted file mode 100644 index 47fc6454009..00000000000 --- a/src/Microsoft.DotNet.Helix/Sdk/tools/azure-pipelines/reporter/azure_devops_result_publisher.py +++ /dev/null @@ -1,273 +0,0 @@ -import base64 -import os -import logging -import time -from typing import Iterable, Mapping, List, Dict, Optional, Tuple -from builtins import str as text -from azure.devops.connection import Connection -from msrest.authentication import BasicTokenAuthentication, BasicAuthentication -from azure.devops.v5_1.test import TestClient -from azure.devops.v5_1.test.models import TestCaseResult, TestAttachmentRequestModel, TestSubResult -from azure.devops.exceptions import AzureDevOpsClientRequestError - -from helpers import get_env -from defs import TestResult - -log = logging.getLogger(__name__) - - -class AzureDevOpsTestResultPublisher: - def __init__(self, collection_uri, access_token, team_project, test_run_id=None): - """ - - :type collection_uri: str The team project collection uri - :type access_token: str The value of SYSTEM_ACCESSTOKEN from the azure pipelines build - """ - self.collection_uri = collection_uri - self.access_token = access_token - self.team_project = team_project - self.test_run_id = test_run_id - self.work_item_name = get_env("HELIX_WORKITEM_FRIENDLYNAME") - pass - - def upload_batch(self, results: Iterable[TestResult]): - results_with_attachments = {r.name: r for r in results if r is not None and r.attachments} - - (test_case_results, test_name_order) = self.convert_results(results) - - self.publish_results(test_case_results, test_name_order, results_with_attachments) - - def is_data_driven_test(self, r: str) -> bool: - return r.endswith(")") - - def get_ddt_base_name(self, r: str) -> str: - return r.split('(', 1)[0] - - def send_attachment(self, test_client, attachment, published_result): - try: - # Python 3 will throw a TypeError exception because b64encode expects bytes - stream = base64.b64encode(text(attachment.text)) - except TypeError: - # stream has to be a string but b64encode takes and returns bytes on Python 3 - stream = base64.b64encode(bytes(attachment.text, "utf-8")).decode("utf-8") - - test_client.create_test_result_attachment( - TestAttachmentRequestModel( - file_name=text(attachment.name), - stream=stream, - ), self.team_project, self.test_run_id, published_result.id) - - def send_sub_attachment(self, test_client, attachment, published_result, sub_result_id): - stream = base64.b64encode(bytes(attachment.text, "utf-8")).decode("utf-8") - - test_client.create_test_sub_result_attachment( - TestAttachmentRequestModel( - file_name=text(attachment.name), - stream=stream, - ), self.team_project, self.test_run_id, published_result.id, sub_result_id) - - def publish_results(self, test_case_results: Iterable[TestCaseResult], test_result_order: Dict[str, List[str]], - results_with_attachments: Mapping[str, TestResult]) -> None: - connection = self.get_connection() - test_client = connection.get_client("azure.devops.v5_1.test.TestClient") # type: TestClient - - tries_left = 10 - succeeded = False - test_run_ended = False - - while tries_left > 0 and not test_run_ended and not succeeded: - try: - published_results = test_client. \ - add_test_results_to_test_run(list(test_case_results), - self.team_project, - self.test_run_id) # type: List[TestCaseResult] - succeeded = True - - except AzureDevOpsClientRequestError as ex: - # Odd syntax here is to deal with checking substrings of the list of args in this exception - hit_503 = len([element for element in ex.args if ('invalid status code of 503' in element)]) != 0 - test_run_ended = len([element for element in ex.args if ('It may have been deleted' in element)]) != 0 - if hit_503: - tries_left -= 1 - log.warning("Hit HTTP 503 from Azure DevOps. Will wait three seconds and try again.") - time.sleep(3) - elif test_run_ended: # Not exceptional, don't retry. - tries_left = 0 - else: - raise ex - - if test_run_ended: - log.info("Test run has ended, skipping attaching results as it would fail.") - return - - # !succeeded means a 503 and not succeeding after 10 tries (otherwise we threw already), so give a nice error - if not succeeded: - raise Exception('Failed to report test results to Azure Dev Ops after retrying. Please contact dnceng.') - - for published_result in published_results: - - # Don't send attachments if the result was not accepted. - if published_result.id == -1: - continue - - # Does the test result have an attachment with an exact matching name? - if published_result.automated_test_name in results_with_attachments: - log.debug("Result {0} has an attachment".format(published_result.automated_test_name)) - result = results_with_attachments.get(published_result.automated_test_name) - - for attachment in result.attachments: - self.send_attachment(test_client, attachment, published_result) - - # Does the test result have an attachment with a sub-result matching name? - # The data structure returned from AzDO does not contain a subresult's name, only an - # index. The order of results is meant to be the same as was posted. This assumes that - # is true , and uses the order of test names recorded earlier to look-up the attachments. - elif published_result.sub_results is not None: - sub_results_order = test_result_order[published_result.automated_test_name] - - # Sanity check - if len(sub_results_order) != len(published_result.sub_results): - log.warning( - "Returned subresults list length does not match expected. Attachments may not pair correctly.") - - for (name, sub_result) in zip(sub_results_order, published_result.sub_results): - if name in results_with_attachments: - result = results_with_attachments.get(name) - for attachment in result.attachments: - self.send_sub_attachment(test_client, attachment, published_result, sub_result.id) - - def convert_results(self, results: Iterable[TestResult]) -> Tuple[Iterable[TestCaseResult], Dict[str, List[str]]]: - comment = "{{ \"HelixJobId\": \"{}\", \"HelixWorkItemName\": \"{}\" }}".format( - os.getenv("HELIX_CORRELATION_ID"), - os.getenv("HELIX_WORKITEM_FRIENDLYNAME"), - ) - - def convert_to_sub_test(r: TestResult) -> Optional[TestSubResult]: - if r.result == "Pass": - return TestSubResult( - comment=comment, - display_name=text(r.name), - duration_in_ms=r.duration_seconds * 1000, - outcome="Passed" - ) - if r.result == "Fail": - return TestSubResult( - comment=comment, - display_name=text(r.name), - duration_in_ms=r.duration_seconds * 1000, - outcome="Failed", - stack_trace=text(r.stack_trace) if r.stack_trace is not None else None, - error_message=text(r.failure_message) - ) - if r.result == "Skip": - return TestSubResult( - comment=comment, - display_name=text(r.name), - duration_in_ms=r.duration_seconds * 1000, - outcome="NotExecuted" - ) - log.warning("Unexpected result value {} for {}".format(r.result, r.name)) - return None - - def convert_result(r: TestResult) -> Optional[TestCaseResult]: - if r.result == "Pass": - return TestCaseResult( - test_case_title=text(r.name), - automated_test_name=text(r.name), - automated_test_type=text(r.kind), - automated_test_storage=self.work_item_name, - priority=1, - duration_in_ms=r.duration_seconds * 1000, - outcome="Passed", - state="Completed", - comment=comment, - ) - if r.result == "Fail": - return TestCaseResult( - test_case_title=text(r.name), - automated_test_name=text(r.name), - automated_test_type=text(r.kind), - automated_test_storage=self.work_item_name, - priority=1, - duration_in_ms=r.duration_seconds * 1000, - outcome="Failed", - state="Completed", - error_message=text(r.failure_message), - stack_trace=text(r.stack_trace) if r.stack_trace is not None else None, - comment=comment, - ) - - if r.result == "Skip": - return TestCaseResult( - test_case_title=text(r.name), - automated_test_name=text(r.name), - automated_test_type=text(r.kind), - automated_test_storage=self.work_item_name, - priority=1, - duration_in_ms=r.duration_seconds * 1000, - outcome="NotExecuted", - state="Completed", - error_message=text(r.skip_reason), - comment=comment, - ) - - log.warning("Unexpected result value {} for {}".format(r.result, r.name)) - return None - - unconverted_results = list(results) # type: List[TestResult] - log.debug("Count of unconverted_results: {0}".format(len(unconverted_results))) - - # Find all DDTs, determine parent, and add to dictionary - data_driven_tests = {} # type: Dict[str, TestCaseResult] - non_data_driven_tests = [] # type: List[TestCaseResult] - test_name_ordering = {} # type: Dict[str, List[str]] - - for r in unconverted_results: - if r is None: - continue - - if not self.is_data_driven_test(r.name): - non_data_driven_tests.append(convert_result(r)) - test_name_ordering[r.name] = [] - continue - - # Must be a DDT - base_name = self.get_ddt_base_name(r.name) - - if base_name in data_driven_tests: - sub_test = convert_to_sub_test(r) - if sub_test is None: - continue - - data_driven_tests[base_name].sub_results.append(sub_test) - test_name_ordering[base_name].append(r.name) - - # Mark parent test as Failed if any subresult is Failed - if sub_test.outcome == "Failed": - data_driven_tests[base_name].outcome = "Failed" - - else: - cr = convert_result(r) - csr = convert_to_sub_test(r) - - if cr is None or csr is None: - continue - - data_driven_tests[base_name] = cr - data_driven_tests[base_name].automated_test_name = base_name - data_driven_tests[base_name].result_group_type = "dataDriven" - data_driven_tests[base_name].sub_results = [csr] - test_name_ordering[base_name] = [r.name] - - return (list(data_driven_tests.values()) + non_data_driven_tests, test_name_ordering) - - def get_connection(self) -> Connection: - credentials = self.get_credentials() - return Connection(self.collection_uri, credentials) - - def get_credentials(self) -> BasicTokenAuthentication: - if self.access_token: - return BasicTokenAuthentication({'access_token': self.access_token}) - - token = get_env("VSTS_PAT") - return BasicAuthentication("ignored", token) diff --git a/src/Microsoft.DotNet.Helix/Sdk/tools/azure-pipelines/reporter/defs.py b/src/Microsoft.DotNet.Helix/Sdk/tools/azure-pipelines/reporter/defs.py deleted file mode 100644 index 53cc7f8b5c5..00000000000 --- a/src/Microsoft.DotNet.Helix/Sdk/tools/azure-pipelines/reporter/defs.py +++ /dev/null @@ -1,98 +0,0 @@ -from typing import List - - -class TestResult: - def __init__(self, name, kind, type_name, method, duration, result, exception_type, failure_message, stack_trace, - skip_reason, attachments): - """ - - :type name: unicode - :type kind: unicode - :type type_name: unicode - :type method: unicode - :type duration: float - :type result: unicode - :type exception_type: unicode - :type failure_message: unicode - :type stack_trace: unicode - :type skip_reason: unicode - :type attachments: List[TestResultAttachment] - """ - self._name = name - self._kind = kind - self._type = type_name - self._method = method - self._duration_seconds = duration - self._result = result - self._exception_type = exception_type - self._failure_message = failure_message - self._stack_trace = stack_trace - self._skip_reason = skip_reason - self._attachments = attachments - - @property - def name(self): - return self._name - - @property - def kind(self): - return self._kind - - @property - def type(self): - return self._type - - @property - def method(self): - return self._method - - @property - def duration_seconds(self): - return self._duration_seconds - - @property - def result(self): - return self._result - - @property - def exception_type(self): - return self._exception_type - - @property - def failure_message(self): - return self._failure_message - - @property - def stack_trace(self): - return self._stack_trace - - @property - def skip_reason(self): - return self._skip_reason - - @property - def output(self): - return self._output - - @property - def attachments(self): - return self._attachments - - -class TestResultAttachment: - def __init__(self, name, text): - """ - - :type name: unicode - :type text: unicode - """ - self._name = name - self._text = text - - @property - def name(self): - return self._name - - @property - def text(self): - return self._text diff --git a/src/Microsoft.DotNet.Helix/Sdk/tools/azure-pipelines/reporter/formats/junit.py b/src/Microsoft.DotNet.Helix/Sdk/tools/azure-pipelines/reporter/formats/junit.py index e5bdbf554cc..629f31b2165 100644 --- a/src/Microsoft.DotNet.Helix/Sdk/tools/azure-pipelines/reporter/formats/junit.py +++ b/src/Microsoft.DotNet.Helix/Sdk/tools/azure-pipelines/reporter/formats/junit.py @@ -1,6 +1,6 @@ import xml.etree.ElementTree from .result_format import ResultFormat -from defs import TestResult, TestResultAttachment +from helix.public import TestResult, TestResultAttachment class JUnitFormat(ResultFormat): diff --git a/src/Microsoft.DotNet.Helix/Sdk/tools/azure-pipelines/reporter/formats/result_format.py b/src/Microsoft.DotNet.Helix/Sdk/tools/azure-pipelines/reporter/formats/result_format.py index 43aa2a2bb40..8d7cc966311 100644 --- a/src/Microsoft.DotNet.Helix/Sdk/tools/azure-pipelines/reporter/formats/result_format.py +++ b/src/Microsoft.DotNet.Helix/Sdk/tools/azure-pipelines/reporter/formats/result_format.py @@ -1,5 +1,5 @@ from abc import ABCMeta, abstractmethod, abstractproperty -from defs import TestResult +from helix.public import TestResult from typing import Iterable @@ -10,15 +10,13 @@ def __init__(self): pass @abstractproperty - def name(self): + def name(self) -> str: pass @abstractproperty - def acceptable_file_suffixes(self): - # type: () -> Iterable[str] + def acceptable_file_suffixes(self) -> Iterable[str]: pass @abstractmethod - def read_results(self, path): - # type: (str) -> Iterable[TestResult] + def read_results(self, path) -> Iterable[TestResult]: pass diff --git a/src/Microsoft.DotNet.Helix/Sdk/tools/azure-pipelines/reporter/formats/trx.py b/src/Microsoft.DotNet.Helix/Sdk/tools/azure-pipelines/reporter/formats/trx.py index 9fabb0d88db..cb2afbec916 100644 --- a/src/Microsoft.DotNet.Helix/Sdk/tools/azure-pipelines/reporter/formats/trx.py +++ b/src/Microsoft.DotNet.Helix/Sdk/tools/azure-pipelines/reporter/formats/trx.py @@ -1,7 +1,7 @@ import glob import xml.etree.ElementTree from .result_format import ResultFormat -from defs import TestResult, TestResultAttachment +from helix.public import TestResult, TestResultAttachment class TRXFormat(ResultFormat): diff --git a/src/Microsoft.DotNet.Helix/Sdk/tools/azure-pipelines/reporter/formats/xunit.py b/src/Microsoft.DotNet.Helix/Sdk/tools/azure-pipelines/reporter/formats/xunit.py index b46a11f1964..bbf8ee6f96e 100644 --- a/src/Microsoft.DotNet.Helix/Sdk/tools/azure-pipelines/reporter/formats/xunit.py +++ b/src/Microsoft.DotNet.Helix/Sdk/tools/azure-pipelines/reporter/formats/xunit.py @@ -2,7 +2,7 @@ import xml.etree.ElementTree from .result_format import ResultFormat -from defs import TestResult, TestResultAttachment +from helix.public import TestResult, TestResultAttachment _unescape_char_map = { 'r': '\r', diff --git a/src/Microsoft.DotNet.Helix/Sdk/tools/azure-pipelines/reporter/run.bat b/src/Microsoft.DotNet.Helix/Sdk/tools/azure-pipelines/reporter/run.bat deleted file mode 100644 index 3a3c0f9d1ba..00000000000 --- a/src/Microsoft.DotNet.Helix/Sdk/tools/azure-pipelines/reporter/run.bat +++ /dev/null @@ -1,40 +0,0 @@ - -set ENV_PATH=%USERPROFILE%\.azdo-env -set TMP_ENV_PATH=%USERPROFILE%\.azdo-env-tmp - -REM Removing pythonpath forces a clean installation of the Azure DevOps client, but subsequent commands may use HELIX libraries -set _OLD_PYTHONPATH=%PYTHONPATH% -set PYTHONPATH= - -echo %date%-%time% - -if NOT EXIST %ENV_PATH%\Scripts\python.exe ( - rmdir /Q /S %TMP_ENV_PATH% - rmdir /Q /S %ENV_PATH% - %HELIX_PYTHONPATH% -m virtualenv --no-site-packages %TMP_ENV_PATH% - rename %TMP_ENV_PATH% .azdo-env -) -REM On certain slow machines python.exe keeps a handle open just long enough to break the rename; retry if so -set /a renameAttemptNumber=1 -:retryloop -if NOT EXIST %ENV_PATH%\Scripts\python.exe ( -set /a renameAttemptNumber+=1 -echo Error renaming venv folder; waiting 5 seconds and retrying up to 10x Attempt: %renameAttemptNumber% -ping -n 6 127.0.0.1 > nul -rename %TMP_ENV_PATH% .azdo-env -IF %renameAttemptNumber% GEQ 10 GOTO :renamingdone -GOTO :retryloop -) -:renamingdone - -%ENV_PATH%\Scripts\python.exe -c "import azure.devops" || %ENV_PATH%\Scripts\python.exe -m pip install azure-devops==5.0.0b9 - -%ENV_PATH%\Scripts\python.exe -c "import future" || %ENV_PATH%\Scripts\python.exe -m pip install future==0.17.1 - -echo %date%-%time% -%ENV_PATH%\Scripts\python.exe -B %~dp0run.py %* -set _uploaderExitCode=%ERRORLEVEL% -echo %date%-%time% - -set PYTHONPATH=%_OLD_PYTHONPATH% -exit /b %_uploaderExitCode% diff --git a/src/Microsoft.DotNet.Helix/Sdk/tools/azure-pipelines/reporter/run.py b/src/Microsoft.DotNet.Helix/Sdk/tools/azure-pipelines/reporter/run.py index e862eb2335d..49363dfab9c 100644 --- a/src/Microsoft.DotNet.Helix/Sdk/tools/azure-pipelines/reporter/run.py +++ b/src/Microsoft.DotNet.Helix/Sdk/tools/azure-pipelines/reporter/run.py @@ -6,50 +6,12 @@ import logging from queue import Queue from threading import Thread, Lock -from typing import Tuple, Optional, List - +from typing import Tuple, Optional + +from helpers import get_env from test_results_reader import read_results -from helpers import batch, get_env -from azure_devops_result_publisher import AzureDevOpsTestResultPublisher - -workerFailedLock = Lock() -workerFailed = False - - -class UploadWorker(Thread): - def __init__(self, queue, idx, collection_uri, team_project, test_run_id, access_token): - super(UploadWorker, self).__init__() - self.queue = queue - self.idx = idx - self.publisher = AzureDevOpsTestResultPublisher( - collection_uri=collection_uri, - access_token=access_token, - team_project=team_project, - test_run_id=test_run_id, - ) - self.total_uploaded = 0 - - def __print(self, msg): - sys.stdout.write('Worker {}: {}\n'.format(self.idx, msg)) - sys.stdout.flush() - - def __process(self, batch): - self.publisher.upload_batch(batch) - self.total_uploaded = self.total_uploaded + len(batch) - - def run(self): - global workerFailed, workerFailedLock - while True: - try: - item = self.queue.get() - self.__process(item) - except: - self.__print("got error: {}".format(traceback.format_exc())) - with workerFailedLock: - workerFailed = True - finally: - self.queue.task_done() +from helix.public import DefaultTestReporter, AzureDevOpsReportingParameters def process_args() -> Tuple[str, str, str, Optional[str]]: if len(sys.argv) < 4 or len(sys.argv) > 5: @@ -70,109 +32,36 @@ def process_args() -> Tuple[str, str, str, Optional[str]]: return collection_uri, team_project, test_run_id, access_token -# This reporter will be phased out soon, but until then we need to deal with ADO outages and failures from client lib -# Currently only understands XUnit TestResults.xml (should not be around long enough to need more) -# See https://github.com/dotnet/arcade/issues/7371 for details -def check_passed_to_workaround_ado_api_failure(dirs_to_check: List[str]) -> bool: - print("Reporting has failed. Running mitigation for https://github.com/dotnet/arcade/issues/7371") - found_a_result = False - acceptable_xunit_file_names = [ - "testResults.xml", - "test-results.xml", - "test_results.xml", - "TestResults.xUnit.xml" - ] - - failure_count_found = 0 - - for dir_name in dirs_to_check: - print("Searching '{}' for test results files".format(dir_name)) - for root, dirs, files in os.walk(dir_name): - for file_name in files: - if file_name in acceptable_xunit_file_names: - file_path = os.path.join(root, file_name) - print('Found results file {} '.format(file_path)) - found_a_result = True - failure_count_found += get_failure_count(file_path) - - if found_a_result: - if failure_count_found == 0: - print("Reporter script has failed, but XUnit test results show no failures.") - return True - else: - print("Reporter script has failed, and we were able to find XUnit test results with failures ({})" - .format(str(failure_count_found))) - else: - print("Tried to mitigate but no results files found.") - return False - - -def get_failure_count(test_results_path: str): - fail_count = 0 - with open(test_results_path, encoding="utf-8") as result_file: - total_regex = re.compile(r'failed="(\d+)"') - for line in result_file: - if ' Date: Fri, 2 Jul 2021 09:26:31 -0700 Subject: [PATCH 201/699] Automatically add dotnet6-internal feeds (#7580) If dotnet6 is present, add dotnet6-internal and dotnet6-internal-transport. This is the same methodology as .NET 5 and .NET 3.1 --- eng/common/SetupNugetSources.ps1 | 6 ++++++ eng/common/SetupNugetSources.sh | 24 ++++++++++++++++++++++++ 2 files changed, 30 insertions(+) diff --git a/eng/common/SetupNugetSources.ps1 b/eng/common/SetupNugetSources.ps1 index a0b5fc37f43..18823840b11 100644 --- a/eng/common/SetupNugetSources.ps1 +++ b/eng/common/SetupNugetSources.ps1 @@ -158,4 +158,10 @@ if ($dotnet5Source -ne $null) { AddPackageSource -Sources $sources -SourceName "dotnet5-internal-transport" -SourceEndPoint "https://pkgs.dev.azure.com/dnceng/internal/_packaging/dotnet5-internal-transport/nuget/v2" -Creds $creds -Username $userName -Password $Password } +$dotnet6Source = $sources.SelectSingleNode("add[@key='dotnet6']") +if ($dotnet6Source -ne $null) { + AddPackageSource -Sources $sources -SourceName "dotnet6-internal" -SourceEndPoint "https://pkgs.dev.azure.com/dnceng/internal/_packaging/dotnet6-internal/nuget/v2" -Creds $creds -Username $userName -Password $Password + AddPackageSource -Sources $sources -SourceName "dotnet6-internal-transport" -SourceEndPoint "https://pkgs.dev.azure.com/dnceng/internal/_packaging/dotnet6-internal-transport/nuget/v2" -Creds $creds -Username $userName -Password $Password +} + $doc.Save($filename) diff --git a/eng/common/SetupNugetSources.sh b/eng/common/SetupNugetSources.sh index 2734601c13c..ad3fb74fd2c 100755 --- a/eng/common/SetupNugetSources.sh +++ b/eng/common/SetupNugetSources.sh @@ -129,6 +129,30 @@ if [ "$?" == "0" ]; then PackageSources+=('dotnet5-internal-transport') fi +# Ensure dotnet6-internal and dotnet6-internal-transport are in the packageSources if the public dotnet6 feeds are present +grep -i "" + + sed -i.bak "s|$PackageSourcesNodeFooter|$PackageSourceTemplate${NL}$PackageSourcesNodeFooter|" $ConfigFile + fi + PackageSources+=('dotnet6-internal') + + grep -i "" $ConfigFile + if [ "$?" != "0" ]; then + echo "Adding dotnet6-internal-transport to the packageSources." + PackageSourcesNodeFooter="" + PackageSourceTemplate="${TB}" + + sed -i.bak "s|$PackageSourcesNodeFooter|$PackageSourceTemplate${NL}$PackageSourcesNodeFooter|" $ConfigFile + fi + PackageSources+=('dotnet6-internal-transport') +fi + # I want things split line by line PrevIFS=$IFS IFS=$'\n' From 0f496578b39793650160aa8a1a0e26883bf804fa Mon Sep 17 00:00:00 2001 From: Jeremy Koritzinsky Date: Fri, 2 Jul 2021 16:47:39 -0700 Subject: [PATCH 202/699] Add VS2022 support to the CMake SDK (#7586) CMake 3.21.0-rc2 has support for VS2022, so enable VS2022 support in the CMake SDK since that's available for download. cc: @RussKie --- .../build/Microsoft.DotNet.CMake.Sdk.targets | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/Microsoft.DotNet.CMake.Sdk/build/Microsoft.DotNet.CMake.Sdk.targets b/src/Microsoft.DotNet.CMake.Sdk/build/Microsoft.DotNet.CMake.Sdk.targets index 50567ff2682..0fa9a659f9e 100644 --- a/src/Microsoft.DotNet.CMake.Sdk/build/Microsoft.DotNet.CMake.Sdk.targets +++ b/src/Microsoft.DotNet.CMake.Sdk/build/Microsoft.DotNet.CMake.Sdk.targets @@ -31,7 +31,7 @@ <_CMakeMultiConfigurationGenerator>true <_CMakePassArchitectureToGenerator>true - [15,17.0) + [15,18.0) Win32 @@ -50,6 +50,7 @@ Visual Studio 16 2019 + Visual Studio 17 2022 Date: Mon, 5 Jul 2021 14:03:26 +0000 Subject: [PATCH 203/699] [main] Update dependencies from dotnet/roslyn dotnet/xharness dotnet/xliff-tasks dotnet/arcade mono/linker (#7581) [main] Update dependencies from dotnet/roslyn dotnet/xharness dotnet/xliff-tasks dotnet/arcade mono/linker --- eng/Version.Details.xml | 36 ++++++++++++++++++------------------ eng/Versions.props | 14 +++++++------- global.json | 4 ++-- 3 files changed, 27 insertions(+), 27 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index 46e0acda34d..b93d37d17c1 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -11,25 +11,25 @@ - + https://github.com/dotnet/arcade - 6b9d24236d8d1906284e6cb6c28e3fe93a69b7d2 + 7f52af24016a4b749a2c1f219105c0f5a7100028 - + https://github.com/dotnet/arcade - 6b9d24236d8d1906284e6cb6c28e3fe93a69b7d2 + 7f52af24016a4b749a2c1f219105c0f5a7100028 - + https://github.com/dotnet/arcade - 6b9d24236d8d1906284e6cb6c28e3fe93a69b7d2 + 7f52af24016a4b749a2c1f219105c0f5a7100028 - + https://github.com/dotnet/arcade - 6b9d24236d8d1906284e6cb6c28e3fe93a69b7d2 + 7f52af24016a4b749a2c1f219105c0f5a7100028 - + https://github.com/dotnet/arcade - 6b9d24236d8d1906284e6cb6c28e3fe93a69b7d2 + 7f52af24016a4b749a2c1f219105c0f5a7100028 https://github.com/dotnet/arcade-services @@ -39,17 +39,17 @@ https://github.com/dotnet/arcade-services cac955fe259cb611f6a29d09209bd717deb69037 - + https://github.com/dotnet/xharness - 0bc5e50dff0583fda68f52cfcd39c253e0dacbbe + 32c37bf7374fc77ef79255c8126d34c7a00cf78e - + https://github.com/dotnet/roslyn - 7ceb633154acb9d716fd3eb2b6df1a0468d8e416 + 246ce641f04b67ef017655275d850bf902a8e40f - + https://github.com/mono/linker - f549b4e8bfdf07c31f2540d05f55b50af0e2f391 + f574448d16af45f7ac2c4b89d71dea73dec86726 https://github.com/dotnet/sourcelink @@ -68,9 +68,9 @@ https://github.com/dotnet/symreader-converter c5ba7c88f92e2dde156c324a8c8edc04d9fa4fe0 - + https://github.com/dotnet/xliff-tasks - 45e08da009cf96a72c6b177a7e8f1fe6e6cac72c + dff6c8ede1bf9f95f09fccc2836dbc0564b853a1 diff --git a/eng/Versions.props b/eng/Versions.props index dd340805dc6..7ba1708e86e 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -34,8 +34,8 @@ 2.0.0 2.1.1 2.1.0 - 3.10.0-4.21318.11 - 6.0.100-preview.6.21329.2 + 3.10.0-4.21329.37 + 6.0.100-preview.6.21330.1 16.7.1 4.8.3 5.3.0.1 @@ -65,8 +65,8 @@ 2.4.1 2.0.3 2.4.1 - 6.0.0-beta.21329.8 - 6.0.0-beta.21329.8 + 6.0.0-beta.21351.2 + 6.0.0-beta.21351.2 1.22.0 1.1.2 2.0.0 @@ -77,10 +77,10 @@ 1.1.0-beta.20258.6 1.1.0-beta-21309-01 1.1.0-beta-21309-01 - 6.0.0-beta.21329.8 - 1.0.0-beta.21329.1 + 6.0.0-beta.21351.2 + 1.0.0-beta.21352.1 1.1.0-beta.21228.1 - 1.0.0-prerelease.21328.2 + 1.0.0-prerelease.21351.2 1.1.156602 1.1.156602 6.0.100-preview.5.21254.11 diff --git a/global.json b/global.json index a6e42772766..2099c0638e6 100644 --- a/global.json +++ b/global.json @@ -3,7 +3,7 @@ "dotnet": "6.0.100-preview.4.21255.9" }, "msbuild-sdks": { - "Microsoft.DotNet.Arcade.Sdk": "6.0.0-beta.21329.8", - "Microsoft.DotNet.Helix.Sdk": "6.0.0-beta.21329.8" + "Microsoft.DotNet.Arcade.Sdk": "6.0.0-beta.21351.2", + "Microsoft.DotNet.Helix.Sdk": "6.0.0-beta.21351.2" } } From 615fbd8c498067deae160a696701eaf33155da56 Mon Sep 17 00:00:00 2001 From: dotnet bot Date: Mon, 5 Jul 2021 09:01:08 -0700 Subject: [PATCH 204/699] Localized file check-in by OneLocBuild Task (#7590) --- src/Microsoft.DotNet.AsmDiff/xlf/Resources.cs.xlf | 8 ++++---- src/Microsoft.DotNet.AsmDiff/xlf/Resources.de.xlf | 8 ++++---- src/Microsoft.DotNet.AsmDiff/xlf/Resources.es.xlf | 8 ++++---- src/Microsoft.DotNet.AsmDiff/xlf/Resources.fr.xlf | 8 ++++---- src/Microsoft.DotNet.AsmDiff/xlf/Resources.it.xlf | 8 ++++---- src/Microsoft.DotNet.AsmDiff/xlf/Resources.ja.xlf | 8 ++++---- src/Microsoft.DotNet.AsmDiff/xlf/Resources.ko.xlf | 8 ++++---- src/Microsoft.DotNet.AsmDiff/xlf/Resources.pl.xlf | 8 ++++---- src/Microsoft.DotNet.AsmDiff/xlf/Resources.pt-BR.xlf | 8 ++++---- src/Microsoft.DotNet.AsmDiff/xlf/Resources.ru.xlf | 8 ++++---- src/Microsoft.DotNet.AsmDiff/xlf/Resources.tr.xlf | 8 ++++---- src/Microsoft.DotNet.AsmDiff/xlf/Resources.zh-Hans.xlf | 8 ++++---- src/Microsoft.DotNet.AsmDiff/xlf/Resources.zh-Hant.xlf | 8 ++++---- 13 files changed, 52 insertions(+), 52 deletions(-) diff --git a/src/Microsoft.DotNet.AsmDiff/xlf/Resources.cs.xlf b/src/Microsoft.DotNet.AsmDiff/xlf/Resources.cs.xlf index 2b886d8a1fa..9955162a2f7 100644 --- a/src/Microsoft.DotNet.AsmDiff/xlf/Resources.cs.xlf +++ b/src/Microsoft.DotNet.AsmDiff/xlf/Resources.cs.xlf @@ -4,19 +4,19 @@ # API List of {0} - # API List of {0} + # Seznam rozhraní API pro {0} API listing follows standard diff formatting. Lines preceded by a '+' are additions and a '-' indicates removal. - API listing follows standard diff formatting. -Lines preceded by a '+' are additions and a '-' indicates removal. + Výpis rozhraní API se řídí standardním formátováním rozdílů. +Řádky před znakem + jsou přidané a znak - označuje odebrání. # API Difference {0} vs {1} - # API Difference {0} vs {1} + # Rozdíly v rozhraních API mezi {0} a {1} diff --git a/src/Microsoft.DotNet.AsmDiff/xlf/Resources.de.xlf b/src/Microsoft.DotNet.AsmDiff/xlf/Resources.de.xlf index c1a0a1f85e7..920aaeec945 100644 --- a/src/Microsoft.DotNet.AsmDiff/xlf/Resources.de.xlf +++ b/src/Microsoft.DotNet.AsmDiff/xlf/Resources.de.xlf @@ -4,19 +4,19 @@ # API List of {0} - # API List of {0} + # API-Liste von {0} API listing follows standard diff formatting. Lines preceded by a '+' are additions and a '-' indicates removal. - API listing follows standard diff formatting. -Lines preceded by a '+' are additions and a '-' indicates removal. + Die API-Auflistung folgt der Standard-Diff-Formatierung. +Zeilen, denen ein "+" vorangestellt ist, sind Ergänzungen, und ein "-" gibt das Entfernen an. # API Difference {0} vs {1} - # API Difference {0} vs {1} + # API-Unterschiede {0} im Vergleich zu {1} diff --git a/src/Microsoft.DotNet.AsmDiff/xlf/Resources.es.xlf b/src/Microsoft.DotNet.AsmDiff/xlf/Resources.es.xlf index a95e4aa5cc0..333e4e351b8 100644 --- a/src/Microsoft.DotNet.AsmDiff/xlf/Resources.es.xlf +++ b/src/Microsoft.DotNet.AsmDiff/xlf/Resources.es.xlf @@ -4,19 +4,19 @@ # API List of {0} - # API List of {0} + # Lista de API de {0} API listing follows standard diff formatting. Lines preceded by a '+' are additions and a '-' indicates removal. - API listing follows standard diff formatting. -Lines preceded by a '+' are additions and a '-' indicates removal. + La lista de API sigue el formato de diff estándar. +Las líneas precedidas por un signo "+" son adiciones y un "-" indica una eliminación. # API Difference {0} vs {1} - # API Difference {0} vs {1} + # Diferencias de API {0} frente a {1} diff --git a/src/Microsoft.DotNet.AsmDiff/xlf/Resources.fr.xlf b/src/Microsoft.DotNet.AsmDiff/xlf/Resources.fr.xlf index 3baf33dba93..b3a0136388a 100644 --- a/src/Microsoft.DotNet.AsmDiff/xlf/Resources.fr.xlf +++ b/src/Microsoft.DotNet.AsmDiff/xlf/Resources.fr.xlf @@ -4,19 +4,19 @@ # API List of {0} - # API List of {0} + # Liste des API de {0} API listing follows standard diff formatting. Lines preceded by a '+' are additions and a '-' indicates removal. - API listing follows standard diff formatting. -Lines preceded by a '+' are additions and a '-' indicates removal. + La liste des API respecte la mise en forme diff standard. +Les lignes précédées d’un signe « + » sont des ajouts et « - » indique une suppression. # API Difference {0} vs {1} - # API Difference {0} vs {1} + # Différence d’API {0} vs {1} diff --git a/src/Microsoft.DotNet.AsmDiff/xlf/Resources.it.xlf b/src/Microsoft.DotNet.AsmDiff/xlf/Resources.it.xlf index 1f910332f7e..35d6b35f3e4 100644 --- a/src/Microsoft.DotNet.AsmDiff/xlf/Resources.it.xlf +++ b/src/Microsoft.DotNet.AsmDiff/xlf/Resources.it.xlf @@ -4,19 +4,19 @@ # API List of {0} - # API List of {0} + # Elenco delle API di {0} API listing follows standard diff formatting. Lines preceded by a '+' are additions and a '-' indicates removal. - API listing follows standard diff formatting. -Lines preceded by a '+' are additions and a '-' indicates removal. + Per l'elenco delle API viene usata la formattazione standard delle differenze. +Le righe precedute dal segno più ('+') sono aggiunte, mentre il segno meno ('-') contraddistingue quelle rimosse. # API Difference {0} vs {1} - # API Difference {0} vs {1} + # Differenza API {0} rispetto a {1} diff --git a/src/Microsoft.DotNet.AsmDiff/xlf/Resources.ja.xlf b/src/Microsoft.DotNet.AsmDiff/xlf/Resources.ja.xlf index a2e082aaadc..dd529a8a0ba 100644 --- a/src/Microsoft.DotNet.AsmDiff/xlf/Resources.ja.xlf +++ b/src/Microsoft.DotNet.AsmDiff/xlf/Resources.ja.xlf @@ -4,19 +4,19 @@ # API List of {0} - # API List of {0} + {0} の # API リスト API listing follows standard diff formatting. Lines preceded by a '+' are additions and a '-' indicates removal. - API listing follows standard diff formatting. -Lines preceded by a '+' are additions and a '-' indicates removal. + API 一覧は、標準の差分形式に従います。 + + ' が続く行は追加、'-' は削除を示します。 # API Difference {0} vs {1} - # API Difference {0} vs {1} + # API 差分 {0} 対 {1} diff --git a/src/Microsoft.DotNet.AsmDiff/xlf/Resources.ko.xlf b/src/Microsoft.DotNet.AsmDiff/xlf/Resources.ko.xlf index 15cd02fd8ba..adbcf69d360 100644 --- a/src/Microsoft.DotNet.AsmDiff/xlf/Resources.ko.xlf +++ b/src/Microsoft.DotNet.AsmDiff/xlf/Resources.ko.xlf @@ -4,19 +4,19 @@ # API List of {0} - # API List of {0} + # {0}의 API 목록 API listing follows standard diff formatting. Lines preceded by a '+' are additions and a '-' indicates removal. - API listing follows standard diff formatting. -Lines preceded by a '+' are additions and a '-' indicates removal. + API 목록은 표준 차이 서식을 따릅니다. +앞에 '+'로 시작하는 줄은 추가이며 '-'는 제거를 나타냅니다. # API Difference {0} vs {1} - # API Difference {0} vs {1} + # API 차이 {0} 및 {1} diff --git a/src/Microsoft.DotNet.AsmDiff/xlf/Resources.pl.xlf b/src/Microsoft.DotNet.AsmDiff/xlf/Resources.pl.xlf index 262941aec35..05323de3b8a 100644 --- a/src/Microsoft.DotNet.AsmDiff/xlf/Resources.pl.xlf +++ b/src/Microsoft.DotNet.AsmDiff/xlf/Resources.pl.xlf @@ -4,19 +4,19 @@ # API List of {0} - # API List of {0} + Lista interfejsów API # z {0} API listing follows standard diff formatting. Lines preceded by a '+' are additions and a '-' indicates removal. - API listing follows standard diff formatting. -Lines preceded by a '+' are additions and a '-' indicates removal. + Lista interfejsów API jest zgodna ze standardowym formatowaniem różnicowym. +Wiersze poprzedzone znakiem "+" są dodawaniem, a znak "-" wskazuje usuwanie. # API Difference {0} vs {1} - # API Difference {0} vs {1} + Różnica interfejsu API # {0} w stosunku do {1} diff --git a/src/Microsoft.DotNet.AsmDiff/xlf/Resources.pt-BR.xlf b/src/Microsoft.DotNet.AsmDiff/xlf/Resources.pt-BR.xlf index e481c3ebaae..c5ea35bc9a8 100644 --- a/src/Microsoft.DotNet.AsmDiff/xlf/Resources.pt-BR.xlf +++ b/src/Microsoft.DotNet.AsmDiff/xlf/Resources.pt-BR.xlf @@ -4,19 +4,19 @@ # API List of {0} - # API List of {0} + # Lista de APIs de {0} API listing follows standard diff formatting. Lines preceded by a '+' are additions and a '-' indicates removal. - API listing follows standard diff formatting. -Lines preceded by a '+' are additions and a '-' indicates removal. + A listagem da API segue a formatação de comparação padrão. +Linhas precedidas por '+' são adições e '-' indica remoção. # API Difference {0} vs {1} - # API Difference {0} vs {1} + # Diferença da API {0} vs {1} diff --git a/src/Microsoft.DotNet.AsmDiff/xlf/Resources.ru.xlf b/src/Microsoft.DotNet.AsmDiff/xlf/Resources.ru.xlf index fc2423c0378..9d1156bffe6 100644 --- a/src/Microsoft.DotNet.AsmDiff/xlf/Resources.ru.xlf +++ b/src/Microsoft.DotNet.AsmDiff/xlf/Resources.ru.xlf @@ -4,19 +4,19 @@ # API List of {0} - # API List of {0} + # Список API {0} API listing follows standard diff formatting. Lines preceded by a '+' are additions and a '-' indicates removal. - API listing follows standard diff formatting. -Lines preceded by a '+' are additions and a '-' indicates removal. + Списки API следуют стандартному форматированию различий. +Строки, начинающиеся символом "+", являются дополнениями, а символ "-" означает удаление. # API Difference {0} vs {1} - # API Difference {0} vs {1} + # Различие API {0} и {1} diff --git a/src/Microsoft.DotNet.AsmDiff/xlf/Resources.tr.xlf b/src/Microsoft.DotNet.AsmDiff/xlf/Resources.tr.xlf index e690363aed2..2972a564b9d 100644 --- a/src/Microsoft.DotNet.AsmDiff/xlf/Resources.tr.xlf +++ b/src/Microsoft.DotNet.AsmDiff/xlf/Resources.tr.xlf @@ -4,19 +4,19 @@ # API List of {0} - # API List of {0} + # {0} API listesi API listing follows standard diff formatting. Lines preceded by a '+' are additions and a '-' indicates removal. - API listing follows standard diff formatting. -Lines preceded by a '+' are additions and a '-' indicates removal. + API listesi, standart fark biçimlendirmeyi izler. +Başında '+' olması satırların ekleneceğini, '-' olması ise kaldırılacağını belirtir. # API Difference {0} vs {1} - # API Difference {0} vs {1} + # {0} ile {1} arasındaki API farkı diff --git a/src/Microsoft.DotNet.AsmDiff/xlf/Resources.zh-Hans.xlf b/src/Microsoft.DotNet.AsmDiff/xlf/Resources.zh-Hans.xlf index 607aea34bfc..ae88e93fcfe 100644 --- a/src/Microsoft.DotNet.AsmDiff/xlf/Resources.zh-Hans.xlf +++ b/src/Microsoft.DotNet.AsmDiff/xlf/Resources.zh-Hans.xlf @@ -4,19 +4,19 @@ # API List of {0} - # API List of {0} + # API {0} 列表 API listing follows standard diff formatting. Lines preceded by a '+' are additions and a '-' indicates removal. - API listing follows standard diff formatting. -Lines preceded by a '+' are additions and a '-' indicates removal. + API 列表遵循标准差异格式。 +行前面有 "+" 的是添加,而 "-" 表示删除。 # API Difference {0} vs {1} - # API Difference {0} vs {1} + # API 差异 {0} 与 {1} diff --git a/src/Microsoft.DotNet.AsmDiff/xlf/Resources.zh-Hant.xlf b/src/Microsoft.DotNet.AsmDiff/xlf/Resources.zh-Hant.xlf index 0435ed37712..837f19474a7 100644 --- a/src/Microsoft.DotNet.AsmDiff/xlf/Resources.zh-Hant.xlf +++ b/src/Microsoft.DotNet.AsmDiff/xlf/Resources.zh-Hant.xlf @@ -4,19 +4,19 @@ # API List of {0} - # API List of {0} + # {0} 的 API 清單 API listing follows standard diff formatting. Lines preceded by a '+' are additions and a '-' indicates removal. - API listing follows standard diff formatting. -Lines preceded by a '+' are additions and a '-' indicates removal. + API 清單遵循標準差異格式。 +前面加上 '+' 的行是加法,而 '-' 表示移除。 # API Difference {0} vs {1} - # API Difference {0} vs {1} + # API 差異 {0} 與 {1} From 66fc8396a36c272fe9273c53dfe3b7f9f626ccb3 Mon Sep 17 00:00:00 2001 From: Jacques Eloff Date: Mon, 5 Jul 2021 21:33:45 -0700 Subject: [PATCH 205/699] Fix provider key for manifest MSI (#7589) --- .../src/GenerateManifestMsi.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Microsoft.DotNet.Build.Tasks.Workloads/src/GenerateManifestMsi.cs b/src/Microsoft.DotNet.Build.Tasks.Workloads/src/GenerateManifestMsi.cs index 2345987c8aa..16bee2bad66 100644 --- a/src/Microsoft.DotNet.Build.Tasks.Workloads/src/GenerateManifestMsi.cs +++ b/src/Microsoft.DotNet.Build.Tasks.Workloads/src/GenerateManifestMsi.cs @@ -184,7 +184,7 @@ public override bool Execute() candle.PreprocessorDefinitions.Add($@"ProductCode={productCode}"); candle.PreprocessorDefinitions.Add($@"UpgradeCode={upgradeCode}"); // Override the default provider key - candle.PreprocessorDefinitions.Add($@"DependencyProviderKey={nupkg.Id},{platform}"); + candle.PreprocessorDefinitions.Add($@"DependencyProviderKeyName={ManifestId},{SdkFeatureBandVersion},{platform}"); candle.PreprocessorDefinitions.Add($@"ProductName={productName}"); candle.PreprocessorDefinitions.Add($@"Platform={platform}"); candle.PreprocessorDefinitions.Add($@"SourceDir={packageContentsDataDirectory}"); From 52058ebd28fff9900b021133294e9e34dc6d0340 Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Tue, 6 Jul 2021 14:32:36 +0000 Subject: [PATCH 206/699] [main] Update dependencies from dotnet/arcade mono/linker (#7591) [main] Update dependencies from dotnet/arcade mono/linker --- eng/Version.Details.xml | 24 ++++++++++++------------ eng/Versions.props | 8 ++++---- global.json | 4 ++-- 3 files changed, 18 insertions(+), 18 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index b93d37d17c1..6516ac8f775 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -11,25 +11,25 @@ - + https://github.com/dotnet/arcade - 7f52af24016a4b749a2c1f219105c0f5a7100028 + 615fbd8c498067deae160a696701eaf33155da56 - + https://github.com/dotnet/arcade - 7f52af24016a4b749a2c1f219105c0f5a7100028 + 615fbd8c498067deae160a696701eaf33155da56 - + https://github.com/dotnet/arcade - 7f52af24016a4b749a2c1f219105c0f5a7100028 + 615fbd8c498067deae160a696701eaf33155da56 - + https://github.com/dotnet/arcade - 7f52af24016a4b749a2c1f219105c0f5a7100028 + 615fbd8c498067deae160a696701eaf33155da56 - + https://github.com/dotnet/arcade - 7f52af24016a4b749a2c1f219105c0f5a7100028 + 615fbd8c498067deae160a696701eaf33155da56 https://github.com/dotnet/arcade-services @@ -47,9 +47,9 @@ https://github.com/dotnet/roslyn 246ce641f04b67ef017655275d850bf902a8e40f - + https://github.com/mono/linker - f574448d16af45f7ac2c4b89d71dea73dec86726 + 41fd293dda27c099b063f51d8917e607271a508e https://github.com/dotnet/sourcelink diff --git a/eng/Versions.props b/eng/Versions.props index 7ba1708e86e..a7c86318f62 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -35,7 +35,7 @@ 2.1.1 2.1.0 3.10.0-4.21329.37 - 6.0.100-preview.6.21330.1 + 6.0.100-preview.6.21355.2 16.7.1 4.8.3 5.3.0.1 @@ -65,8 +65,8 @@ 2.4.1 2.0.3 2.4.1 - 6.0.0-beta.21351.2 - 6.0.0-beta.21351.2 + 6.0.0-beta.21355.2 + 6.0.0-beta.21355.2 1.22.0 1.1.2 2.0.0 @@ -77,7 +77,7 @@ 1.1.0-beta.20258.6 1.1.0-beta-21309-01 1.1.0-beta-21309-01 - 6.0.0-beta.21351.2 + 6.0.0-beta.21355.2 1.0.0-beta.21352.1 1.1.0-beta.21228.1 1.0.0-prerelease.21351.2 diff --git a/global.json b/global.json index 2099c0638e6..fc72486e109 100644 --- a/global.json +++ b/global.json @@ -3,7 +3,7 @@ "dotnet": "6.0.100-preview.4.21255.9" }, "msbuild-sdks": { - "Microsoft.DotNet.Arcade.Sdk": "6.0.0-beta.21351.2", - "Microsoft.DotNet.Helix.Sdk": "6.0.0-beta.21351.2" + "Microsoft.DotNet.Arcade.Sdk": "6.0.0-beta.21355.2", + "Microsoft.DotNet.Helix.Sdk": "6.0.0-beta.21355.2" } } From 05634736a53ee65b0d19cf913d77d1f5d4293ebc Mon Sep 17 00:00:00 2001 From: Matt Mitchell Date: Tue, 6 Jul 2021 08:38:59 -0700 Subject: [PATCH 207/699] Add internal runtime args to source build template (#7587) These need to be passed through to correct restore an internal runtime --- eng/common/templates/steps/source-build.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/eng/common/templates/steps/source-build.yml b/eng/common/templates/steps/source-build.yml index e20637ed6a1..b7e053cb2ac 100644 --- a/eng/common/templates/steps/source-build.yml +++ b/eng/common/templates/steps/source-build.yml @@ -29,6 +29,11 @@ steps: officialBuildArgs='/p:DotNetPublishUsingPipelines=true /p:OfficialBuildId=$(BUILD.BUILDNUMBER)' fi + internalRuntimeDownloadArgs= + if [ '${{ ne(variables['System.TeamProject'], 'public') }}' = 'True' ]; then + internalRuntimeDownloadArgs='--runtime-source-feed https://dotnetclimsrc.blob.core.windows.net/dotnet --runtime-source-feed-key $(dotnetclimsrc-read-sas-token-base64)' + fi + targetRidArgs= if [ '${{ parameters.platform.targetRID }}' != '' ]; then targetRidArgs='/p:TargetRid=${{ parameters.platform.targetRID }}' @@ -43,6 +48,7 @@ steps: --configuration $buildConfig \ --restore --build --pack $publishArgs -bl \ $officialBuildArgs \ + $internalRuntimeDownloadArgs \ $targetRidArgs \ /p:SourceBuildNonPortable=${{ parameters.platform.nonPortable }} \ /p:ArcadeBuildFromSource=true From 03b92b3212af54cfcca488ed065e6984e6619af9 Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Wed, 7 Jul 2021 14:19:03 +0000 Subject: [PATCH 208/699] Update dependencies from https://github.com/dotnet/xliff-tasks build 20210706.1 (#7594) [main] Update dependencies from dotnet/xliff-tasks --- eng/Version.Details.xml | 4 ++-- eng/Versions.props | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index 6516ac8f775..43c15427e49 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -68,9 +68,9 @@ https://github.com/dotnet/symreader-converter c5ba7c88f92e2dde156c324a8c8edc04d9fa4fe0 - + https://github.com/dotnet/xliff-tasks - dff6c8ede1bf9f95f09fccc2836dbc0564b853a1 + 68c1b83a228fc70d4b2e8f11954ab4883e1f5a77 diff --git a/eng/Versions.props b/eng/Versions.props index a7c86318f62..132e20de59f 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -78,7 +78,7 @@ 1.1.0-beta-21309-01 1.1.0-beta-21309-01 6.0.0-beta.21355.2 - 1.0.0-beta.21352.1 + 1.0.0-beta.21356.1 1.1.0-beta.21228.1 1.0.0-prerelease.21351.2 1.1.156602 From 91598151a6659a5f1a77d024bbfddd3e734dff61 Mon Sep 17 00:00:00 2001 From: Missy Messa <47990216+missymessa@users.noreply.github.com> Date: Wed, 7 Jul 2021 10:03:30 -0700 Subject: [PATCH 209/699] Revert 7383 (#7595) * Update badge branch names * Revert "Use helix reporting (#7383)" This reverts commit 7f52af24016a4b749a2c1f219105c0f5a7100028. --- .gitignore | 6 - eng/test-configuration.json | 5 - .../HelpersTests.cs | 16 - .../Sdk/SendHelixJob.cs | 35 +-- ...crosoft.DotNet.Helix.Sdk.MonoQueue.targets | 10 +- .../AzurePipelines.MonoQueue.targets | 4 +- .../reporter/azure_devops_result_publisher.py | 273 ++++++++++++++++++ .../tools/azure-pipelines/reporter/defs.py | 98 +++++++ .../azure-pipelines/reporter/formats/junit.py | 2 +- .../reporter/formats/result_format.py | 10 +- .../azure-pipelines/reporter/formats/trx.py | 2 +- .../azure-pipelines/reporter/formats/xunit.py | 2 +- .../tools/azure-pipelines/reporter/run.bat | 40 +++ .../Sdk/tools/azure-pipelines/reporter/run.py | 173 +++++++++-- .../Sdk/tools/azure-pipelines/reporter/run.sh | 42 +++ .../reporter/test_results_reader/__init__.py | 2 +- 16 files changed, 612 insertions(+), 108 deletions(-) delete mode 100644 eng/test-configuration.json create mode 100644 src/Microsoft.DotNet.Helix/Sdk/tools/azure-pipelines/reporter/azure_devops_result_publisher.py create mode 100644 src/Microsoft.DotNet.Helix/Sdk/tools/azure-pipelines/reporter/defs.py create mode 100644 src/Microsoft.DotNet.Helix/Sdk/tools/azure-pipelines/reporter/run.bat create mode 100755 src/Microsoft.DotNet.Helix/Sdk/tools/azure-pipelines/reporter/run.sh diff --git a/.gitignore b/.gitignore index aae2dbd6cf1..19c954ea8f3 100644 --- a/.gitignore +++ b/.gitignore @@ -131,9 +131,3 @@ node_modules/ # Python Compile Outputs *.pyc - -# IntelliJ -.idea/ - -# vscode python env files -.env \ No newline at end of file diff --git a/eng/test-configuration.json b/eng/test-configuration.json deleted file mode 100644 index 27fdfceca0d..00000000000 --- a/eng/test-configuration.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "version": 1, - "defaultOnFailure": "rerun", - "localRerunCount": 1 -} \ No newline at end of file diff --git a/src/Microsoft.DotNet.Helix/Sdk.Tests/Microsoft.DotNet.Helix.Sdk.Tests/HelpersTests.cs b/src/Microsoft.DotNet.Helix/Sdk.Tests/Microsoft.DotNet.Helix.Sdk.Tests/HelpersTests.cs index 86c53ddee40..a971acd4da5 100644 --- a/src/Microsoft.DotNet.Helix/Sdk.Tests/Microsoft.DotNet.Helix.Sdk.Tests/HelpersTests.cs +++ b/src/Microsoft.DotNet.Helix/Sdk.Tests/Microsoft.DotNet.Helix.Sdk.Tests/HelpersTests.cs @@ -1,8 +1,5 @@ -using System; -using System.IO; using Xunit; using System.Net; -using Newtonsoft.Json; namespace Microsoft.DotNet.Helix.Sdk.Tests { @@ -38,18 +35,5 @@ public void VerifyNonEncodedFowardSlashIsConverted() Assert.Equal(workItemNameExpected, actual); } - - [Fact] - public void FailOnceThenPass() - { - var target = Path.Combine(Path.GetTempPath(), "my-test-file-123456.snt"); - bool exists = File.Exists(target); - if (!exists) - { - File.WriteAllText(target, "Test failed once"); - } - - Assert.True(exists, $"File should exist: {target}"); - } } } diff --git a/src/Microsoft.DotNet.Helix/Sdk/SendHelixJob.cs b/src/Microsoft.DotNet.Helix/Sdk/SendHelixJob.cs index cf1cede9a45..6212882bbea 100644 --- a/src/Microsoft.DotNet.Helix/Sdk/SendHelixJob.cs +++ b/src/Microsoft.DotNet.Helix/Sdk/SendHelixJob.cs @@ -2,7 +2,6 @@ using System.Collections.Generic; using System.Globalization; using System.IO; -using System.IO.Compression; using System.Linq; using System.Text; using System.Threading; @@ -34,7 +33,6 @@ public static class MetadataNames public const string Uri = "Uri"; public const string Destination = "Destination"; public const string IncludeDirectoryName = "IncludeDirectoryName"; - public const string AsArchive = "AsArchive"; } /// @@ -523,41 +521,16 @@ private IJobDefinition AddCorrelationPayload(IJobDefinition def, ITaskItem corre if (Directory.Exists(path)) { string includeDirectoryNameStr = correlationPayload.GetMetadata(MetadataNames.IncludeDirectoryName); - if (!bool.TryParse(includeDirectoryNameStr, out bool includeDirectoryName)) - { - includeDirectoryName = false; - } + bool.TryParse(includeDirectoryNameStr, out bool includeDirectoryName); - Log.LogMessage( - MessageImportance.Low, - $"Adding Correlation Payload Directory '{path}', destination '{destination}'" - ); + Log.LogMessage(MessageImportance.Low, $"Adding Correlation Payload Directory '{path}', destination '{destination}'"); return def.WithCorrelationPayloadDirectory(path, includeDirectoryName, destination); - } if (File.Exists(path)) { - string asArchiveStr = correlationPayload.GetMetadata(MetadataNames.AsArchive); - if (!bool.TryParse(asArchiveStr, out bool asArchive)) - { - asArchive = false; - } - - if (asArchive) - { - Log.LogMessage( - MessageImportance.Low, - $"Adding Correlation Payload Archive '{path}', destination '{destination}'" - ); - return def.WithCorrelationPayloadArchive(path, destination); - } - - Log.LogMessage( - MessageImportance.Low, - $"Adding Correlation Payload File '{path}', destination '{destination}'" - ); - return def.WithCorrelationPayloadFiles(path); + Log.LogMessage(MessageImportance.Low, $"Adding Correlation Payload Archive '{path}', destination '{destination}'"); + return def.WithCorrelationPayloadArchive(path, destination); } Log.LogError(FailureCategory.Build, $"Correlation Payload '{path}' not found."); diff --git a/src/Microsoft.DotNet.Helix/Sdk/tools/Microsoft.DotNet.Helix.Sdk.MonoQueue.targets b/src/Microsoft.DotNet.Helix/Sdk/tools/Microsoft.DotNet.Helix.Sdk.MonoQueue.targets index 7f8604a40fa..b271e821239 100644 --- a/src/Microsoft.DotNet.Helix/Sdk/tools/Microsoft.DotNet.Helix.Sdk.MonoQueue.targets +++ b/src/Microsoft.DotNet.Helix/Sdk/tools/Microsoft.DotNet.Helix.Sdk.MonoQueue.targets @@ -3,11 +3,7 @@ false - - - $(RepositoryEngineeringDir)/test-configuration.json - - + @@ -40,10 +36,6 @@ - - - - diff --git a/src/Microsoft.DotNet.Helix/Sdk/tools/azure-pipelines/AzurePipelines.MonoQueue.targets b/src/Microsoft.DotNet.Helix/Sdk/tools/azure-pipelines/AzurePipelines.MonoQueue.targets index d5fbcb4569f..9dc488962f1 100644 --- a/src/Microsoft.DotNet.Helix/Sdk/tools/azure-pipelines/AzurePipelines.MonoQueue.targets +++ b/src/Microsoft.DotNet.Helix/Sdk/tools/azure-pipelines/AzurePipelines.MonoQueue.targets @@ -7,11 +7,11 @@ $(HelixPostCommands); - $HELIX_PYTHONPATH $HELIX_CORRELATION_PAYLOAD/reporter/run.py $(SYSTEM_TEAMFOUNDATIONCOLLECTIONURI) $(SYSTEM_TEAMPROJECT) $(TestRunId) $(SYSTEM_ACCESSTOKEN) || exit $? + /bin/sh $HELIX_CORRELATION_PAYLOAD/reporter/run.sh $(SYSTEM_TEAMFOUNDATIONCOLLECTIONURI) $(SYSTEM_TEAMPROJECT) $(TestRunId) $(SYSTEM_ACCESSTOKEN) || exit $? $(HelixPostCommands); - %HELIX_PYTHONPATH% %HELIX_CORRELATION_PAYLOAD%\reporter\run.py $(SYSTEM_TEAMFOUNDATIONCOLLECTIONURI) $(SYSTEM_TEAMPROJECT) $(TestRunId) $(SYSTEM_ACCESSTOKEN) || exit /b + call %HELIX_CORRELATION_PAYLOAD%\reporter\run.bat $(SYSTEM_TEAMFOUNDATIONCOLLECTIONURI) $(SYSTEM_TEAMPROJECT) $(TestRunId) $(SYSTEM_ACCESSTOKEN) || exit /b diff --git a/src/Microsoft.DotNet.Helix/Sdk/tools/azure-pipelines/reporter/azure_devops_result_publisher.py b/src/Microsoft.DotNet.Helix/Sdk/tools/azure-pipelines/reporter/azure_devops_result_publisher.py new file mode 100644 index 00000000000..47fc6454009 --- /dev/null +++ b/src/Microsoft.DotNet.Helix/Sdk/tools/azure-pipelines/reporter/azure_devops_result_publisher.py @@ -0,0 +1,273 @@ +import base64 +import os +import logging +import time +from typing import Iterable, Mapping, List, Dict, Optional, Tuple +from builtins import str as text +from azure.devops.connection import Connection +from msrest.authentication import BasicTokenAuthentication, BasicAuthentication +from azure.devops.v5_1.test import TestClient +from azure.devops.v5_1.test.models import TestCaseResult, TestAttachmentRequestModel, TestSubResult +from azure.devops.exceptions import AzureDevOpsClientRequestError + +from helpers import get_env +from defs import TestResult + +log = logging.getLogger(__name__) + + +class AzureDevOpsTestResultPublisher: + def __init__(self, collection_uri, access_token, team_project, test_run_id=None): + """ + + :type collection_uri: str The team project collection uri + :type access_token: str The value of SYSTEM_ACCESSTOKEN from the azure pipelines build + """ + self.collection_uri = collection_uri + self.access_token = access_token + self.team_project = team_project + self.test_run_id = test_run_id + self.work_item_name = get_env("HELIX_WORKITEM_FRIENDLYNAME") + pass + + def upload_batch(self, results: Iterable[TestResult]): + results_with_attachments = {r.name: r for r in results if r is not None and r.attachments} + + (test_case_results, test_name_order) = self.convert_results(results) + + self.publish_results(test_case_results, test_name_order, results_with_attachments) + + def is_data_driven_test(self, r: str) -> bool: + return r.endswith(")") + + def get_ddt_base_name(self, r: str) -> str: + return r.split('(', 1)[0] + + def send_attachment(self, test_client, attachment, published_result): + try: + # Python 3 will throw a TypeError exception because b64encode expects bytes + stream = base64.b64encode(text(attachment.text)) + except TypeError: + # stream has to be a string but b64encode takes and returns bytes on Python 3 + stream = base64.b64encode(bytes(attachment.text, "utf-8")).decode("utf-8") + + test_client.create_test_result_attachment( + TestAttachmentRequestModel( + file_name=text(attachment.name), + stream=stream, + ), self.team_project, self.test_run_id, published_result.id) + + def send_sub_attachment(self, test_client, attachment, published_result, sub_result_id): + stream = base64.b64encode(bytes(attachment.text, "utf-8")).decode("utf-8") + + test_client.create_test_sub_result_attachment( + TestAttachmentRequestModel( + file_name=text(attachment.name), + stream=stream, + ), self.team_project, self.test_run_id, published_result.id, sub_result_id) + + def publish_results(self, test_case_results: Iterable[TestCaseResult], test_result_order: Dict[str, List[str]], + results_with_attachments: Mapping[str, TestResult]) -> None: + connection = self.get_connection() + test_client = connection.get_client("azure.devops.v5_1.test.TestClient") # type: TestClient + + tries_left = 10 + succeeded = False + test_run_ended = False + + while tries_left > 0 and not test_run_ended and not succeeded: + try: + published_results = test_client. \ + add_test_results_to_test_run(list(test_case_results), + self.team_project, + self.test_run_id) # type: List[TestCaseResult] + succeeded = True + + except AzureDevOpsClientRequestError as ex: + # Odd syntax here is to deal with checking substrings of the list of args in this exception + hit_503 = len([element for element in ex.args if ('invalid status code of 503' in element)]) != 0 + test_run_ended = len([element for element in ex.args if ('It may have been deleted' in element)]) != 0 + if hit_503: + tries_left -= 1 + log.warning("Hit HTTP 503 from Azure DevOps. Will wait three seconds and try again.") + time.sleep(3) + elif test_run_ended: # Not exceptional, don't retry. + tries_left = 0 + else: + raise ex + + if test_run_ended: + log.info("Test run has ended, skipping attaching results as it would fail.") + return + + # !succeeded means a 503 and not succeeding after 10 tries (otherwise we threw already), so give a nice error + if not succeeded: + raise Exception('Failed to report test results to Azure Dev Ops after retrying. Please contact dnceng.') + + for published_result in published_results: + + # Don't send attachments if the result was not accepted. + if published_result.id == -1: + continue + + # Does the test result have an attachment with an exact matching name? + if published_result.automated_test_name in results_with_attachments: + log.debug("Result {0} has an attachment".format(published_result.automated_test_name)) + result = results_with_attachments.get(published_result.automated_test_name) + + for attachment in result.attachments: + self.send_attachment(test_client, attachment, published_result) + + # Does the test result have an attachment with a sub-result matching name? + # The data structure returned from AzDO does not contain a subresult's name, only an + # index. The order of results is meant to be the same as was posted. This assumes that + # is true , and uses the order of test names recorded earlier to look-up the attachments. + elif published_result.sub_results is not None: + sub_results_order = test_result_order[published_result.automated_test_name] + + # Sanity check + if len(sub_results_order) != len(published_result.sub_results): + log.warning( + "Returned subresults list length does not match expected. Attachments may not pair correctly.") + + for (name, sub_result) in zip(sub_results_order, published_result.sub_results): + if name in results_with_attachments: + result = results_with_attachments.get(name) + for attachment in result.attachments: + self.send_sub_attachment(test_client, attachment, published_result, sub_result.id) + + def convert_results(self, results: Iterable[TestResult]) -> Tuple[Iterable[TestCaseResult], Dict[str, List[str]]]: + comment = "{{ \"HelixJobId\": \"{}\", \"HelixWorkItemName\": \"{}\" }}".format( + os.getenv("HELIX_CORRELATION_ID"), + os.getenv("HELIX_WORKITEM_FRIENDLYNAME"), + ) + + def convert_to_sub_test(r: TestResult) -> Optional[TestSubResult]: + if r.result == "Pass": + return TestSubResult( + comment=comment, + display_name=text(r.name), + duration_in_ms=r.duration_seconds * 1000, + outcome="Passed" + ) + if r.result == "Fail": + return TestSubResult( + comment=comment, + display_name=text(r.name), + duration_in_ms=r.duration_seconds * 1000, + outcome="Failed", + stack_trace=text(r.stack_trace) if r.stack_trace is not None else None, + error_message=text(r.failure_message) + ) + if r.result == "Skip": + return TestSubResult( + comment=comment, + display_name=text(r.name), + duration_in_ms=r.duration_seconds * 1000, + outcome="NotExecuted" + ) + log.warning("Unexpected result value {} for {}".format(r.result, r.name)) + return None + + def convert_result(r: TestResult) -> Optional[TestCaseResult]: + if r.result == "Pass": + return TestCaseResult( + test_case_title=text(r.name), + automated_test_name=text(r.name), + automated_test_type=text(r.kind), + automated_test_storage=self.work_item_name, + priority=1, + duration_in_ms=r.duration_seconds * 1000, + outcome="Passed", + state="Completed", + comment=comment, + ) + if r.result == "Fail": + return TestCaseResult( + test_case_title=text(r.name), + automated_test_name=text(r.name), + automated_test_type=text(r.kind), + automated_test_storage=self.work_item_name, + priority=1, + duration_in_ms=r.duration_seconds * 1000, + outcome="Failed", + state="Completed", + error_message=text(r.failure_message), + stack_trace=text(r.stack_trace) if r.stack_trace is not None else None, + comment=comment, + ) + + if r.result == "Skip": + return TestCaseResult( + test_case_title=text(r.name), + automated_test_name=text(r.name), + automated_test_type=text(r.kind), + automated_test_storage=self.work_item_name, + priority=1, + duration_in_ms=r.duration_seconds * 1000, + outcome="NotExecuted", + state="Completed", + error_message=text(r.skip_reason), + comment=comment, + ) + + log.warning("Unexpected result value {} for {}".format(r.result, r.name)) + return None + + unconverted_results = list(results) # type: List[TestResult] + log.debug("Count of unconverted_results: {0}".format(len(unconverted_results))) + + # Find all DDTs, determine parent, and add to dictionary + data_driven_tests = {} # type: Dict[str, TestCaseResult] + non_data_driven_tests = [] # type: List[TestCaseResult] + test_name_ordering = {} # type: Dict[str, List[str]] + + for r in unconverted_results: + if r is None: + continue + + if not self.is_data_driven_test(r.name): + non_data_driven_tests.append(convert_result(r)) + test_name_ordering[r.name] = [] + continue + + # Must be a DDT + base_name = self.get_ddt_base_name(r.name) + + if base_name in data_driven_tests: + sub_test = convert_to_sub_test(r) + if sub_test is None: + continue + + data_driven_tests[base_name].sub_results.append(sub_test) + test_name_ordering[base_name].append(r.name) + + # Mark parent test as Failed if any subresult is Failed + if sub_test.outcome == "Failed": + data_driven_tests[base_name].outcome = "Failed" + + else: + cr = convert_result(r) + csr = convert_to_sub_test(r) + + if cr is None or csr is None: + continue + + data_driven_tests[base_name] = cr + data_driven_tests[base_name].automated_test_name = base_name + data_driven_tests[base_name].result_group_type = "dataDriven" + data_driven_tests[base_name].sub_results = [csr] + test_name_ordering[base_name] = [r.name] + + return (list(data_driven_tests.values()) + non_data_driven_tests, test_name_ordering) + + def get_connection(self) -> Connection: + credentials = self.get_credentials() + return Connection(self.collection_uri, credentials) + + def get_credentials(self) -> BasicTokenAuthentication: + if self.access_token: + return BasicTokenAuthentication({'access_token': self.access_token}) + + token = get_env("VSTS_PAT") + return BasicAuthentication("ignored", token) diff --git a/src/Microsoft.DotNet.Helix/Sdk/tools/azure-pipelines/reporter/defs.py b/src/Microsoft.DotNet.Helix/Sdk/tools/azure-pipelines/reporter/defs.py new file mode 100644 index 00000000000..53cc7f8b5c5 --- /dev/null +++ b/src/Microsoft.DotNet.Helix/Sdk/tools/azure-pipelines/reporter/defs.py @@ -0,0 +1,98 @@ +from typing import List + + +class TestResult: + def __init__(self, name, kind, type_name, method, duration, result, exception_type, failure_message, stack_trace, + skip_reason, attachments): + """ + + :type name: unicode + :type kind: unicode + :type type_name: unicode + :type method: unicode + :type duration: float + :type result: unicode + :type exception_type: unicode + :type failure_message: unicode + :type stack_trace: unicode + :type skip_reason: unicode + :type attachments: List[TestResultAttachment] + """ + self._name = name + self._kind = kind + self._type = type_name + self._method = method + self._duration_seconds = duration + self._result = result + self._exception_type = exception_type + self._failure_message = failure_message + self._stack_trace = stack_trace + self._skip_reason = skip_reason + self._attachments = attachments + + @property + def name(self): + return self._name + + @property + def kind(self): + return self._kind + + @property + def type(self): + return self._type + + @property + def method(self): + return self._method + + @property + def duration_seconds(self): + return self._duration_seconds + + @property + def result(self): + return self._result + + @property + def exception_type(self): + return self._exception_type + + @property + def failure_message(self): + return self._failure_message + + @property + def stack_trace(self): + return self._stack_trace + + @property + def skip_reason(self): + return self._skip_reason + + @property + def output(self): + return self._output + + @property + def attachments(self): + return self._attachments + + +class TestResultAttachment: + def __init__(self, name, text): + """ + + :type name: unicode + :type text: unicode + """ + self._name = name + self._text = text + + @property + def name(self): + return self._name + + @property + def text(self): + return self._text diff --git a/src/Microsoft.DotNet.Helix/Sdk/tools/azure-pipelines/reporter/formats/junit.py b/src/Microsoft.DotNet.Helix/Sdk/tools/azure-pipelines/reporter/formats/junit.py index 629f31b2165..e5bdbf554cc 100644 --- a/src/Microsoft.DotNet.Helix/Sdk/tools/azure-pipelines/reporter/formats/junit.py +++ b/src/Microsoft.DotNet.Helix/Sdk/tools/azure-pipelines/reporter/formats/junit.py @@ -1,6 +1,6 @@ import xml.etree.ElementTree from .result_format import ResultFormat -from helix.public import TestResult, TestResultAttachment +from defs import TestResult, TestResultAttachment class JUnitFormat(ResultFormat): diff --git a/src/Microsoft.DotNet.Helix/Sdk/tools/azure-pipelines/reporter/formats/result_format.py b/src/Microsoft.DotNet.Helix/Sdk/tools/azure-pipelines/reporter/formats/result_format.py index 8d7cc966311..43aa2a2bb40 100644 --- a/src/Microsoft.DotNet.Helix/Sdk/tools/azure-pipelines/reporter/formats/result_format.py +++ b/src/Microsoft.DotNet.Helix/Sdk/tools/azure-pipelines/reporter/formats/result_format.py @@ -1,5 +1,5 @@ from abc import ABCMeta, abstractmethod, abstractproperty -from helix.public import TestResult +from defs import TestResult from typing import Iterable @@ -10,13 +10,15 @@ def __init__(self): pass @abstractproperty - def name(self) -> str: + def name(self): pass @abstractproperty - def acceptable_file_suffixes(self) -> Iterable[str]: + def acceptable_file_suffixes(self): + # type: () -> Iterable[str] pass @abstractmethod - def read_results(self, path) -> Iterable[TestResult]: + def read_results(self, path): + # type: (str) -> Iterable[TestResult] pass diff --git a/src/Microsoft.DotNet.Helix/Sdk/tools/azure-pipelines/reporter/formats/trx.py b/src/Microsoft.DotNet.Helix/Sdk/tools/azure-pipelines/reporter/formats/trx.py index cb2afbec916..9fabb0d88db 100644 --- a/src/Microsoft.DotNet.Helix/Sdk/tools/azure-pipelines/reporter/formats/trx.py +++ b/src/Microsoft.DotNet.Helix/Sdk/tools/azure-pipelines/reporter/formats/trx.py @@ -1,7 +1,7 @@ import glob import xml.etree.ElementTree from .result_format import ResultFormat -from helix.public import TestResult, TestResultAttachment +from defs import TestResult, TestResultAttachment class TRXFormat(ResultFormat): diff --git a/src/Microsoft.DotNet.Helix/Sdk/tools/azure-pipelines/reporter/formats/xunit.py b/src/Microsoft.DotNet.Helix/Sdk/tools/azure-pipelines/reporter/formats/xunit.py index bbf8ee6f96e..b46a11f1964 100644 --- a/src/Microsoft.DotNet.Helix/Sdk/tools/azure-pipelines/reporter/formats/xunit.py +++ b/src/Microsoft.DotNet.Helix/Sdk/tools/azure-pipelines/reporter/formats/xunit.py @@ -2,7 +2,7 @@ import xml.etree.ElementTree from .result_format import ResultFormat -from helix.public import TestResult, TestResultAttachment +from defs import TestResult, TestResultAttachment _unescape_char_map = { 'r': '\r', diff --git a/src/Microsoft.DotNet.Helix/Sdk/tools/azure-pipelines/reporter/run.bat b/src/Microsoft.DotNet.Helix/Sdk/tools/azure-pipelines/reporter/run.bat new file mode 100644 index 00000000000..3a3c0f9d1ba --- /dev/null +++ b/src/Microsoft.DotNet.Helix/Sdk/tools/azure-pipelines/reporter/run.bat @@ -0,0 +1,40 @@ + +set ENV_PATH=%USERPROFILE%\.azdo-env +set TMP_ENV_PATH=%USERPROFILE%\.azdo-env-tmp + +REM Removing pythonpath forces a clean installation of the Azure DevOps client, but subsequent commands may use HELIX libraries +set _OLD_PYTHONPATH=%PYTHONPATH% +set PYTHONPATH= + +echo %date%-%time% + +if NOT EXIST %ENV_PATH%\Scripts\python.exe ( + rmdir /Q /S %TMP_ENV_PATH% + rmdir /Q /S %ENV_PATH% + %HELIX_PYTHONPATH% -m virtualenv --no-site-packages %TMP_ENV_PATH% + rename %TMP_ENV_PATH% .azdo-env +) +REM On certain slow machines python.exe keeps a handle open just long enough to break the rename; retry if so +set /a renameAttemptNumber=1 +:retryloop +if NOT EXIST %ENV_PATH%\Scripts\python.exe ( +set /a renameAttemptNumber+=1 +echo Error renaming venv folder; waiting 5 seconds and retrying up to 10x Attempt: %renameAttemptNumber% +ping -n 6 127.0.0.1 > nul +rename %TMP_ENV_PATH% .azdo-env +IF %renameAttemptNumber% GEQ 10 GOTO :renamingdone +GOTO :retryloop +) +:renamingdone + +%ENV_PATH%\Scripts\python.exe -c "import azure.devops" || %ENV_PATH%\Scripts\python.exe -m pip install azure-devops==5.0.0b9 + +%ENV_PATH%\Scripts\python.exe -c "import future" || %ENV_PATH%\Scripts\python.exe -m pip install future==0.17.1 + +echo %date%-%time% +%ENV_PATH%\Scripts\python.exe -B %~dp0run.py %* +set _uploaderExitCode=%ERRORLEVEL% +echo %date%-%time% + +set PYTHONPATH=%_OLD_PYTHONPATH% +exit /b %_uploaderExitCode% diff --git a/src/Microsoft.DotNet.Helix/Sdk/tools/azure-pipelines/reporter/run.py b/src/Microsoft.DotNet.Helix/Sdk/tools/azure-pipelines/reporter/run.py index 49363dfab9c..e862eb2335d 100644 --- a/src/Microsoft.DotNet.Helix/Sdk/tools/azure-pipelines/reporter/run.py +++ b/src/Microsoft.DotNet.Helix/Sdk/tools/azure-pipelines/reporter/run.py @@ -6,12 +6,50 @@ import logging from queue import Queue from threading import Thread, Lock -from typing import Tuple, Optional - -from helpers import get_env +from typing import Tuple, Optional, List + from test_results_reader import read_results +from helpers import batch, get_env +from azure_devops_result_publisher import AzureDevOpsTestResultPublisher + +workerFailedLock = Lock() +workerFailed = False + + +class UploadWorker(Thread): + def __init__(self, queue, idx, collection_uri, team_project, test_run_id, access_token): + super(UploadWorker, self).__init__() + self.queue = queue + self.idx = idx + self.publisher = AzureDevOpsTestResultPublisher( + collection_uri=collection_uri, + access_token=access_token, + team_project=team_project, + test_run_id=test_run_id, + ) + self.total_uploaded = 0 + + def __print(self, msg): + sys.stdout.write('Worker {}: {}\n'.format(self.idx, msg)) + sys.stdout.flush() + + def __process(self, batch): + self.publisher.upload_batch(batch) + self.total_uploaded = self.total_uploaded + len(batch) + + def run(self): + global workerFailed, workerFailedLock + while True: + try: + item = self.queue.get() + self.__process(item) + except: + self.__print("got error: {}".format(traceback.format_exc())) + with workerFailedLock: + workerFailed = True + finally: + self.queue.task_done() -from helix.public import DefaultTestReporter, AzureDevOpsReportingParameters def process_args() -> Tuple[str, str, str, Optional[str]]: if len(sys.argv) < 4 or len(sys.argv) > 5: @@ -32,36 +70,109 @@ def process_args() -> Tuple[str, str, str, Optional[str]]: return collection_uri, team_project, test_run_id, access_token +# This reporter will be phased out soon, but until then we need to deal with ADO outages and failures from client lib +# Currently only understands XUnit TestResults.xml (should not be around long enough to need more) +# See https://github.com/dotnet/arcade/issues/7371 for details +def check_passed_to_workaround_ado_api_failure(dirs_to_check: List[str]) -> bool: + print("Reporting has failed. Running mitigation for https://github.com/dotnet/arcade/issues/7371") + found_a_result = False + acceptable_xunit_file_names = [ + "testResults.xml", + "test-results.xml", + "test_results.xml", + "TestResults.xUnit.xml" + ] + + failure_count_found = 0 + + for dir_name in dirs_to_check: + print("Searching '{}' for test results files".format(dir_name)) + for root, dirs, files in os.walk(dir_name): + for file_name in files: + if file_name in acceptable_xunit_file_names: + file_path = os.path.join(root, file_name) + print('Found results file {} '.format(file_path)) + found_a_result = True + failure_count_found += get_failure_count(file_path) + + if found_a_result: + if failure_count_found == 0: + print("Reporter script has failed, but XUnit test results show no failures.") + return True + else: + print("Reporter script has failed, and we were able to find XUnit test results with failures ({})" + .format(str(failure_count_found))) + else: + print("Tried to mitigate but no results files found.") + return False + + +def get_failure_count(test_results_path: str): + fail_count = 0 + with open(test_results_path, encoding="utf-8") as result_file: + total_regex = re.compile(r'failed="(\d+)"') + for line in result_file: + if ' Date: Wed, 7 Jul 2021 14:10:40 -0700 Subject: [PATCH 210/699] Revert "Add internal runtime args to source build template (#7587)" (#7598) This reverts commit 05634736a53ee65b0d19cf913d77d1f5d4293ebc. --- eng/common/templates/steps/source-build.yml | 6 ------ 1 file changed, 6 deletions(-) diff --git a/eng/common/templates/steps/source-build.yml b/eng/common/templates/steps/source-build.yml index b7e053cb2ac..e20637ed6a1 100644 --- a/eng/common/templates/steps/source-build.yml +++ b/eng/common/templates/steps/source-build.yml @@ -29,11 +29,6 @@ steps: officialBuildArgs='/p:DotNetPublishUsingPipelines=true /p:OfficialBuildId=$(BUILD.BUILDNUMBER)' fi - internalRuntimeDownloadArgs= - if [ '${{ ne(variables['System.TeamProject'], 'public') }}' = 'True' ]; then - internalRuntimeDownloadArgs='--runtime-source-feed https://dotnetclimsrc.blob.core.windows.net/dotnet --runtime-source-feed-key $(dotnetclimsrc-read-sas-token-base64)' - fi - targetRidArgs= if [ '${{ parameters.platform.targetRID }}' != '' ]; then targetRidArgs='/p:TargetRid=${{ parameters.platform.targetRID }}' @@ -48,7 +43,6 @@ steps: --configuration $buildConfig \ --restore --build --pack $publishArgs -bl \ $officialBuildArgs \ - $internalRuntimeDownloadArgs \ $targetRidArgs \ /p:SourceBuildNonPortable=${{ parameters.platform.nonPortable }} \ /p:ArcadeBuildFromSource=true From 851a5c4ca923728bbc4de53e6e21642f452c689d Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Thu, 8 Jul 2021 14:53:17 +0000 Subject: [PATCH 211/699] [main] Update dependencies from dotnet/arcade mono/linker (#7601) [main] Update dependencies from dotnet/arcade mono/linker --- eng/Version.Details.xml | 24 ++++++++++++------------ eng/Versions.props | 8 ++++---- global.json | 4 ++-- 3 files changed, 18 insertions(+), 18 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index 43c15427e49..e6e57791095 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -11,25 +11,25 @@ - + https://github.com/dotnet/arcade - 615fbd8c498067deae160a696701eaf33155da56 + 286d98094b830b8dad769542b2669cb1b75f7097 - + https://github.com/dotnet/arcade - 615fbd8c498067deae160a696701eaf33155da56 + 286d98094b830b8dad769542b2669cb1b75f7097 - + https://github.com/dotnet/arcade - 615fbd8c498067deae160a696701eaf33155da56 + 286d98094b830b8dad769542b2669cb1b75f7097 - + https://github.com/dotnet/arcade - 615fbd8c498067deae160a696701eaf33155da56 + 286d98094b830b8dad769542b2669cb1b75f7097 - + https://github.com/dotnet/arcade - 615fbd8c498067deae160a696701eaf33155da56 + 286d98094b830b8dad769542b2669cb1b75f7097 https://github.com/dotnet/arcade-services @@ -47,9 +47,9 @@ https://github.com/dotnet/roslyn 246ce641f04b67ef017655275d850bf902a8e40f - + https://github.com/mono/linker - 41fd293dda27c099b063f51d8917e607271a508e + 35a1c74d6a0dbd115bf079dc986cea59cdb01430 https://github.com/dotnet/sourcelink diff --git a/eng/Versions.props b/eng/Versions.props index 132e20de59f..88a4701151e 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -35,7 +35,7 @@ 2.1.1 2.1.0 3.10.0-4.21329.37 - 6.0.100-preview.6.21355.2 + 6.0.100-preview.6.21357.1 16.7.1 4.8.3 5.3.0.1 @@ -65,8 +65,8 @@ 2.4.1 2.0.3 2.4.1 - 6.0.0-beta.21355.2 - 6.0.0-beta.21355.2 + 6.0.0-beta.21357.3 + 6.0.0-beta.21357.3 1.22.0 1.1.2 2.0.0 @@ -77,7 +77,7 @@ 1.1.0-beta.20258.6 1.1.0-beta-21309-01 1.1.0-beta-21309-01 - 6.0.0-beta.21355.2 + 6.0.0-beta.21357.3 1.0.0-beta.21356.1 1.1.0-beta.21228.1 1.0.0-prerelease.21351.2 diff --git a/global.json b/global.json index fc72486e109..d4f456e766c 100644 --- a/global.json +++ b/global.json @@ -3,7 +3,7 @@ "dotnet": "6.0.100-preview.4.21255.9" }, "msbuild-sdks": { - "Microsoft.DotNet.Arcade.Sdk": "6.0.0-beta.21355.2", - "Microsoft.DotNet.Helix.Sdk": "6.0.0-beta.21355.2" + "Microsoft.DotNet.Arcade.Sdk": "6.0.0-beta.21357.3", + "Microsoft.DotNet.Helix.Sdk": "6.0.0-beta.21357.3" } } From 189395dd59321509073bb46683144f148f4c4b05 Mon Sep 17 00:00:00 2001 From: Gen Lu Date: Thu, 8 Jul 2021 10:20:15 -0700 Subject: [PATCH 212/699] Support ignoremvidmismatch option in ibcmerge (#7599) Support ignoremvidmismatch option in ibcmerge --- src/Microsoft.DotNet.Arcade.Sdk/tools/DefaultVersions.props | 2 +- .../tools/OptimizationData.targets | 5 ++++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/Microsoft.DotNet.Arcade.Sdk/tools/DefaultVersions.props b/src/Microsoft.DotNet.Arcade.Sdk/tools/DefaultVersions.props index 1dc0c2e0db8..e3426bf8703 100644 --- a/src/Microsoft.DotNet.Arcade.Sdk/tools/DefaultVersions.props +++ b/src/Microsoft.DotNet.Arcade.Sdk/tools/DefaultVersions.props @@ -82,7 +82,7 @@ 18.165.29912-buildid11693003 1.0.422 0.2.0 - 5.0.7-beta.20159.1 + 5.1.0-beta.21356.1 16.6.1 1.0.0-preview.2 16.9.1050 diff --git a/src/Microsoft.DotNet.Arcade.Sdk/tools/OptimizationData.targets b/src/Microsoft.DotNet.Arcade.Sdk/tools/OptimizationData.targets index cc66fbca32b..737ec7a2924 100644 --- a/src/Microsoft.DotNet.Arcade.Sdk/tools/OptimizationData.targets +++ b/src/Microsoft.DotNet.Arcade.Sdk/tools/OptimizationData.targets @@ -8,6 +8,7 @@ EnableNgenOptimization Set to true to enable NGEN optimization (partial or full). EnableNgenOptimizationLogDetails Set to true to enable NGEN method logging output ApplyNgenOptimization Set to 'partial' or 'full' in a project to embed partial/full NGEN optimization data to the built binary. + IgnoreIbcMergeErrors Set to true to ignore certain errors encountered while running ibcmerge, those problematic IBC files will be ignored. Items: OptimizeAssembly Set of assemblies to apply Partial NGEN optimization data to. @@ -117,6 +118,8 @@ <_PartialNgenArg/> <_PartialNgenArg Condition="'$(ApplyNgenOptimization)' == 'partial'">-partialNGEN + <_IgnoreMvidMismatchArg/> + <_IgnoreMvidMismatchArg Condition="'$(IgnoreIbcMergeErrors)' == 'true'">-ignoremvidmismatch @@ -127,7 +130,7 @@ - -q -f $(_PartialNgenArg) -minify -delete -mo "%(_AssemblyWithRawIbcData.PreviousAssemblyCopyPath)" "$([MSBuild]::ValueOrDefault('%(_AssemblyWithRawIbcData.IbcFiles)', '').Replace(';', '" "'))" + -q -f $(_PartialNgenArg) $(_IgnoreMvidMismatchArg) -minify -delete -mo "%(_AssemblyWithRawIbcData.PreviousAssemblyCopyPath)" "$([MSBuild]::ValueOrDefault('%(_AssemblyWithRawIbcData.IbcFiles)', '').Replace(';', '" "'))" <_IbcMergeInvocation Include="%(_AssemblyWithRawIbcData.AssemblyFileName) [MergePreviousToCurrent]"> From 970f51f6b5f1bbfdcdc51bfea8c31d18495ce7b5 Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Fri, 9 Jul 2021 15:02:10 +0000 Subject: [PATCH 213/699] [main] Update dependencies from dotnet/xliff-tasks mono/linker (#7605) [main] Update dependencies from dotnet/xliff-tasks mono/linker --- eng/Version.Details.xml | 8 ++++---- eng/Versions.props | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index e6e57791095..2eac4aa6b1a 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -47,9 +47,9 @@ https://github.com/dotnet/roslyn 246ce641f04b67ef017655275d850bf902a8e40f - + https://github.com/mono/linker - 35a1c74d6a0dbd115bf079dc986cea59cdb01430 + b9501922637806f4135df09a9922d5540e203858 https://github.com/dotnet/sourcelink @@ -68,9 +68,9 @@ https://github.com/dotnet/symreader-converter c5ba7c88f92e2dde156c324a8c8edc04d9fa4fe0 - + https://github.com/dotnet/xliff-tasks - 68c1b83a228fc70d4b2e8f11954ab4883e1f5a77 + 278d1810611250edf8095eab5ee6aa825fdb178a diff --git a/eng/Versions.props b/eng/Versions.props index 88a4701151e..39bd2f3e991 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -35,7 +35,7 @@ 2.1.1 2.1.0 3.10.0-4.21329.37 - 6.0.100-preview.6.21357.1 + 6.0.100-preview.6.21358.3 16.7.1 4.8.3 5.3.0.1 @@ -78,7 +78,7 @@ 1.1.0-beta-21309-01 1.1.0-beta-21309-01 6.0.0-beta.21357.3 - 1.0.0-beta.21356.1 + 1.0.0-beta.21358.1 1.1.0-beta.21228.1 1.0.0-prerelease.21351.2 1.1.156602 From 55262f114b0c1b82f0b081bca0d919b657ba24c5 Mon Sep 17 00:00:00 2001 From: Matt Galbraith Date: Fri, 9 Jul 2021 08:58:09 -0700 Subject: [PATCH 214/699] Try to sort https://github.com/dotnet/core-eng/issues/11391 by using the non-redirected URL (the old path actually is a redirect to this URL) (#7603) --- eng/common/tools.ps1 | 4 ++-- eng/common/tools.sh | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/eng/common/tools.ps1 b/eng/common/tools.ps1 index 4b255203249..2df0909937d 100644 --- a/eng/common/tools.ps1 +++ b/eng/common/tools.ps1 @@ -42,7 +42,7 @@ [bool]$useInstalledDotNetCli = if (Test-Path variable:useInstalledDotNetCli) { $useInstalledDotNetCli } else { $true } # Enable repos to use a particular version of the on-line dotnet-install scripts. -# default URL: https://dot.net/v1/dotnet-install.ps1 +# default URL: https://dotnet.microsoft.com/download/dotnet/scripts/v1/dotnet-install.ps1 [string]$dotnetInstallScriptVersion = if (Test-Path variable:dotnetInstallScriptVersion) { $dotnetInstallScriptVersion } else { 'v1' } # True to use global NuGet cache instead of restoring packages to repository-local directory. @@ -223,7 +223,7 @@ function GetDotNetInstallScript([string] $dotnetRoot) { if (!(Test-Path $installScript)) { Create-Directory $dotnetRoot $ProgressPreference = 'SilentlyContinue' # Don't display the console progress UI - it's a huge perf hit - $uri = "https://dot.net/$dotnetInstallScriptVersion/dotnet-install.ps1" + $uri = "https://dotnet.microsoft.com/download/dotnet/scripts/$dotnetInstallScriptVersion/dotnet-install.ps1" Retry({ Write-Host "GET $uri" diff --git a/eng/common/tools.sh b/eng/common/tools.sh index 05ca99c6b28..828119be411 100755 --- a/eng/common/tools.sh +++ b/eng/common/tools.sh @@ -54,7 +54,7 @@ warn_as_error=${warn_as_error:-true} use_installed_dotnet_cli=${use_installed_dotnet_cli:-true} # Enable repos to use a particular version of the on-line dotnet-install scripts. -# default URL: https://dot.net/v1/dotnet-install.sh +# default URL: https://dotnet.microsoft.com/download/dotnet/scripts/v1/dotnet-install.sh dotnetInstallScriptVersion=${dotnetInstallScriptVersion:-'v1'} # True to use global NuGet cache instead of restoring packages to repository-local directory. @@ -262,7 +262,7 @@ function with_retries { function GetDotNetInstallScript { local root=$1 local install_script="$root/dotnet-install.sh" - local install_script_url="https://dot.net/$dotnetInstallScriptVersion/dotnet-install.sh" + local install_script_url="https://dotnet.microsoft.com/download/dotnet/scripts/$dotnetInstallScriptVersion/dotnet-install.sh" if [[ ! -a "$install_script" ]]; then mkdir -p "$root" From faeec296ad397aacee16fd69fb3a5d01ad6e6d2e Mon Sep 17 00:00:00 2001 From: Jan Vorlicek Date: Fri, 9 Jul 2021 20:02:46 +0200 Subject: [PATCH 215/699] Update Alpine due to LLVM version changes in edge (#7602) The edge branch that we use to install lldb from has moved LLVM to version 11. This change fixes the rootfs build for Alpine 3.9 --- eng/common/cross/build-rootfs.sh | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/eng/common/cross/build-rootfs.sh b/eng/common/cross/build-rootfs.sh index 591d8666a84..debef05a3ea 100755 --- a/eng/common/cross/build-rootfs.sh +++ b/eng/common/cross/build-rootfs.sh @@ -33,7 +33,6 @@ __AlpinePackages="alpine-base" __AlpinePackages+=" build-base" __AlpinePackages+=" linux-headers" __AlpinePackagesEdgeCommunity=" lldb-dev" -__AlpinePackagesEdgeMain=" llvm10-libs" __AlpinePackagesEdgeMain+=" python3" __AlpinePackagesEdgeMain+=" libedit" @@ -191,6 +190,8 @@ while :; do __CodeName=alpine __UbuntuRepo= __AlpineVersion=3.9 + __AlpinePackagesEdgeMain+=" llvm11-libs" + __AlpinePackagesEdgeMain+=" clang-libs" ;; alpine3.13) __CodeName=alpine @@ -201,6 +202,7 @@ while :; do __AlpinePackagesEdgeCommunity= __AlpinePackages+=$__AlpinePackagesEdgeMain __AlpinePackagesEdgeMain= + __AlpinePackages+=" llvm10-libs" ;; freebsd11) __FreeBSDBase="11.3-RELEASE" From cfe12e6f09b12124209648cb867de3095149577d Mon Sep 17 00:00:00 2001 From: Matt Thalman Date: Mon, 12 Jul 2021 11:05:18 -0700 Subject: [PATCH 216/699] Update tag references to dotnet-buildtools/prereqs (#7608) --- azure-pipelines.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 31e3239b4d1..d47f9957bd3 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -20,7 +20,7 @@ variables: resources: containers: - container: LinuxContainer - image: microsoft/dotnet-buildtools-prereqs:ubuntu-14.04-cross-0cd4667-20170319080304 + image: mcr.microsoft.com/dotnet-buildtools/prereqs:ubuntu-14.04-cross-0cd4667-20170319080304 stages: - stage: build From b59fb3675ce771f680d67afa57da959766597b06 Mon Sep 17 00:00:00 2001 From: Jan Vorlicek Date: Mon, 12 Jul 2021 22:07:02 +0200 Subject: [PATCH 217/699] Fix s390x rootfs build (#7609) Ubuntu for s390x architecture doesn't have OMP libraries. --- eng/common/cross/build-rootfs.sh | 2 ++ 1 file changed, 2 insertions(+) diff --git a/eng/common/cross/build-rootfs.sh b/eng/common/cross/build-rootfs.sh index debef05a3ea..735a4c82838 100755 --- a/eng/common/cross/build-rootfs.sh +++ b/eng/common/cross/build-rootfs.sh @@ -114,6 +114,8 @@ while :; do __UbuntuArch=s390x __UbuntuRepo="http://ports.ubuntu.com/ubuntu-ports/" __UbuntuPackages=$(echo ${__UbuntuPackages} | sed 's/ libunwind8-dev//') + __UbuntuPackages=$(echo ${__UbuntuPackages} | sed 's/ libomp-dev//') + __UbuntuPackages=$(echo ${__UbuntuPackages} | sed 's/ libomp5//') unset __LLDB_Package ;; x86) From bb041fc41b705e0626153845b7b8b5dbf1f35479 Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Tue, 13 Jul 2021 14:43:58 +0000 Subject: [PATCH 218/699] [main] Update dependencies from dotnet/xharness dotnet/arcade mono/linker (#7610) [main] Update dependencies from dotnet/xharness dotnet/arcade mono/linker --- eng/Version.Details.xml | 28 ++++++++++++++-------------- eng/Versions.props | 10 +++++----- global.json | 4 ++-- 3 files changed, 21 insertions(+), 21 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index 2eac4aa6b1a..619ed320ae9 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -11,25 +11,25 @@ - + https://github.com/dotnet/arcade - 286d98094b830b8dad769542b2669cb1b75f7097 + 55262f114b0c1b82f0b081bca0d919b657ba24c5 - + https://github.com/dotnet/arcade - 286d98094b830b8dad769542b2669cb1b75f7097 + 55262f114b0c1b82f0b081bca0d919b657ba24c5 - + https://github.com/dotnet/arcade - 286d98094b830b8dad769542b2669cb1b75f7097 + 55262f114b0c1b82f0b081bca0d919b657ba24c5 - + https://github.com/dotnet/arcade - 286d98094b830b8dad769542b2669cb1b75f7097 + 55262f114b0c1b82f0b081bca0d919b657ba24c5 - + https://github.com/dotnet/arcade - 286d98094b830b8dad769542b2669cb1b75f7097 + 55262f114b0c1b82f0b081bca0d919b657ba24c5 https://github.com/dotnet/arcade-services @@ -39,17 +39,17 @@ https://github.com/dotnet/arcade-services cac955fe259cb611f6a29d09209bd717deb69037 - + https://github.com/dotnet/xharness - 32c37bf7374fc77ef79255c8126d34c7a00cf78e + c6d444eaf7e95339589ceef371cbef0a90a4add5 https://github.com/dotnet/roslyn 246ce641f04b67ef017655275d850bf902a8e40f - + https://github.com/mono/linker - b9501922637806f4135df09a9922d5540e203858 + 664e78edc72dd0a48e6f55e352051b6ba61bba9a https://github.com/dotnet/sourcelink diff --git a/eng/Versions.props b/eng/Versions.props index 39bd2f3e991..733b9af0655 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -35,7 +35,7 @@ 2.1.1 2.1.0 3.10.0-4.21329.37 - 6.0.100-preview.6.21358.3 + 6.0.100-preview.6.21362.3 16.7.1 4.8.3 5.3.0.1 @@ -65,8 +65,8 @@ 2.4.1 2.0.3 2.4.1 - 6.0.0-beta.21357.3 - 6.0.0-beta.21357.3 + 6.0.0-beta.21359.3 + 6.0.0-beta.21359.3 1.22.0 1.1.2 2.0.0 @@ -77,10 +77,10 @@ 1.1.0-beta.20258.6 1.1.0-beta-21309-01 1.1.0-beta-21309-01 - 6.0.0-beta.21357.3 + 6.0.0-beta.21359.3 1.0.0-beta.21358.1 1.1.0-beta.21228.1 - 1.0.0-prerelease.21351.2 + 1.0.0-prerelease.21357.4 1.1.156602 1.1.156602 6.0.100-preview.5.21254.11 diff --git a/global.json b/global.json index d4f456e766c..7ea4d9f101a 100644 --- a/global.json +++ b/global.json @@ -3,7 +3,7 @@ "dotnet": "6.0.100-preview.4.21255.9" }, "msbuild-sdks": { - "Microsoft.DotNet.Arcade.Sdk": "6.0.0-beta.21357.3", - "Microsoft.DotNet.Helix.Sdk": "6.0.0-beta.21357.3" + "Microsoft.DotNet.Arcade.Sdk": "6.0.0-beta.21359.3", + "Microsoft.DotNet.Helix.Sdk": "6.0.0-beta.21359.3" } } From 1b053babb8a542e3ab20f93b3d0aedc732b7e0c7 Mon Sep 17 00:00:00 2001 From: jakubstilec Date: Tue, 13 Jul 2021 19:32:56 +0200 Subject: [PATCH 219/699] #13433: product builds secret configuration (#7583) --- ...roduct-builds-dnceng-pipeline-secrets.yaml | 84 ++++++++++ .vault-config/product-builds-engkeyvault.yaml | 144 ++++++++++++++++++ .vault-config/product-builds-helixprodkv.yaml | 11 ++ .../product-builds-netsourceindexvault.yaml | 20 +++ 4 files changed, 259 insertions(+) create mode 100644 .vault-config/product-builds-dnceng-pipeline-secrets.yaml create mode 100644 .vault-config/product-builds-engkeyvault.yaml create mode 100644 .vault-config/product-builds-helixprodkv.yaml create mode 100644 .vault-config/product-builds-netsourceindexvault.yaml diff --git a/.vault-config/product-builds-dnceng-pipeline-secrets.yaml b/.vault-config/product-builds-dnceng-pipeline-secrets.yaml new file mode 100644 index 00000000000..6c0b90ce500 --- /dev/null +++ b/.vault-config/product-builds-dnceng-pipeline-secrets.yaml @@ -0,0 +1,84 @@ +storageLocation: + type: azure-key-vault + parameters: + subscription: a4fc5514-21a9-4296-bfaf-5c7ee7fa35d1 + name: dnceng-pipeline-secrets + +secrets: + #DotNet-DotNetCli-Storage + dotnetcli-storage-key: + type: text + parameters: + description: set to never expire + + dotnetclichecksums-storage-key: + type: text + parameters: + description: set to never expire + + #DotNet-MSRC-Storage + dotnetbuilddropsmsrc-access-key: + type: text + parameters: + description: set to never expire + + dotnetclichecksumsmsrc-storage-key: + type: text + parameters: + description: set to never expire + + dotnetclimsrc-access-key: + type: text + parameters: + description: set to never expire + + dotnetclimsrc-private-feed-url: + type: text + parameters: + description: created manually from SAS in the format https://dotnetclimsrc.azurewebsites.net/sig/{sig}/se{se} + + dotnetclimsrc-connection-string: + type: azure-storage-connection-string + parameters: + storageKeySecret: dotnetclimsrc-access-key + account: dotnetclimsrc + + dotnetclimsrc-read-sas-token: + type: azure-storage-container-sas-token + parameters: + connectionString: dotnetclimsrc-connection-string + permissions: rl + container: dotnet + + dotnetclimsrc-read-sas-token-base64: + type: base64-encoder + parameters: + secret: dotnetclimsrc-read-sas-token + + dotnetfeedmsrc-private-feed-url: + type: text + parameters: + description: created manually from SAS in the format https://dotnetfeedmsrc.azurewebsites.net/sig/{sig}/se{se} + + dotnetfeedmsrc-storage-access-key-1: + type: text + parameters: + description: set to never expire + + dotnetfeedmsrc-connection-string: + type: azure-storage-connection-string + parameters: + storageKeySecret: dotnetfeedmsrc-storage-access-key-1 + account: dotnetfeedmsrc + + dotnetfeedmsrc-read-sas-token: + type: azure-storage-container-sas-token + parameters: + connectionString: dotnetfeedmsrc-connection-string + permissions: r + container: $root + + dotnetfeedmsrc-read-sas-token-base64: + type: base64-encoder + parameters: + secret: dotnetfeedmsrc-read-sas-token \ No newline at end of file diff --git a/.vault-config/product-builds-engkeyvault.yaml b/.vault-config/product-builds-engkeyvault.yaml new file mode 100644 index 00000000000..a66d6576a3f --- /dev/null +++ b/.vault-config/product-builds-engkeyvault.yaml @@ -0,0 +1,144 @@ +storageLocation: + type: azure-key-vault + parameters: + subscription: a4fc5514-21a9-4296-bfaf-5c7ee7fa35d1 + name: EngKeyVault + +references: + helixkv: + type: azure-key-vault + parameters: + subscription: a4fc5514-21a9-4296-bfaf-5c7ee7fa35d1 + name: helixkv + +secrets: + BotAccount-dotnet-maestro-bot: + type: github-account + parameters: + Name: dotnet-maestro-bot + + #DotNet-Blob-Feed + dotnetfeed-storage-access-key-1: + type: azure-storage-key + parameters: + subscription: a4fc5514-21a9-4296-bfaf-5c7ee7fa35d1 + account: dotnetfeed + + #Publish-Build-Assets + MaestroAccessToken: + type: maestro-access-token + parameters: + environment: maestro-prod.westus2.cloudapp.azure.com + + BotAccount-dotnet-maestro-bot-PAT: + type: github-access-token + parameters: + gitHubBotAccountSecret: BotAccount-dotnet-maestro-bot + gitHubBotAccountName: dotnet-maestro-bot + + dn-bot-dnceng-build-rw-code-rw: + type: azure-devops-access-token + parameters: + domainAccountName: dn-bot + domainAccountSecret: + location: helixkv + name: dn-bot-account-redmond + name: dn-bot-dnceng-build + organization: dnceng + + akams: + type: github-oauth-secret + parameters: + appName: akams + description: set to never expire + + publishing-dnceng-devdiv-code-r-build-re: + type: azure-devops-access-token + parameters: + domainAccountName: dn-bot + domainAccountSecret: + location: helixkv + name: dn-bot-account-redmond + name: publishing-dnceng-devdiv-code + organization: dnceng + + dn-bot-dotnet-build-rw-code-rw: + type: azure-devops-access-token + parameters: + domainAccountName: dn-bot + domainAccountSecret: + location: helixkv + name: dn-bot-account-redmond + name: dn-bot-dotnet-build + organization: dnceng + + dn-bot-all-orgs-build-rw-code-rw: + type: azure-devops-access-token + parameters: + domainAccountName: dn-bot + domainAccountSecret: + location: helixkv + name: dn-bot-account-redmond + name: dn-bot-all-orgs-build + organization: dnceng + + #DotNet-AllOrgs-Darc-Pats + dn-bot-devdiv-dnceng-rw-code-pat: + type: azure-devops-access-token + parameters: + domainAccountName: dn-bot + domainAccountSecret: + location: helixkv + name: dn-bot-account-redmond + name: dn-bot-devdiv-dnceng + organization: dnceng + + #AzureDevOps-Artifact-Feeds-Pats + dn-bot-dnceng-artifact-feeds-rw: + type: azure-devops-access-token + parameters: + domainAccountName: dn-bot + domainAccountSecret: + location: helixkv + name: dn-bot-account-redmond + name: dn-bot-dnceng-artifact-feeds + organization: dnceng + + dn-bot-dnceng-universal-packages-rw: + type: azure-devops-access-token + parameters: + domainAccountName: dn-bot + domainAccountSecret: + location: helixkv + name: dn-bot-account-redmond + name: dn-bot-dnceng-universal-packages + organization: dnceng + + dn-bot-all-orgs-artifact-feeds-rw: + type: azure-devops-access-token + parameters: + domainAccountName: dn-bot + domainAccountSecret: + location: helixkv + name: dn-bot-account-redmond + name: dn-bot-all-orgs-artifact-feeds + organization: dnceng + + #DotNet-Symbol-Server-Pats + microsoft-symbol-server-pat: + type: azure-devops-access-token + parameters: + domainAccountSecret: + location: helixkv + name: dn-bot-account-redmond + name: microsoft-symbol-server-pat + organization: dnceng + + symweb-symbol-server-pat: + type: azure-devops-access-token + parameters: + domainAccountSecret: + location: helixkv + name: dn-bot-account-redmond + name: dn-symweb-symbol-server-pat + organization: dnceng \ No newline at end of file diff --git a/.vault-config/product-builds-helixprodkv.yaml b/.vault-config/product-builds-helixprodkv.yaml new file mode 100644 index 00000000000..4dc01995c60 --- /dev/null +++ b/.vault-config/product-builds-helixprodkv.yaml @@ -0,0 +1,11 @@ +storageLocation: + type: azure-key-vault + parameters: + subscription: 68672ab8-de0c-40f1-8d1b-ffb20bd62c0f + name: HelixProdKV + +secrets: + HelixApiAccessToken: + type: helix-access-token + parameters: + environment: helix.dot.net \ No newline at end of file diff --git a/.vault-config/product-builds-netsourceindexvault.yaml b/.vault-config/product-builds-netsourceindexvault.yaml new file mode 100644 index 00000000000..c1b49124444 --- /dev/null +++ b/.vault-config/product-builds-netsourceindexvault.yaml @@ -0,0 +1,20 @@ +storageLocation: + type: azure-key-vault + parameters: + subscription: a4fc5514-21a9-4296-bfaf-5c7ee7fa35d1 + name: netsourceindexvault + +secrets: + source-dot-net-stage1-connection-string: + type: azure-storage-connection-string + parameters: + subscription: a4fc5514-21a9-4296-bfaf-5c7ee7fa35d1 + account: netsourceindexstage1 + + #source-dot-net stage1 variables + source-dot-net-stage1-blob-container-url: + type: azure-storage-container-sas-uri + parameters: + connectionString: source-dot-net-stage1-connection-string + permissions: racwdl + container: stage1 \ No newline at end of file From a188ebf73fb121f0e1d9bc8607c3f5eccd21dfe1 Mon Sep 17 00:00:00 2001 From: Davis Goodin Date: Tue, 13 Jul 2021 14:56:18 -0500 Subject: [PATCH 220/699] Make SDL/Guardian scripts and templates flexible (#7611) --- eng/common/sdl/configure-sdl-tool.ps1 | 109 +++++++++++++++++++ eng/common/sdl/execute-all-sdl-tools.ps1 | 71 ++++++++++-- eng/common/sdl/extract-artifact-archives.ps1 | 63 +++++++++++ eng/common/sdl/run-sdl.ps1 | 50 +++------ eng/common/templates/job/execute-sdl.yml | 108 ++++++++++++++++-- eng/common/tools.ps1 | 51 +++++++++ 6 files changed, 395 insertions(+), 57 deletions(-) create mode 100644 eng/common/sdl/configure-sdl-tool.ps1 create mode 100644 eng/common/sdl/extract-artifact-archives.ps1 diff --git a/eng/common/sdl/configure-sdl-tool.ps1 b/eng/common/sdl/configure-sdl-tool.ps1 new file mode 100644 index 00000000000..4999c307088 --- /dev/null +++ b/eng/common/sdl/configure-sdl-tool.ps1 @@ -0,0 +1,109 @@ +Param( + [string] $GuardianCliLocation, + [string] $WorkingDirectory, + [string] $TargetDirectory, + [string] $GdnFolder, + # The list of Guardian tools to configure. For each object in the array: + # - If the item is a [hashtable], it must contain these entries: + # - Name = The tool name as Guardian knows it. + # - Scenario = (Optional) Scenario-specific name for this configuration entry. It must be unique + # among all tool entries with the same Name. + # - Args = (Optional) Array of Guardian tool configuration args, like '@("Target > C:\temp")' + # - If the item is a [string] $v, it is treated as '@{ Name="$v" }' + [object[]] $ToolsList, + [string] $GuardianLoggerLevel='Standard', + # Optional: Additional params to add to any tool using CredScan. + [string[]] $CrScanAdditionalRunConfigParams, + # Optional: Additional params to add to any tool using PoliCheck. + [string[]] $PoliCheckAdditionalRunConfigParams +) + +$ErrorActionPreference = 'Stop' +Set-StrictMode -Version 2.0 +$disableConfigureToolsetImport = $true +$global:LASTEXITCODE = 0 + +try { + # `tools.ps1` checks $ci to perform some actions. Since the SDL + # scripts don't necessarily execute in the same agent that run the + # build.ps1/sh script this variable isn't automatically set. + $ci = $true + . $PSScriptRoot\..\tools.ps1 + + # Normalize tools list: all in [hashtable] form with defined values for each key. + $ToolsList = $ToolsList | + ForEach-Object { + if ($_ -is [string]) { + $_ = @{ Name = $_ } + } + + if (-not ($_['Scenario'])) { $_.Scenario = "" } + if (-not ($_['Args'])) { $_.Args = @() } + $_ + } + + Write-Host "List of tools to configure:" + $ToolsList | ForEach-Object { $_ | Out-String | Write-Host } + + # We store config files in the r directory of .gdn + $gdnConfigPath = Join-Path $GdnFolder 'r' + $ValidPath = Test-Path $GuardianCliLocation + + if ($ValidPath -eq $False) + { + Write-PipelineTelemetryError -Force -Category 'Sdl' -Message "Invalid Guardian CLI Location." + ExitWithExitCode 1 + } + + foreach ($tool in $ToolsList) { + # Put together the name and scenario to make a unique key. + $toolConfigName = $tool.Name + if ($tool.Scenario) { + $toolConfigName += "_" + $tool.Scenario + } + + Write-Host "=== Configuring $toolConfigName..." + + $gdnConfigFile = Join-Path $gdnConfigPath "$toolConfigName-configure.gdnconfig" + + # For some tools, add default and automatic args. + if ($tool.Name -eq 'credscan') { + if ($targetDirectory) { + $tool.Args += "TargetDirectory < $TargetDirectory" + } + $tool.Args += "OutputType < pre" + $tool.Args += $CrScanAdditionalRunConfigParams + } elseif ($tool.Name -eq 'policheck') { + if ($targetDirectory) { + $tool.Args += "Target < $TargetDirectory" + } + $tool.Args += $PoliCheckAdditionalRunConfigParams + } + + # Create variable pointing to the args array directly so we can use splat syntax later. + $toolArgs = $tool.Args + + # Configure the tool. If args array is provided or the current tool has some default arguments + # defined, add "--args" and splat each element on the end. Arg format is "{Arg id} < {Value}", + # one per parameter. Doc page for "guardian configure": + # https://dev.azure.com/securitytools/SecurityIntegration/_wiki/wikis/Guardian/1395/configure + Exec-BlockVerbosely { + & $GuardianCliLocation configure ` + --working-directory $WorkingDirectory ` + --tool $tool.Name ` + --output-path $gdnConfigFile ` + --logger-level $GuardianLoggerLevel ` + --noninteractive ` + --force ` + $(if ($toolArgs) { "--args" }) @toolArgs + Exit-IfNZEC "Sdl" + } + + Write-Host "Created '$toolConfigName' configuration file: $gdnConfigFile" + } +} +catch { + Write-Host $_.ScriptStackTrace + Write-PipelineTelemetryError -Force -Category 'Sdl' -Message $_ + ExitWithExitCode 1 +} diff --git a/eng/common/sdl/execute-all-sdl-tools.ps1 b/eng/common/sdl/execute-all-sdl-tools.ps1 index 2881a56083c..1157151f486 100644 --- a/eng/common/sdl/execute-all-sdl-tools.ps1 +++ b/eng/common/sdl/execute-all-sdl-tools.ps1 @@ -7,8 +7,17 @@ Param( [string] $SourceDirectory=$env:BUILD_SOURCESDIRECTORY, # Required: the directory where source files are located [string] $ArtifactsDirectory = (Join-Path $env:BUILD_ARTIFACTSTAGINGDIRECTORY ('artifacts')), # Required: the directory where build artifacts are located [string] $AzureDevOpsAccessToken, # Required: access token for dnceng; should be provided via KeyVault - [string[]] $SourceToolsList, # Optional: list of SDL tools to run on source code - [string[]] $ArtifactToolsList, # Optional: list of SDL tools to run on built artifacts + + # Optional: list of SDL tools to run on source code. See 'configure-sdl-tool.ps1' for tools list + # format. + [object[]] $SourceToolsList, + # Optional: list of SDL tools to run on built artifacts. See 'configure-sdl-tool.ps1' for tools + # list format. + [object[]] $ArtifactToolsList, + # Optional: list of SDL tools to run without automatically specifying a target directory. See + # 'configure-sdl-tool.ps1' for tools list format. + [object[]] $CustomToolsList, + [bool] $TsaPublish=$False, # Optional: true will publish results to TSA; only set to true after onboarding to TSA; TSA is the automated framework used to upload test results as bugs. [string] $TsaBranchName=$env:BUILD_SOURCEBRANCH, # Optional: required for TSA publish; defaults to $(Build.SourceBranchName); TSA is the automated framework used to upload test results as bugs. [string] $TsaRepositoryName=$env:BUILD_REPOSITORY_NAME, # Optional: TSA repository name; will be generated automatically if not submitted; TSA is the automated framework used to upload test results as bugs. @@ -63,13 +72,16 @@ try { ExitWithExitCode 1 } - & $(Join-Path $PSScriptRoot 'init-sdl.ps1') -GuardianCliLocation $guardianCliLocation -Repository $RepoName -BranchName $BranchName -WorkingDirectory $workingDirectory -AzureDevOpsAccessToken $AzureDevOpsAccessToken -GuardianLoggerLevel $GuardianLoggerLevel + Exec-BlockVerbosely { + & $(Join-Path $PSScriptRoot 'init-sdl.ps1') -GuardianCliLocation $guardianCliLocation -Repository $RepoName -BranchName $BranchName -WorkingDirectory $workingDirectory -AzureDevOpsAccessToken $AzureDevOpsAccessToken -GuardianLoggerLevel $GuardianLoggerLevel + } $gdnFolder = Join-Path $workingDirectory '.gdn' if ($TsaOnboard) { if ($TsaCodebaseName -and $TsaNotificationEmail -and $TsaCodebaseAdmin -and $TsaBugAreaPath) { - Write-Host "$guardianCliLocation tsa-onboard --codebase-name `"$TsaCodebaseName`" --notification-alias `"$TsaNotificationEmail`" --codebase-admin `"$TsaCodebaseAdmin`" --instance-url `"$TsaInstanceUrl`" --project-name `"$TsaProjectName`" --area-path `"$TsaBugAreaPath`" --iteration-path `"$TsaIterationPath`" --working-directory $workingDirectory --logger-level $GuardianLoggerLevel" - & $guardianCliLocation tsa-onboard --codebase-name "$TsaCodebaseName" --notification-alias "$TsaNotificationEmail" --codebase-admin "$TsaCodebaseAdmin" --instance-url "$TsaInstanceUrl" --project-name "$TsaProjectName" --area-path "$TsaBugAreaPath" --iteration-path "$TsaIterationPath" --working-directory $workingDirectory --logger-level $GuardianLoggerLevel + Exec-BlockVerbosely { + & $guardianCliLocation tsa-onboard --codebase-name "$TsaCodebaseName" --notification-alias "$TsaNotificationEmail" --codebase-admin "$TsaCodebaseAdmin" --instance-url "$TsaInstanceUrl" --project-name "$TsaProjectName" --area-path "$TsaBugAreaPath" --iteration-path "$TsaIterationPath" --working-directory $workingDirectory --logger-level $GuardianLoggerLevel + } if ($LASTEXITCODE -ne 0) { Write-PipelineTelemetryError -Force -Category 'Sdl' -Message "Guardian tsa-onboard failed with exit code $LASTEXITCODE." ExitWithExitCode $LASTEXITCODE @@ -80,11 +92,41 @@ try { } } - if ($ArtifactToolsList -and $ArtifactToolsList.Count -gt 0) { - & $(Join-Path $PSScriptRoot 'run-sdl.ps1') -GuardianCliLocation $guardianCliLocation -WorkingDirectory $workingDirectory -TargetDirectory $ArtifactsDirectory -GdnFolder $gdnFolder -ToolsList $ArtifactToolsList -AzureDevOpsAccessToken $AzureDevOpsAccessToken -UpdateBaseline $UpdateBaseline -GuardianLoggerLevel $GuardianLoggerLevel -CrScanAdditionalRunConfigParams $CrScanAdditionalRunConfigParams -PoliCheckAdditionalRunConfigParams $PoliCheckAdditionalRunConfigParams + # Configure a list of tools with a default target directory. Populates the ".gdn/r" directory. + function Configure-ToolsList([object[]] $tools, [string] $targetDirectory) { + if ($tools -and $tools.Count -gt 0) { + Exec-BlockVerbosely { + & $(Join-Path $PSScriptRoot 'configure-sdl-tool.ps1') ` + -GuardianCliLocation $guardianCliLocation ` + -WorkingDirectory $workingDirectory ` + -TargetDirectory $targetDirectory ` + -GdnFolder $gdnFolder ` + -ToolsList $tools ` + -AzureDevOpsAccessToken $AzureDevOpsAccessToken ` + -GuardianLoggerLevel $GuardianLoggerLevel ` + -CrScanAdditionalRunConfigParams $CrScanAdditionalRunConfigParams ` + -PoliCheckAdditionalRunConfigParams $PoliCheckAdditionalRunConfigParams + if ($BreakOnFailure) { + Exit-IfNZEC "Sdl" + } + } + } } - if ($SourceToolsList -and $SourceToolsList.Count -gt 0) { - & $(Join-Path $PSScriptRoot 'run-sdl.ps1') -GuardianCliLocation $guardianCliLocation -WorkingDirectory $workingDirectory -TargetDirectory $SourceDirectory -GdnFolder $gdnFolder -ToolsList $SourceToolsList -AzureDevOpsAccessToken $AzureDevOpsAccessToken -UpdateBaseline $UpdateBaseline -GuardianLoggerLevel $GuardianLoggerLevel -CrScanAdditionalRunConfigParams $CrScanAdditionalRunConfigParams -PoliCheckAdditionalRunConfigParams $PoliCheckAdditionalRunConfigParams + + # Configure Artifact and Source tools with default Target directories. + Configure-ToolsList $ArtifactToolsList $ArtifactsDirectory + Configure-ToolsList $SourceToolsList $SourceDirectory + # Configure custom tools with no default Target directory. + Configure-ToolsList $CustomToolsList $null + + # At this point, all tools are configured in the ".gdn" directory. Run them all in a single call. + # (If we used "run" multiple times, each run would overwrite data from earlier runs.) + Exec-BlockVerbosely { + & $(Join-Path $PSScriptRoot 'run-sdl.ps1') ` + -GuardianCliLocation $guardianCliLocation ` + -WorkingDirectory $workingDirectory ` + -UpdateBaseline $UpdateBaseline ` + -GdnFolder $gdnFolder } if ($TsaPublish) { @@ -92,8 +134,9 @@ try { if (-not $TsaRepositoryName) { $TsaRepositoryName = "$($Repository)-$($BranchName)" } - Write-Host "$guardianCliLocation tsa-publish --all-tools --repository-name `"$TsaRepositoryName`" --branch-name `"$TsaBranchName`" --build-number `"$BuildNumber`" --codebase-name `"$TsaCodebaseName`" --notification-alias `"$TsaNotificationEmail`" --codebase-admin `"$TsaCodebaseAdmin`" --instance-url `"$TsaInstanceUrl`" --project-name `"$TsaProjectName`" --area-path `"$TsaBugAreaPath`" --iteration-path `"$TsaIterationPath`" --working-directory $workingDirectory --logger-level $GuardianLoggerLevel" - & $guardianCliLocation tsa-publish --all-tools --repository-name "$TsaRepositoryName" --branch-name "$TsaBranchName" --build-number "$BuildNumber" --onboard $True --codebase-name "$TsaCodebaseName" --notification-alias "$TsaNotificationEmail" --codebase-admin "$TsaCodebaseAdmin" --instance-url "$TsaInstanceUrl" --project-name "$TsaProjectName" --area-path "$TsaBugAreaPath" --iteration-path "$TsaIterationPath" --working-directory $workingDirectory --logger-level $GuardianLoggerLevel + Exec-BlockVerbosely { + & $guardianCliLocation tsa-publish --all-tools --repository-name "$TsaRepositoryName" --branch-name "$TsaBranchName" --build-number "$BuildNumber" --onboard $True --codebase-name "$TsaCodebaseName" --notification-alias "$TsaNotificationEmail" --codebase-admin "$TsaCodebaseAdmin" --instance-url "$TsaInstanceUrl" --project-name "$TsaProjectName" --area-path "$TsaBugAreaPath" --iteration-path "$TsaIterationPath" --working-directory $workingDirectory --logger-level $GuardianLoggerLevel + } if ($LASTEXITCODE -ne 0) { Write-PipelineTelemetryError -Force -Category 'Sdl' -Message "Guardian tsa-publish failed with exit code $LASTEXITCODE." ExitWithExitCode $LASTEXITCODE @@ -106,7 +149,11 @@ try { if ($BreakOnFailure) { Write-Host "Failing the build in case of breaking results..." - & $guardianCliLocation break + Exec-BlockVerbosely { + & $guardianCliLocation break --working-directory $workingDirectory --logger-level $GuardianLoggerLevel + } + } else { + Write-Host "Letting the build pass even if there were breaking results..." } } catch { diff --git a/eng/common/sdl/extract-artifact-archives.ps1 b/eng/common/sdl/extract-artifact-archives.ps1 new file mode 100644 index 00000000000..68da4fbf257 --- /dev/null +++ b/eng/common/sdl/extract-artifact-archives.ps1 @@ -0,0 +1,63 @@ +# This script looks for each archive file in a directory and extracts it into the target directory. +# For example, the file "$InputPath/bin.tar.gz" extracts to "$ExtractPath/bin.tar.gz.extracted/**". +# Uses the "tar" utility added to Windows 10 / Windows 2019 that supports tar.gz and zip. +param( + # Full path to directory where archives are stored. + [Parameter(Mandatory=$true)][string] $InputPath, + # Full path to directory to extract archives into. May be the same as $InputPath. + [Parameter(Mandatory=$true)][string] $ExtractPath +) + +$ErrorActionPreference = 'Stop' +Set-StrictMode -Version 2.0 + +$disableConfigureToolsetImport = $true + +try { + # `tools.ps1` checks $ci to perform some actions. Since the SDL + # scripts don't necessarily execute in the same agent that run the + # build.ps1/sh script this variable isn't automatically set. + $ci = $true + . $PSScriptRoot\..\tools.ps1 + + Measure-Command { + $jobs = @() + + # Find archive files for non-Windows and Windows builds. + $archiveFiles = @( + Get-ChildItem (Join-Path $InputPath "*.tar.gz") + Get-ChildItem (Join-Path $InputPath "*.zip") + ) + + foreach ($targzFile in $archiveFiles) { + $jobs += Start-Job -ScriptBlock { + $file = $using:targzFile + $fileName = [System.IO.Path]::GetFileName($file) + $extractDir = Join-Path $using:ExtractPath "$fileName.extracted" + + New-Item $extractDir -ItemType Directory -Force | Out-Null + + Write-Host "Extracting '$file' to '$extractDir'..." + + # Pipe errors to stdout to prevent PowerShell detecting them and quitting the job early. + # This type of quit skips the catch, so we wouldn't be able to tell which file triggered the + # error. Save output so it can be stored in the exception string along with context. + $output = tar -xf $file -C $extractDir 2>&1 + # Handle NZEC manually rather than using Exit-IfNZEC: we are in a background job, so we + # don't have access to the outer scope. + if ($LASTEXITCODE -ne 0) { + throw "Error extracting '$file': non-zero exit code ($LASTEXITCODE). Output: '$output'" + } + + Write-Host "Extracted to $extractDir" + } + } + + Receive-Job $jobs -Wait + } +} +catch { + Write-Host $_ + Write-PipelineTelemetryError -Force -Category 'Sdl' -Message $_ + ExitWithExitCode 1 +} diff --git a/eng/common/sdl/run-sdl.ps1 b/eng/common/sdl/run-sdl.ps1 index 3d9c87aba6a..2eac8c78f10 100644 --- a/eng/common/sdl/run-sdl.ps1 +++ b/eng/common/sdl/run-sdl.ps1 @@ -1,13 +1,9 @@ Param( [string] $GuardianCliLocation, [string] $WorkingDirectory, - [string] $TargetDirectory, [string] $GdnFolder, - [string[]] $ToolsList, [string] $UpdateBaseline, - [string] $GuardianLoggerLevel='Standard', - [string[]] $CrScanAdditionalRunConfigParams, - [string[]] $PoliCheckAdditionalRunConfigParams + [string] $GuardianLoggerLevel='Standard' ) $ErrorActionPreference = 'Stop' @@ -23,7 +19,6 @@ try { . $PSScriptRoot\..\tools.ps1 # We store config files in the r directory of .gdn - Write-Host $ToolsList $gdnConfigPath = Join-Path $GdnFolder 'r' $ValidPath = Test-Path $GuardianCliLocation @@ -33,37 +28,18 @@ try { ExitWithExitCode 1 } - $configParam = @('--config') - - foreach ($tool in $ToolsList) { - $gdnConfigFile = Join-Path $gdnConfigPath "$tool-configure.gdnconfig" - Write-Host $tool - # We have to manually configure tools that run on source to look at the source directory only - if ($tool -eq 'credscan') { - Write-Host "$GuardianCliLocation configure --working-directory $WorkingDirectory --tool $tool --output-path $gdnConfigFile --logger-level $GuardianLoggerLevel --noninteractive --force --args `" TargetDirectory < $TargetDirectory `" `" OutputType < pre `" $(If ($CrScanAdditionalRunConfigParams) {$CrScanAdditionalRunConfigParams})" - & $GuardianCliLocation configure --working-directory $WorkingDirectory --tool $tool --output-path $gdnConfigFile --logger-level $GuardianLoggerLevel --noninteractive --force --args " TargetDirectory < $TargetDirectory " "OutputType < pre" $(If ($CrScanAdditionalRunConfigParams) {$CrScanAdditionalRunConfigParams}) - if ($LASTEXITCODE -ne 0) { - Write-PipelineTelemetryError -Force -Category 'Sdl' -Message "Guardian configure for $tool failed with exit code $LASTEXITCODE." - ExitWithExitCode $LASTEXITCODE - } - } - if ($tool -eq 'policheck') { - Write-Host "$GuardianCliLocation configure --working-directory $WorkingDirectory --tool $tool --output-path $gdnConfigFile --logger-level $GuardianLoggerLevel --noninteractive --force --args `" Target < $TargetDirectory `" $(If ($PoliCheckAdditionalRunConfigParams) {$PoliCheckAdditionalRunConfigParams})" - & $GuardianCliLocation configure --working-directory $WorkingDirectory --tool $tool --output-path $gdnConfigFile --logger-level $GuardianLoggerLevel --noninteractive --force --args " Target < $TargetDirectory " $(If ($PoliCheckAdditionalRunConfigParams) {$PoliCheckAdditionalRunConfigParams}) - if ($LASTEXITCODE -ne 0) { - Write-PipelineTelemetryError -Force -Category 'Sdl' -Message "Guardian configure for $tool failed with exit code $LASTEXITCODE." - ExitWithExitCode $LASTEXITCODE - } - } - - $configParam+=$gdnConfigFile - } - - Write-Host "$GuardianCliLocation run --working-directory $WorkingDirectory --baseline mainbaseline --update-baseline $UpdateBaseline --logger-level $GuardianLoggerLevel $configParam" - & $GuardianCliLocation run --working-directory $WorkingDirectory --tool $tool --baseline mainbaseline --update-baseline $UpdateBaseline --logger-level $GuardianLoggerLevel $configParam - if ($LASTEXITCODE -ne 0) { - Write-PipelineTelemetryError -Force -Category 'Sdl' -Message "Guardian run for $ToolsList using $configParam failed with exit code $LASTEXITCODE." - ExitWithExitCode $LASTEXITCODE + $gdnConfigFiles = Get-ChildItem $gdnConfigPath -Recurse -Include '*.gdnconfig' + Write-Host "Discovered Guardian config files:" + $gdnConfigFiles | Out-String | Write-Host + + Exec-BlockVerbosely { + & $GuardianCliLocation run ` + --working-directory $WorkingDirectory ` + --baseline mainbaseline ` + --update-baseline $UpdateBaseline ` + --logger-level $GuardianLoggerLevel ` + --config @gdnConfigFiles + Exit-IfNZEC "Sdl" } } catch { diff --git a/eng/common/templates/job/execute-sdl.yml b/eng/common/templates/job/execute-sdl.yml index 4a32181fd8f..69eb67849d7 100644 --- a/eng/common/templates/job/execute-sdl.yml +++ b/eng/common/templates/job/execute-sdl.yml @@ -2,17 +2,41 @@ parameters: enable: 'false' # Whether the SDL validation job should execute or not overrideParameters: '' # Optional: to override values for parameters. additionalParameters: '' # Optional: parameters that need user specific values eg: '-SourceToolsList @("abc","def") -ArtifactToolsList @("ghi","jkl")' + # Optional: if specified, restore and use this version of Guardian instead of the default. + overrideGuardianVersion: '' + # Optional: if true, publish the '.gdn' folder as a pipeline artifact. This can help with in-depth + # diagnosis of problems with specific tool configurations. + publishGuardianDirectoryToPipeline: false + # The script to run to execute all SDL tools. Use this if you want to use a script to define SDL + # parameters rather than relying on YAML. It may be better to use a local script, because you can + # reproduce results locally without piecing together a command based on the YAML. + executeAllSdlToolsScript: 'eng/common/sdl/execute-all-sdl-tools.ps1' # There is some sort of bug (has been reported) in Azure DevOps where if this parameter is named # 'continueOnError', the parameter value is not correctly picked up. # This can also be remedied by the caller (post-build.yml) if it does not use a nested parameter sdlContinueOnError: false # optional: determines whether to continue the build if the step errors; - downloadArtifacts: true # optional: determines if the artifacts should be dowloaded + # optional: determines if build artifacts should be downloaded. + downloadArtifacts: true + # optional: determines if this job should search the directory of downloaded artifacts for + # 'tar.gz' and 'zip' archive files and extract them before running SDL validation tasks. + extractArchiveArtifacts: false dependsOn: '' # Optional: dependencies of the job artifactNames: '' # Optional: patterns supplied to DownloadBuildArtifacts # Usage: # artifactNames: # - 'BlobArtifacts' # - 'Artifacts_Windows_NT_Release' + # Optional: download a list of pipeline artifacts. 'downloadArtifacts' controls build artifacts, + # not pipeline artifacts, so doesn't affect the use of this parameter. + pipelineArtifactNames: [] + # Optional: location and ID of the AzDO build that the build/pipeline artifacts should be + # downloaded from. By default, uses runtime expressions to decide based on the variables set by + # the 'setupMaestroVars' dependency. Overriding this parameter is necessary if SDL tasks are + # running without Maestro++/BAR involved, or to download artifacts from a specific existing build + # to iterate quickly on SDL changes. + AzDOProjectName: $[ dependencies.setupMaestroVars.outputs['setReleaseVars.AzDOProjectName'] ] + AzDOPipelineId: $[ dependencies.setupMaestroVars.outputs['setReleaseVars.AzDOPipelineId'] ] + AzDOBuildId: $[ dependencies.setupMaestroVars.outputs['setReleaseVars.AzDOBuildId'] ] jobs: - job: Run_SDL @@ -22,16 +46,29 @@ jobs: variables: - group: DotNet-VSTS-Bot - name: AzDOProjectName - value: $[ dependencies.setupMaestroVars.outputs['setReleaseVars.AzDOProjectName'] ] + value: ${{ parameters.AzDOProjectName }} - name: AzDOPipelineId - value: $[ dependencies.setupMaestroVars.outputs['setReleaseVars.AzDOPipelineId'] ] + value: ${{ parameters.AzDOPipelineId }} - name: AzDOBuildId - value: $[ dependencies.setupMaestroVars.outputs['setReleaseVars.AzDOBuildId'] ] + value: ${{ parameters.AzDOBuildId }} + # The Guardian version specified in 'eng/common/sdl/packages.config'. This value must be kept in + # sync with the packages.config file. + - name: DefaultGuardianVersion + value: 0.53.3 + - name: GuardianVersion + value: ${{ coalesce(parameters.overrideGuardianVersion, '$(DefaultGuardianVersion)') }} + - name: GuardianPackagesConfigFile + value: $(Build.SourcesDirectory)\eng\common\sdl\packages.config pool: - name: Hosted VS2017 + # To extract archives (.tar.gz, .zip), we need access to "tar", added in Windows 10/2019. + ${{ if eq(parameters.extractArchiveArtifacts, 'false') }}: + name: Hosted VS2017 + ${{ if ne(parameters.extractArchiveArtifacts, 'false') }}: + vmImage: windows-2019 steps: - checkout: self clean: true + - ${{ if ne(parameters.downloadArtifacts, 'false')}}: - ${{ if ne(parameters.artifactNames, '') }}: - ${{ each artifactName in parameters.artifactNames }}: @@ -59,16 +96,51 @@ jobs: itemPattern: "**" downloadPath: $(Build.ArtifactStagingDirectory)\artifacts checkDownloadedFiles: true + + - ${{ each artifactName in parameters.pipelineArtifactNames }}: + - task: DownloadPipelineArtifact@2 + displayName: Download Pipeline Artifacts + inputs: + buildType: specific + buildVersionToDownload: specific + project: $(AzDOProjectName) + pipeline: $(AzDOPipelineId) + buildId: $(AzDOBuildId) + artifactName: ${{ artifactName }} + downloadPath: $(Build.ArtifactStagingDirectory)\artifacts + checkDownloadedFiles: true + - powershell: eng/common/sdl/extract-artifact-packages.ps1 -InputPath $(Build.ArtifactStagingDirectory)\artifacts\BlobArtifacts -ExtractPath $(Build.ArtifactStagingDirectory)\artifacts\BlobArtifacts displayName: Extract Blob Artifacts continueOnError: ${{ parameters.sdlContinueOnError }} + - powershell: eng/common/sdl/extract-artifact-packages.ps1 -InputPath $(Build.ArtifactStagingDirectory)\artifacts\PackageArtifacts -ExtractPath $(Build.ArtifactStagingDirectory)\artifacts\PackageArtifacts displayName: Extract Package Artifacts continueOnError: ${{ parameters.sdlContinueOnError }} + + - ${{ if ne(parameters.extractArchiveArtifacts, 'false') }}: + - powershell: eng/common/sdl/extract-artifact-archives.ps1 + -InputPath $(Build.ArtifactStagingDirectory)\artifacts + -ExtractPath $(Build.ArtifactStagingDirectory)\artifacts + displayName: Extract Archive Artifacts + continueOnError: ${{ parameters.sdlContinueOnError }} + + - ${{ if ne(parameters.overrideGuardianVersion, '') }}: + - powershell: | + $content = Get-Content $(GuardianPackagesConfigFile) + + Write-Host "packages.config content was:`n$content" + + $content = $content.Replace('$(DefaultGuardianVersion)', '$(GuardianVersion)') + $content | Set-Content $(GuardianPackagesConfigFile) + + Write-Host "packages.config content updated to:`n$content" + displayName: Use overridden Guardian version ${{ parameters.overrideGuardianVersion }} + - task: NuGetToolInstaller@1 displayName: 'Install NuGet.exe' - task: NuGetCommand@2 @@ -79,15 +151,35 @@ jobs: nugetConfigPath: $(Build.SourcesDirectory)\eng\common\sdl\NuGet.config externalFeedCredentials: GuardianConnect restoreDirectory: $(Build.SourcesDirectory)\.packages + - ${{ if ne(parameters.overrideParameters, '') }}: - - powershell: eng/common/sdl/execute-all-sdl-tools.ps1 ${{ parameters.overrideParameters }} + - powershell: ${{ parameters.executeAllSdlToolsScript }} ${{ parameters.overrideParameters }} displayName: Execute SDL continueOnError: ${{ parameters.sdlContinueOnError }} - ${{ if eq(parameters.overrideParameters, '') }}: - - powershell: eng/common/sdl/execute-all-sdl-tools.ps1 - -GuardianPackageName Microsoft.Guardian.Cli.0.53.3 + - powershell: ${{ parameters.executeAllSdlToolsScript }} + -GuardianPackageName Microsoft.Guardian.Cli.$(GuardianVersion) -NugetPackageDirectory $(Build.SourcesDirectory)\.packages -AzureDevOpsAccessToken $(dn-bot-dotnet-build-rw-code-rw) ${{ parameters.additionalParameters }} displayName: Execute SDL continueOnError: ${{ parameters.sdlContinueOnError }} + + - ${{ if ne(parameters.publishGuardianDirectoryToPipeline, 'false') }}: + # We want to publish the Guardian results and configuration for easy diagnosis. However, the + # '.gdn' dir is a mix of configuration, results, extracted dependencies, and Guardian default + # tooling files. Some of these files are large and aren't useful during an investigation, so + # exclude them by simply deleting them before publishing. (As of writing, there is no documented + # way to selectively exclude a dir from the pipeline artifact publish task.) + - task: DeleteFiles@1 + displayName: Delete Guardian dependencies to avoid uploading + inputs: + SourceFolder: $(Agent.BuildDirectory)/.gdn + Contents: | + c + i + condition: succeededOrFailed() + - publish: $(Agent.BuildDirectory)/.gdn + artifact: GuardianConfiguration + displayName: Publish GuardianConfiguration + condition: succeededOrFailed() diff --git a/eng/common/tools.ps1 b/eng/common/tools.ps1 index 2df0909937d..5d526c74d51 100644 --- a/eng/common/tools.ps1 +++ b/eng/common/tools.ps1 @@ -106,6 +106,46 @@ function Exec-Process([string]$command, [string]$commandArgs) { } } +# Take the given block, print it, print what the block probably references from the current set of +# variables using low-effort string matching, then run the block. +# +# This is intended to replace the pattern of manually copy-pasting a command, wrapping it in quotes, +# and printing it using "Write-Host". The copy-paste method is more readable in build logs, but less +# maintainable and less reliable. It is easy to make a mistake and modify the command without +# properly updating the "Write-Host" line, resulting in misleading build logs. The probability of +# this mistake makes the pattern hard to trust when it shows up in build logs. Finding the bug in +# existing source code can also be difficult, because the strings are not aligned to each other and +# the line may be 300+ columns long. +# +# By removing the need to maintain two copies of the command, Exec-BlockVerbosely avoids the issues. +# +# In Bash (or any posix-like shell), "set -x" prints usable verbose output automatically. +# "Set-PSDebug" appears to be similar at first glance, but unfortunately, it isn't very useful: it +# doesn't print any info about the variables being used by the command, which is normally the +# interesting part to diagnose. +function Exec-BlockVerbosely([scriptblock] $block) { + Write-Host "--- Running script block:" + $blockString = $block.ToString().Trim() + Write-Host $blockString + + Write-Host "--- List of variables that might be used:" + # For each variable x in the environment, check the block for a reference to x via simple "$x" or + # "@x" syntax. This doesn't detect other ways to reference variables ("${x}" nor "$variable:x", + # among others). It only catches what this function was originally written for: simple + # command-line commands. + $variableTable = Get-Variable | + Where-Object { + $blockString.Contains("`$$($_.Name)") -or $blockString.Contains("@$($_.Name)") + } | + Format-Table -AutoSize -HideTableHeaders -Wrap | + Out-String + Write-Host $variableTable.Trim() + + Write-Host "--- Executing:" + & $block + Write-Host "--- Done running script block!" +} + # createSdkLocationFile parameter enables a file being generated under the toolset directory # which writes the sdk's location into. This is only necessary for cmd --> powershell invocations # as dot sourcing isn't possible. @@ -632,6 +672,17 @@ function ExitWithExitCode([int] $exitCode) { exit $exitCode } +# Check if $LASTEXITCODE is a nonzero exit code (NZEC). If so, print a Azure Pipeline error for +# diagnostics, then exit the script with the $LASTEXITCODE. +function Exit-IfNZEC([string] $category = "General") { + Write-Host "Exit code $LASTEXITCODE" + if ($LASTEXITCODE -ne 0) { + $message = "Last command failed with exit code $LASTEXITCODE." + Write-PipelineTelemetryError -Force -Category $category -Message $message + ExitWithExitCode $LASTEXITCODE + } +} + function Stop-Processes() { Write-Host 'Killing running build processes...' foreach ($processName in $processesToStopOnExit) { From 0ec8c018893653d73b363a2a449d8fee5de2fd0a Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Wed, 14 Jul 2021 14:37:13 +0000 Subject: [PATCH 221/699] [main] Update dependencies from dotnet/xliff-tasks dotnet/arcade mono/linker (#7618) [main] Update dependencies from dotnet/xliff-tasks dotnet/arcade mono/linker --- eng/Version.Details.xml | 28 ++++++++++++++-------------- eng/Versions.props | 10 +++++----- global.json | 4 ++-- 3 files changed, 21 insertions(+), 21 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index 619ed320ae9..51e3b1a24c4 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -11,25 +11,25 @@ - + https://github.com/dotnet/arcade - 55262f114b0c1b82f0b081bca0d919b657ba24c5 + 1b053babb8a542e3ab20f93b3d0aedc732b7e0c7 - + https://github.com/dotnet/arcade - 55262f114b0c1b82f0b081bca0d919b657ba24c5 + 1b053babb8a542e3ab20f93b3d0aedc732b7e0c7 - + https://github.com/dotnet/arcade - 55262f114b0c1b82f0b081bca0d919b657ba24c5 + 1b053babb8a542e3ab20f93b3d0aedc732b7e0c7 - + https://github.com/dotnet/arcade - 55262f114b0c1b82f0b081bca0d919b657ba24c5 + 1b053babb8a542e3ab20f93b3d0aedc732b7e0c7 - + https://github.com/dotnet/arcade - 55262f114b0c1b82f0b081bca0d919b657ba24c5 + 1b053babb8a542e3ab20f93b3d0aedc732b7e0c7 https://github.com/dotnet/arcade-services @@ -47,9 +47,9 @@ https://github.com/dotnet/roslyn 246ce641f04b67ef017655275d850bf902a8e40f - + https://github.com/mono/linker - 664e78edc72dd0a48e6f55e352051b6ba61bba9a + e1c0c83d24d619ba37cdfc8bd7f8c8ebaf9f309b https://github.com/dotnet/sourcelink @@ -68,9 +68,9 @@ https://github.com/dotnet/symreader-converter c5ba7c88f92e2dde156c324a8c8edc04d9fa4fe0 - + https://github.com/dotnet/xliff-tasks - 278d1810611250edf8095eab5ee6aa825fdb178a + 5f24cdd0b5703d5c4f5e2d252d34db531c0854db diff --git a/eng/Versions.props b/eng/Versions.props index 733b9af0655..b88e81111af 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -35,7 +35,7 @@ 2.1.1 2.1.0 3.10.0-4.21329.37 - 6.0.100-preview.6.21362.3 + 6.0.100-preview.6.21363.1 16.7.1 4.8.3 5.3.0.1 @@ -65,8 +65,8 @@ 2.4.1 2.0.3 2.4.1 - 6.0.0-beta.21359.3 - 6.0.0-beta.21359.3 + 6.0.0-beta.21363.2 + 6.0.0-beta.21363.2 1.22.0 1.1.2 2.0.0 @@ -77,8 +77,8 @@ 1.1.0-beta.20258.6 1.1.0-beta-21309-01 1.1.0-beta-21309-01 - 6.0.0-beta.21359.3 - 1.0.0-beta.21358.1 + 6.0.0-beta.21363.2 + 1.0.0-beta.21363.1 1.1.0-beta.21228.1 1.0.0-prerelease.21357.4 1.1.156602 diff --git a/global.json b/global.json index 7ea4d9f101a..012e28fb06e 100644 --- a/global.json +++ b/global.json @@ -3,7 +3,7 @@ "dotnet": "6.0.100-preview.4.21255.9" }, "msbuild-sdks": { - "Microsoft.DotNet.Arcade.Sdk": "6.0.0-beta.21359.3", - "Microsoft.DotNet.Helix.Sdk": "6.0.0-beta.21359.3" + "Microsoft.DotNet.Arcade.Sdk": "6.0.0-beta.21363.2", + "Microsoft.DotNet.Helix.Sdk": "6.0.0-beta.21363.2" } } From 6a8491b61e0c243cbb6a7ff4966b48e6d1e075b1 Mon Sep 17 00:00:00 2001 From: Ricardo Arenas Date: Wed, 14 Jul 2021 11:31:40 -0700 Subject: [PATCH 222/699] Add details to contact org admin for repos outside of the dotnet org (#7619) * Add details to contact org admin for repos outside of the dotnet org * move the remark out of the optional prerequisites --- Documentation/DependencyFlowOnboarding.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Documentation/DependencyFlowOnboarding.md b/Documentation/DependencyFlowOnboarding.md index 88fcd58e48b..bdf1e1e1ce2 100644 --- a/Documentation/DependencyFlowOnboarding.md +++ b/Documentation/DependencyFlowOnboarding.md @@ -10,7 +10,9 @@ There's a set of steps that need to be completed so the versions of assets your ## Prerequisites -These pre-requisites are not hard requirements, but enabling dependency flow will be much simpler if you are using these processes: +- If your repository is not part of the Dotnet GitHub organization, contact an administrator for the organization to install the dotnet-maestro app in your repository: https://github.com/apps/dotnet-maestro + +The following pre-requisites are not hard requirements, but enabling dependency flow will be much simpler if you are using these processes: - Internal builds produced out of https://dev.azure.com/dnceng/internal From 7dea2b89967cef8a823c296f4578f67a435b4143 Mon Sep 17 00:00:00 2001 From: Jacques Eloff Date: Wed, 14 Jul 2021 16:19:39 -0700 Subject: [PATCH 223/699] Update workload pack tasks (#7614) * Update workload pack tasks * Suppress NU5118; Add RelatedProduct information * Fix serialization * Make Icon.png conditional to avoid duplicate files * Make AddPackageIcon target conditional * Switch back to System.Text.Json for crossplat builds * Change BeforeTargets --- .../testassets/MonoWorkloadManifest.json | 273 ++++++++++++++++++ .../src/GenerateManifestMsi.cs | 25 +- .../src/GenerateMsiBase.cs | 25 +- .../src/MsiProperties.cs | 18 +- .../src/MsiTemplate/ManifestProduct.wxs | 2 +- .../src/MsiTemplate/Product.wxs | 2 +- .../src/MsiTemplate/Registry.wxs | 1 + .../src/MsiTemplate/Variables.wxi | 4 + .../src/MsiUtils.cs | 32 +- .../src/RelatedProduct.cs | 57 ++++ .../src/VisualStudioComponent.cs | 12 +- 11 files changed, 429 insertions(+), 22 deletions(-) create mode 100644 src/Microsoft.DotNet.Build.Tasks.Workloads.Tests/testassets/MonoWorkloadManifest.json create mode 100644 src/Microsoft.DotNet.Build.Tasks.Workloads/src/RelatedProduct.cs diff --git a/src/Microsoft.DotNet.Build.Tasks.Workloads.Tests/testassets/MonoWorkloadManifest.json b/src/Microsoft.DotNet.Build.Tasks.Workloads.Tests/testassets/MonoWorkloadManifest.json new file mode 100644 index 00000000000..3e1177e5e06 --- /dev/null +++ b/src/Microsoft.DotNet.Build.Tasks.Workloads.Tests/testassets/MonoWorkloadManifest.json @@ -0,0 +1,273 @@ +{ + "version": "6.0.0-preview.7.21358.4", + "depends-on": { + "Microsoft.NET.Workload.Emscripten": "6.0.0-preview.7.21330.1" + }, + "workloads": { + "microsoft-net-sdk-blazorwebassembly-aot": { + "description": "Browser Runtime native performance tools", + "packs": [ + "Microsoft.NET.Runtime.WebAssembly.Sdk", + "Microsoft.NETCore.App.Runtime.Mono.browser-wasm", + "Microsoft.NETCore.App.Runtime.AOT.Cross.browser-wasm", + "Microsoft.NET.Runtime.Emscripten.Node", + "Microsoft.NET.Runtime.Emscripten.Python", + "Microsoft.NET.Runtime.Emscripten.Sdk" + ], + "extends": [ "microsoft-net-runtime-mono-tooling", "microsoft-net-sdk-emscripten" ], + "platforms": [ "win-x64", "linux-x64", "osx-x64", "osx-arm64" ] + }, + "microsoft-net-runtime-android": { + "abstract": true, + "description": "Android Mono Runtime", + "packs": [ + "Microsoft.NETCore.App.Runtime.Mono.android-arm", + "Microsoft.NETCore.App.Runtime.Mono.android-arm64", + "Microsoft.NETCore.App.Runtime.Mono.android-x64", + "Microsoft.NETCore.App.Runtime.Mono.android-x86" + ], + "extends": [ "microsoft-net-runtime-mono-tooling" ], + "platforms": [ "win-x64", "linux-x64", "osx-x64", "osx-arm64" ] + }, + "microsoft-net-runtime-android-aot": { + "abstract": true, + "description": "Android Mono AOT Workload", + "packs": [ + "Microsoft.NETCore.App.Runtime.AOT.Cross.android-x86", + "Microsoft.NETCore.App.Runtime.AOT.Cross.android-x64", + "Microsoft.NETCore.App.Runtime.AOT.Cross.android-arm", + "Microsoft.NETCore.App.Runtime.AOT.Cross.android-arm64" + ], + "extends": [ "microsoft-net-runtime-android" ], + "platforms": [ "win-x64", "linux-x64", "osx-x64", "osx-arm64" ] + }, + "microsoft-net-runtime-ios": { + "abstract": true, + "description": "iOS Mono Runtime and AOT Workload", + "packs": [ + "Microsoft.NETCore.App.Runtime.Mono.ios-arm", + "Microsoft.NETCore.App.Runtime.Mono.ios-arm64", + "Microsoft.NETCore.App.Runtime.Mono.iossimulator", + "Microsoft.NETCore.App.Runtime.Mono.iossimulator-x86", + "Microsoft.NETCore.App.Runtime.AOT.Cross.ios-arm", + "Microsoft.NETCore.App.Runtime.AOT.Cross.ios-arm64", + "Microsoft.NETCore.App.Runtime.AOT.Cross.iossimulator", + "Microsoft.NETCore.App.Runtime.AOT.Cross.iossimulator-x86" + ], + "extends": [ "microsoft-net-runtime-mono-tooling" ], + "platforms": [ "osx-arm64", "osx-x64" ] + }, + "microsoft-net-runtime-maccatalyst": { + "abstract": true, + "description": "MacCatalyst Mono Runtime and AOT Workload", + "packs": [ + "Microsoft.NETCore.App.Runtime.Mono.maccatalyst", + "Microsoft.NETCore.App.Runtime.AOT.Cross.maccatalyst" + ], + "extends": [ "microsoft-net-runtime-mono-tooling" ], + "platforms": [ "osx-arm64", "osx-x64" ] + }, + "microsoft-net-runtime-tvos": { + "abstract": true, + "description": "tvOS Mono Runtime and AOT Workload", + "packs": [ + "Microsoft.NETCore.App.Runtime.Mono.tvos-arm64", + "Microsoft.NETCore.App.Runtime.Mono.tvossimulator", + "Microsoft.NETCore.App.Runtime.AOT.Cross.tvos-arm64", + "Microsoft.NETCore.App.Runtime.AOT.Cross.tvossimulator" + ], + "extends": [ "microsoft-net-runtime-mono-tooling" ], + "platforms": [ "osx-arm64", "osx-x64" ] + }, + "microsoft-net-runtime-mono-tooling": { + "abstract": true, + "description": "Shared native build tooling for Mono runtime", + "packs": [ + "Microsoft.NET.Runtime.MonoAOTCompiler.Task", + "Microsoft.NET.Runtime.MonoTargets.Sdk", + ], + } + }, + "packs": { + "Microsoft.NET.Runtime.MonoAOTCompiler.Task": { + "kind": "Sdk", + "version": "6.0.0-preview.7.21358.4" + }, + "Microsoft.NET.Runtime.MonoTargets.Sdk": { + "kind": "Sdk", + "version": "6.0.0-preview.7.21358.4" + }, + "Microsoft.NET.Runtime.WebAssembly.Sdk": { + "kind": "Sdk", + "version": "6.0.0-preview.7.21358.4" + }, + "Microsoft.NETCore.App.Runtime.Mono.android-arm": { + "kind": "framework", + "version": "6.0.0-preview.7.21358.4" + }, + "Microsoft.NETCore.App.Runtime.Mono.android-arm64": { + "kind": "framework", + "version": "6.0.0-preview.7.21358.4" + }, + "Microsoft.NETCore.App.Runtime.Mono.android-x64": { + "kind": "framework", + "version": "6.0.0-preview.7.21358.4" + }, + "Microsoft.NETCore.App.Runtime.Mono.android-x86": { + "kind": "framework", + "version": "6.0.0-preview.7.21358.4" + }, + "Microsoft.NETCore.App.Runtime.AOT.Cross.android-x86": { + "kind": "Sdk", + "version": "6.0.0-preview.7.21358.4", + "alias-to": { + "win-x64": "Microsoft.NETCore.App.Runtime.AOT.win-x64.Cross.android-x86", + "linux-x64": "Microsoft.NETCore.App.Runtime.AOT.linux-x64.Cross.android-x86", + "osx-x64": "Microsoft.NETCore.App.Runtime.AOT.osx-x64.Cross.android-x86", + "osx-arm64": "Microsoft.NETCore.App.Runtime.AOT.osx-x64.Cross.android-x86" + } + }, + "Microsoft.NETCore.App.Runtime.AOT.Cross.android-x64": { + "kind": "Sdk", + "version": "6.0.0-preview.7.21358.4", + "alias-to": { + "win-x64": "Microsoft.NETCore.App.Runtime.AOT.win-x64.Cross.android-x64", + "linux-x64": "Microsoft.NETCore.App.Runtime.AOT.linux-x64.Cross.android-x64", + "osx-x64": "Microsoft.NETCore.App.Runtime.AOT.osx-x64.Cross.android-x64", + "osx-arm64": "Microsoft.NETCore.App.Runtime.AOT.osx-x64.Cross.android-x64" + } + }, + "Microsoft.NETCore.App.Runtime.AOT.Cross.android-arm": { + "kind": "Sdk", + "version": "6.0.0-preview.7.21358.4", + "alias-to": { + "win-x64": "Microsoft.NETCore.App.Runtime.AOT.win-x64.Cross.android-arm", + "linux-x64": "Microsoft.NETCore.App.Runtime.AOT.linux-x64.Cross.android-arm", + "osx-x64": "Microsoft.NETCore.App.Runtime.AOT.osx-x64.Cross.android-arm", + "osx-arm64": "Microsoft.NETCore.App.Runtime.AOT.osx-x64.Cross.android-arm" + } + }, + "Microsoft.NETCore.App.Runtime.AOT.Cross.android-arm64": { + "kind": "Sdk", + "version": "6.0.0-preview.7.21358.4", + "alias-to": { + "win-x64": "Microsoft.NETCore.App.Runtime.AOT.win-x64.Cross.android-arm64", + "linux-x64": "Microsoft.NETCore.App.Runtime.AOT.linux-x64.Cross.android-arm64", + "osx-x64": "Microsoft.NETCore.App.Runtime.AOT.osx-x64.Cross.android-arm64", + "osx-arm64": "Microsoft.NETCore.App.Runtime.AOT.osx-x64.Cross.android-arm64" + } + }, + "Microsoft.NETCore.App.Runtime.Mono.maccatalyst": { + "kind": "framework", + "version": "6.0.0-preview.7.21358.4", + "alias-to": { + "osx-arm64": "Microsoft.NETCore.App.Runtime.Mono.maccatalyst-arm64", + "osx-x64": "Microsoft.NETCore.App.Runtime.Mono.maccatalyst-x64" + } + }, + "Microsoft.NETCore.App.Runtime.Mono.ios-arm" : { + "kind": "framework", + "version": "6.0.0-preview.7.21358.4" + }, + "Microsoft.NETCore.App.Runtime.Mono.ios-arm64" : { + "kind": "framework", + "version": "6.0.0-preview.7.21358.4" + }, + "Microsoft.NETCore.App.Runtime.Mono.iossimulator" : { + "kind": "framework", + "version": "6.0.0-preview.7.21358.4", + "alias-to": { + "osx-arm64": "Microsoft.NETCore.App.Runtime.Mono.iossimulator-arm64", + "osx-x64": "Microsoft.NETCore.App.Runtime.Mono.iossimulator-x64" + } + }, + "Microsoft.NETCore.App.Runtime.Mono.iossimulator-x86" : { + "kind": "framework", + "version": "6.0.0-preview.7.21358.4", + "alias-to": { + "osx-x64": "Microsoft.NETCore.App.Runtime.Mono.iossimulator-x86" + } + }, + "Microsoft.NETCore.App.Runtime.AOT.Cross.tvos-arm64": { + "kind": "Sdk", + "version": "6.0.0-preview.7.21358.4", + "alias-to": { + "osx-x64": "Microsoft.NETCore.App.Runtime.AOT.osx-x64.Cross.tvos-arm64", + "osx-arm64": "Microsoft.NETCore.App.Runtime.AOT.osx-x64.Cross.tvos-arm64", + } + }, + "Microsoft.NETCore.App.Runtime.Mono.tvos-arm64" : { + "kind": "framework", + "version": "6.0.0-preview.7.21358.4" + }, + "Microsoft.NETCore.App.Runtime.Mono.tvossimulator" : { + "kind": "framework", + "version": "6.0.0-preview.7.21358.4", + "alias-to": { + "osx-arm64": "Microsoft.NETCore.App.Runtime.Mono.tvossimulator-arm64", + "osx-x64": "Microsoft.NETCore.App.Runtime.Mono.tvossimulator-x64" + } + }, + "Microsoft.NETCore.App.Runtime.AOT.Cross.maccatalyst": { + "kind": "Sdk", + "version": "6.0.0-preview.7.21358.4", + "alias-to": { + "osx-arm64": "Microsoft.NETCore.App.Runtime.AOT.osx-x64.Cross.maccatalyst-arm64", + "osx-x64": "Microsoft.NETCore.App.Runtime.AOT.osx-x64.Cross.maccatalyst-x64" + } + }, + "Microsoft.NETCore.App.Runtime.AOT.Cross.tvossimulator": { + "kind": "Sdk", + "version": "6.0.0-preview.7.21358.4", + "alias-to": { + "osx-arm64": "Microsoft.NETCore.App.Runtime.AOT.osx-x64.Cross.tvossimulator-arm64", + "osx-x64": "Microsoft.NETCore.App.Runtime.AOT.osx-x64.Cross.tvossimulator-x64" + } + }, + "Microsoft.NETCore.App.Runtime.AOT.Cross.ios-arm": { + "kind": "Sdk", + "version": "6.0.0-preview.7.21358.4", + "alias-to": { + "osx-x64": "Microsoft.NETCore.App.Runtime.AOT.osx-x64.Cross.ios-arm", + "osx-arm64": "Microsoft.NETCore.App.Runtime.AOT.osx-x64.Cross.ios-arm", + } + }, + "Microsoft.NETCore.App.Runtime.AOT.Cross.ios-arm64": { + "kind": "Sdk", + "version": "6.0.0-preview.7.21358.4", + "alias-to": { + "osx-x64": "Microsoft.NETCore.App.Runtime.AOT.osx-x64.Cross.ios-arm64", + "osx-arm64": "Microsoft.NETCore.App.Runtime.AOT.osx-x64.Cross.ios-arm64", + } + }, + "Microsoft.NETCore.App.Runtime.AOT.Cross.iossimulator": { + "kind": "Sdk", + "version": "6.0.0-preview.7.21358.4", + "alias-to": { + "osx-arm64": "Microsoft.NETCore.App.Runtime.AOT.osx-x64.Cross.iossimulator-arm64", + "osx-x64": "Microsoft.NETCore.App.Runtime.AOT.osx-x64.Cross.iossimulator-x64" + } + }, + "Microsoft.NETCore.App.Runtime.AOT.Cross.iossimulator-x86": { + "kind": "Sdk", + "version": "6.0.0-preview.7.21358.4", + "alias-to": { + "osx-x64": "Microsoft.NETCore.App.Runtime.AOT.osx-x64.Cross.iossimulator-x86" + } + }, + "Microsoft.NETCore.App.Runtime.AOT.Cross.browser-wasm": { + "kind": "Sdk", + "version": "6.0.0-preview.7.21358.4", + "alias-to": { + "win-x64": "Microsoft.NETCore.App.Runtime.AOT.win-x64.Cross.browser-wasm", + "linux-x64": "Microsoft.NETCore.App.Runtime.AOT.linux-x64.Cross.browser-wasm", + "osx-x64": "Microsoft.NETCore.App.Runtime.AOT.osx-x64.Cross.browser-wasm", + "osx-arm64": "Microsoft.NETCore.App.Runtime.AOT.osx-x64.Cross.browser-wasm" + } + }, + "Microsoft.NETCore.App.Runtime.Mono.browser-wasm" : { + "kind": "framework", + "version": "6.0.0-preview.7.21358.4" + }, + } +} diff --git a/src/Microsoft.DotNet.Build.Tasks.Workloads/src/GenerateManifestMsi.cs b/src/Microsoft.DotNet.Build.Tasks.Workloads/src/GenerateManifestMsi.cs index 16bee2bad66..384e46cfdde 100644 --- a/src/Microsoft.DotNet.Build.Tasks.Workloads/src/GenerateManifestMsi.cs +++ b/src/Microsoft.DotNet.Build.Tasks.Workloads/src/GenerateManifestMsi.cs @@ -234,11 +234,13 @@ public override bool Execute() MsiProperties msiProps = new MsiProperties { InstallSize = MsiUtils.GetInstallSize(msiPath), + Language = Convert.ToInt32(MsiUtils.GetProperty(msiPath, "ProductLanguage")), Payload = Path.GetFileName(msiPath), ProductCode = MsiUtils.GetProperty(msiPath, "ProductCode"), ProductVersion = MsiUtils.GetProperty(msiPath, "ProductVersion"), ProviderKeyName = $"{nupkg.Id},{nupkg.Version},{platform}", - UpgradeCode = MsiUtils.GetProperty(msiPath, "UpgradeCode") + UpgradeCode = MsiUtils.GetProperty(msiPath, "UpgradeCode"), + RelatedProducts = MsiUtils.GetRelatedProducts(msiPath) }; string msiJsonPath = Path.Combine(Path.GetDirectoryName(msiPath), Path.GetFileNameWithoutExtension(msiPath) + ".json"); @@ -308,7 +310,6 @@ private string GeneratePackageProject(string msiPath, string msiJsonPath, string writer.WriteElementString("PackageId", $"{nupkg.Id}.Msi.{platform}"); writer.WriteElementString("PackageVersion", $"{nupkg.Version}"); writer.WriteElementString("Description", nupkg.Description); - writer.WriteElementString("PackageIcon", "Icon.png"); if (!string.IsNullOrWhiteSpace(nupkg.Authors)) { @@ -326,11 +327,23 @@ private string GeneratePackageProject(string msiPath, string msiJsonPath, string writer.WriteStartElement("ItemGroup"); WriteItem(writer, "None", msiPath, @"\data"); WriteItem(writer, "None", msiJsonPath, @"\data\msi.json"); - WriteItem(writer, "None", iconFileName, string.Empty); WriteItem(writer, "None", licenseFileName, @"\"); - writer.WriteEndElement(); - - writer.WriteEndElement(); + writer.WriteEndElement(); // ItemGroup + + writer.WriteRaw(@" + + + Icon.png + + + + + +"); + + writer.WriteEndElement(); // Project writer.Flush(); writer.Close(); diff --git a/src/Microsoft.DotNet.Build.Tasks.Workloads/src/GenerateMsiBase.cs b/src/Microsoft.DotNet.Build.Tasks.Workloads/src/GenerateMsiBase.cs index 62fcf789438..9e201639401 100644 --- a/src/Microsoft.DotNet.Build.Tasks.Workloads/src/GenerateMsiBase.cs +++ b/src/Microsoft.DotNet.Build.Tasks.Workloads/src/GenerateMsiBase.cs @@ -256,11 +256,13 @@ protected IEnumerable Generate(string sourcePackage, string swixPacka MsiProperties msiProps = new MsiProperties { InstallSize = MsiUtils.GetInstallSize(msiPath), + Language = Convert.ToInt32(MsiUtils.GetProperty(msiPath, "ProductLanguage")), Payload = Path.GetFileName(msiPath), ProductCode = MsiUtils.GetProperty(msiPath, "ProductCode"), ProductVersion = MsiUtils.GetProperty(msiPath, "ProductVersion"), ProviderKeyName = $"{nupkg.Id},{nupkg.Version},{platform}", - UpgradeCode = MsiUtils.GetProperty(msiPath, "UpgradeCode") + UpgradeCode = MsiUtils.GetProperty(msiPath, "UpgradeCode"), + RelatedProducts = MsiUtils.GetRelatedProducts(msiPath) }; string msiJsonPath = Path.Combine(Path.GetDirectoryName(msiPath), Path.GetFileNameWithoutExtension(msiPath) + ".json"); @@ -334,7 +336,6 @@ private string GeneratePackageProject(string msiPath, string msiJsonPath, string writer.WriteElementString("PackageId", $"{nupkg.Id}.Msi.{platform}"); writer.WriteElementString("PackageVersion", $"{nupkg.Version}"); writer.WriteElementString("Description", nupkg.Description); - writer.WriteElementString("PackageIcon", "Icon.png"); if (!string.IsNullOrWhiteSpace(nupkg.Authors)) { @@ -352,11 +353,23 @@ private string GeneratePackageProject(string msiPath, string msiJsonPath, string writer.WriteStartElement("ItemGroup"); WriteItem(writer, "None", msiPath, @"\data"); WriteItem(writer, "None", msiJsonPath, @"\data\msi.json"); - WriteItem(writer, "None", iconFileName, string.Empty); WriteItem(writer, "None", licenseFileName, @"\"); - writer.WriteEndElement(); - - writer.WriteEndElement(); + writer.WriteEndElement(); // ItemGroup + + writer.WriteRaw(@" + + + Icon.png + + + + + +"); + + writer.WriteEndElement(); // Project writer.Flush(); writer.Close(); diff --git a/src/Microsoft.DotNet.Build.Tasks.Workloads/src/MsiProperties.cs b/src/Microsoft.DotNet.Build.Tasks.Workloads/src/MsiProperties.cs index b3f4ab15d23..7c8376c69a0 100644 --- a/src/Microsoft.DotNet.Build.Tasks.Workloads/src/MsiProperties.cs +++ b/src/Microsoft.DotNet.Build.Tasks.Workloads/src/MsiProperties.cs @@ -1,11 +1,7 @@ // Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. -using System; using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace Microsoft.DotNet.Build.Tasks.Workloads { @@ -17,6 +13,12 @@ public long InstallSize set; } + public int Language + { + get; + set; + } + public string Payload { get; @@ -45,6 +47,12 @@ public string UpgradeCode { get; set; - } + } + + public IEnumerable RelatedProducts + { + get; + set; + } } } diff --git a/src/Microsoft.DotNet.Build.Tasks.Workloads/src/MsiTemplate/ManifestProduct.wxs b/src/Microsoft.DotNet.Build.Tasks.Workloads/src/MsiTemplate/ManifestProduct.wxs index b5556c28d19..128fe2200bb 100644 --- a/src/Microsoft.DotNet.Build.Tasks.Workloads/src/MsiTemplate/ManifestProduct.wxs +++ b/src/Microsoft.DotNet.Build.Tasks.Workloads/src/MsiTemplate/ManifestProduct.wxs @@ -2,7 +2,7 @@ - diff --git a/src/Microsoft.DotNet.Build.Tasks.Workloads/src/MsiTemplate/Product.wxs b/src/Microsoft.DotNet.Build.Tasks.Workloads/src/MsiTemplate/Product.wxs index 98d2a78515c..6f628f7797b 100644 --- a/src/Microsoft.DotNet.Build.Tasks.Workloads/src/MsiTemplate/Product.wxs +++ b/src/Microsoft.DotNet.Build.Tasks.Workloads/src/MsiTemplate/Product.wxs @@ -2,7 +2,7 @@ - diff --git a/src/Microsoft.DotNet.Build.Tasks.Workloads/src/MsiTemplate/Registry.wxs b/src/Microsoft.DotNet.Build.Tasks.Workloads/src/MsiTemplate/Registry.wxs index 9835ce99ca4..99f2127088e 100644 --- a/src/Microsoft.DotNet.Build.Tasks.Workloads/src/MsiTemplate/Registry.wxs +++ b/src/Microsoft.DotNet.Build.Tasks.Workloads/src/MsiTemplate/Registry.wxs @@ -11,6 +11,7 @@ + diff --git a/src/Microsoft.DotNet.Build.Tasks.Workloads/src/MsiTemplate/Variables.wxi b/src/Microsoft.DotNet.Build.Tasks.Workloads/src/MsiTemplate/Variables.wxi index 0c5e3b07d49..0e1b15b5322 100644 --- a/src/Microsoft.DotNet.Build.Tasks.Workloads/src/MsiTemplate/Variables.wxi +++ b/src/Microsoft.DotNet.Build.Tasks.Workloads/src/MsiTemplate/Variables.wxi @@ -17,6 +17,10 @@ + + + + diff --git a/src/Microsoft.DotNet.Build.Tasks.Workloads/src/MsiUtils.cs b/src/Microsoft.DotNet.Build.Tasks.Workloads/src/MsiUtils.cs index caa99c8170c..6ca695ff84f 100644 --- a/src/Microsoft.DotNet.Build.Tasks.Workloads/src/MsiUtils.cs +++ b/src/Microsoft.DotNet.Build.Tasks.Workloads/src/MsiUtils.cs @@ -13,6 +13,8 @@ public class MsiUtils { private const string _getFilesQuery = "SELECT `File`, `Component_`, `FileName`, `FileSize`, `Version`, `Language`, `Attributes`, `Sequence` FROM `File`"; + private const string _getUpgradeQuery = "SELECT `UpgradeCode`, `VersionMin`, `VersionMax`, `Language`, `Attributes` FROM `Upgrade`"; + public static IEnumerable GetAllFiles(string packagePath) { using InstallPackage ip = new(packagePath, DatabaseOpenMode.ReadOnly); @@ -29,12 +31,40 @@ public static IEnumerable GetAllFiles(string packagePath) return files; } + public static IEnumerable GetRelatedProducts(string packagePath) + { + using InstallPackage ip = new(packagePath, DatabaseOpenMode.ReadOnly); + using Database db = new(packagePath, DatabaseOpenMode.ReadOnly); + + if (db.Tables.Contains("Upgrade")) + { + using View upgradeView = db.OpenView(_getUpgradeQuery); + List relatedProducts = new(); + upgradeView.Execute(); + + foreach (Record relatedProduct in upgradeView) + { + relatedProducts.Add(RelatedProduct.Create(relatedProduct)); + } + + return relatedProducts; + } + + return Enumerable.Empty(); + } + + /// + /// Extracts the specified property from the MSI's Property table. + /// + /// The path to the MSI package. + /// The name of the property to extract. + /// The value of the property. public static string GetProperty(string packagePath, string property) { using InstallPackage ip = new(packagePath, DatabaseOpenMode.ReadOnly); return ip.Property[property]; - } + /// /// Calculate the number of bytes a Windows Installer Package would consume on disk. The function assumes that all files will be installed. /// diff --git a/src/Microsoft.DotNet.Build.Tasks.Workloads/src/RelatedProduct.cs b/src/Microsoft.DotNet.Build.Tasks.Workloads/src/RelatedProduct.cs new file mode 100644 index 00000000000..4eb3a09ba1f --- /dev/null +++ b/src/Microsoft.DotNet.Build.Tasks.Workloads/src/RelatedProduct.cs @@ -0,0 +1,57 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +using System; +using Microsoft.Deployment.WindowsInstaller; + +namespace Microsoft.DotNet.Build.Tasks.Workloads +{ + // Represents a single row from the MSI Upgrade table. + public class RelatedProduct + { + public string UpgradeCode + { + get; + set; + } + + public string VersionMin + { + get; + set; + } + + public string VersionMax + { + get; + set; + } + + public string Language + { + get; + set; + } + + public int Attributes + { + get; + set; + } + + public static RelatedProduct Create(Record record) + { + string versionMin = (string)record["VersionMin"]; + string versionMax = (string)record["VersionMax"]; + + return new RelatedProduct + { + UpgradeCode = (string)record["UpgradeCode"], + VersionMin = string.IsNullOrWhiteSpace(versionMin) ? null : versionMin, + VersionMax = string.IsNullOrWhiteSpace(versionMax) ? null : versionMax, + Language = (string)record["Language"], + Attributes = (int)record["Attributes"] + }; + } + } +} diff --git a/src/Microsoft.DotNet.Build.Tasks.Workloads/src/VisualStudioComponent.cs b/src/Microsoft.DotNet.Build.Tasks.Workloads/src/VisualStudioComponent.cs index b6d523fb38e..22b083a99b5 100644 --- a/src/Microsoft.DotNet.Build.Tasks.Workloads/src/VisualStudioComponent.cs +++ b/src/Microsoft.DotNet.Build.Tasks.Workloads/src/VisualStudioComponent.cs @@ -243,7 +243,7 @@ public static VisualStudioComponent Create(TaskLoggingHelper log, WorkloadManife IEnumerable missingPackIds = missingPacks.Select(p => p.ItemSpec); log?.LogMessage(MessageImportance.Low, $"Missing packs: {string.Join(", ", missingPackIds)}"); - // If the work extends other workloads, we add those as component dependencies before + // If the workload extends other workloads, we add those as component dependencies before // processing direct pack dependencies if (workload.Extends?.Count() > 0) { @@ -263,7 +263,15 @@ public static VisualStudioComponent Create(TaskLoggingHelper log, WorkloadManife foreach (WorkloadPackId packId in packIds) { log?.LogMessage(MessageImportance.Low, $"Adding component dependency for {packId} "); - component.AddDependency(manifest.Packs[packId]); + + if (manifest.Packs.ContainsKey(packId)) + { + component.AddDependency(manifest.Packs[packId]); + } + else + { + log?.LogMessage(MessageImportance.High, $"Missing Visual Studio component dependency, packId: {packId}."); + } } } From 6b1251cc20dad47cb15c84e82522d7a51cc25cc6 Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Thu, 15 Jul 2021 14:52:43 +0000 Subject: [PATCH 224/699] Update dependencies from https://github.com/dotnet/xliff-tasks build 20210714.1 (#7625) [main] Update dependencies from dotnet/xliff-tasks --- eng/Version.Details.xml | 4 ++-- eng/Versions.props | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index 51e3b1a24c4..be290e7d69d 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -68,9 +68,9 @@ https://github.com/dotnet/symreader-converter c5ba7c88f92e2dde156c324a8c8edc04d9fa4fe0 - + https://github.com/dotnet/xliff-tasks - 5f24cdd0b5703d5c4f5e2d252d34db531c0854db + 2bef7706c6016c8db4360911c8259a07e7f212e2 diff --git a/eng/Versions.props b/eng/Versions.props index b88e81111af..97c23f36f28 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -78,7 +78,7 @@ 1.1.0-beta-21309-01 1.1.0-beta-21309-01 6.0.0-beta.21363.2 - 1.0.0-beta.21363.1 + 1.0.0-beta.21364.1 1.1.0-beta.21228.1 1.0.0-prerelease.21357.4 1.1.156602 From a311590405df7e4f4525e1d3b93cf16ddf8f8e91 Mon Sep 17 00:00:00 2001 From: Igor Velikorossov Date: Fri, 16 Jul 2021 01:57:59 +1000 Subject: [PATCH 225/699] Exclude inboxed analyzers from VerifyClosure task (#7624) As per https://github.com/dotnet/designs/blob/main/accepted/2021/InboxSourceGenerators.md inboxed source generators are placed under ref/ folder, and need to be excluded from RuntimePack reference check. Fixes broken build https://github.com/dotnet/windowsdesktop/pull/1803 --- .../targets/sharedfx.targets | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/Microsoft.DotNet.SharedFramework.Sdk/targets/sharedfx.targets b/src/Microsoft.DotNet.SharedFramework.Sdk/targets/sharedfx.targets index df74bf08695..b06ac3f40c6 100644 --- a/src/Microsoft.DotNet.SharedFramework.Sdk/targets/sharedfx.targets +++ b/src/Microsoft.DotNet.SharedFramework.Sdk/targets/sharedfx.targets @@ -457,6 +457,9 @@ + + From 8181002e0fe0a45918db5f8cfd05f0f2363c6652 Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Thu, 15 Jul 2021 22:19:25 +0000 Subject: [PATCH 226/699] Update dependencies from https://github.com/dotnet/arcade build 20210714.3 (#7628) [main] Update dependencies from dotnet/arcade --- eng/Version.Details.xml | 20 ++++++++++---------- eng/Versions.props | 6 +++--- global.json | 4 ++-- 3 files changed, 15 insertions(+), 15 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index be290e7d69d..4b45bb912fa 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -11,25 +11,25 @@ - + https://github.com/dotnet/arcade - 1b053babb8a542e3ab20f93b3d0aedc732b7e0c7 + 6a8491b61e0c243cbb6a7ff4966b48e6d1e075b1 - + https://github.com/dotnet/arcade - 1b053babb8a542e3ab20f93b3d0aedc732b7e0c7 + 6a8491b61e0c243cbb6a7ff4966b48e6d1e075b1 - + https://github.com/dotnet/arcade - 1b053babb8a542e3ab20f93b3d0aedc732b7e0c7 + 6a8491b61e0c243cbb6a7ff4966b48e6d1e075b1 - + https://github.com/dotnet/arcade - 1b053babb8a542e3ab20f93b3d0aedc732b7e0c7 + 6a8491b61e0c243cbb6a7ff4966b48e6d1e075b1 - + https://github.com/dotnet/arcade - 1b053babb8a542e3ab20f93b3d0aedc732b7e0c7 + 6a8491b61e0c243cbb6a7ff4966b48e6d1e075b1 https://github.com/dotnet/arcade-services diff --git a/eng/Versions.props b/eng/Versions.props index 97c23f36f28..42328e54e90 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -65,8 +65,8 @@ 2.4.1 2.0.3 2.4.1 - 6.0.0-beta.21363.2 - 6.0.0-beta.21363.2 + 6.0.0-beta.21364.3 + 6.0.0-beta.21364.3 1.22.0 1.1.2 2.0.0 @@ -77,7 +77,7 @@ 1.1.0-beta.20258.6 1.1.0-beta-21309-01 1.1.0-beta-21309-01 - 6.0.0-beta.21363.2 + 6.0.0-beta.21364.3 1.0.0-beta.21364.1 1.1.0-beta.21228.1 1.0.0-prerelease.21357.4 diff --git a/global.json b/global.json index 012e28fb06e..f99825bdd1d 100644 --- a/global.json +++ b/global.json @@ -3,7 +3,7 @@ "dotnet": "6.0.100-preview.4.21255.9" }, "msbuild-sdks": { - "Microsoft.DotNet.Arcade.Sdk": "6.0.0-beta.21363.2", - "Microsoft.DotNet.Helix.Sdk": "6.0.0-beta.21363.2" + "Microsoft.DotNet.Arcade.Sdk": "6.0.0-beta.21364.3", + "Microsoft.DotNet.Helix.Sdk": "6.0.0-beta.21364.3" } } From 7b88b24068ecb4f6cf1da8395dbc2dee25a700bd Mon Sep 17 00:00:00 2001 From: Eric StJohn Date: Thu, 15 Jul 2021 17:31:06 -0700 Subject: [PATCH 227/699] Revert "Exclude inboxed analyzers from VerifyClosure task (#7624)" (#7633) This reverts commit a311590405df7e4f4525e1d3b93cf16ddf8f8e91. --- .../targets/sharedfx.targets | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/Microsoft.DotNet.SharedFramework.Sdk/targets/sharedfx.targets b/src/Microsoft.DotNet.SharedFramework.Sdk/targets/sharedfx.targets index b06ac3f40c6..df74bf08695 100644 --- a/src/Microsoft.DotNet.SharedFramework.Sdk/targets/sharedfx.targets +++ b/src/Microsoft.DotNet.SharedFramework.Sdk/targets/sharedfx.targets @@ -457,9 +457,6 @@ - - From b03966cd85285e425ffe56003c0ab57e103dd14e Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Fri, 16 Jul 2021 15:01:28 +0000 Subject: [PATCH 228/699] [main] Update dependencies from dotnet/xliff-tasks dotnet/arcade mono/linker (#7637) [main] Update dependencies from dotnet/xliff-tasks dotnet/arcade mono/linker --- eng/Version.Details.xml | 28 ++++++++++++++-------------- eng/Versions.props | 10 +++++----- global.json | 4 ++-- 3 files changed, 21 insertions(+), 21 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index 4b45bb912fa..28ea240ab5c 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -11,25 +11,25 @@ - + https://github.com/dotnet/arcade - 6a8491b61e0c243cbb6a7ff4966b48e6d1e075b1 + 7b88b24068ecb4f6cf1da8395dbc2dee25a700bd - + https://github.com/dotnet/arcade - 6a8491b61e0c243cbb6a7ff4966b48e6d1e075b1 + 7b88b24068ecb4f6cf1da8395dbc2dee25a700bd - + https://github.com/dotnet/arcade - 6a8491b61e0c243cbb6a7ff4966b48e6d1e075b1 + 7b88b24068ecb4f6cf1da8395dbc2dee25a700bd - + https://github.com/dotnet/arcade - 6a8491b61e0c243cbb6a7ff4966b48e6d1e075b1 + 7b88b24068ecb4f6cf1da8395dbc2dee25a700bd - + https://github.com/dotnet/arcade - 6a8491b61e0c243cbb6a7ff4966b48e6d1e075b1 + 7b88b24068ecb4f6cf1da8395dbc2dee25a700bd https://github.com/dotnet/arcade-services @@ -47,9 +47,9 @@ https://github.com/dotnet/roslyn 246ce641f04b67ef017655275d850bf902a8e40f - + https://github.com/mono/linker - e1c0c83d24d619ba37cdfc8bd7f8c8ebaf9f309b + 9ecf5bd2809f93d98c1dbea640790ca5a88d35ec https://github.com/dotnet/sourcelink @@ -68,9 +68,9 @@ https://github.com/dotnet/symreader-converter c5ba7c88f92e2dde156c324a8c8edc04d9fa4fe0 - + https://github.com/dotnet/xliff-tasks - 2bef7706c6016c8db4360911c8259a07e7f212e2 + 027a6514519ec9d98dae0f123fb411a455323f91 diff --git a/eng/Versions.props b/eng/Versions.props index 42328e54e90..22bbad9243c 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -35,7 +35,7 @@ 2.1.1 2.1.0 3.10.0-4.21329.37 - 6.0.100-preview.6.21363.1 + 6.0.100-preview.6.21365.1 16.7.1 4.8.3 5.3.0.1 @@ -65,8 +65,8 @@ 2.4.1 2.0.3 2.4.1 - 6.0.0-beta.21364.3 - 6.0.0-beta.21364.3 + 6.0.0-beta.21365.11 + 6.0.0-beta.21365.11 1.22.0 1.1.2 2.0.0 @@ -77,8 +77,8 @@ 1.1.0-beta.20258.6 1.1.0-beta-21309-01 1.1.0-beta-21309-01 - 6.0.0-beta.21364.3 - 1.0.0-beta.21364.1 + 6.0.0-beta.21365.11 + 1.0.0-beta.21365.1 1.1.0-beta.21228.1 1.0.0-prerelease.21357.4 1.1.156602 diff --git a/global.json b/global.json index f99825bdd1d..e265b8b6a57 100644 --- a/global.json +++ b/global.json @@ -3,7 +3,7 @@ "dotnet": "6.0.100-preview.4.21255.9" }, "msbuild-sdks": { - "Microsoft.DotNet.Arcade.Sdk": "6.0.0-beta.21364.3", - "Microsoft.DotNet.Helix.Sdk": "6.0.0-beta.21364.3" + "Microsoft.DotNet.Arcade.Sdk": "6.0.0-beta.21365.11", + "Microsoft.DotNet.Helix.Sdk": "6.0.0-beta.21365.11" } } From de59b8fe51f4433ee886606736ecbac0f1fecb16 Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Mon, 19 Jul 2021 04:38:09 +0000 Subject: [PATCH 229/699] [main] Update dependencies from dotnet/xliff-tasks dotnet/arcade mono/linker (#7641) [main] Update dependencies from dotnet/xliff-tasks dotnet/arcade mono/linker --- eng/Version.Details.xml | 28 ++++++++++++++-------------- eng/Versions.props | 10 +++++----- global.json | 4 ++-- 3 files changed, 21 insertions(+), 21 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index 28ea240ab5c..e54d39bf4c3 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -11,25 +11,25 @@ - + https://github.com/dotnet/arcade - 7b88b24068ecb4f6cf1da8395dbc2dee25a700bd + b03966cd85285e425ffe56003c0ab57e103dd14e - + https://github.com/dotnet/arcade - 7b88b24068ecb4f6cf1da8395dbc2dee25a700bd + b03966cd85285e425ffe56003c0ab57e103dd14e - + https://github.com/dotnet/arcade - 7b88b24068ecb4f6cf1da8395dbc2dee25a700bd + b03966cd85285e425ffe56003c0ab57e103dd14e - + https://github.com/dotnet/arcade - 7b88b24068ecb4f6cf1da8395dbc2dee25a700bd + b03966cd85285e425ffe56003c0ab57e103dd14e - + https://github.com/dotnet/arcade - 7b88b24068ecb4f6cf1da8395dbc2dee25a700bd + b03966cd85285e425ffe56003c0ab57e103dd14e https://github.com/dotnet/arcade-services @@ -47,9 +47,9 @@ https://github.com/dotnet/roslyn 246ce641f04b67ef017655275d850bf902a8e40f - + https://github.com/mono/linker - 9ecf5bd2809f93d98c1dbea640790ca5a88d35ec + 460dd6ddb329a5588d9e4399f4257ce28dfadaca https://github.com/dotnet/sourcelink @@ -68,9 +68,9 @@ https://github.com/dotnet/symreader-converter c5ba7c88f92e2dde156c324a8c8edc04d9fa4fe0 - + https://github.com/dotnet/xliff-tasks - 027a6514519ec9d98dae0f123fb411a455323f91 + 346cb8673bc0dba67d9bf7bb3a868d921a8211f7 diff --git a/eng/Versions.props b/eng/Versions.props index 22bbad9243c..0cf45f651a6 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -35,7 +35,7 @@ 2.1.1 2.1.0 3.10.0-4.21329.37 - 6.0.100-preview.6.21365.1 + 6.0.100-preview.6.21366.2 16.7.1 4.8.3 5.3.0.1 @@ -65,8 +65,8 @@ 2.4.1 2.0.3 2.4.1 - 6.0.0-beta.21365.11 - 6.0.0-beta.21365.11 + 6.0.0-beta.21366.1 + 6.0.0-beta.21366.1 1.22.0 1.1.2 2.0.0 @@ -77,8 +77,8 @@ 1.1.0-beta.20258.6 1.1.0-beta-21309-01 1.1.0-beta-21309-01 - 6.0.0-beta.21365.11 - 1.0.0-beta.21365.1 + 6.0.0-beta.21366.1 + 1.0.0-beta.21367.1 1.1.0-beta.21228.1 1.0.0-prerelease.21357.4 1.1.156602 diff --git a/global.json b/global.json index e265b8b6a57..1540240649a 100644 --- a/global.json +++ b/global.json @@ -3,7 +3,7 @@ "dotnet": "6.0.100-preview.4.21255.9" }, "msbuild-sdks": { - "Microsoft.DotNet.Arcade.Sdk": "6.0.0-beta.21365.11", - "Microsoft.DotNet.Helix.Sdk": "6.0.0-beta.21365.11" + "Microsoft.DotNet.Arcade.Sdk": "6.0.0-beta.21366.1", + "Microsoft.DotNet.Helix.Sdk": "6.0.0-beta.21366.1" } } From 7cbe70f57e3ccf97a3604b528fde7ecd6eb79573 Mon Sep 17 00:00:00 2001 From: Davis Goodin Date: Mon, 19 Jul 2021 09:57:26 -0500 Subject: [PATCH 230/699] Update interactive example Arcade subscription (#7622) --- Documentation/DependencyFlowOnboarding.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Documentation/DependencyFlowOnboarding.md b/Documentation/DependencyFlowOnboarding.md index bdf1e1e1ce2..15eeaa204a3 100644 --- a/Documentation/DependencyFlowOnboarding.md +++ b/Documentation/DependencyFlowOnboarding.md @@ -104,8 +104,9 @@ Target Branch: Update Frequency: everyDay Batchable: False Merge Policies: -- Name: standard +- Name: Standard Properties: {} +Pull Request Failure Notification Tags: '' ``` 3. Save and close From e97027cf100d2b532adce387e5cb93a373de93c9 Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Mon, 19 Jul 2021 17:55:57 +0000 Subject: [PATCH 231/699] Update dependencies from https://github.com/dotnet/xharness build 20210714.1 (#7642) [main] Update dependencies from dotnet/xharness --- eng/Version.Details.xml | 4 ++-- eng/Versions.props | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index e54d39bf4c3..9d2dceaa30d 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -39,9 +39,9 @@ https://github.com/dotnet/arcade-services cac955fe259cb611f6a29d09209bd717deb69037 - + https://github.com/dotnet/xharness - c6d444eaf7e95339589ceef371cbef0a90a4add5 + e5511489deb44b13418fe622775bd7035e21c5ae https://github.com/dotnet/roslyn diff --git a/eng/Versions.props b/eng/Versions.props index 0cf45f651a6..8342b842ff5 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -80,7 +80,7 @@ 6.0.0-beta.21366.1 1.0.0-beta.21367.1 1.1.0-beta.21228.1 - 1.0.0-prerelease.21357.4 + 1.0.0-prerelease.21364.1 1.1.156602 1.1.156602 6.0.100-preview.5.21254.11 From b4f27c70ebbcc486adf73f801397886ee6d8da79 Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Tue, 20 Jul 2021 14:23:42 +0000 Subject: [PATCH 232/699] [main] Update dependencies from dotnet/arcade mono/linker (#7648) [main] Update dependencies from dotnet/arcade mono/linker --- eng/Version.Details.xml | 24 ++++++++++++------------ eng/Versions.props | 8 ++++---- global.json | 4 ++-- 3 files changed, 18 insertions(+), 18 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index 9d2dceaa30d..2821b9a672a 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -11,25 +11,25 @@ - + https://github.com/dotnet/arcade - b03966cd85285e425ffe56003c0ab57e103dd14e + e97027cf100d2b532adce387e5cb93a373de93c9 - + https://github.com/dotnet/arcade - b03966cd85285e425ffe56003c0ab57e103dd14e + e97027cf100d2b532adce387e5cb93a373de93c9 - + https://github.com/dotnet/arcade - b03966cd85285e425ffe56003c0ab57e103dd14e + e97027cf100d2b532adce387e5cb93a373de93c9 - + https://github.com/dotnet/arcade - b03966cd85285e425ffe56003c0ab57e103dd14e + e97027cf100d2b532adce387e5cb93a373de93c9 - + https://github.com/dotnet/arcade - b03966cd85285e425ffe56003c0ab57e103dd14e + e97027cf100d2b532adce387e5cb93a373de93c9 https://github.com/dotnet/arcade-services @@ -47,9 +47,9 @@ https://github.com/dotnet/roslyn 246ce641f04b67ef017655275d850bf902a8e40f - + https://github.com/mono/linker - 460dd6ddb329a5588d9e4399f4257ce28dfadaca + 8d49e169d872d6225bcf73ae14ae50b002f39319 https://github.com/dotnet/sourcelink diff --git a/eng/Versions.props b/eng/Versions.props index 8342b842ff5..9f0b898f19f 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -35,7 +35,7 @@ 2.1.1 2.1.0 3.10.0-4.21329.37 - 6.0.100-preview.6.21366.2 + 6.0.100-preview.6.21369.3 16.7.1 4.8.3 5.3.0.1 @@ -65,8 +65,8 @@ 2.4.1 2.0.3 2.4.1 - 6.0.0-beta.21366.1 - 6.0.0-beta.21366.1 + 6.0.0-beta.21369.3 + 6.0.0-beta.21369.3 1.22.0 1.1.2 2.0.0 @@ -77,7 +77,7 @@ 1.1.0-beta.20258.6 1.1.0-beta-21309-01 1.1.0-beta-21309-01 - 6.0.0-beta.21366.1 + 6.0.0-beta.21369.3 1.0.0-beta.21367.1 1.1.0-beta.21228.1 1.0.0-prerelease.21364.1 diff --git a/global.json b/global.json index 1540240649a..e3311e8d991 100644 --- a/global.json +++ b/global.json @@ -3,7 +3,7 @@ "dotnet": "6.0.100-preview.4.21255.9" }, "msbuild-sdks": { - "Microsoft.DotNet.Arcade.Sdk": "6.0.0-beta.21366.1", - "Microsoft.DotNet.Helix.Sdk": "6.0.0-beta.21366.1" + "Microsoft.DotNet.Arcade.Sdk": "6.0.0-beta.21369.3", + "Microsoft.DotNet.Helix.Sdk": "6.0.0-beta.21369.3" } } From d3144387176fa68e1e72d612b956e626052512dc Mon Sep 17 00:00:00 2001 From: Eric StJohn Date: Tue, 20 Jul 2021 10:34:29 -0700 Subject: [PATCH 233/699] Include Dependency Frameworks in set of TFMs considered for package testing (#7645) * Include Dependency Frameworks in set of TFMs considered for package testing. * Add test for raising test frameworks from dependency groups. --- ...CompatibilePackageTargetFrameworksTests.cs | 29 ++++++++++++++++++- .../NupkgParser.cs | 5 +++- .../Package.cs | 3 +- 3 files changed, 34 insertions(+), 3 deletions(-) diff --git a/src/Microsoft.DotNet.PackageTesting.Tests/GetCompatibilePackageTargetFrameworksTests.cs b/src/Microsoft.DotNet.PackageTesting.Tests/GetCompatibilePackageTargetFrameworksTests.cs index 949b15ceccc..1fbcc5ff995 100644 --- a/src/Microsoft.DotNet.PackageTesting.Tests/GetCompatibilePackageTargetFrameworksTests.cs +++ b/src/Microsoft.DotNet.PackageTesting.Tests/GetCompatibilePackageTargetFrameworksTests.cs @@ -2,6 +2,7 @@ // The .NET Foundation licenses this file to you under the MIT license. using System.Collections.Generic; +using System.Linq; using NuGet.Frameworks; using Xunit; @@ -135,11 +136,37 @@ public GetCompatibilePackageTargetFrameworksTests() [MemberData(nameof(PackageTfmData))] public void GetCompatibleFrameworks(List filePaths, List expectedTestFrameworks) { - Package package = new("TestPackage", "1.0.0", filePaths); + Package package = new("TestPackage", "1.0.0", filePaths, Enumerable.Empty()); IEnumerable actualTestFrameworks = GetCompatiblePackageTargetFrameworks.GetTestFrameworks(package, "netcoreapp3.1"); CollectionsEqual(expectedTestFrameworks, actualTestFrameworks); } + [Fact] + public void GetCompatibleFrameworksFromDependencies() + { + var dependencyFrameworks = new[] + { + FrameworkConstants.CommonFrameworks.NetCoreApp21, + FrameworkConstants.CommonFrameworks.NetCoreApp31, + FrameworkConstants.CommonFrameworks.NetStandard20, + FrameworkConstants.CommonFrameworks.NetStandard21, + NuGetFramework.Parse("net6.0"), + }; + Package package = new("TestPackage", "1.0.0", Enumerable.Empty(), dependencyFrameworks); + IEnumerable actualTestFrameworks = GetCompatiblePackageTargetFrameworks.GetTestFrameworks(package, "netcoreapp3.1"); + + var expectedTestFrameworks = new[] + { + NuGetFramework.Parse("net6.0"), + FrameworkConstants.CommonFrameworks.NetCoreApp31, + FrameworkConstants.CommonFrameworks.Net461, + FrameworkConstants.CommonFrameworks.Net462, + FrameworkConstants.CommonFrameworks.NetStandard20, + FrameworkConstants.CommonFrameworks.NetStandard21 + }; + CollectionsEqual(expectedTestFrameworks, actualTestFrameworks); + } + private static void CollectionsEqual(IEnumerable T1, IEnumerable T2) { foreach (var item in T1) diff --git a/src/Microsoft.DotNet.PackageTesting/NupkgParser.cs b/src/Microsoft.DotNet.PackageTesting/NupkgParser.cs index 9832e3f592a..919041292dc 100644 --- a/src/Microsoft.DotNet.PackageTesting/NupkgParser.cs +++ b/src/Microsoft.DotNet.PackageTesting/NupkgParser.cs @@ -2,6 +2,7 @@ // The .NET Foundation licenses this file to you under the MIT license. using System.Linq; +using NuGet.Frameworks; using NuGet.Packaging; namespace Microsoft.DotNet.PackageTesting @@ -16,7 +17,9 @@ public static Package CreatePackageObject(string packagePath) string packageId = nuspecReader.GetId(); string version = nuspecReader.GetVersion().ToString(); - return new Package(packageId, version, nupkgReader.GetFiles()?.Where(t => t.EndsWith(packageId + ".dll"))); + NuGetFramework[] dependencyFrameworks = nuspecReader.GetDependencyGroups().Select(dg => dg.TargetFramework).Where(tfm => tfm != null).ToArray(); + + return new Package(packageId, version, nupkgReader.GetFiles()?.Where(t => t.EndsWith(packageId + ".dll")), dependencyFrameworks); } } } diff --git a/src/Microsoft.DotNet.PackageTesting/Package.cs b/src/Microsoft.DotNet.PackageTesting/Package.cs index 8574dea2e3a..303d4713b76 100644 --- a/src/Microsoft.DotNet.PackageTesting/Package.cs +++ b/src/Microsoft.DotNet.PackageTesting/Package.cs @@ -11,7 +11,7 @@ namespace Microsoft.DotNet.PackageTesting { public class Package { - public Package(string packageId, string version, IEnumerable packageAssetPaths) + public Package(string packageId, string version, IEnumerable packageAssetPaths, IEnumerable dependencyFrameworks) { PackageId = packageId; Version = version; @@ -27,6 +27,7 @@ public Package(string packageId, string version, IEnumerable packageAsse IEnumerable RuntimeAssets = packageAssets.FindItems(conventions.Patterns.RuntimeAssemblies); FrameworksInPackageList.AddRange(RuntimeAssets.Select(t => (NuGetFramework)t.Properties["tfm"]).Distinct()); + FrameworksInPackageList.AddRange(dependencyFrameworks); FrameworksInPackage = FrameworksInPackageList.Distinct(); } From d74d98df8324fe0d7131a0f2ec7447b7d7665190 Mon Sep 17 00:00:00 2001 From: Alitzel Mendez <6895254+AlitzelMendez@users.noreply.github.com> Date: Tue, 20 Jul 2021 12:39:49 -0700 Subject: [PATCH 234/699] Update Build Retry Documentation (#7644) * Build Retry * update build retry doc --- .../Build Analysis/BuildRetryOnboard.md | 92 ++++++++++++++++++- 1 file changed, 91 insertions(+), 1 deletion(-) diff --git a/Documentation/Projects/Build Analysis/BuildRetryOnboard.md b/Documentation/Projects/Build Analysis/BuildRetryOnboard.md index b13ca0a1cb2..546619169ab 100644 --- a/Documentation/Projects/Build Analysis/BuildRetryOnboard.md +++ b/Documentation/Projects/Build Analysis/BuildRetryOnboard.md @@ -43,6 +43,33 @@ Ex. \eng\BuildConfiguration\build-configuration.json { "StageName":"StageName" } + ], + "RetryJobsInStage":[ + { + "StageName":"StageName", + "JobsNames":["JobName"] + } + ] + }, + "RetryByErrorsInPipeline":{ + "ErrorInPipelineByStage":[ + { + "StageName":"StageName", + "ErrorRegex":"Regex" + } + ], + "ErrorInPipelineByJobs":[ + { + "JobsNames":["JobName"], + "ErrorRegex":"Regex" + } + ], + "ErrorInPipelineByJobsInStage":[ + { + "StageName":"StageName", + "JobsNames":["JobName"], + "ErrorRegex":"Regex" + } ] } } @@ -98,7 +125,70 @@ Default value: False. "RetryByPipeline":{ "RetryStages":[ { - "StageName":"Build" + "StageName":"StageName" + } + ] + } + } + ``` + If you want to retry jobs under a specific stage, you can do that by defining the stage name and then the jobs that you want to retry that are under that stage. You will need to define each stage separately. + ```json + { + "RetryCountLimit":1, + "RetryByPipeline":{ + "RetryJobsInStage":[ + { + "StageName":"StageName", + "JobsNames":[ "JobNameA", "JobNameB" ] + } + ] + } + } + ``` +- **RetryByErrorsInPipeline:** This is a combination of retry by error and retry by pipeline, in which you will be able to retry a build base on errors found in specific places on the pipeline.
+This gives you a more granular control on which error do you want that get retried.
+For example, imagine that you have an error: "Vstest failed with error." that most of the time happens in StageA, when it happens on StageA and you retry the build it usually finishes successfully. Unfortunately, the same error could happen on StageB and when that happens it is unusual. So, if you want the build only gets retried when the error happens in StageA you can define that: + + ```json + { + "RetryCountLimit":1, + "RetryByErrorsInPipeline":{ + "ErrorInPipelineByStage":[ + { + "StageName":"StageA", + "ErrorRegex":"Vstest failed with error.*" + } + ] + } + } + ``` + + This same principle can be applied to errors under specific job names: + + ```json + { + "RetryCountLimit":1, + "RetryByErrorsInPipeline":{ + "ErrorInPipelineByJobs":[ + { + "JobsNames":["JobNameA","JobNameB"], + "ErrorRegex":"Regex" + } + ] + } + } + ``` + + and errors for Jobs under a specific Stage: + ```json + { + "RetryCountLimit":1, + "RetryByErrorsInPipeline":{ + "ErrorInPipelineByJobsInStage":[ + { + "StageName":"StageName", + "JobsNames":["JobNameA", "JobNameB"], + "ErrorRegex":"Regex" } ] } From 89806f0b9e93ad2bbe32c654412835c0801a2032 Mon Sep 17 00:00:00 2001 From: Epsitha Ananth <47157394+epananth@users.noreply.github.com> Date: Tue, 20 Jul 2021 13:48:42 -0700 Subject: [PATCH 235/699] Enable or disable telemetry (#7638) * turn off telemetry * add turnOffTelemetry to task * typo * Added some comments * review comments * remove comments * test fix * Test * last time * Updated comments * merge conflict * test * rename variable * comments * review comments * minor fix * comment --- .../src/Telemetry.cs | 25 +++++++++++++------ 1 file changed, 17 insertions(+), 8 deletions(-) diff --git a/src/Microsoft.DotNet.SignTool/src/Telemetry.cs b/src/Microsoft.DotNet.SignTool/src/Telemetry.cs index 7faf1af06d4..1910970a318 100644 --- a/src/Microsoft.DotNet.SignTool/src/Telemetry.cs +++ b/src/Microsoft.DotNet.SignTool/src/Telemetry.cs @@ -20,26 +20,35 @@ internal class Telemetry { "BUILD_SOURCEVERSION", Environment.GetEnvironmentVariable("BUILD_SOURCEVERSION") } }; + private readonly bool _disableTelemetry ; + public Telemetry() { _metrics = new Dictionary(); + _disableTelemetry = + (!string.IsNullOrEmpty(Environment.GetEnvironmentVariable("SIGNTOOL_DISABLE_TELEMETRY"))); } internal void AddMetric(string name, double value) { - _metrics.Add(name, value); + if (!_disableTelemetry) + { + _metrics.Add(name, value); + } } internal void SendEvents() { - // set APPINSIGHTS_INSTRUMENTATIONKEY environment variable to begin tracking telemetry - TelemetryConfiguration configuration = TelemetryConfiguration.CreateDefault(); - - TelemetryClient telemetryClient = new TelemetryClient(configuration); + if (!_disableTelemetry) + { + // set APPINSIGHTS_INSTRUMENTATIONKEY environment variable to begin tracking telemetry + TelemetryConfiguration configuration = TelemetryConfiguration.CreateDefault(); + TelemetryClient telemetryClient = new TelemetryClient(configuration); - telemetryClient.TrackEvent(s_sendEventName, properties: s_properties, metrics: _metrics); - telemetryClient.Flush(); - _metrics = null; + telemetryClient.TrackEvent(s_sendEventName, properties: s_properties, metrics: _metrics); + telemetryClient.Flush(); + _metrics = null; + } } } } From dc5deb120047922d85aa0a002e1aea64f2db41b2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C5=99emek=20Vysok=C3=BD?= Date: Wed, 21 Jul 2021 15:54:42 +0200 Subject: [PATCH 236/699] Support custom commands in Android XHarness SDK (#7582) - Adds support for `` in Android flows - Changes Android windows payload script from `.bat` to `.ps1` - Allows to re-use 1 app for multiple work items but different inputs (and specify work item name) - Adds tests for custom commands - De-duplicates common code unit test projects - Makes unit tests work in non-ci runs --- azure-pipelines.yml | 14 +- .../CreateXHarnessAndroidWorkItemsTests.cs | 60 +++++-- .../CreateXHarnessAppleWorkItemsTests.cs | 56 +++++- .../Sdk/CreateXHarnessAndroidWorkItems.cs | 168 +++++++++++------- .../Sdk/CreateXHarnessAppleWorkItems.cs | 71 +++++--- .../Sdk/Microsoft.DotNet.Helix.Sdk.csproj | 2 +- .../Sdk/XharnessTaskBase.cs | 10 ++ .../Sdk/tools/xharness-runner/Readme.md | 35 +++- .../xharness-helix-job.android.bat | 23 --- .../xharness-helix-job.android.ps1 | 49 +++++ .../xharness-helix-job.android.sh | 76 +++++++- .../xharness-runner/xharness-runner.apple.sh | 8 +- tests/UnitTests.XHarness.Android.Device.proj | 14 ++ .../UnitTests.XHarness.Android.Simulator.proj | 20 +++ ...tTests.XHarness.Android.WindowsQueues.proj | 52 ------ ...s.proj => UnitTests.XHarness.Common.props} | 26 +-- tests/UnitTests.XHarness.iOS.Device.proj | 31 +--- tests/UnitTests.XHarness.iOS.Simulator.proj | 34 +--- tests/XHarness/XHarness.TestApks.proj | 24 ++- 19 files changed, 490 insertions(+), 283 deletions(-) delete mode 100644 src/Microsoft.DotNet.Helix/Sdk/tools/xharness-runner/xharness-helix-job.android.bat create mode 100644 src/Microsoft.DotNet.Helix/Sdk/tools/xharness-runner/xharness-helix-job.android.ps1 create mode 100644 tests/UnitTests.XHarness.Android.Device.proj create mode 100644 tests/UnitTests.XHarness.Android.Simulator.proj delete mode 100644 tests/UnitTests.XHarness.Android.WindowsQueues.proj rename tests/{UnitTests.XHarness.Android.LinuxQueues.proj => UnitTests.XHarness.Common.props} (59%) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index d47f9957bd3..5a751ef9288 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -142,10 +142,10 @@ stages: -ci -restore -test - -projects $(Build.SourcesDirectory)\tests\UnitTests.XHarness.Android.WindowsQueues.proj - /bl:$(Build.SourcesDirectory)\artifacts\log\$(_BuildConfig)\Helix.XHarness.Android.WindowsQueues.binlog + -projects $(Build.SourcesDirectory)\tests\UnitTests.XHarness.Android.Device.proj + /bl:$(Build.SourcesDirectory)\artifacts\log\$(_BuildConfig)\Helix.XHarness.Android.Device.binlog /p:RestoreUsingNuGetTargets=false - /p:XharnessTestARM64_V8A=true + /p:XHarnessTestARM64_V8A=true displayName: XHarness Android Helix Testing (Windows) env: SYSTEM_ACCESSTOKEN: $(System.AccessToken) @@ -210,11 +210,11 @@ stages: -ci -restore -test - -projects $(Build.SourcesDirectory)/tests/UnitTests.XHarness.Android.LinuxQueues.proj - /bl:$(Build.SourcesDirectory)/artifacts/log/$(_BuildConfig)/Helix.XHarness.Android.LinuxQueues.binlog + -projects $(Build.SourcesDirectory)/tests/UnitTests.XHarness.Android.Simulator.proj + /bl:$(Build.SourcesDirectory)/artifacts/log/$(_BuildConfig)/Helix.XHarness.Android.Simulator.binlog /p:RestoreUsingNuGetTargets=false - /p:XharnessTestX86=true - /p:XharnessTestX86_64=true + /p:XHarnessTestX86=true + /p:XHarnessTestX86_64=true displayName: XHarness Android Helix Testing (Linux) env: SYSTEM_ACCESSTOKEN: $(System.AccessToken) diff --git a/src/Microsoft.DotNet.Helix/Sdk.Tests/Microsoft.DotNet.Helix.Sdk.Tests/CreateXHarnessAndroidWorkItemsTests.cs b/src/Microsoft.DotNet.Helix/Sdk.Tests/Microsoft.DotNet.Helix.Sdk.Tests/CreateXHarnessAndroidWorkItemsTests.cs index af852c7a545..8115f06826c 100644 --- a/src/Microsoft.DotNet.Helix/Sdk.Tests/Microsoft.DotNet.Helix.Sdk.Tests/CreateXHarnessAndroidWorkItemsTests.cs +++ b/src/Microsoft.DotNet.Helix/Sdk.Tests/Microsoft.DotNet.Helix.Sdk.Tests/CreateXHarnessAndroidWorkItemsTests.cs @@ -83,12 +83,12 @@ public void AndroidXHarnessWorkItemIsCreated() _fileSystem.FileExists(payloadArchive).Should().BeTrue(); var command = workItem.GetMetadata("Command"); - command.Should().Contain("--timeout \"00:08:55\""); + command.Should().Contain("-timeout \"00:08:55\""); _zipArchiveManager .Verify(x => x.AddResourceFileToArchive(payloadArchive, It.Is(s => s.Contains("xharness-helix-job.android.sh")), "xharness-helix-job.android.sh"), Times.AtLeastOnce); _zipArchiveManager - .Verify(x => x.AddResourceFileToArchive(payloadArchive, It.Is(s => s.Contains("xharness-helix-job.android.bat")), "xharness-helix-job.android.bat"), Times.AtLeastOnce); + .Verify(x => x.AddResourceFileToArchive(payloadArchive, It.Is(s => s.Contains("xharness-helix-job.android.ps1")), "xharness-helix-job.android.ps1"), Times.AtLeastOnce); } [Fact] @@ -123,6 +123,40 @@ public void ArchivePayloadIsOverwritten() _fileSystem.RemovedFiles.Should().Contain(payloadArchive); } + [Fact] + public void ApkIsReused() + { + var collection = CreateMockServiceCollection(); + _task.ConfigureServices(collection); + _task.Apks = new[] + { + CreateApk("item-1", "System.Foo", apkPath: "apks/System.Foo.apk"), + CreateApk("item-2", "System.Foo", apkPath: "apks/System.Foo.apk"), + }; + + // Act + using var provider = collection.BuildServiceProvider(); + _task.InvokeExecute(provider).Should().BeTrue(); + + // Verify + _task.WorkItems.Length.Should().Be(2); + _fileSystem.RemovedFiles.Should().BeEmpty(); + + var workItem1 = _task.WorkItems.Last(); + workItem1.GetMetadata("Identity").Should().Be("item-2"); + + var payloadArchive = workItem1.GetMetadata("PayloadArchive"); + payloadArchive.Should().NotBeNullOrEmpty(); + _fileSystem.FileExists(payloadArchive).Should().BeTrue(); + + var workItem2 = _task.WorkItems.First(); + workItem2.GetMetadata("Identity").Should().Be("item-1"); + + payloadArchive = workItem2.GetMetadata("PayloadArchive"); + payloadArchive.Should().NotBeNullOrEmpty(); + _fileSystem.FileExists(payloadArchive).Should().BeTrue(); + } + [Fact] public void AreDependenciesRegistered() { @@ -142,32 +176,38 @@ public void AreDependenciesRegistered() } private ITaskItem CreateApk( - string path, + string itemSpec, string apkName, string? workItemTimeout = null, string? testTimeout = null, - int expectedExitCode = 0) + int expectedExitCode = 0, + string? apkPath = null) { var mockBundle = new Mock(); - mockBundle.SetupGet(x => x.ItemSpec).Returns(path); - mockBundle.Setup(x => x.GetMetadata("AndroidPackageName")).Returns(apkName); + mockBundle.SetupGet(x => x.ItemSpec).Returns(itemSpec); + mockBundle.Setup(x => x.GetMetadata(CreateXHarnessAndroidWorkItems.MetadataNames.AndroidPackageName)).Returns(apkName); if (workItemTimeout != null) { - mockBundle.Setup(x => x.GetMetadata("WorkItemTimeout")).Returns(workItemTimeout); + mockBundle.Setup(x => x.GetMetadata(XHarnessTaskBase.MetadataName.WorkItemTimeout)).Returns(workItemTimeout); } if (testTimeout != null) { - mockBundle.Setup(x => x.GetMetadata("TestTimeout")).Returns(testTimeout); + mockBundle.Setup(x => x.GetMetadata(XHarnessTaskBase.MetadataName.TestTimeout)).Returns(testTimeout); } if (expectedExitCode != 0) { - mockBundle.Setup(x => x.GetMetadata("ExpectedExitCode")).Returns(expectedExitCode.ToString()); + mockBundle.Setup(x => x.GetMetadata(XHarnessTaskBase.MetadataName.ExpectedExitCode)).Returns(expectedExitCode.ToString()); + } + + if (apkPath != null) + { + mockBundle.Setup(x => x.GetMetadata(CreateXHarnessAndroidWorkItems.MetadataNames.ApkPath)).Returns(apkPath); } - _fileSystem.WriteToFile(path, "apk"); + _fileSystem.WriteToFile(apkPath ?? itemSpec, "apk"); return mockBundle.Object; } diff --git a/src/Microsoft.DotNet.Helix/Sdk.Tests/Microsoft.DotNet.Helix.Sdk.Tests/CreateXHarnessAppleWorkItemsTests.cs b/src/Microsoft.DotNet.Helix/Sdk.Tests/Microsoft.DotNet.Helix.Sdk.Tests/CreateXHarnessAppleWorkItemsTests.cs index b1c76a859a2..86e5f9366b5 100644 --- a/src/Microsoft.DotNet.Helix/Sdk.Tests/Microsoft.DotNet.Helix.Sdk.Tests/CreateXHarnessAppleWorkItemsTests.cs +++ b/src/Microsoft.DotNet.Helix/Sdk.Tests/Microsoft.DotNet.Helix.Sdk.Tests/CreateXHarnessAppleWorkItemsTests.cs @@ -112,7 +112,7 @@ public void ArchivePayloadIsOverwritten() CreateAppBundle("apps/System.Bar.app", "ios-simulator-64_13.5"), }; - _fileSystem.Files.Add("apps/xharness-app-payload-system.foo.app.zip", "archive"); + _fileSystem.Files.Add("apps/xharness-app-payload-system.foo.zip", "archive"); // Act using var provider = collection.BuildServiceProvider(); @@ -161,6 +161,46 @@ public void CustomCommandsAreExecuted() .Verify(x => x.AddContentToArchive(payloadArchive, "command.sh", "echo foo"), Times.Once); } + [Fact] + public void AppBundleIsReused() + { + var collection = CreateMockServiceCollection(); + _task.ConfigureServices(collection); + _task.AppBundles = new[] + { + CreateAppBundle("item-1", "ios-simulator-64_13.5", appBundlePath: "apps/System.Foo.app"), + CreateAppBundle("item-2", "ios-simulator-64_13.6", appBundlePath: "apps/System.Foo.app"), + }; + + // Act + using var provider = collection.BuildServiceProvider(); + _task.InvokeExecute(provider).Should().BeTrue(); + + // Verify + _task.WorkItems.Length.Should().Be(2); + _fileSystem.RemovedFiles.Should().BeEmpty(); + + var workItem1 = _task.WorkItems.Last(); + workItem1.GetMetadata("Identity").Should().Be("item-2"); + + var payloadArchive = workItem1.GetMetadata("PayloadArchive"); + payloadArchive.Should().NotBeNullOrEmpty(); + _fileSystem.FileExists(payloadArchive).Should().BeTrue(); + + var command = workItem1.GetMetadata("Command"); + command.Should().Contain("--target \"ios-simulator-64_13.6\""); + + var workItem2 = _task.WorkItems.First(); + workItem2.GetMetadata("Identity").Should().Be("item-1"); + + payloadArchive = workItem2.GetMetadata("PayloadArchive"); + payloadArchive.Should().NotBeNullOrEmpty(); + _fileSystem.FileExists(payloadArchive).Should().BeTrue(); + + command = workItem2.GetMetadata("Command"); + command.Should().Contain("--target \"ios-simulator-64_13.5\""); + } + [Fact] public void AreDependenciesRegistered() { @@ -180,17 +220,18 @@ public void AreDependenciesRegistered() } private ITaskItem CreateAppBundle( - string path, + string itemSpec, string target, string? workItemTimeout = null, string? testTimeout = null, string? launchTimeout = null, int expectedExitCode = 0, bool includesTestRunner = true, - string? customCommands = null) + string? customCommands = null, + string? appBundlePath = null) { var mockBundle = new Mock(); - mockBundle.SetupGet(x => x.ItemSpec).Returns(path); + mockBundle.SetupGet(x => x.ItemSpec).Returns(itemSpec); mockBundle.Setup(x => x.GetMetadata(CreateXHarnessAppleWorkItems.MetadataNames.Target)).Returns(target); mockBundle.Setup(x => x.GetMetadata(CreateXHarnessAppleWorkItems.MetadataNames.IncludesTestRunner)).Returns(includesTestRunner.ToString()); @@ -219,7 +260,12 @@ private ITaskItem CreateAppBundle( mockBundle.Setup(x => x.GetMetadata(XHarnessTaskBase.MetadataName.CustomCommands)).Returns(customCommands); } - _fileSystem.CreateDirectory(path); + if (appBundlePath != null) + { + mockBundle.Setup(x => x.GetMetadata(CreateXHarnessAppleWorkItems.MetadataNames.AppBundlePath)).Returns(appBundlePath); + } + + _fileSystem.CreateDirectory(appBundlePath ?? itemSpec); return mockBundle.Object; } diff --git a/src/Microsoft.DotNet.Helix/Sdk/CreateXHarnessAndroidWorkItems.cs b/src/Microsoft.DotNet.Helix/Sdk/CreateXHarnessAndroidWorkItems.cs index d2910307991..bcec332732f 100644 --- a/src/Microsoft.DotNet.Helix/Sdk/CreateXHarnessAndroidWorkItems.cs +++ b/src/Microsoft.DotNet.Helix/Sdk/CreateXHarnessAndroidWorkItems.cs @@ -1,5 +1,4 @@ using System; -using System.Collections.Generic; using System.IO; using System.Linq; using System.Threading.Tasks; @@ -15,13 +14,17 @@ namespace Microsoft.DotNet.Helix.Sdk ///
public class CreateXHarnessAndroidWorkItems : XHarnessTaskBase { - private const string ArgumentsPropName = "Arguments"; - private const string AndroidInstrumentationNamePropName = "AndroidInstrumentationName"; - private const string DeviceOutputPathPropName = "DeviceOutputPath"; - private const string AndroidPackageNamePropName = "AndroidPackageName"; + public static class MetadataNames + { + public const string Arguments = "Arguments"; + public const string AndroidInstrumentationName = "AndroidInstrumentationName"; + public const string DeviceOutputPath = "DeviceOutputPath"; + public const string AndroidPackageName = "AndroidPackageName"; + public const string ApkPath = "ApkPath"; + } private const string PosixAndroidWrapperScript = "xharness-helix-job.android.sh"; - private const string NonPosixAndroidWrapperScript = "xharness-helix-job.android.bat"; + private const string NonPosixAndroidWrapperScript = "xharness-helix-job.android.ps1"; ///
/// Boolean true if this is a posix shell, false if not. @@ -64,34 +67,114 @@ public bool ExecuteTask(IZipArchiveManager zipArchiveManager, IFileSystem fileSy /// An ITaskItem instance representing the prepared HelixWorkItem. private async Task PrepareWorkItem(IZipArchiveManager zipArchiveManager, IFileSystem fileSystem, ITaskItem appPackage) { - string workItemName = fileSystem.GetFileNameWithoutExtension(appPackage.ItemSpec); - - var (testTimeout, workItemTimeout, expectedExitCode, customCommands) = ParseMetadata(appPackage); + // The user can re-use the same .apk for 2 work items so the name of the work item will come from ItemSpec and path from metadata + // This can be useful when we want to run the same app with different parameters or run the same app on different test targets, e.g. iOS 13 and 13.5 + string workItemName; + string apkPath; + if (appPackage.TryGetMetadata(MetadataNames.ApkPath, out string apkPathMetadata) && !string.IsNullOrEmpty(apkPathMetadata)) + { + workItemName = appPackage.ItemSpec; + apkPath = apkPathMetadata; + } + else + { + workItemName = fileSystem.GetFileNameWithoutExtension(appPackage.ItemSpec); + apkPath = appPackage.ItemSpec; + } - string command = ValidateMetadataAndGetXHarnessAndroidCommand(appPackage, testTimeout, expectedExitCode); + if (!fileSystem.FileExists(apkPath)) + { + Log.LogError($"App package not found in {apkPath}"); + return null; + } - if (!fileSystem.GetExtension(appPackage.ItemSpec).Equals(".apk", StringComparison.OrdinalIgnoreCase)) + if (!fileSystem.GetExtension(apkPath).Equals(".apk", StringComparison.OrdinalIgnoreCase)) { - Log.LogError($"Unsupported app package type: {fileSystem.GetFileName(appPackage.ItemSpec)}"); + Log.LogError($"Unsupported app package type: {fileSystem.GetFileName(apkPath)}"); return null; } - Log.LogMessage($"Creating work item with properties Identity: {workItemName}, Payload: {appPackage.ItemSpec}, Command: {command}"); + // Validation of any metadata specific to Android stuff goes here + if (!appPackage.GetRequiredMetadata(Log, MetadataNames.AndroidPackageName, out string androidPackageName)) + { + Log.LogError($"{MetadataNames.AndroidPackageName} metadata must be specified; this may match, but can vary from file name"); + return null; + } - string workItemZip = await CreateZipArchiveOfPackageAsync(zipArchiveManager, fileSystem, appPackage.ItemSpec); + var (testTimeout, workItemTimeout, expectedExitCode, customCommands) = ParseMetadata(appPackage); - return new Build.Utilities.TaskItem(workItemName, new Dictionary() + if (customCommands == null) { - { "Identity", workItemName }, - { "PayloadArchive", workItemZip }, - { "Command", command }, - { "Timeout", workItemTimeout.ToString() }, - }); + // When no user commands are specified, we add the default `android test ...` command + customCommands = GetDefaultCommand(appPackage, expectedExitCode); + } + + string command = GetHelixCommand(appPackage, apkPath, androidPackageName, testTimeout, expectedExitCode); + + Log.LogMessage($"Creating work item with properties Identity: {workItemName}, Payload: {apkPath}, Command: {command}"); + + string workItemZip = await CreateZipArchiveOfPackageAsync(zipArchiveManager, fileSystem, workItemName, apkPath, customCommands); + + return CreateTaskItem(workItemName, workItemZip, command, workItemTimeout); } - private async Task CreateZipArchiveOfPackageAsync(IZipArchiveManager zipArchiveManager, IFileSystem fileSystem, string fileToZip) + private string GetDefaultCommand(ITaskItem appPackage, int expectedExitCode) { - string fileName = $"xharness-apk-payload-{fileSystem.GetFileNameWithoutExtension(fileToZip).ToLowerInvariant()}.zip"; + appPackage.TryGetMetadata(MetadataNames.Arguments, out string extraArguments); + + var exitCodeArg = expectedExitCode != 0 ? $"--expected-exit-code $expected_exit_code" : string.Empty; + var passthroughArgs = !string.IsNullOrEmpty(AppArguments) ? $" -- {AppArguments}" : string.Empty; + + var instrumentationArg = appPackage.TryGetMetadata(MetadataNames.AndroidInstrumentationName, out string androidInstrumentationName) + ? $"--instrumentation \"{androidInstrumentationName}\"" + : string.Empty; + + var devOutArg = appPackage.TryGetMetadata(MetadataNames.DeviceOutputPath, out string deviceOutputPath) + ? $"--dev-out \"{deviceOutputPath}\"" + : string.Empty; + + // In case user didn't specify custom commands, we use our default one + return "xharness android test " + + "--app \"$app\" " + + "--output-directory \"$output_directory\" " + + "--timeout \"$timeout\" " + + "--package-name \"$package_name\" " + + " -v " + + $"{ devOutArg } { instrumentationArg } { exitCodeArg } { extraArguments } { passthroughArgs }"; + } + + private string GetHelixCommand(ITaskItem appPackage, string apkPath, string androidPackageName, TimeSpan xHarnessTimeout, int expectedExitCode) + { + appPackage.TryGetMetadata(MetadataNames.AndroidInstrumentationName, out string androidInstrumentationName); + appPackage.TryGetMetadata(MetadataNames.DeviceOutputPath, out string deviceOutputPath); + + string wrapperScriptName = IsPosixShell ? PosixAndroidWrapperScript : NonPosixAndroidWrapperScript; + string xharnessHelixWrapperScript = IsPosixShell ? $"chmod +x ./{wrapperScriptName} && ./{wrapperScriptName}" + : $"powershell -ExecutionPolicy ByPass -NoProfile -File \"{wrapperScriptName}\""; + + // We either call .ps1 or .sh so we need to format the arguments well (PS has -argument, bash has --argument) + string dash = IsPosixShell ? "--" : "-"; + string xharnessRunCommand = $"{xharnessHelixWrapperScript} " + + $"{dash}app \"{Path.GetFileName(apkPath)}\" " + + $"{dash}timeout \"{xHarnessTimeout}\" " + + $"{dash}package_name \"{androidPackageName}\" " + + (expectedExitCode != 0 ? $" {dash}expected_exit_code \"{expectedExitCode}\" " : string.Empty) + + (string.IsNullOrEmpty(deviceOutputPath) ? string.Empty : $"{dash}device_output_path \"{deviceOutputPath}\" ") + + (string.IsNullOrEmpty(androidInstrumentationName) ? string.Empty : $"{dash}instrumentation \"{androidInstrumentationName}\" "); + + Log.LogMessage(MessageImportance.Low, $"Generated XHarness command: {xharnessRunCommand}"); + + return xharnessRunCommand; + } + + private async Task CreateZipArchiveOfPackageAsync( + IZipArchiveManager zipArchiveManager, + IFileSystem fileSystem, + string workItemName, + string fileToZip, + string injectedCommands) + { + string fileName = $"xharness-apk-payload-{workItemName.ToLowerInvariant()}.zip"; string outputZipPath = fileSystem.PathCombine(fileSystem.GetDirectoryName(fileToZip), fileName); if (fileSystem.FileExists(outputZipPath)) @@ -106,48 +189,9 @@ private async Task CreateZipArchiveOfPackageAsync(IZipArchiveManager zip // so we'll always include both scripts (very small) await zipArchiveManager.AddResourceFileToArchive(outputZipPath, ScriptNamespace + PosixAndroidWrapperScript, PosixAndroidWrapperScript); await zipArchiveManager.AddResourceFileToArchive(outputZipPath, ScriptNamespace + NonPosixAndroidWrapperScript, NonPosixAndroidWrapperScript); + await zipArchiveManager.AddContentToArchive(outputZipPath, CustomCommandsScript + (IsPosixShell ? ".sh" : ".ps1"), injectedCommands); return outputZipPath; } - - private string ValidateMetadataAndGetXHarnessAndroidCommand(ITaskItem appPackage, TimeSpan xHarnessTimeout, int expectedExitCode) - { - // Validation of any metadata specific to Android stuff goes here - if (!appPackage.GetRequiredMetadata(Log, AndroidPackageNamePropName, out string androidPackageName)) - { - Log.LogError($"{AndroidPackageNamePropName} metadata must be specified; this may match, but can vary from file name"); - return null; - } - - appPackage.TryGetMetadata(ArgumentsPropName, out string arguments); - appPackage.TryGetMetadata(AndroidInstrumentationNamePropName, out string androidInstrumentationName); - appPackage.TryGetMetadata(DeviceOutputPathPropName, out string deviceOutputPath); - - string outputPathArg = string.IsNullOrEmpty(deviceOutputPath) ? string.Empty : $"--dev-out={deviceOutputPath} "; - string instrumentationArg = string.IsNullOrEmpty(androidInstrumentationName) ? string.Empty : $"-i={androidInstrumentationName} "; - - string outputDirectory = IsPosixShell ? "$HELIX_WORKITEM_UPLOAD_ROOT" : "%HELIX_WORKITEM_UPLOAD_ROOT%"; - string wrapperScriptName = IsPosixShell ? PosixAndroidWrapperScript : NonPosixAndroidWrapperScript; - - string xharnessHelixWrapperScript = IsPosixShell ? $"chmod +x ./{wrapperScriptName} && ./{wrapperScriptName}" - : $"call {wrapperScriptName}"; - - string xharnessRunCommand = $"{xharnessHelixWrapperScript} " + - $"dotnet exec \"{(IsPosixShell ? "$XHARNESS_CLI_PATH" : "%XHARNESS_CLI_PATH%")}\" android test " + - $"--app \"{Path.GetFileName(appPackage.ItemSpec)}\" " + - $"--output-directory \"{outputDirectory}\" " + - $"--timeout \"{xHarnessTimeout}\" " + - $"-p=\"{androidPackageName}\" " + - "-v " + - (expectedExitCode != 0 ? $" --expected-exit-code \"{expectedExitCode}\" " : string.Empty) + - outputPathArg + - instrumentationArg + - arguments + - (!string.IsNullOrEmpty(AppArguments) ? $" -- {AppArguments}" : string.Empty); - - Log.LogMessage(MessageImportance.Low, $"Generated XHarness command: {xharnessRunCommand}"); - - return xharnessRunCommand; - } } } diff --git a/src/Microsoft.DotNet.Helix/Sdk/CreateXHarnessAppleWorkItems.cs b/src/Microsoft.DotNet.Helix/Sdk/CreateXHarnessAppleWorkItems.cs index 1cd81e66846..a21be345429 100644 --- a/src/Microsoft.DotNet.Helix/Sdk/CreateXHarnessAppleWorkItems.cs +++ b/src/Microsoft.DotNet.Helix/Sdk/CreateXHarnessAppleWorkItems.cs @@ -1,5 +1,4 @@ using System; -using System.Collections.Generic; using System.IO; using System.Linq; using System.Threading.Tasks; @@ -24,6 +23,7 @@ public static class MetadataNames public const string LaunchTimeout = "LaunchTimeout"; public const string IncludesTestRunner = "IncludesTestRunner"; public const string ResetSimulator = "ResetSimulator"; + public const string AppBundlePath = "AppBundlePath"; } private const string EntryPointScript = "xharness-helix-job.apple.sh"; @@ -91,9 +91,28 @@ private async Task PrepareWorkItem( IFileSystem fileSystem, ITaskItem appBundleItem) { - string appFolderPath = appBundleItem.ItemSpec.TrimEnd(Path.DirectorySeparatorChar); + // The user can re-use the same .apk for 2 work items so the name of the work item will come from ItemSpec and path from metadata + string workItemName; + string appFolderPath; + if (appBundleItem.TryGetMetadata(MetadataNames.AppBundlePath, out string appPathMetadata) && !string.IsNullOrEmpty(appPathMetadata)) + { + workItemName = appBundleItem.ItemSpec; + appFolderPath = appPathMetadata; + } + else + { + workItemName = fileSystem.GetFileName(appBundleItem.ItemSpec); + appFolderPath = appBundleItem.ItemSpec; + } + + appFolderPath = appFolderPath.TrimEnd(Path.DirectorySeparatorChar); + + if (!fileSystem.DirectoryExists(appFolderPath)) + { + Log.LogError($"App bundle not found in {appFolderPath}"); + return null; + } - string workItemName = fileSystem.GetFileName(appFolderPath); if (workItemName.EndsWith(".app")) { workItemName = workItemName.Substring(0, workItemName.Length - 4); @@ -147,37 +166,34 @@ private async Task PrepareWorkItem( if (customCommands == null) { - // In case user didn't specify custom commands, we use our default one - customCommands = $"xharness apple {(includesTestRunner ? "test" : "run")} " + - "--app \"$app\" " + - "--output-directory \"$output_directory\" " + - "--target \"$target\" " + - "--timeout \"$timeout\" " + - (includesTestRunner - ? $"--launch-timeout \"$launch_timeout\" " - : $"--expected-exit-code $expected_exit_code ") + - (resetSimulator ? $"--reset-simulator " : string.Empty) + - (target.Contains("device") ? $"--signal-app-end " : string.Empty) + // iOS/tvOS 14+ workaround - "--xcode \"$xcode_path\" " + - "-v " + - (!string.IsNullOrEmpty(AppArguments) ? "-- " + AppArguments : string.Empty); + // When no user commands are specified, we add the default `apple test ...` command + customCommands = GetDefaultCommand(target, includesTestRunner, resetSimulator); } - string appName = fileSystem.GetFileName(appBundleItem.ItemSpec); + string appName = fileSystem.GetFileName(appFolderPath); string helixCommand = GetHelixCommand(appName, target, testTimeout, launchTimeout, includesTestRunner, expectedExitCode, resetSimulator); - string payloadArchivePath = await CreateZipArchiveOfFolder(zipArchiveManager, fileSystem, appFolderPath, customCommands); + string payloadArchivePath = await CreateZipArchiveOfFolder(zipArchiveManager, fileSystem, workItemName, appFolderPath, customCommands); Log.LogMessage($"Creating work item with properties Identity: {workItemName}, Payload: {appFolderPath}, Command: {helixCommand}"); - return new Build.Utilities.TaskItem(workItemName, new Dictionary() - { - { "Identity", workItemName }, - { "PayloadArchive", payloadArchivePath }, - { "Command", helixCommand }, - { "Timeout", workItemTimeout.ToString() }, - }); + return CreateTaskItem(workItemName, payloadArchivePath, helixCommand, workItemTimeout); } + private string GetDefaultCommand(string target, bool includesTestRunner, bool resetSimulator) => + $"xharness apple {(includesTestRunner ? "test" : "run")} " + + "--app \"$app\" " + + "--output-directory \"$output_directory\" " + + "--target \"$target\" " + + "--timeout \"$timeout\" " + + "--xcode \"$xcode_path\" " + + "-v " + + (includesTestRunner + ? $"--launch-timeout \"$launch_timeout\" " + : $"--expected-exit-code $expected_exit_code ") + + (resetSimulator ? $"--reset-simulator " : string.Empty) + + (target.Contains("device") ? $"--signal-app-end " : string.Empty) + // iOS/tvOS 14+ workaround + (!string.IsNullOrEmpty(AppArguments) ? "-- " + AppArguments : string.Empty); + private string GetHelixCommand( string appName, string target, @@ -201,6 +217,7 @@ private string GetHelixCommand( private async Task CreateZipArchiveOfFolder( IZipArchiveManager zipArchiveManager, IFileSystem fileSystem, + string workItemName, string folderToZip, string injectedCommands) { @@ -211,7 +228,7 @@ private async Task CreateZipArchiveOfFolder( } string appFolderDirectory = fileSystem.GetDirectoryName(folderToZip); - string fileName = $"xharness-app-payload-{fileSystem.GetFileName(folderToZip).ToLowerInvariant()}.zip"; + string fileName = $"xharness-app-payload-{workItemName.ToLowerInvariant()}.zip"; string outputZipPath = fileSystem.PathCombine(appFolderDirectory, fileName); if (fileSystem.FileExists(outputZipPath)) diff --git a/src/Microsoft.DotNet.Helix/Sdk/Microsoft.DotNet.Helix.Sdk.csproj b/src/Microsoft.DotNet.Helix/Sdk/Microsoft.DotNet.Helix.Sdk.csproj index e06aeef2fbe..2e510066ae4 100644 --- a/src/Microsoft.DotNet.Helix/Sdk/Microsoft.DotNet.Helix.Sdk.csproj +++ b/src/Microsoft.DotNet.Helix/Sdk/Microsoft.DotNet.Helix.Sdk.csproj @@ -40,7 +40,7 @@ Never - + Never diff --git a/src/Microsoft.DotNet.Helix/Sdk/XharnessTaskBase.cs b/src/Microsoft.DotNet.Helix/Sdk/XharnessTaskBase.cs index 0797b49f38e..205bf33a6dd 100644 --- a/src/Microsoft.DotNet.Helix/Sdk/XharnessTaskBase.cs +++ b/src/Microsoft.DotNet.Helix/Sdk/XharnessTaskBase.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Generic; using Microsoft.Arcade.Common; using Microsoft.Build.Framework; @@ -93,5 +94,14 @@ public class MetadataName return (testTimeout, workItemTimeout, expectedExitCode, customCommands); } + + protected Build.Utilities.TaskItem CreateTaskItem(string workItemName, string payloadArchivePath, string command, TimeSpan timeout) => + new (workItemName, new Dictionary() + { + { "Identity", workItemName }, + { "PayloadArchive", payloadArchivePath }, + { "Command", command }, + { "Timeout", timeout.ToString() }, + }); } } diff --git a/src/Microsoft.DotNet.Helix/Sdk/tools/xharness-runner/Readme.md b/src/Microsoft.DotNet.Helix/Sdk/tools/xharness-runner/Readme.md index c953bbbb06c..bebc13f69fa 100644 --- a/src/Microsoft.DotNet.Helix/Sdk/tools/xharness-runner/Readme.md +++ b/src/Microsoft.DotNet.Helix/Sdk/tools/xharness-runner/Readme.md @@ -181,6 +181,9 @@ Example: ``` +Please note that Android can run on both Windows and Linux based on the target queue. +For that reason, make sure the `` script you supply is either **bash** for Linux queues or **PowerShell** for Windows. + When using `CustomCommands`, several variables will be defined for you for easier run. #### Variables defined for Apple scenarios @@ -190,4 +193,34 @@ When using `CustomCommands`, several variables will be defined for you for easie - `$target`, `$timeout`, `$launch_timeout`, `$expected_exit_code`, `$includes_test_runner` - parsed metadata defined on the original `XHarnessAppBundleToTest` MSBuild item #### Variables defined for Android scenarios -Android is currently not supported - coming soon! +- `$app` - path to the application +- `$package_name` - name of the Android package +- `$output_directory` - path under which all files will be uploaded to Helix at the end of the job + - If a file named `testResults.xml` is found containing xUnit results, it will be uploaded back to Azure DevOps +- `$timeout`, `$expected_exit_code`, `$device_output_path`, `$instrumentation` - parsed metadata defined on the original `XHarnessApkToTest` MSBuild item + + +### Reusing app bundles / apks + +In some scenarios, you might need to re-use one application for multiple work items, i.e. to supply each with a different custom command to run the application with different parameters or to run the application on different test targets (e.g. different versions of iOS). + +You can then name the item however you like and supply the path to the app as metadata: + +```xml + + path/to/System.Text.Json.Tests.apk + net.dot.System.Buffers.Tests + net.dot.MonoRunner + + + + path/to/System.Text.Json.Tests.apk + net.dot.System.Buffers.Tests + net.dot.MonoRunner + + xharness android test --app "$app" --package-name "net.dot.System.Buffers.Tests" --output-directory "$output_directory" --instrumentation=net.dot.MonoRunner + + +``` + +For Apple it is the same, just the metadata property name is ``. diff --git a/src/Microsoft.DotNet.Helix/Sdk/tools/xharness-runner/xharness-helix-job.android.bat b/src/Microsoft.DotNet.Helix/Sdk/tools/xharness-runner/xharness-helix-job.android.bat deleted file mode 100644 index 5ffe3a911dc..00000000000 --- a/src/Microsoft.DotNet.Helix/Sdk/tools/xharness-runner/xharness-helix-job.android.bat +++ /dev/null @@ -1,23 +0,0 @@ -@echo off - -REM This script is used as a payload of Helix jobs that execute Android workloads through XHarness on Windows systems. -REM This is used as the entrypoint of the work item so that XHarness failures can be detected and (when appropriate) -REM cause the work item to retry and reboot the Helix agent the work is running on. - -REM Currently no special functionality is needed beyond causing infrastructure retry and reboot if the emulators -REM or devices have trouble, but to add more Helix-specific Android XHarness behaviors, this is one extensibility point. - -set ADB_DEVICE_ENUMERATION_FAILURE=85 - -echo Xharness Helix Wrapper: Arguments: %* -%* -set EXIT_CODE=%ERRORLEVEL% - -if %EXIT_CODE%==%ADB_DEVICE_ENUMERATION_FAILURE% ( - echo Encountered ADB_DEVICE_ENUMERATION_FAILURE. This is typically not a failure of the work item. We will run it again and reboot this computer to help its devices - echo If this occurs repeatedly, please check for architectural mismatch, e.g. sending x86 or x86_64 APKs to an arm64_v8a-only queue. - %HELIX_PYTHONPATH% -c "from helix.workitemutil import request_infra_retry; request_infra_retry('Retrying because we could not enumerate all Android devices')" - %HELIX_PYTHONPATH% -c "from helix.workitemutil import request_reboot; request_reboot('Rebooting to allow Android emulator or device to restart')" -) - -exit /B %EXIT_CODE% diff --git a/src/Microsoft.DotNet.Helix/Sdk/tools/xharness-runner/xharness-helix-job.android.ps1 b/src/Microsoft.DotNet.Helix/Sdk/tools/xharness-runner/xharness-helix-job.android.ps1 new file mode 100644 index 00000000000..99dba979c0a --- /dev/null +++ b/src/Microsoft.DotNet.Helix/Sdk/tools/xharness-runner/xharness-helix-job.android.ps1 @@ -0,0 +1,49 @@ +<# +This script is used as a payload of Helix jobs that execute Android workloads through XHarness on Windows systems. +This is used as the entrypoint of the work item so that XHarness failures can be detected and (when appropriate) +cause the work item to retry and reboot the Helix agent the work is running on. + +Currently no special functionality is needed beyond causing infrastructure retry and reboot if the emulators +or devices have trouble, but to add more Helix-specific Android XHarness behaviors, this is one extensibility point. +#> + +param ( + [Parameter(Mandatory)] + [string]$app, + [Parameter(Mandatory)] + [string]$timeout, + [Parameter(Mandatory)] + [string]$package_name, + [Parameter()] + [int]$expected_exit_code = 0, + [Parameter()] + [string]$device_output_path = $null, + [Parameter()] + [string]$instrumentation = $null +) + +$ErrorActionPreference="Stop" + +[Diagnostics.CodeAnalysis.SuppressMessageAttribute("PSUseDeclaredVarsMoreThanAssignments", "")] # Variable used in sourced script +$output_directory=$Env:HELIX_WORKITEM_UPLOAD_ROOT + +# The xharness alias +function xharness() { + dotnet exec $Env:XHARNESS_CLI_PATH @args +} + +# Act out the actual commands +. "$PSScriptRoot\command.ps1" + +$exit_code=$LASTEXITCODE + +# ADB_DEVICE_ENUMERATION_FAILURE +if ($exit_code -eq 85) { + $ErrorActionPreference="Continue" + Write-Error "Encountered ADB_DEVICE_ENUMERATION_FAILURE. This is typically not a failure of the work item. We will run it again and reboot this computer to help its devices" + Write-Error "If this occurs repeatedly, please check for architectural mismatch, e.g. sending x86 or x86_64 APKs to an arm64_v8a-only queue." + & "$Env:HELIX_PYTHONPATH" -c "from helix.workitemutil import request_infra_retry; request_infra_retry('Retrying because we could not enumerate all Android devices')" + & "$Env:HELIX_PYTHONPATH" -c "from helix.workitemutil import request_reboot; request_reboot('Rebooting to allow Android emulator or device to restart')" +} + +exit $exit_code diff --git a/src/Microsoft.DotNet.Helix/Sdk/tools/xharness-runner/xharness-helix-job.android.sh b/src/Microsoft.DotNet.Helix/Sdk/tools/xharness-runner/xharness-helix-job.android.sh index 3206267624c..f7e2b920b91 100644 --- a/src/Microsoft.DotNet.Helix/Sdk/tools/xharness-runner/xharness-helix-job.android.sh +++ b/src/Microsoft.DotNet.Helix/Sdk/tools/xharness-runner/xharness-helix-job.android.sh @@ -3,13 +3,77 @@ ### This script is used as a payload of Helix jobs that execute Android workloads through XHarness on Linux systems. ### This is used as the entrypoint of the work item so that XHarness failures can be detected and (when appropriate) ### cause the work item to retry and reboot the Helix agent the work is running on. -### -### Currently no special functionality is needed beyond causing infrastructure retry and reboot if the emulators -### or devices have trouble, but to add more Helix-specific Android XHarness behaviors, this is one extensibility point. +### +### This scripts sets up the environment and then sources the actual XHarness commands that come either from the Helix +### SDK or from user via the property. -set -x echo "XHarness Helix Job Wrapper calling '$@'" -"$@" + +set -x + +app='' +timeout='' +package_name='' +expected_exit_code=0 +device_output_path='' +instrumentation='' +output_directory=$HELIX_WORKITEM_UPLOAD_ROOT + +while [[ $# -gt 0 ]]; do + opt="$(echo "$1" | tr "[:upper:]" "[:lower:]")" + case "$opt" in + --app) + app="$2" + shift + ;; + --timeout) + timeout="$2" + shift + ;; + --package_name) + package_name="$2" + shift + ;; + --expected_exit_code) + expected_exit_code="$2" + shift + ;; + --device_output_path) + device_output_path="$2" + shift + ;; + --instrumentation) + instrumentation="$2" + shift + ;; + esac + shift +done + +if [ -z "$app" ]; then + die "App bundle path wasn't provided"; +fi + +if [ -z "$timeout" ]; then + die "No timeout was provided"; +fi + +if [ -z "$package_name" ]; then + die "Package name path wasn't provided"; +fi + +if [ -z "$output_directory" ]; then + die "No output directory provided"; +fi + +# The xharness alias +function xharness() { + dotnet exec $XHARNESS_CLI_PATH "$@" +} + +# Act out the actual commands +source command.sh + exit_code=$? # This handles issues where devices or emulators fail to start. @@ -17,7 +81,7 @@ exit_code=$? # Too see where these values come from, check out https://github.com/dotnet/xharness/blob/master/src/Microsoft.DotNet.XHarness.Common/CLI/ExitCode.cs # Avoid any helix-ism in the Xharness! -ADB_DEVICE_ENUMERATION_FAILURE=85 +ADB_DEVICE_ENUMERATION_FAILURE=85 if [ $exit_code -eq $ADB_DEVICE_ENUMERATION_FAILURE ]; then echo 'Encountered ADB_DEVICE_ENUMERATION_FAILURE. This is typically not a failure of the work item. We will run it again and reboot this computer to help its devices' echo 'If this occurs repeatedly, please check for architectural mismatch, e.g. sending arm64_v8a APKs to an x86_64 / x86 only queue.' diff --git a/src/Microsoft.DotNet.Helix/Sdk/tools/xharness-runner/xharness-runner.apple.sh b/src/Microsoft.DotNet.Helix/Sdk/tools/xharness-runner/xharness-runner.apple.sh index 8cfdc978e99..6096d835d48 100644 --- a/src/Microsoft.DotNet.Helix/Sdk/tools/xharness-runner/xharness-runner.apple.sh +++ b/src/Microsoft.DotNet.Helix/Sdk/tools/xharness-runner/xharness-runner.apple.sh @@ -78,7 +78,7 @@ if [ -z "$app" ]; then fi if [ -z "$target" ]; then - die "No target were provided"; + die "No target was provided"; fi if [ -z "$output_directory" ]; then @@ -139,7 +139,11 @@ fi export XHARNESS_DISABLE_COLORED_OUTPUT=true export XHARNESS_LOG_WITH_TIMESTAMPS=true -alias xharness="dotnet exec $xharness_cli_path" + +# The xharness alias +function xharness() { + dotnet exec $xharness_cli_path "$@" +} # Act out the actual commands source command.sh diff --git a/tests/UnitTests.XHarness.Android.Device.proj b/tests/UnitTests.XHarness.Android.Device.proj new file mode 100644 index 00000000000..c3aeeb59dff --- /dev/null +++ b/tests/UnitTests.XHarness.Android.Device.proj @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/tests/UnitTests.XHarness.Android.Simulator.proj b/tests/UnitTests.XHarness.Android.Simulator.proj new file mode 100644 index 00000000000..11dfbaba887 --- /dev/null +++ b/tests/UnitTests.XHarness.Android.Simulator.proj @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + diff --git a/tests/UnitTests.XHarness.Android.WindowsQueues.proj b/tests/UnitTests.XHarness.Android.WindowsQueues.proj deleted file mode 100644 index 1614ac47ea5..00000000000 --- a/tests/UnitTests.XHarness.Android.WindowsQueues.proj +++ /dev/null @@ -1,52 +0,0 @@ - - - - - - - - $(MSBuildThisFileDirectory)../artifacts/bin/Microsoft.DotNet.Helix.Sdk/$(Configuration)/netcoreapp3.1/publish/Microsoft.DotNet.Helix.Sdk.dll - $(MSBuildThisFileDirectory)../artifacts/bin/Microsoft.DotNet.Helix.Sdk/$(Configuration)/net472/publish/Microsoft.DotNet.Helix.Sdk.dll - - - - test/product/ - $(AGENT_JOBNAME) - true - true - true - https://helix.dot.net - - - - - - - - - - - - - - - - - true - $(BUILD_SOURCEVERSIONAUTHOR) - anon - - - - - msbuild - - - - - - diff --git a/tests/UnitTests.XHarness.Android.LinuxQueues.proj b/tests/UnitTests.XHarness.Common.props similarity index 59% rename from tests/UnitTests.XHarness.Android.LinuxQueues.proj rename to tests/UnitTests.XHarness.Common.props index a8d3dbcd51f..d657a6d9e5c 100644 --- a/tests/UnitTests.XHarness.Android.LinuxQueues.proj +++ b/tests/UnitTests.XHarness.Common.props @@ -1,11 +1,9 @@ - + @@ -22,18 +20,11 @@ https://helix.dot.net - - - - - - - - - - - - + + + false + false + true @@ -45,8 +36,5 @@ msbuild - - - diff --git a/tests/UnitTests.XHarness.iOS.Device.proj b/tests/UnitTests.XHarness.iOS.Device.proj index 0e78ad60d95..d828cca75c7 100644 --- a/tests/UnitTests.XHarness.iOS.Device.proj +++ b/tests/UnitTests.XHarness.iOS.Device.proj @@ -1,6 +1,5 @@ - - + - - $(MSBuildThisFileDirectory)../artifacts/bin/Microsoft.DotNet.Helix.Sdk/$(Configuration)/netcoreapp3.1/publish/Microsoft.DotNet.Helix.Sdk.dll - $(MSBuildThisFileDirectory)../artifacts/bin/Microsoft.DotNet.Helix.Sdk/$(Configuration)/net472/publish/Microsoft.DotNet.Helix.Sdk.dll - - - - test/product/ - $(AGENT_JOBNAME) - true - true - true - https://helix.dot.net - - - - - - - true - $(BUILD_SOURCEVERSIONAUTHOR) - anon - - - - - msbuild - - diff --git a/tests/UnitTests.XHarness.iOS.Simulator.proj b/tests/UnitTests.XHarness.iOS.Simulator.proj index 7c07d677773..e483cb6384a 100644 --- a/tests/UnitTests.XHarness.iOS.Simulator.proj +++ b/tests/UnitTests.XHarness.iOS.Simulator.proj @@ -1,6 +1,5 @@ - - + - - $(MSBuildThisFileDirectory)../artifacts/bin/Microsoft.DotNet.Helix.Sdk/$(Configuration)/netcoreapp3.1/publish/Microsoft.DotNet.Helix.Sdk.dll - $(MSBuildThisFileDirectory)../artifacts/bin/Microsoft.DotNet.Helix.Sdk/$(Configuration)/net472/publish/Microsoft.DotNet.Helix.Sdk.dll - - - - test/product/ - $(AGENT_JOBNAME) - true - true - true - https://helix.dot.net - - - - - - - - - - true - $(BUILD_SOURCEVERSIONAUTHOR) - anon - - - - - msbuild - - diff --git a/tests/XHarness/XHarness.TestApks.proj b/tests/XHarness/XHarness.TestApks.proj index b26e872c26a..f44c1c26b3b 100644 --- a/tests/XHarness/XHarness.TestApks.proj +++ b/tests/XHarness/XHarness.TestApks.proj @@ -8,26 +8,38 @@ https://netcorenativeassets.blob.core.windows.net/resource-packages/external/android/test-apk/arm64_v8a/System.Buffers.Tests-arm64-v8a.apk + - + - + - + + - - + + %(FullPath) + + + net.dot.System.Buffers.Tests + + + net.dot.MonoRunner + + + + %(FullPath) net.dot.System.Buffers.Tests @@ -35,6 +47,8 @@ net.dot.MonoRunner + + xharness android test --app "$app" --package-name "$package_name" --output-directory "$output_directory" --instrumentation "$instrumentation" --timeout "$timeout" -v From 007b5840c3adafd1bec166b522654711eba11701 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alexander=20K=C3=B6plinger?= Date: Wed, 21 Jul 2021 20:39:44 +0200 Subject: [PATCH 237/699] Fix TestPLatformApplies for MacCatalyst/iOS (#7655) Since https://github.com/dotnet/runtime/commit/14854e209868749262bd58a64407b3802177542f the IsOSPlatform API returns true for "iOS" on MacCatalyst platforms. This caused a few iOS-specific tests to fail in dotnet/runtime. --- src/Microsoft.DotNet.XUnitExtensions/src/DiscovererHelpers.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Microsoft.DotNet.XUnitExtensions/src/DiscovererHelpers.cs b/src/Microsoft.DotNet.XUnitExtensions/src/DiscovererHelpers.cs index 4887e9e27bc..b1762309589 100644 --- a/src/Microsoft.DotNet.XUnitExtensions/src/DiscovererHelpers.cs +++ b/src/Microsoft.DotNet.XUnitExtensions/src/DiscovererHelpers.cs @@ -25,7 +25,7 @@ public static bool TestPlatformApplies(TestPlatforms platforms) => (platforms.HasFlag(TestPlatforms.OSX) && RuntimeInformation.IsOSPlatform(OSPlatform.OSX)) || (platforms.HasFlag(TestPlatforms.illumos) && RuntimeInformation.IsOSPlatform(OSPlatform.Create("ILLUMOS"))) || (platforms.HasFlag(TestPlatforms.Solaris) && RuntimeInformation.IsOSPlatform(OSPlatform.Create("SOLARIS"))) || - (platforms.HasFlag(TestPlatforms.iOS) && RuntimeInformation.IsOSPlatform(OSPlatform.Create("IOS"))) || + (platforms.HasFlag(TestPlatforms.iOS) && RuntimeInformation.IsOSPlatform(OSPlatform.Create("IOS")) && !RuntimeInformation.IsOSPlatform(OSPlatform.Create("MACCATALYST"))) || (platforms.HasFlag(TestPlatforms.tvOS) && RuntimeInformation.IsOSPlatform(OSPlatform.Create("TVOS"))) || (platforms.HasFlag(TestPlatforms.MacCatalyst) && RuntimeInformation.IsOSPlatform(OSPlatform.Create("MACCATALYST"))) || (platforms.HasFlag(TestPlatforms.Android) && RuntimeInformation.IsOSPlatform(OSPlatform.Create("ANDROID"))) || From 828107daa2dd84171c328b9d2b58009984ee4c39 Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Wed, 21 Jul 2021 23:56:27 +0000 Subject: [PATCH 238/699] [main] Update dependencies from dotnet/xliff-tasks dotnet/arcade mono/linker (#7653) [main] Update dependencies from dotnet/xliff-tasks dotnet/arcade mono/linker --- eng/Version.Details.xml | 28 ++++++++++++++-------------- eng/Versions.props | 10 +++++----- global.json | 4 ++-- 3 files changed, 21 insertions(+), 21 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index 2821b9a672a..9d96db2890d 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -11,25 +11,25 @@ - + https://github.com/dotnet/arcade - e97027cf100d2b532adce387e5cb93a373de93c9 + 89806f0b9e93ad2bbe32c654412835c0801a2032 - + https://github.com/dotnet/arcade - e97027cf100d2b532adce387e5cb93a373de93c9 + 89806f0b9e93ad2bbe32c654412835c0801a2032 - + https://github.com/dotnet/arcade - e97027cf100d2b532adce387e5cb93a373de93c9 + 89806f0b9e93ad2bbe32c654412835c0801a2032 - + https://github.com/dotnet/arcade - e97027cf100d2b532adce387e5cb93a373de93c9 + 89806f0b9e93ad2bbe32c654412835c0801a2032 - + https://github.com/dotnet/arcade - e97027cf100d2b532adce387e5cb93a373de93c9 + 89806f0b9e93ad2bbe32c654412835c0801a2032 https://github.com/dotnet/arcade-services @@ -47,9 +47,9 @@ https://github.com/dotnet/roslyn 246ce641f04b67ef017655275d850bf902a8e40f - + https://github.com/mono/linker - 8d49e169d872d6225bcf73ae14ae50b002f39319 + 6eae01980dc694107bdee0bc723d75a0dd601f0e https://github.com/dotnet/sourcelink @@ -68,9 +68,9 @@ https://github.com/dotnet/symreader-converter c5ba7c88f92e2dde156c324a8c8edc04d9fa4fe0 - + https://github.com/dotnet/xliff-tasks - 346cb8673bc0dba67d9bf7bb3a868d921a8211f7 + d3fdae4d3abdee3863c9e2b6364796edb072cfa0 diff --git a/eng/Versions.props b/eng/Versions.props index 9f0b898f19f..b15a01c19a1 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -35,7 +35,7 @@ 2.1.1 2.1.0 3.10.0-4.21329.37 - 6.0.100-preview.6.21369.3 + 6.0.100-preview.6.21370.1 16.7.1 4.8.3 5.3.0.1 @@ -65,8 +65,8 @@ 2.4.1 2.0.3 2.4.1 - 6.0.0-beta.21369.3 - 6.0.0-beta.21369.3 + 6.0.0-beta.21370.12 + 6.0.0-beta.21370.12 1.22.0 1.1.2 2.0.0 @@ -77,8 +77,8 @@ 1.1.0-beta.20258.6 1.1.0-beta-21309-01 1.1.0-beta-21309-01 - 6.0.0-beta.21369.3 - 1.0.0-beta.21367.1 + 6.0.0-beta.21370.12 + 1.0.0-beta.21370.1 1.1.0-beta.21228.1 1.0.0-prerelease.21364.1 1.1.156602 diff --git a/global.json b/global.json index e3311e8d991..68631046301 100644 --- a/global.json +++ b/global.json @@ -3,7 +3,7 @@ "dotnet": "6.0.100-preview.4.21255.9" }, "msbuild-sdks": { - "Microsoft.DotNet.Arcade.Sdk": "6.0.0-beta.21369.3", - "Microsoft.DotNet.Helix.Sdk": "6.0.0-beta.21369.3" + "Microsoft.DotNet.Arcade.Sdk": "6.0.0-beta.21370.12", + "Microsoft.DotNet.Helix.Sdk": "6.0.0-beta.21370.12" } } From 25d490025943afbe9e9707fccf7be6302ba1d7a6 Mon Sep 17 00:00:00 2001 From: Matt Mitchell Date: Thu, 22 Jul 2021 09:58:19 -0700 Subject: [PATCH 239/699] Update .NET SDK to preview 6 (#7657) --- global.json | 2 +- src/Microsoft.DotNet.Helix/Sdk/tools/dotnet-cli/DotNetCli.props | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/global.json b/global.json index 68631046301..30d998e60fd 100644 --- a/global.json +++ b/global.json @@ -1,6 +1,6 @@ { "tools": { - "dotnet": "6.0.100-preview.4.21255.9" + "dotnet": "6.0.100-preview.6.21355.2" }, "msbuild-sdks": { "Microsoft.DotNet.Arcade.Sdk": "6.0.0-beta.21370.12", diff --git a/src/Microsoft.DotNet.Helix/Sdk/tools/dotnet-cli/DotNetCli.props b/src/Microsoft.DotNet.Helix/Sdk/tools/dotnet-cli/DotNetCli.props index 5c2539a9074..1244e50dc8b 100644 --- a/src/Microsoft.DotNet.Helix/Sdk/tools/dotnet-cli/DotNetCli.props +++ b/src/Microsoft.DotNet.Helix/Sdk/tools/dotnet-cli/DotNetCli.props @@ -1,7 +1,7 @@ false - 6.0.0-preview.4.21253.5 + 6.0.0-preview.6.21355.2 runtime $(BundledNETCoreAppPackageVersion) From 5a60f9ce50a885044603c7325f3a686a77b27428 Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Thu, 22 Jul 2021 19:39:55 +0000 Subject: [PATCH 240/699] Update dependencies from https://github.com/dotnet/xliff-tasks build 20210721.1 (#7656) [main] Update dependencies from dotnet/xliff-tasks --- eng/Version.Details.xml | 4 ++-- eng/Versions.props | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index 9d96db2890d..c3f3fccdc92 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -68,9 +68,9 @@ https://github.com/dotnet/symreader-converter c5ba7c88f92e2dde156c324a8c8edc04d9fa4fe0 - + https://github.com/dotnet/xliff-tasks - d3fdae4d3abdee3863c9e2b6364796edb072cfa0 + 31d2b6c3aa2f874e9e93a005e773101468b8612a diff --git a/eng/Versions.props b/eng/Versions.props index b15a01c19a1..3f67c814f90 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -78,7 +78,7 @@ 1.1.0-beta-21309-01 1.1.0-beta-21309-01 6.0.0-beta.21370.12 - 1.0.0-beta.21370.1 + 1.0.0-beta.21371.1 1.1.0-beta.21228.1 1.0.0-prerelease.21364.1 1.1.156602 From d5177c53ff595603cfe833b8777b475a7e1e0d0a Mon Sep 17 00:00:00 2001 From: Matt Mitchell Date: Thu, 22 Jul 2021 13:46:05 -0700 Subject: [PATCH 241/699] Add internal runtime args to source build template (#7659) These need to be passed through to correct restore an internal runtime. This is a follow-on to a previous attempt (https://github.com/dotnet/arcade/pull/7587). The two changes from that are: - Use the eng/common/build.sh variation of runtimesourcefeed/runtimesourcefeedkey (without -'s) - Determine whether the MSRC variable is actually set before adding the args. --- eng/common/templates/steps/source-build.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/eng/common/templates/steps/source-build.yml b/eng/common/templates/steps/source-build.yml index e20637ed6a1..705b7a1c847 100644 --- a/eng/common/templates/steps/source-build.yml +++ b/eng/common/templates/steps/source-build.yml @@ -29,6 +29,11 @@ steps: officialBuildArgs='/p:DotNetPublishUsingPipelines=true /p:OfficialBuildId=$(BUILD.BUILDNUMBER)' fi + internalRuntimeDownloadArgs= + if [ '$(dotnetclimsrc-read-sas-token-base64)' != '$''(dotnetclimsrc-read-sas-token-base64)' ]; then + internalRuntimeDownloadArgs='--runtimesourcefeed https://dotnetclimsrc.blob.core.windows.net/dotnet --runtimesourcefeedkey $(dotnetclimsrc-read-sas-token-base64)' + fi + targetRidArgs= if [ '${{ parameters.platform.targetRID }}' != '' ]; then targetRidArgs='/p:TargetRid=${{ parameters.platform.targetRID }}' @@ -43,6 +48,7 @@ steps: --configuration $buildConfig \ --restore --build --pack $publishArgs -bl \ $officialBuildArgs \ + $internalRuntimeDownloadArgs \ $targetRidArgs \ /p:SourceBuildNonPortable=${{ parameters.platform.nonPortable }} \ /p:ArcadeBuildFromSource=true From 6224d1b573b73caaa84176bd83dabe75f202cdc7 Mon Sep 17 00:00:00 2001 From: Jacques Eloff Date: Thu, 22 Jul 2021 16:11:47 -0700 Subject: [PATCH 242/699] Fix installation for library and template packs (#7651) * Fix installation for library and template packs * Enable generating SWIX project for manifest installers * Make SDK Version/Manifest ID optional * Clean up formatting --- .../src/GenerateManifestMsi.cs | 76 +++++++++++++++++-- .../src/GenerateMsiBase.cs | 8 +- .../src/MsiTemplate/Directories.wxs | 2 + 3 files changed, 80 insertions(+), 6 deletions(-) diff --git a/src/Microsoft.DotNet.Build.Tasks.Workloads/src/GenerateManifestMsi.cs b/src/Microsoft.DotNet.Build.Tasks.Workloads/src/GenerateManifestMsi.cs index 384e46cfdde..ec049c9b3f7 100644 --- a/src/Microsoft.DotNet.Build.Tasks.Workloads/src/GenerateManifestMsi.cs +++ b/src/Microsoft.DotNet.Build.Tasks.Workloads/src/GenerateManifestMsi.cs @@ -17,6 +17,15 @@ public class GenerateManifestMsi : GenerateTaskBase { private Version _sdkFeaureBandVersion; + /// + /// Gets or sets whether a corresponding SWIX project should be generated for the MSI. + /// + public bool GenerateSwixAuthoring + { + get; + set; + } = true; + /// /// The path where the generated MSIs will be placed. /// @@ -30,7 +39,6 @@ public string OutputPath /// /// The ID of the workload manifest. /// - [Required] public string ManifestId { get; @@ -65,7 +73,6 @@ private Version SdkFeatureBandVersion /// /// The SDK version, e.g. 6.0.107. /// - [Required] public string SdkVersion { get; @@ -102,11 +109,35 @@ public override bool Execute() { try { - Log.LogMessage($"Generating workload manifest installer for {SdkFeatureBandVersion}"); - NugetPackage nupkg = new(WorkloadManifestPackage, Log); List msis = new(); + var manifestSeparator = ".Manifest-"; + if (string.IsNullOrWhiteSpace(ManifestId)) + { + if ($"{nupkg.Id}".IndexOf(manifestSeparator, StringComparison.OrdinalIgnoreCase) == -1) + { + Log.LogError($"Unable to parse a manifest ID from package ID: '{nupkg.Id}'. Please provide the 'ManifestId' parameter."); + } + else + { + ManifestId = $"{nupkg.Id}".Substring(0, $"{nupkg.Id}".IndexOf(manifestSeparator)); + } + } + if (string.IsNullOrWhiteSpace(SdkVersion)) + { + if ($"{nupkg.Id}".IndexOf(manifestSeparator, StringComparison.OrdinalIgnoreCase) == -1) + { + Log.LogError($"Unable to parse the SDK version from package ID: '{nupkg.Id}'. Please provide the 'SdkVersion' parameter."); + } + else + { + SdkVersion = $"{nupkg.Id}".Substring($"{nupkg.Id}".IndexOf(manifestSeparator) + manifestSeparator.Length); + } + } + + Log.LogMessage(MessageImportance.High, $"Generating workload manifest installer for {SdkFeatureBandVersion}"); + // MSI ProductName defaults to the package title and fallback to the package ID with a warning. string productName = nupkg.Title; @@ -116,6 +147,10 @@ public override bool Execute() productName = nupkg.Id; } + + + + // Extract once, but harvest multiple times because some generated attributes are platform dependent. string packageContentsDirectory = Path.Combine(PackageDirectory, $"{nupkg.Identity}"); nupkg.Extract(packageContentsDirectory, Enumerable.Empty()); @@ -252,6 +287,19 @@ public override bool Execute() msi.SetMetadata(Metadata.JsonProperties, msiJsonPath); msi.SetMetadata(Metadata.WixObj, candleIntermediateOutputPath); + if (GenerateSwixAuthoring && IsSupportedByVisualStudio(platform)) + { + string swixPackageId = $"{nupkg.Id}"; + + string swixProject = GenerateSwixPackageAuthoring(light.OutputFile, + swixPackageId, platform); + + if (!string.IsNullOrWhiteSpace(swixProject)) + { + msi.SetMetadata(Metadata.SwixProject, swixProject); + } + } + // Generate a .csproj to build a NuGet payload package to carry the MSI and JSON manifest msi.SetMetadata(Metadata.PackageProject, GeneratePackageProject(msi.ItemSpec, msiJsonPath, platform, nupkg)); @@ -268,7 +316,6 @@ public override bool Execute() return !Log.HasLoggedErrors; } - private string GeneratePackageProject(string msiPath, string msiJsonPath, string platform, NugetPackage nupkg) { string msiPackageProject = Path.Combine(MsiPackageDirectory, platform, nupkg.Id, "msi.csproj"); @@ -358,5 +405,24 @@ private void WriteItem(XmlWriter writer, string itemName, string include, string writer.WriteAttributeString("PackagePath", packagePath); writer.WriteEndElement(); } + + private string GenerateSwixPackageAuthoring(string msiPath, string packageId, string platform) + { + GenerateVisualStudioMsiPackageProject swixTask = new() + { + Chip = platform, + IntermediateBaseOutputPath = this.IntermediateBaseOutputPath, + PackageName = packageId, + MsiPath = msiPath, + BuildEngine = this.BuildEngine, + }; + + if (!swixTask.Execute()) + { + Log.LogError($"Failed to generate SWIX authoring for '{msiPath}'"); + } + + return swixTask.SwixProject; + } } } diff --git a/src/Microsoft.DotNet.Build.Tasks.Workloads/src/GenerateMsiBase.cs b/src/Microsoft.DotNet.Build.Tasks.Workloads/src/GenerateMsiBase.cs index 9e201639401..3f36c9d0a11 100644 --- a/src/Microsoft.DotNet.Build.Tasks.Workloads/src/GenerateMsiBase.cs +++ b/src/Microsoft.DotNet.Build.Tasks.Workloads/src/GenerateMsiBase.cs @@ -134,6 +134,7 @@ protected IEnumerable Generate(string sourcePackage, string swixPacka string packageContentsDirectory = Path.Combine(PackageDirectory, $"{nupkg.Identity}"); IEnumerable exclusions = GetExlusionPatterns(); string installDir = GetInstallDir(kind); + string packKind = kind.ToString().ToLowerInvariant(); if ((kind != WorkloadPackKind.Library) && (kind != WorkloadPackKind.Template)) { @@ -174,10 +175,14 @@ protected IEnumerable Generate(string sourcePackage, string swixPacka string packageContentWxs = Path.Combine(msiSourcePath, "PackageContent.wxs"); sourceFiles.Add(packageContentWxs); + string directoryReference = (kind == WorkloadPackKind.Library) || (kind == WorkloadPackKind.Template) + ? "InstallDir" + : PackageContentDirectoryReference; + HarvestToolTask heat = new(BuildEngine, WixToolsetPath) { ComponentGroupName = PackageContentComponentGroupName, - DirectoryReference = PackageContentDirectoryReference, + DirectoryReference = directoryReference, OutputFile = packageContentWxs, Platform = platform, SourceDirectory = packageContentsDirectory @@ -216,6 +221,7 @@ protected IEnumerable Generate(string sourcePackage, string swixPacka candle.PreprocessorDefinitions.Add($@"SourceDir={packageContentsDirectory}"); candle.PreprocessorDefinitions.Add($@"Manufacturer={manufacturer}"); candle.PreprocessorDefinitions.Add($@"EulaRtf={EulaRtfPath}"); + candle.PreprocessorDefinitions.Add($@"PackKind={packKind}"); // Compiler extension to process dependency provider authoring for package reference counting. candle.Extensions.Add("WixDependencyExtension"); diff --git a/src/Microsoft.DotNet.Build.Tasks.Workloads/src/MsiTemplate/Directories.wxs b/src/Microsoft.DotNet.Build.Tasks.Workloads/src/MsiTemplate/Directories.wxs index 574cbe373b1..709bbb08563 100644 --- a/src/Microsoft.DotNet.Build.Tasks.Workloads/src/MsiTemplate/Directories.wxs +++ b/src/Microsoft.DotNet.Build.Tasks.Workloads/src/MsiTemplate/Directories.wxs @@ -7,9 +7,11 @@ + + From c5d8214ed77ba3abc86337e870e8568deb14a93a Mon Sep 17 00:00:00 2001 From: Ricardo Arenas Date: Fri, 23 Jul 2021 11:11:45 -0700 Subject: [PATCH 243/699] don't allocate response content buffer when downloading files for publishing (#7662) --- .../src/PublishArtifactsInManifestBase.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Microsoft.DotNet.Build.Tasks.Feed/src/PublishArtifactsInManifestBase.cs b/src/Microsoft.DotNet.Build.Tasks.Feed/src/PublishArtifactsInManifestBase.cs index 8670e955c83..986f2668445 100644 --- a/src/Microsoft.DotNet.Build.Tasks.Feed/src/PublishArtifactsInManifestBase.cs +++ b/src/Microsoft.DotNet.Build.Tasks.Feed/src/PublishArtifactsInManifestBase.cs @@ -912,7 +912,7 @@ public async Task DownloadFileAsync( new CancellationTokenSource(TimeSpan.FromMinutes(TimeoutInMinutes)); using HttpRequestMessage getMessage = new HttpRequestMessage(HttpMethod.Get, uri); - using HttpResponseMessage response = await client.GetAsync(uri, timeoutTokenSource.Token); + using HttpResponseMessage response = await client.GetAsync(uri, HttpCompletionOption.ResponseHeadersRead, timeoutTokenSource.Token); response.EnsureSuccessStatusCode(); From 77b4397cb33de6e82118c7f263b28a72e9b51842 Mon Sep 17 00:00:00 2001 From: Aaron Robinson Date: Fri, 23 Jul 2021 16:17:28 -0700 Subject: [PATCH 244/699] Update Onboarding.md (#7665) Update links to main branch. --- Documentation/Onboarding.md | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/Documentation/Onboarding.md b/Documentation/Onboarding.md index 9e919011974..1da3ec480c1 100644 --- a/Documentation/Onboarding.md +++ b/Documentation/Onboarding.md @@ -8,22 +8,22 @@ Steps: 1. Add a - [global.json](https://github.com/dotnet/arcade/blob/master/global.json). + [global.json](https://github.com/dotnet/arcade/blob/main/global.json). 2. Add (or copy) - [Directory.Build.props](https://github.com/dotnet/arcade/blob/master/Directory.Build.props) + [Directory.Build.props](https://github.com/dotnet/arcade/blob/main/Directory.Build.props) and - [Directory.build.targets](https://github.com/dotnet/arcade/blob/master/Directory.Build.targets). + [Directory.build.targets](https://github.com/dotnet/arcade/blob/main/Directory.Build.targets). 3. Copy `eng\common` from - [Arcade](https://github.com/dotnet/arcade/tree/master/eng/common) + [Arcade](https://github.com/dotnet/arcade/tree/main/eng/common) into repo. 4. Add (or copy) the - [Versions.props](https://github.com/dotnet/arcade/blob/master/eng/Versions.props) + [Versions.props](https://github.com/dotnet/arcade/blob/main/eng/Versions.props) and - [Version.Details.xml](https://github.com/dotnet/arcade/blob/master/eng/Version.Details.xml) + [Version.Details.xml](https://github.com/dotnet/arcade/blob/main/eng/Version.Details.xml) files to your eng\ folder. Adjust the version prefix and prerelease label as necessary. 5. Add dotnet-core feed and any other feeds that the repository restores NuGet packages from to - [NuGet.config](https://github.com/dotnet/arcade/blob/master/NuGet.config). + [NuGet.config](https://github.com/dotnet/arcade/blob/main/NuGet.config). **Using Arcade packages** - See [documentation](CorePackages/) for information on specific packages. @@ -37,7 +37,7 @@ DevDiv to DncEng](AzureDevOps/MovingFromDevDivToDncEng.md). - Onboard onto dependency flow (Darc). - See [Dependency Flow Onboarding](DependencyFlowOnboarding.md). -- Use Helix for testing where possible - See [Sending Jobs to Helix](https://github.com/dotnet/arcade/blob/master/Documentation/AzureDevOps/SendingJobsToHelix.md) +- Use Helix for testing where possible - See [Sending Jobs to Helix](https://github.com/dotnet/arcade/blob/main/Documentation/AzureDevOps/SendingJobsToHelix.md) ## Which branches should I make these changes in? From c6a28c81f96d196338b3ea520bc1e6dc7c440ee2 Mon Sep 17 00:00:00 2001 From: Ricardo Arenas Date: Fri, 23 Jul 2021 16:41:48 -0700 Subject: [PATCH 245/699] update to arcade that contains publishing fix (#7664) --- eng/Version.Details.xml | 20 ++++++++++---------- eng/Versions.props | 6 +++--- global.json | 4 ++-- 3 files changed, 15 insertions(+), 15 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index c3f3fccdc92..97ff63c2ca1 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -11,25 +11,25 @@ - + https://github.com/dotnet/arcade - 89806f0b9e93ad2bbe32c654412835c0801a2032 + c5d8214ed77ba3abc86337e870e8568deb14a93a - + https://github.com/dotnet/arcade - 89806f0b9e93ad2bbe32c654412835c0801a2032 + c5d8214ed77ba3abc86337e870e8568deb14a93a - + https://github.com/dotnet/arcade - 89806f0b9e93ad2bbe32c654412835c0801a2032 + c5d8214ed77ba3abc86337e870e8568deb14a93a - + https://github.com/dotnet/arcade - 89806f0b9e93ad2bbe32c654412835c0801a2032 + c5d8214ed77ba3abc86337e870e8568deb14a93a - + https://github.com/dotnet/arcade - 89806f0b9e93ad2bbe32c654412835c0801a2032 + c5d8214ed77ba3abc86337e870e8568deb14a93a https://github.com/dotnet/arcade-services diff --git a/eng/Versions.props b/eng/Versions.props index 3f67c814f90..e0d6ddc1de1 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -65,8 +65,8 @@ 2.4.1 2.0.3 2.4.1 - 6.0.0-beta.21370.12 - 6.0.0-beta.21370.12 + 6.0.0-beta.21373.9 + 6.0.0-beta.21373.9 1.22.0 1.1.2 2.0.0 @@ -77,7 +77,7 @@ 1.1.0-beta.20258.6 1.1.0-beta-21309-01 1.1.0-beta-21309-01 - 6.0.0-beta.21370.12 + 6.0.0-beta.21373.9 1.0.0-beta.21371.1 1.1.0-beta.21228.1 1.0.0-prerelease.21364.1 diff --git a/global.json b/global.json index 30d998e60fd..78e2236c795 100644 --- a/global.json +++ b/global.json @@ -3,7 +3,7 @@ "dotnet": "6.0.100-preview.6.21355.2" }, "msbuild-sdks": { - "Microsoft.DotNet.Arcade.Sdk": "6.0.0-beta.21370.12", - "Microsoft.DotNet.Helix.Sdk": "6.0.0-beta.21370.12" + "Microsoft.DotNet.Arcade.Sdk": "6.0.0-beta.21373.9", + "Microsoft.DotNet.Helix.Sdk": "6.0.0-beta.21373.9" } } From d25a4669f20bd450064706e6ffd9784223e68739 Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Mon, 26 Jul 2021 14:28:22 +0000 Subject: [PATCH 246/699] [main] Update dependencies from dotnet/xliff-tasks dotnet/xharness dotnet/arcade (#7666) [main] Update dependencies from dotnet/xliff-tasks dotnet/xharness dotnet/arcade --- eng/Version.Details.xml | 28 ++++++++++++++-------------- eng/Versions.props | 10 +++++----- global.json | 4 ++-- 3 files changed, 21 insertions(+), 21 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index 97ff63c2ca1..db7b939afc4 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -11,25 +11,25 @@ - + https://github.com/dotnet/arcade - c5d8214ed77ba3abc86337e870e8568deb14a93a + c6a28c81f96d196338b3ea520bc1e6dc7c440ee2 - + https://github.com/dotnet/arcade - c5d8214ed77ba3abc86337e870e8568deb14a93a + c6a28c81f96d196338b3ea520bc1e6dc7c440ee2 - + https://github.com/dotnet/arcade - c5d8214ed77ba3abc86337e870e8568deb14a93a + c6a28c81f96d196338b3ea520bc1e6dc7c440ee2 - + https://github.com/dotnet/arcade - c5d8214ed77ba3abc86337e870e8568deb14a93a + c6a28c81f96d196338b3ea520bc1e6dc7c440ee2 - + https://github.com/dotnet/arcade - c5d8214ed77ba3abc86337e870e8568deb14a93a + c6a28c81f96d196338b3ea520bc1e6dc7c440ee2 https://github.com/dotnet/arcade-services @@ -39,9 +39,9 @@ https://github.com/dotnet/arcade-services cac955fe259cb611f6a29d09209bd717deb69037 - + https://github.com/dotnet/xharness - e5511489deb44b13418fe622775bd7035e21c5ae + ccb49ae05b6d98b29871a1779408d4579e16d6e5 https://github.com/dotnet/roslyn @@ -68,9 +68,9 @@ https://github.com/dotnet/symreader-converter c5ba7c88f92e2dde156c324a8c8edc04d9fa4fe0 - + https://github.com/dotnet/xliff-tasks - 31d2b6c3aa2f874e9e93a005e773101468b8612a + ba0f1e992b0e154787e4411723ae71909a77e73d diff --git a/eng/Versions.props b/eng/Versions.props index e0d6ddc1de1..34ba4fa170b 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -65,8 +65,8 @@ 2.4.1 2.0.3 2.4.1 - 6.0.0-beta.21373.9 - 6.0.0-beta.21373.9 + 6.0.0-beta.21373.11 + 6.0.0-beta.21373.11 1.22.0 1.1.2 2.0.0 @@ -77,10 +77,10 @@ 1.1.0-beta.20258.6 1.1.0-beta-21309-01 1.1.0-beta-21309-01 - 6.0.0-beta.21373.9 - 1.0.0-beta.21371.1 + 6.0.0-beta.21373.11 + 1.0.0-beta.21374.1 1.1.0-beta.21228.1 - 1.0.0-prerelease.21364.1 + 1.0.0-prerelease.21373.1 1.1.156602 1.1.156602 6.0.100-preview.5.21254.11 diff --git a/global.json b/global.json index 78e2236c795..84406050151 100644 --- a/global.json +++ b/global.json @@ -3,7 +3,7 @@ "dotnet": "6.0.100-preview.6.21355.2" }, "msbuild-sdks": { - "Microsoft.DotNet.Arcade.Sdk": "6.0.0-beta.21373.9", - "Microsoft.DotNet.Helix.Sdk": "6.0.0-beta.21373.9" + "Microsoft.DotNet.Arcade.Sdk": "6.0.0-beta.21373.11", + "Microsoft.DotNet.Helix.Sdk": "6.0.0-beta.21373.11" } } From c09545a2169ea1535c0b7ee475b3e95bf521f85b Mon Sep 17 00:00:00 2001 From: Jacques Eloff Date: Mon, 26 Jul 2021 21:39:01 -0700 Subject: [PATCH 247/699] Include manifest ID in upgrade code generation (#7671) --- .../src/GenerateManifestMsi.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Microsoft.DotNet.Build.Tasks.Workloads/src/GenerateManifestMsi.cs b/src/Microsoft.DotNet.Build.Tasks.Workloads/src/GenerateManifestMsi.cs index ec049c9b3f7..86b4bf68b90 100644 --- a/src/Microsoft.DotNet.Build.Tasks.Workloads/src/GenerateManifestMsi.cs +++ b/src/Microsoft.DotNet.Build.Tasks.Workloads/src/GenerateManifestMsi.cs @@ -188,7 +188,7 @@ public override bool Execute() // To support upgrades, the UpgradeCode must be stable withing a feature band. // For example, 6.0.101 and 6.0.108 will generate the same GUID for the same platform. - var upgradeCode = Utils.CreateUuid(GenerateMsiBase.UpgradeCodeNamespaceUuid, $"{SdkFeatureBandVersion};{platform}"); + var upgradeCode = Utils.CreateUuid(GenerateMsiBase.UpgradeCodeNamespaceUuid, $"{ManifestId};{SdkFeatureBandVersion};{platform}"); var productCode = Guid.NewGuid(); Log.LogMessage($"UC: {upgradeCode}, PC: {productCode}, {SdkFeatureBandVersion}, {SdkVersion}, {platform}"); From e6abc186425e675e0f201acc1c33e183a0e51c86 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C5=99emek=20Vysok=C3=BD?= Date: Tue, 27 Jul 2021 08:45:24 +0200 Subject: [PATCH 248/699] Move from XliffTasks to Microsoft.DotNet.XliffTasks (#7667) The package name was changed to start with a reserved name (https://github.com/dotnet/xliff-tasks/issues/412) --- eng/Version.Details.xml | 4 ++-- eng/Versions.props | 2 +- .../Microsoft.DotNet.Arcade.Sdk.csproj | 2 +- src/Microsoft.DotNet.Arcade.Sdk/tools/Localization.targets | 2 +- src/Microsoft.DotNet.AsmDiff/Microsoft.DotNet.AsmDiff.csproj | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index db7b939afc4..05b5deee504 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -68,9 +68,9 @@ https://github.com/dotnet/symreader-converter c5ba7c88f92e2dde156c324a8c8edc04d9fa4fe0 - + https://github.com/dotnet/xliff-tasks - ba0f1e992b0e154787e4411723ae71909a77e73d + 397ff033b467003d51619f9ac3928e02a4d4178f diff --git a/eng/Versions.props b/eng/Versions.props index 34ba4fa170b..c595b5613bd 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -78,7 +78,7 @@ 1.1.0-beta-21309-01 1.1.0-beta-21309-01 6.0.0-beta.21373.11 - 1.0.0-beta.21374.1 + 1.0.0-beta.21376.1 1.1.0-beta.21228.1 1.0.0-prerelease.21373.1 1.1.156602 diff --git a/src/Microsoft.DotNet.Arcade.Sdk/Microsoft.DotNet.Arcade.Sdk.csproj b/src/Microsoft.DotNet.Arcade.Sdk/Microsoft.DotNet.Arcade.Sdk.csproj index cb00a3c492f..7cc96f188ed 100644 --- a/src/Microsoft.DotNet.Arcade.Sdk/Microsoft.DotNet.Arcade.Sdk.csproj +++ b/src/Microsoft.DotNet.Arcade.Sdk/Microsoft.DotNet.Arcade.Sdk.csproj @@ -81,7 +81,7 @@ $(MicrosoftNetILLinkTasksVersion) $(MicrosoftSourceLinkVersion) $(MicrosoftDiaSymReaderPdb2PdbVersion) - $(XliffTasksVersion) + $(MicrosoftDotNetXliffTasksVersion) $(MicrosoftDotNetMaestroTasksVersion) $(MicrosoftSymbolUploaderBuildTaskVersion) diff --git a/src/Microsoft.DotNet.Arcade.Sdk/tools/Localization.targets b/src/Microsoft.DotNet.Arcade.Sdk/tools/Localization.targets index d6558f3abd5..4eef799770d 100644 --- a/src/Microsoft.DotNet.Arcade.Sdk/tools/Localization.targets +++ b/src/Microsoft.DotNet.Arcade.Sdk/tools/Localization.targets @@ -23,6 +23,6 @@ - + diff --git a/src/Microsoft.DotNet.AsmDiff/Microsoft.DotNet.AsmDiff.csproj b/src/Microsoft.DotNet.AsmDiff/Microsoft.DotNet.AsmDiff.csproj index dca4d958f8d..84cc31bf5ad 100644 --- a/src/Microsoft.DotNet.AsmDiff/Microsoft.DotNet.AsmDiff.csproj +++ b/src/Microsoft.DotNet.AsmDiff/Microsoft.DotNet.AsmDiff.csproj @@ -21,7 +21,7 @@ - + From cab4a3c50fd042677ea17cfc5171b4ce8b29930f Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Tue, 27 Jul 2021 15:06:40 +0000 Subject: [PATCH 249/699] [main] Update dependencies from dotnet/arcade mono/linker (#7673) [main] Update dependencies from dotnet/arcade mono/linker --- eng/Version.Details.xml | 24 ++++++++++++------------ eng/Versions.props | 8 ++++---- global.json | 4 ++-- 3 files changed, 18 insertions(+), 18 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index 05b5deee504..75759ab53b8 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -11,25 +11,25 @@ - + https://github.com/dotnet/arcade - c6a28c81f96d196338b3ea520bc1e6dc7c440ee2 + e6abc186425e675e0f201acc1c33e183a0e51c86 - + https://github.com/dotnet/arcade - c6a28c81f96d196338b3ea520bc1e6dc7c440ee2 + e6abc186425e675e0f201acc1c33e183a0e51c86 - + https://github.com/dotnet/arcade - c6a28c81f96d196338b3ea520bc1e6dc7c440ee2 + e6abc186425e675e0f201acc1c33e183a0e51c86 - + https://github.com/dotnet/arcade - c6a28c81f96d196338b3ea520bc1e6dc7c440ee2 + e6abc186425e675e0f201acc1c33e183a0e51c86 - + https://github.com/dotnet/arcade - c6a28c81f96d196338b3ea520bc1e6dc7c440ee2 + e6abc186425e675e0f201acc1c33e183a0e51c86 https://github.com/dotnet/arcade-services @@ -47,9 +47,9 @@ https://github.com/dotnet/roslyn 246ce641f04b67ef017655275d850bf902a8e40f - + https://github.com/mono/linker - 6eae01980dc694107bdee0bc723d75a0dd601f0e + b888d672e11588e2bbca1cd3eeaee30d53416897 https://github.com/dotnet/sourcelink diff --git a/eng/Versions.props b/eng/Versions.props index c595b5613bd..2a5933de86b 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -35,7 +35,7 @@ 2.1.1 2.1.0 3.10.0-4.21329.37 - 6.0.100-preview.6.21370.1 + 6.0.100-preview.6.21376.2 16.7.1 4.8.3 5.3.0.1 @@ -65,8 +65,8 @@ 2.4.1 2.0.3 2.4.1 - 6.0.0-beta.21373.11 - 6.0.0-beta.21373.11 + 6.0.0-beta.21376.4 + 6.0.0-beta.21376.4 1.22.0 1.1.2 2.0.0 @@ -77,7 +77,7 @@ 1.1.0-beta.20258.6 1.1.0-beta-21309-01 1.1.0-beta-21309-01 - 6.0.0-beta.21373.11 + 6.0.0-beta.21376.4 1.0.0-beta.21376.1 1.1.0-beta.21228.1 1.0.0-prerelease.21373.1 diff --git a/global.json b/global.json index 84406050151..3ac43a5dbc0 100644 --- a/global.json +++ b/global.json @@ -3,7 +3,7 @@ "dotnet": "6.0.100-preview.6.21355.2" }, "msbuild-sdks": { - "Microsoft.DotNet.Arcade.Sdk": "6.0.0-beta.21373.11", - "Microsoft.DotNet.Helix.Sdk": "6.0.0-beta.21373.11" + "Microsoft.DotNet.Arcade.Sdk": "6.0.0-beta.21376.4", + "Microsoft.DotNet.Helix.Sdk": "6.0.0-beta.21376.4" } } From 7c7c38be327c4a3c5d62feff0cd0fe94ce1e85ef Mon Sep 17 00:00:00 2001 From: Ricardo Arenas Date: Tue, 27 Jul 2021 11:27:18 -0700 Subject: [PATCH 250/699] Use hosted pool for publishing job (#7676) --- eng/publishing/v3/publish-assets.yml | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) diff --git a/eng/publishing/v3/publish-assets.yml b/eng/publishing/v3/publish-assets.yml index 589ce5c5a1e..33ef36c0979 100644 --- a/eng/publishing/v3/publish-assets.yml +++ b/eng/publishing/v3/publish-assets.yml @@ -25,15 +25,8 @@ jobs: - name: AzDOAccount value: $[ dependencies.setupMaestroVars.outputs['setReleaseVars.AzDOBuildAccount'] ] - # Using non-hosted build agents to (hopefully temporarily) work around OOMs - # See https://github.com/dotnet/core-eng/issues/13098 for context - ${{ if eq(variables['System.TeamFoundationCollectionUri'], 'https://dev.azure.com/dnceng/') }}: - pool: - name: NetCoreInternal-Pool - queue: BuildPool.Server.Amd64.VS2019 - ${{ if ne(variables['System.TeamFoundationCollectionUri'], 'https://dev.azure.com/dnceng/') }}: - pool: - vmImage: 'windows-2019' + pool: + vmImage: 'windows-2019' steps: - task: DownloadBuildArtifacts@0 displayName: Download Build Assets From 1790a07c28f87a04edf84c0e1625ee9d3129977b Mon Sep 17 00:00:00 2001 From: Eric StJohn Date: Tue, 27 Jul 2021 12:45:48 -0700 Subject: [PATCH 251/699] Fix NotSupported assemblies built from VS (#7678) --- .../build/Microsoft.DotNet.GenFacadesNotSupported.targets | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Microsoft.DotNet.GenFacades/build/Microsoft.DotNet.GenFacadesNotSupported.targets b/src/Microsoft.DotNet.GenFacades/build/Microsoft.DotNet.GenFacadesNotSupported.targets index fdc6b533ccf..a071dd35b9b 100644 --- a/src/Microsoft.DotNet.GenFacades/build/Microsoft.DotNet.GenFacadesNotSupported.targets +++ b/src/Microsoft.DotNet.GenFacades/build/Microsoft.DotNet.GenFacadesNotSupported.targets @@ -31,7 +31,7 @@ Projects="@(ProjectReference)" Targets="SourceFilesProjectOutputGroup" Properties="%(ProjectReference.SetTargetFramework)" - Condition="'%(ProjectReference.Targets)' == 'GetCompile' and ('$(BuildingInsideVisualStudio)' == 'true' or '$(BuildProjectReferences)' != 'true')"> + Condition="'%(ProjectReference.Targets)' == 'SourceFilesProjectOutputGroup' and ('$(BuildingInsideVisualStudio)' == 'true' or '$(BuildProjectReferences)' != 'true')"> From 0602cfaab1dfdbf7802dd3d2876fd17cf4ae04a7 Mon Sep 17 00:00:00 2001 From: Adeel Mujahid <3840695+am11@users.noreply.github.com> Date: Wed, 28 Jul 2021 10:00:31 +0300 Subject: [PATCH 252/699] Update license headers (#7670) --- eng/common/internal/Tools.csproj | 2 +- .../Microsoft.DotNet.Build.Tasks.Archives.csproj | 2 +- .../src/PublishSymbolsHelper.cs | 1 - src/Microsoft.DotNet.Build.Tasks.Feed/src/PushToBlobFeed.cs | 1 - .../build/deb-package-tool/package_tool.sh | 2 +- .../deb-package-tool/scripts/config_template_generator.py | 1 - .../build/deb-package-tool/scripts/debian_build_lib.sh | 1 - .../build/deb-package-tool/scripts/extract_json_value.py | 1 - .../build/deb-package-tool/scripts/manpage_generator.py | 1 - .../build/deb-package-tool/setup/build_setup.sh | 3 +-- .../build/deb-package-tool/setup/test_setup.sh | 3 +-- .../build/deb-package-tool/templates/debian/control | 1 - .../build/deb-package-tool/templates/debian/copyright | 2 +- .../build/deb-package-tool/templates/debian/rules | 1 - .../build/rpm_templates/copyright | 2 +- .../src/BuildFPMToolPreReqs.cs | 1 - .../src/ExecWithRetries.cs | 1 - .../src/GenerateCurrentVersion.cs | 1 - .../src/GenerateGuidFromName.cs | 1 - .../src/GenerateJsonObjectString.cs | 1 - .../src/GenerateMacOSDistributionFile.cs | 1 - .../src/GenerateMsiVersion.cs | 1 - .../src/StabilizeWixFileId.cs | 1 - .../Microsoft.DotNet.Build.Tasks.VisualStudio.csproj | 2 +- .../tasks/Microsoft.DotNet.NuGetRepack.Tasks.csproj | 2 +- src/Microsoft.DotNet.NuGetRepack/tasks/src/NuGetUtils.cs | 3 ++- .../tasks/src/NuGetVersionUpdater.cs | 3 ++- .../tasks/src/ReplacePackageParts.cs | 3 ++- .../tasks/src/UpdatePackageVersionTask.cs | 3 ++- .../tests/Microsoft.DotNet.NuGetRepack.Tests.csproj | 2 +- .../tests/ReplacePackagePartsTests.cs | 3 ++- .../tests/TestHelpers/AssertEx.cs | 3 ++- .../tests/TestHelpers/DiffUtil.cs | 3 ++- .../tests/TestHelpers/ResourceLoader.cs | 5 +++-- .../tests/TestHelpers/TestResources.cs | 3 ++- .../tests/VersionUpdaterTests.cs | 3 ++- .../Microsoft.DotNet.SharedFramework.Sdk.csproj | 2 +- .../src/CreateFrameworkListFile.cs | 1 - .../src/FileUtilities.cs | 1 - .../src/GeneratePlatformManifestEntriesFromFileList.cs | 1 - .../src/GeneratePlatformManifestEntriesFromTemplate.cs | 1 - .../src/GenerateSharedFrameworkDepsFile.cs | 1 - .../src/Packaging/Extensions.cs | 1 - .../src/PlatformManifestEntry.cs | 1 - .../src/ValidateFileVersions.cs | 1 - 45 files changed, 32 insertions(+), 48 deletions(-) diff --git a/eng/common/internal/Tools.csproj b/eng/common/internal/Tools.csproj index f46d5efe2e3..2067b8df8d9 100644 --- a/eng/common/internal/Tools.csproj +++ b/eng/common/internal/Tools.csproj @@ -1,5 +1,5 @@ + - net472 diff --git a/src/Microsoft.DotNet.Build.Tasks.Archives/Microsoft.DotNet.Build.Tasks.Archives.csproj b/src/Microsoft.DotNet.Build.Tasks.Archives/Microsoft.DotNet.Build.Tasks.Archives.csproj index af826e9d5df..c09d77629ea 100644 --- a/src/Microsoft.DotNet.Build.Tasks.Archives/Microsoft.DotNet.Build.Tasks.Archives.csproj +++ b/src/Microsoft.DotNet.Build.Tasks.Archives/Microsoft.DotNet.Build.Tasks.Archives.csproj @@ -1,4 +1,4 @@ - + netcoreapp3.1 diff --git a/src/Microsoft.DotNet.Build.Tasks.Feed/src/PublishSymbolsHelper.cs b/src/Microsoft.DotNet.Build.Tasks.Feed/src/PublishSymbolsHelper.cs index f781d8f0b21..75991951b72 100644 --- a/src/Microsoft.DotNet.Build.Tasks.Feed/src/PublishSymbolsHelper.cs +++ b/src/Microsoft.DotNet.Build.Tasks.Feed/src/PublishSymbolsHelper.cs @@ -1,6 +1,5 @@ // 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 System; using System.Collections.Generic; diff --git a/src/Microsoft.DotNet.Build.Tasks.Feed/src/PushToBlobFeed.cs b/src/Microsoft.DotNet.Build.Tasks.Feed/src/PushToBlobFeed.cs index 5e26d9fa001..0e9d96c94aa 100644 --- a/src/Microsoft.DotNet.Build.Tasks.Feed/src/PushToBlobFeed.cs +++ b/src/Microsoft.DotNet.Build.Tasks.Feed/src/PushToBlobFeed.cs @@ -1,6 +1,5 @@ // 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.Arcade.Common; using Microsoft.Build.Framework; diff --git a/src/Microsoft.DotNet.Build.Tasks.Installers/build/deb-package-tool/package_tool.sh b/src/Microsoft.DotNet.Build.Tasks.Installers/build/deb-package-tool/package_tool.sh index 9e069b7a1e0..6987c8a0b1d 100644 --- a/src/Microsoft.DotNet.Build.Tasks.Installers/build/deb-package-tool/package_tool.sh +++ b/src/Microsoft.DotNet.Build.Tasks.Installers/build/deb-package-tool/package_tool.sh @@ -2,8 +2,8 @@ # # 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. # + set -e SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" diff --git a/src/Microsoft.DotNet.Build.Tasks.Installers/build/deb-package-tool/scripts/config_template_generator.py b/src/Microsoft.DotNet.Build.Tasks.Installers/build/deb-package-tool/scripts/config_template_generator.py index 6b8b21c9e12..4811634c5d3 100644 --- a/src/Microsoft.DotNet.Build.Tasks.Installers/build/deb-package-tool/scripts/config_template_generator.py +++ b/src/Microsoft.DotNet.Build.Tasks.Installers/build/deb-package-tool/scripts/config_template_generator.py @@ -2,7 +2,6 @@ # # 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. # # Parses debian_config.json and generates appropriate templates diff --git a/src/Microsoft.DotNet.Build.Tasks.Installers/build/deb-package-tool/scripts/debian_build_lib.sh b/src/Microsoft.DotNet.Build.Tasks.Installers/build/deb-package-tool/scripts/debian_build_lib.sh index 18d388864fd..1520ffa62aa 100644 --- a/src/Microsoft.DotNet.Build.Tasks.Installers/build/deb-package-tool/scripts/debian_build_lib.sh +++ b/src/Microsoft.DotNet.Build.Tasks.Installers/build/deb-package-tool/scripts/debian_build_lib.sh @@ -1,7 +1,6 @@ # # 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. # # This file is not intended to be executed directly diff --git a/src/Microsoft.DotNet.Build.Tasks.Installers/build/deb-package-tool/scripts/extract_json_value.py b/src/Microsoft.DotNet.Build.Tasks.Installers/build/deb-package-tool/scripts/extract_json_value.py index 74f26a6ffdd..27b98c106a1 100644 --- a/src/Microsoft.DotNet.Build.Tasks.Installers/build/deb-package-tool/scripts/extract_json_value.py +++ b/src/Microsoft.DotNet.Build.Tasks.Installers/build/deb-package-tool/scripts/extract_json_value.py @@ -2,7 +2,6 @@ # # 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. # # Extract Json Value diff --git a/src/Microsoft.DotNet.Build.Tasks.Installers/build/deb-package-tool/scripts/manpage_generator.py b/src/Microsoft.DotNet.Build.Tasks.Installers/build/deb-package-tool/scripts/manpage_generator.py index c62e6807901..dc20bb6d1c5 100644 --- a/src/Microsoft.DotNet.Build.Tasks.Installers/build/deb-package-tool/scripts/manpage_generator.py +++ b/src/Microsoft.DotNet.Build.Tasks.Installers/build/deb-package-tool/scripts/manpage_generator.py @@ -2,7 +2,6 @@ # # 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. # # manpage_generator diff --git a/src/Microsoft.DotNet.Build.Tasks.Installers/build/deb-package-tool/setup/build_setup.sh b/src/Microsoft.DotNet.Build.Tasks.Installers/build/deb-package-tool/setup/build_setup.sh index 12c223aacbc..a77cc192ecd 100644 --- a/src/Microsoft.DotNet.Build.Tasks.Installers/build/deb-package-tool/setup/build_setup.sh +++ b/src/Microsoft.DotNet.Build.Tasks.Installers/build/deb-package-tool/setup/build_setup.sh @@ -1,7 +1,6 @@ # # 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. # install_dependencies(){ @@ -18,4 +17,4 @@ setup(){ install_dependencies } -setup \ No newline at end of file +setup diff --git a/src/Microsoft.DotNet.Build.Tasks.Installers/build/deb-package-tool/setup/test_setup.sh b/src/Microsoft.DotNet.Build.Tasks.Installers/build/deb-package-tool/setup/test_setup.sh index a7cdd95c2b3..287db6c51ea 100644 --- a/src/Microsoft.DotNet.Build.Tasks.Installers/build/deb-package-tool/setup/test_setup.sh +++ b/src/Microsoft.DotNet.Build.Tasks.Installers/build/deb-package-tool/setup/test_setup.sh @@ -1,7 +1,6 @@ # # 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. # install_dependencies(){ @@ -25,4 +24,4 @@ setup(){ install_bats } -setup \ No newline at end of file +setup diff --git a/src/Microsoft.DotNet.Build.Tasks.Installers/build/deb-package-tool/templates/debian/control b/src/Microsoft.DotNet.Build.Tasks.Installers/build/deb-package-tool/templates/debian/control index 114d8493042..9497e6c5d07 100644 --- a/src/Microsoft.DotNet.Build.Tasks.Installers/build/deb-package-tool/templates/debian/control +++ b/src/Microsoft.DotNet.Build.Tasks.Installers/build/deb-package-tool/templates/debian/control @@ -1,7 +1,6 @@ # # 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. # Source: {PACKAGE_NAME} diff --git a/src/Microsoft.DotNet.Build.Tasks.Installers/build/deb-package-tool/templates/debian/copyright b/src/Microsoft.DotNet.Build.Tasks.Installers/build/deb-package-tool/templates/debian/copyright index 72febbba8af..3e916a1311d 100644 --- a/src/Microsoft.DotNet.Build.Tasks.Installers/build/deb-package-tool/templates/debian/copyright +++ b/src/Microsoft.DotNet.Build.Tasks.Installers/build/deb-package-tool/templates/debian/copyright @@ -1,4 +1,4 @@ -Comment: 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. +Comment: Licensed to the .NET Foundation under one or more agreements. The .NET Foundation licenses this file to you under the MIT license. Format: http://www.debian.org/doc/packaging-manuals/copyright-format/1.0/ diff --git a/src/Microsoft.DotNet.Build.Tasks.Installers/build/deb-package-tool/templates/debian/rules b/src/Microsoft.DotNet.Build.Tasks.Installers/build/deb-package-tool/templates/debian/rules index b5cbfb27e20..6a4e98d27a5 100644 --- a/src/Microsoft.DotNet.Build.Tasks.Installers/build/deb-package-tool/templates/debian/rules +++ b/src/Microsoft.DotNet.Build.Tasks.Installers/build/deb-package-tool/templates/debian/rules @@ -2,7 +2,6 @@ # # 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. # {overrides} diff --git a/src/Microsoft.DotNet.Build.Tasks.Installers/build/rpm_templates/copyright b/src/Microsoft.DotNet.Build.Tasks.Installers/build/rpm_templates/copyright index ba561b5eceb..ec4b68bc19f 100644 --- a/src/Microsoft.DotNet.Build.Tasks.Installers/build/rpm_templates/copyright +++ b/src/Microsoft.DotNet.Build.Tasks.Installers/build/rpm_templates/copyright @@ -1,4 +1,4 @@ -Comment: 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. +Comment: Licensed to the .NET Foundation under one or more agreements. The .NET Foundation licenses this file to you under the MIT license. Files: * Copyright: {COPYRIGHT_TEXT} diff --git a/src/Microsoft.DotNet.Build.Tasks.Installers/src/BuildFPMToolPreReqs.cs b/src/Microsoft.DotNet.Build.Tasks.Installers/src/BuildFPMToolPreReqs.cs index c956a24e661..39c9246b131 100644 --- a/src/Microsoft.DotNet.Build.Tasks.Installers/src/BuildFPMToolPreReqs.cs +++ b/src/Microsoft.DotNet.Build.Tasks.Installers/src/BuildFPMToolPreReqs.cs @@ -1,6 +1,5 @@ // 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 Newtonsoft.Json; diff --git a/src/Microsoft.DotNet.Build.Tasks.Installers/src/ExecWithRetries.cs b/src/Microsoft.DotNet.Build.Tasks.Installers/src/ExecWithRetries.cs index 3beaa96ec29..fea8f8eb87c 100644 --- a/src/Microsoft.DotNet.Build.Tasks.Installers/src/ExecWithRetries.cs +++ b/src/Microsoft.DotNet.Build.Tasks.Installers/src/ExecWithRetries.cs @@ -1,6 +1,5 @@ // 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. // Initially copied from https://github.com/dotnet/buildtools/blob/6736870b84e06b75e7df32bb84d442db1b2afa10/src/Microsoft.DotNet.Build.Tasks/ExecWithRetries.cs diff --git a/src/Microsoft.DotNet.Build.Tasks.Installers/src/GenerateCurrentVersion.cs b/src/Microsoft.DotNet.Build.Tasks.Installers/src/GenerateCurrentVersion.cs index 3c00c3a5f83..8680208bdb2 100644 --- a/src/Microsoft.DotNet.Build.Tasks.Installers/src/GenerateCurrentVersion.cs +++ b/src/Microsoft.DotNet.Build.Tasks.Installers/src/GenerateCurrentVersion.cs @@ -1,6 +1,5 @@ // 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 System; diff --git a/src/Microsoft.DotNet.Build.Tasks.Installers/src/GenerateGuidFromName.cs b/src/Microsoft.DotNet.Build.Tasks.Installers/src/GenerateGuidFromName.cs index 678b32a61a0..6884a0d4522 100644 --- a/src/Microsoft.DotNet.Build.Tasks.Installers/src/GenerateGuidFromName.cs +++ b/src/Microsoft.DotNet.Build.Tasks.Installers/src/GenerateGuidFromName.cs @@ -1,6 +1,5 @@ // 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 System; diff --git a/src/Microsoft.DotNet.Build.Tasks.Installers/src/GenerateJsonObjectString.cs b/src/Microsoft.DotNet.Build.Tasks.Installers/src/GenerateJsonObjectString.cs index 189b1b3d0eb..517e675ed53 100644 --- a/src/Microsoft.DotNet.Build.Tasks.Installers/src/GenerateJsonObjectString.cs +++ b/src/Microsoft.DotNet.Build.Tasks.Installers/src/GenerateJsonObjectString.cs @@ -1,6 +1,5 @@ // 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 System; diff --git a/src/Microsoft.DotNet.Build.Tasks.Installers/src/GenerateMacOSDistributionFile.cs b/src/Microsoft.DotNet.Build.Tasks.Installers/src/GenerateMacOSDistributionFile.cs index 54f0bfe3cff..4a2242b80bd 100644 --- a/src/Microsoft.DotNet.Build.Tasks.Installers/src/GenerateMacOSDistributionFile.cs +++ b/src/Microsoft.DotNet.Build.Tasks.Installers/src/GenerateMacOSDistributionFile.cs @@ -1,6 +1,5 @@ // 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; diff --git a/src/Microsoft.DotNet.Build.Tasks.Installers/src/GenerateMsiVersion.cs b/src/Microsoft.DotNet.Build.Tasks.Installers/src/GenerateMsiVersion.cs index fefcb0a13a5..95ba0420bff 100644 --- a/src/Microsoft.DotNet.Build.Tasks.Installers/src/GenerateMsiVersion.cs +++ b/src/Microsoft.DotNet.Build.Tasks.Installers/src/GenerateMsiVersion.cs @@ -1,6 +1,5 @@ // 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; diff --git a/src/Microsoft.DotNet.Build.Tasks.Installers/src/StabilizeWixFileId.cs b/src/Microsoft.DotNet.Build.Tasks.Installers/src/StabilizeWixFileId.cs index a0a2f1fa1c3..77410034c15 100644 --- a/src/Microsoft.DotNet.Build.Tasks.Installers/src/StabilizeWixFileId.cs +++ b/src/Microsoft.DotNet.Build.Tasks.Installers/src/StabilizeWixFileId.cs @@ -1,6 +1,5 @@ // 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 System; diff --git a/src/Microsoft.DotNet.Build.Tasks.VisualStudio/Microsoft.DotNet.Build.Tasks.VisualStudio.csproj b/src/Microsoft.DotNet.Build.Tasks.VisualStudio/Microsoft.DotNet.Build.Tasks.VisualStudio.csproj index e1ff2fd44b7..ef3b7fb6bb9 100644 --- a/src/Microsoft.DotNet.Build.Tasks.VisualStudio/Microsoft.DotNet.Build.Tasks.VisualStudio.csproj +++ b/src/Microsoft.DotNet.Build.Tasks.VisualStudio/Microsoft.DotNet.Build.Tasks.VisualStudio.csproj @@ -1,4 +1,4 @@ - + net472 diff --git a/src/Microsoft.DotNet.NuGetRepack/tasks/Microsoft.DotNet.NuGetRepack.Tasks.csproj b/src/Microsoft.DotNet.NuGetRepack/tasks/Microsoft.DotNet.NuGetRepack.Tasks.csproj index 6a1cee07932..c532b91fa4d 100644 --- a/src/Microsoft.DotNet.NuGetRepack/tasks/Microsoft.DotNet.NuGetRepack.Tasks.csproj +++ b/src/Microsoft.DotNet.NuGetRepack/tasks/Microsoft.DotNet.NuGetRepack.Tasks.csproj @@ -1,4 +1,4 @@ - + net472;netcoreapp3.1 diff --git a/src/Microsoft.DotNet.NuGetRepack/tasks/src/NuGetUtils.cs b/src/Microsoft.DotNet.NuGetRepack/tasks/src/NuGetUtils.cs index d985a9e8440..260befb6ef1 100644 --- a/src/Microsoft.DotNet.NuGetRepack/tasks/src/NuGetUtils.cs +++ b/src/Microsoft.DotNet.NuGetRepack/tasks/src/NuGetUtils.cs @@ -1,4 +1,5 @@ -// Copyright (c) Microsoft. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. using System; diff --git a/src/Microsoft.DotNet.NuGetRepack/tasks/src/NuGetVersionUpdater.cs b/src/Microsoft.DotNet.NuGetRepack/tasks/src/NuGetVersionUpdater.cs index ba7ce8bb7ec..e2dc7c007f4 100644 --- a/src/Microsoft.DotNet.NuGetRepack/tasks/src/NuGetVersionUpdater.cs +++ b/src/Microsoft.DotNet.NuGetRepack/tasks/src/NuGetVersionUpdater.cs @@ -1,4 +1,5 @@ -// Copyright (c) Microsoft. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. using System; using System.Collections.Generic; diff --git a/src/Microsoft.DotNet.NuGetRepack/tasks/src/ReplacePackageParts.cs b/src/Microsoft.DotNet.NuGetRepack/tasks/src/ReplacePackageParts.cs index 6f7045be7ae..8e6563b8d14 100644 --- a/src/Microsoft.DotNet.NuGetRepack/tasks/src/ReplacePackageParts.cs +++ b/src/Microsoft.DotNet.NuGetRepack/tasks/src/ReplacePackageParts.cs @@ -1,4 +1,5 @@ -// Copyright (c) Microsoft. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. using System; using System.Collections.Generic; diff --git a/src/Microsoft.DotNet.NuGetRepack/tasks/src/UpdatePackageVersionTask.cs b/src/Microsoft.DotNet.NuGetRepack/tasks/src/UpdatePackageVersionTask.cs index 15731be682d..863dd049ca4 100644 --- a/src/Microsoft.DotNet.NuGetRepack/tasks/src/UpdatePackageVersionTask.cs +++ b/src/Microsoft.DotNet.NuGetRepack/tasks/src/UpdatePackageVersionTask.cs @@ -1,4 +1,5 @@ -// Copyright (c) Microsoft. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. using System; using System.Collections.Generic; diff --git a/src/Microsoft.DotNet.NuGetRepack/tests/Microsoft.DotNet.NuGetRepack.Tests.csproj b/src/Microsoft.DotNet.NuGetRepack/tests/Microsoft.DotNet.NuGetRepack.Tests.csproj index 98f73d71421..8cf795a5854 100644 --- a/src/Microsoft.DotNet.NuGetRepack/tests/Microsoft.DotNet.NuGetRepack.Tests.csproj +++ b/src/Microsoft.DotNet.NuGetRepack/tests/Microsoft.DotNet.NuGetRepack.Tests.csproj @@ -1,4 +1,4 @@ - + netcoreapp3.1 diff --git a/src/Microsoft.DotNet.NuGetRepack/tests/ReplacePackagePartsTests.cs b/src/Microsoft.DotNet.NuGetRepack/tests/ReplacePackagePartsTests.cs index b873e8b1ba5..c03085f75c2 100644 --- a/src/Microsoft.DotNet.NuGetRepack/tests/ReplacePackagePartsTests.cs +++ b/src/Microsoft.DotNet.NuGetRepack/tests/ReplacePackagePartsTests.cs @@ -1,4 +1,5 @@ -// Copyright (c) Microsoft. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. using System; using System.IO; diff --git a/src/Microsoft.DotNet.NuGetRepack/tests/TestHelpers/AssertEx.cs b/src/Microsoft.DotNet.NuGetRepack/tests/TestHelpers/AssertEx.cs index c254b131cfb..5ae86b144ab 100644 --- a/src/Microsoft.DotNet.NuGetRepack/tests/TestHelpers/AssertEx.cs +++ b/src/Microsoft.DotNet.NuGetRepack/tests/TestHelpers/AssertEx.cs @@ -1,4 +1,5 @@ -// Copyright (c) Microsoft. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. using System; using System.Collections; diff --git a/src/Microsoft.DotNet.NuGetRepack/tests/TestHelpers/DiffUtil.cs b/src/Microsoft.DotNet.NuGetRepack/tests/TestHelpers/DiffUtil.cs index cc7fd418a7d..62a12cd0a7c 100644 --- a/src/Microsoft.DotNet.NuGetRepack/tests/TestHelpers/DiffUtil.cs +++ b/src/Microsoft.DotNet.NuGetRepack/tests/TestHelpers/DiffUtil.cs @@ -1,4 +1,5 @@ -// Copyright (c) Microsoft. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. using System; using System.Collections.Generic; diff --git a/src/Microsoft.DotNet.NuGetRepack/tests/TestHelpers/ResourceLoader.cs b/src/Microsoft.DotNet.NuGetRepack/tests/TestHelpers/ResourceLoader.cs index 011005dde01..c0c34a41840 100644 --- a/src/Microsoft.DotNet.NuGetRepack/tests/TestHelpers/ResourceLoader.cs +++ b/src/Microsoft.DotNet.NuGetRepack/tests/TestHelpers/ResourceLoader.cs @@ -1,4 +1,5 @@ -// Copyright (c) Microsoft. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. using System; using System.IO; @@ -45,4 +46,4 @@ public static byte[] GetOrCreateResource(ref byte[] resource, string name) return resource; } } -} \ No newline at end of file +} diff --git a/src/Microsoft.DotNet.NuGetRepack/tests/TestHelpers/TestResources.cs b/src/Microsoft.DotNet.NuGetRepack/tests/TestHelpers/TestResources.cs index 27308dcb611..bcc990b8220 100644 --- a/src/Microsoft.DotNet.NuGetRepack/tests/TestHelpers/TestResources.cs +++ b/src/Microsoft.DotNet.NuGetRepack/tests/TestHelpers/TestResources.cs @@ -1,4 +1,5 @@ - // Copyright(c) Microsoft.All Rights Reserved.Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. namespace TestResources { diff --git a/src/Microsoft.DotNet.NuGetRepack/tests/VersionUpdaterTests.cs b/src/Microsoft.DotNet.NuGetRepack/tests/VersionUpdaterTests.cs index 60d4f84c97d..3a2a3667e77 100644 --- a/src/Microsoft.DotNet.NuGetRepack/tests/VersionUpdaterTests.cs +++ b/src/Microsoft.DotNet.NuGetRepack/tests/VersionUpdaterTests.cs @@ -1,4 +1,5 @@ -// Copyright (c) Microsoft. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. using System; using System.IO; diff --git a/src/Microsoft.DotNet.SharedFramework.Sdk/Microsoft.DotNet.SharedFramework.Sdk.csproj b/src/Microsoft.DotNet.SharedFramework.Sdk/Microsoft.DotNet.SharedFramework.Sdk.csproj index 4405a1fecaa..31df0418e14 100644 --- a/src/Microsoft.DotNet.SharedFramework.Sdk/Microsoft.DotNet.SharedFramework.Sdk.csproj +++ b/src/Microsoft.DotNet.SharedFramework.Sdk/Microsoft.DotNet.SharedFramework.Sdk.csproj @@ -1,4 +1,4 @@ - + net472;netcoreapp3.1 diff --git a/src/Microsoft.DotNet.SharedFramework.Sdk/src/CreateFrameworkListFile.cs b/src/Microsoft.DotNet.SharedFramework.Sdk/src/CreateFrameworkListFile.cs index be0e8b2b6ec..68a1af12c73 100644 --- a/src/Microsoft.DotNet.SharedFramework.Sdk/src/CreateFrameworkListFile.cs +++ b/src/Microsoft.DotNet.SharedFramework.Sdk/src/CreateFrameworkListFile.cs @@ -1,6 +1,5 @@ // 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.DotNet.Build.Tasks; diff --git a/src/Microsoft.DotNet.SharedFramework.Sdk/src/FileUtilities.cs b/src/Microsoft.DotNet.SharedFramework.Sdk/src/FileUtilities.cs index 97ab8b182c8..b8d9348bf98 100644 --- a/src/Microsoft.DotNet.SharedFramework.Sdk/src/FileUtilities.cs +++ b/src/Microsoft.DotNet.SharedFramework.Sdk/src/FileUtilities.cs @@ -1,6 +1,5 @@ // 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 System; using System.Collections.Generic; diff --git a/src/Microsoft.DotNet.SharedFramework.Sdk/src/GeneratePlatformManifestEntriesFromFileList.cs b/src/Microsoft.DotNet.SharedFramework.Sdk/src/GeneratePlatformManifestEntriesFromFileList.cs index 20ea4a12316..2e4ba8dd5a9 100644 --- a/src/Microsoft.DotNet.SharedFramework.Sdk/src/GeneratePlatformManifestEntriesFromFileList.cs +++ b/src/Microsoft.DotNet.SharedFramework.Sdk/src/GeneratePlatformManifestEntriesFromFileList.cs @@ -1,6 +1,5 @@ // 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; diff --git a/src/Microsoft.DotNet.SharedFramework.Sdk/src/GeneratePlatformManifestEntriesFromTemplate.cs b/src/Microsoft.DotNet.SharedFramework.Sdk/src/GeneratePlatformManifestEntriesFromTemplate.cs index e8346c2b79a..73f032a2d39 100644 --- a/src/Microsoft.DotNet.SharedFramework.Sdk/src/GeneratePlatformManifestEntriesFromTemplate.cs +++ b/src/Microsoft.DotNet.SharedFramework.Sdk/src/GeneratePlatformManifestEntriesFromTemplate.cs @@ -1,6 +1,5 @@ // 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; diff --git a/src/Microsoft.DotNet.SharedFramework.Sdk/src/GenerateSharedFrameworkDepsFile.cs b/src/Microsoft.DotNet.SharedFramework.Sdk/src/GenerateSharedFrameworkDepsFile.cs index 84f7eda188b..76b1c22d9de 100644 --- a/src/Microsoft.DotNet.SharedFramework.Sdk/src/GenerateSharedFrameworkDepsFile.cs +++ b/src/Microsoft.DotNet.SharedFramework.Sdk/src/GenerateSharedFrameworkDepsFile.cs @@ -1,6 +1,5 @@ // 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; diff --git a/src/Microsoft.DotNet.SharedFramework.Sdk/src/Packaging/Extensions.cs b/src/Microsoft.DotNet.SharedFramework.Sdk/src/Packaging/Extensions.cs index f8da82b1198..be63e1cb5a5 100644 --- a/src/Microsoft.DotNet.SharedFramework.Sdk/src/Packaging/Extensions.cs +++ b/src/Microsoft.DotNet.SharedFramework.Sdk/src/Packaging/Extensions.cs @@ -1,6 +1,5 @@ // 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 NuGet; diff --git a/src/Microsoft.DotNet.SharedFramework.Sdk/src/PlatformManifestEntry.cs b/src/Microsoft.DotNet.SharedFramework.Sdk/src/PlatformManifestEntry.cs index cf54a35ef06..74cb71351a9 100644 --- a/src/Microsoft.DotNet.SharedFramework.Sdk/src/PlatformManifestEntry.cs +++ b/src/Microsoft.DotNet.SharedFramework.Sdk/src/PlatformManifestEntry.cs @@ -1,6 +1,5 @@ // 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. namespace Microsoft.DotNet.SharedFramework.Sdk { diff --git a/src/Microsoft.DotNet.SharedFramework.Sdk/src/ValidateFileVersions.cs b/src/Microsoft.DotNet.SharedFramework.Sdk/src/ValidateFileVersions.cs index 7942a4bb7be..19681d9d82a 100644 --- a/src/Microsoft.DotNet.SharedFramework.Sdk/src/ValidateFileVersions.cs +++ b/src/Microsoft.DotNet.SharedFramework.Sdk/src/ValidateFileVersions.cs @@ -1,6 +1,5 @@ // 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.Construction; using Microsoft.Build.Framework; From dd3652e2ae5ea89703a2286295de9efe908974f1 Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Wed, 28 Jul 2021 14:25:29 +0000 Subject: [PATCH 253/699] [main] Update dependencies from dotnet/xliff-tasks dotnet/arcade mono/linker (#7681) [main] Update dependencies from dotnet/xliff-tasks dotnet/arcade mono/linker --- eng/Version.Details.xml | 28 ++++++++++++++-------------- eng/Versions.props | 10 +++++----- global.json | 4 ++-- 3 files changed, 21 insertions(+), 21 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index 75759ab53b8..8e7f6a4c994 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -11,25 +11,25 @@ - + https://github.com/dotnet/arcade - e6abc186425e675e0f201acc1c33e183a0e51c86 + cab4a3c50fd042677ea17cfc5171b4ce8b29930f - + https://github.com/dotnet/arcade - e6abc186425e675e0f201acc1c33e183a0e51c86 + cab4a3c50fd042677ea17cfc5171b4ce8b29930f - + https://github.com/dotnet/arcade - e6abc186425e675e0f201acc1c33e183a0e51c86 + cab4a3c50fd042677ea17cfc5171b4ce8b29930f - + https://github.com/dotnet/arcade - e6abc186425e675e0f201acc1c33e183a0e51c86 + cab4a3c50fd042677ea17cfc5171b4ce8b29930f - + https://github.com/dotnet/arcade - e6abc186425e675e0f201acc1c33e183a0e51c86 + cab4a3c50fd042677ea17cfc5171b4ce8b29930f https://github.com/dotnet/arcade-services @@ -47,9 +47,9 @@ https://github.com/dotnet/roslyn 246ce641f04b67ef017655275d850bf902a8e40f - + https://github.com/mono/linker - b888d672e11588e2bbca1cd3eeaee30d53416897 + 5c9d3089e576aa1ceffca1c07da95db7b7ce3f82 https://github.com/dotnet/sourcelink @@ -68,9 +68,9 @@ https://github.com/dotnet/symreader-converter c5ba7c88f92e2dde156c324a8c8edc04d9fa4fe0 - + https://github.com/dotnet/xliff-tasks - 397ff033b467003d51619f9ac3928e02a4d4178f + c836bdfc6daba62f1794ca095ee1b97960971fcf diff --git a/eng/Versions.props b/eng/Versions.props index 2a5933de86b..2d6140cdb29 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -35,7 +35,7 @@ 2.1.1 2.1.0 3.10.0-4.21329.37 - 6.0.100-preview.6.21376.2 + 6.0.100-preview.6.21377.1 16.7.1 4.8.3 5.3.0.1 @@ -65,8 +65,8 @@ 2.4.1 2.0.3 2.4.1 - 6.0.0-beta.21376.4 - 6.0.0-beta.21376.4 + 6.0.0-beta.21377.2 + 6.0.0-beta.21377.2 1.22.0 1.1.2 2.0.0 @@ -77,8 +77,8 @@ 1.1.0-beta.20258.6 1.1.0-beta-21309-01 1.1.0-beta-21309-01 - 6.0.0-beta.21376.4 - 1.0.0-beta.21376.1 + 6.0.0-beta.21377.2 + 1.0.0-beta.21377.1 1.1.0-beta.21228.1 1.0.0-prerelease.21373.1 1.1.156602 diff --git a/global.json b/global.json index 3ac43a5dbc0..5836cb1a71c 100644 --- a/global.json +++ b/global.json @@ -3,7 +3,7 @@ "dotnet": "6.0.100-preview.6.21355.2" }, "msbuild-sdks": { - "Microsoft.DotNet.Arcade.Sdk": "6.0.0-beta.21376.4", - "Microsoft.DotNet.Helix.Sdk": "6.0.0-beta.21376.4" + "Microsoft.DotNet.Arcade.Sdk": "6.0.0-beta.21377.2", + "Microsoft.DotNet.Helix.Sdk": "6.0.0-beta.21377.2" } } From dde80826e2fe464ef34182d2f786a6a51121d9a6 Mon Sep 17 00:00:00 2001 From: Katya Sokolova Date: Wed, 28 Jul 2021 18:58:11 +0200 Subject: [PATCH 254/699] Add infra retry in case of installation failure (78) on Android (#7682) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * add infra retry in case of installation failure (78) on Android * Apply suggestions from code review Co-authored-by: Přemek Vysoký * address review feedback * Update src/Microsoft.DotNet.Helix/JobSender/Readme.md Co-authored-by: Přemek Vysoký Co-authored-by: Přemek Vysoký --- .../JobSender/Readme.md | 1 + .../xharness-helix-job.android.ps1 | 36 ++++++++++++++++--- .../xharness-helix-job.android.sh | 34 ++++++++++++++---- 3 files changed, 60 insertions(+), 11 deletions(-) diff --git a/src/Microsoft.DotNet.Helix/JobSender/Readme.md b/src/Microsoft.DotNet.Helix/JobSender/Readme.md index e3a131361c7..ebdb05dd25e 100644 --- a/src/Microsoft.DotNet.Helix/JobSender/Readme.md +++ b/src/Microsoft.DotNet.Helix/JobSender/Readme.md @@ -33,6 +33,7 @@ namespace Sample ### Hello World This will print out `'Hai Wurld!'` in the work item's console log. +Please note the command supplied is executing as a Windows command line command on Windows queues and as a shell command on Linux and OSX queues. ```csharp var job = await api.Job.Define() diff --git a/src/Microsoft.DotNet.Helix/Sdk/tools/xharness-runner/xharness-helix-job.android.ps1 b/src/Microsoft.DotNet.Helix/Sdk/tools/xharness-runner/xharness-helix-job.android.ps1 index 99dba979c0a..9736ebf140c 100644 --- a/src/Microsoft.DotNet.Helix/Sdk/tools/xharness-runner/xharness-helix-job.android.ps1 +++ b/src/Microsoft.DotNet.Helix/Sdk/tools/xharness-runner/xharness-helix-job.android.ps1 @@ -37,13 +37,39 @@ function xharness() { $exit_code=$LASTEXITCODE +$retry=$false +$reboot=$false + +switch ($exit_code) +{ + 85 { + $ErrorActionPreference="Continue" + Write-Error "Encountered ADB_DEVICE_ENUMERATION_FAILURE. This is typically not a failure of the work item. We will run it again and reboot this computer to help its devices" + Write-Error "If this occurs repeatedly, please check for architectural mismatch, e.g. sending x86 or x86_64 APKs to an arm64_v8a-only queue." + $retry=$true + $reboot=$true + Break + } + + 78 { + $ErrorActionPreference="Continue" + Write-Error "Encountered PACKAGE_INSTALLATION_FAILURE. This is typically not a failure of the work item. We will try it again on another Helix agent" + Write-Error "If this occurs repeatedly, please check for architectural mismatch, e.g. requesting installation on arm64_v8a-only queue for x86 or x86_64 APKs." + $retry=$true + Break + } +} + # ADB_DEVICE_ENUMERATION_FAILURE -if ($exit_code -eq 85) { - $ErrorActionPreference="Continue" - Write-Error "Encountered ADB_DEVICE_ENUMERATION_FAILURE. This is typically not a failure of the work item. We will run it again and reboot this computer to help its devices" - Write-Error "If this occurs repeatedly, please check for architectural mismatch, e.g. sending x86 or x86_64 APKs to an arm64_v8a-only queue." +if ($retry) { + & "$Env:HELIX_PYTHONPATH" -c "from helix.workitemutil import request_infra_retry; request_infra_retry('Retrying because we could not enumerate all Android devices')" - & "$Env:HELIX_PYTHONPATH" -c "from helix.workitemutil import request_reboot; request_reboot('Rebooting to allow Android emulator or device to restart')" +} + +# PACKAGE_INSTALLATION_FAILURE +if ($reboot) { + + & "$Env:HELIX_PYTHONPATH" -c "from helix.workitemutil import request_reboot; request_reboot('Rebooting to allow Android emulator or device to restart')" } exit $exit_code diff --git a/src/Microsoft.DotNet.Helix/Sdk/tools/xharness-runner/xharness-helix-job.android.sh b/src/Microsoft.DotNet.Helix/Sdk/tools/xharness-runner/xharness-helix-job.android.sh index f7e2b920b91..3f958fb5c1a 100644 --- a/src/Microsoft.DotNet.Helix/Sdk/tools/xharness-runner/xharness-helix-job.android.sh +++ b/src/Microsoft.DotNet.Helix/Sdk/tools/xharness-runner/xharness-helix-job.android.sh @@ -76,17 +76,39 @@ source command.sh exit_code=$? -# This handles issues where devices or emulators fail to start. -# The only solution is to reboot the machine, so we request a work item retry + agent reboot when this happens +retry=false +reboot=false + # Too see where these values come from, check out https://github.com/dotnet/xharness/blob/master/src/Microsoft.DotNet.XHarness.Common/CLI/ExitCode.cs # Avoid any helix-ism in the Xharness! -ADB_DEVICE_ENUMERATION_FAILURE=85 -if [ $exit_code -eq $ADB_DEVICE_ENUMERATION_FAILURE ]; then - echo 'Encountered ADB_DEVICE_ENUMERATION_FAILURE. This is typically not a failure of the work item. We will run it again and reboot this computer to help its devices' +case "$exit_code" in + 85) + # This handles issues where devices or emulators fail to start. + # The only solution is to reboot the machine, so we request a work item retry + agent reboot when this happens + echo 'Encountered ADB_DEVICE_ENUMERATION_FAILURE. This is typically not a failure of the work item. We will run it again and reboot this computer to help its devices' echo 'If this occurs repeatedly, please check for architectural mismatch, e.g. sending arm64_v8a APKs to an x86_64 / x86 only queue.' - # Since we run the payload script using launchctl, env vars are not set there and we have to do this part here + retry=true + reboot=true + ;; + 78) + # This handles issues where APKs fail to install. + # We already reboot a device inside XHarness and now request a work item retry when this happens + echo 'Encountered PACKAGE_INSTALLATION_FAILURE. This is typically not a failure of the work item. We will try it again on another Helix agent' + echo 'If this occurs repeatedly, please check for architectural mismatch, e.g. requesting installation on arm64_v8a-only queue for x86 or x86_64 APKs.' + retry=true + ;; +esac + + + +ADB_DEVICE_ENUMERATION_FAILURE=85 +if [ "$retry"]; then "$HELIX_PYTHONPATH" -c "from helix.workitemutil import request_infra_retry; request_infra_retry('Retrying because we could not enumerate all Android devices')" +fi + +PACKAGE_INSTALLATION_FAILURE=78 +if [ $exit_code -eq PACKAGE_INSTALLATION_FAILURE ]; then "$HELIX_PYTHONPATH" -c "from helix.workitemutil import request_reboot; request_reboot('Rebooting to allow Android emulator or device to restart.')" fi From b038a54d9137901e22868692b3d1f5c050e968c8 Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Thu, 29 Jul 2021 14:36:19 +0000 Subject: [PATCH 255/699] [main] Update dependencies from dotnet/xliff-tasks dotnet/arcade mono/linker (#7686) [main] Update dependencies from dotnet/xliff-tasks dotnet/arcade mono/linker --- eng/Version.Details.xml | 28 ++++++++++++++-------------- eng/Versions.props | 10 +++++----- global.json | 4 ++-- 3 files changed, 21 insertions(+), 21 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index 8e7f6a4c994..bd9d43a3271 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -11,25 +11,25 @@ - + https://github.com/dotnet/arcade - cab4a3c50fd042677ea17cfc5171b4ce8b29930f + dd3652e2ae5ea89703a2286295de9efe908974f1 - + https://github.com/dotnet/arcade - cab4a3c50fd042677ea17cfc5171b4ce8b29930f + dd3652e2ae5ea89703a2286295de9efe908974f1 - + https://github.com/dotnet/arcade - cab4a3c50fd042677ea17cfc5171b4ce8b29930f + dd3652e2ae5ea89703a2286295de9efe908974f1 - + https://github.com/dotnet/arcade - cab4a3c50fd042677ea17cfc5171b4ce8b29930f + dd3652e2ae5ea89703a2286295de9efe908974f1 - + https://github.com/dotnet/arcade - cab4a3c50fd042677ea17cfc5171b4ce8b29930f + dd3652e2ae5ea89703a2286295de9efe908974f1 https://github.com/dotnet/arcade-services @@ -47,9 +47,9 @@ https://github.com/dotnet/roslyn 246ce641f04b67ef017655275d850bf902a8e40f - + https://github.com/mono/linker - 5c9d3089e576aa1ceffca1c07da95db7b7ce3f82 + 0cb9250a903cfc90cbac602ed79c0cbc588d8d3f https://github.com/dotnet/sourcelink @@ -68,9 +68,9 @@ https://github.com/dotnet/symreader-converter c5ba7c88f92e2dde156c324a8c8edc04d9fa4fe0 - + https://github.com/dotnet/xliff-tasks - c836bdfc6daba62f1794ca095ee1b97960971fcf + 85cac0820fcb9c066bdae0cb9886dcbc7748914e diff --git a/eng/Versions.props b/eng/Versions.props index 2d6140cdb29..d343f4e0b3c 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -35,7 +35,7 @@ 2.1.1 2.1.0 3.10.0-4.21329.37 - 6.0.100-preview.6.21377.1 + 6.0.100-preview.6.21378.1 16.7.1 4.8.3 5.3.0.1 @@ -65,8 +65,8 @@ 2.4.1 2.0.3 2.4.1 - 6.0.0-beta.21377.2 - 6.0.0-beta.21377.2 + 6.0.0-beta.21378.2 + 6.0.0-beta.21378.2 1.22.0 1.1.2 2.0.0 @@ -77,8 +77,8 @@ 1.1.0-beta.20258.6 1.1.0-beta-21309-01 1.1.0-beta-21309-01 - 6.0.0-beta.21377.2 - 1.0.0-beta.21377.1 + 6.0.0-beta.21378.2 + 1.0.0-beta.21378.1 1.1.0-beta.21228.1 1.0.0-prerelease.21373.1 1.1.156602 diff --git a/global.json b/global.json index 5836cb1a71c..aee2d816476 100644 --- a/global.json +++ b/global.json @@ -3,7 +3,7 @@ "dotnet": "6.0.100-preview.6.21355.2" }, "msbuild-sdks": { - "Microsoft.DotNet.Arcade.Sdk": "6.0.0-beta.21377.2", - "Microsoft.DotNet.Helix.Sdk": "6.0.0-beta.21377.2" + "Microsoft.DotNet.Arcade.Sdk": "6.0.0-beta.21378.2", + "Microsoft.DotNet.Helix.Sdk": "6.0.0-beta.21378.2" } } From 62a8aafffd4c68ef887680f6837abdff906a662c Mon Sep 17 00:00:00 2001 From: Michael Stuckey Date: Thu, 29 Jul 2021 12:00:47 -0700 Subject: [PATCH 256/699] SDL: Update dependencies (#7685) * Force System.Net.Http version to avoid CVE-2018-8292 * Force version for System.Text.Encodings.Web to avoid CVE-2021-26701 * Remove duplicate package references --- .../Microsoft.DotNet.Build.Tasks.Feed.Tests.csproj | 4 ---- .../Microsoft.DotNet.Build.Tasks.Feed.csproj | 1 + .../src/Microsoft.DotNet.Git.IssueManager.csproj | 1 + .../Microsoft.DotNet.GitSync.CommitManager.csproj | 3 ++- .../src/Microsoft.DotNet.XUnitConsoleRunner.csproj | 3 ++- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/Microsoft.DotNet.Build.Tasks.Feed.Tests/Microsoft.DotNet.Build.Tasks.Feed.Tests.csproj b/src/Microsoft.DotNet.Build.Tasks.Feed.Tests/Microsoft.DotNet.Build.Tasks.Feed.Tests.csproj index 548fac7ecdb..dba28495f16 100644 --- a/src/Microsoft.DotNet.Build.Tasks.Feed.Tests/Microsoft.DotNet.Build.Tasks.Feed.Tests.csproj +++ b/src/Microsoft.DotNet.Build.Tasks.Feed.Tests/Microsoft.DotNet.Build.Tasks.Feed.Tests.csproj @@ -19,10 +19,6 @@ - - - - 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 a5b108be7f0..9c590b7caa7 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 @@ -17,6 +17,7 @@ + diff --git a/src/Microsoft.DotNet.Git.IssueManager/src/Microsoft.DotNet.Git.IssueManager.csproj b/src/Microsoft.DotNet.Git.IssueManager/src/Microsoft.DotNet.Git.IssueManager.csproj index b6208c81f9f..a246fe86a49 100644 --- a/src/Microsoft.DotNet.Git.IssueManager/src/Microsoft.DotNet.Git.IssueManager.csproj +++ b/src/Microsoft.DotNet.Git.IssueManager/src/Microsoft.DotNet.Git.IssueManager.csproj @@ -10,5 +10,6 @@ + diff --git a/src/Microsoft.DotNet.GitSync.CommitManager/Microsoft.DotNet.GitSync.CommitManager.csproj b/src/Microsoft.DotNet.GitSync.CommitManager/Microsoft.DotNet.GitSync.CommitManager.csproj index 52d184cb8bc..1af776d0448 100644 --- a/src/Microsoft.DotNet.GitSync.CommitManager/Microsoft.DotNet.GitSync.CommitManager.csproj +++ b/src/Microsoft.DotNet.GitSync.CommitManager/Microsoft.DotNet.GitSync.CommitManager.csproj @@ -1,4 +1,4 @@ - + Exe @@ -11,6 +11,7 @@ + diff --git a/src/Microsoft.DotNet.XUnitConsoleRunner/src/Microsoft.DotNet.XUnitConsoleRunner.csproj b/src/Microsoft.DotNet.XUnitConsoleRunner/src/Microsoft.DotNet.XUnitConsoleRunner.csproj index 0cc8dc7f7d6..310c1f2ab72 100644 --- a/src/Microsoft.DotNet.XUnitConsoleRunner/src/Microsoft.DotNet.XUnitConsoleRunner.csproj +++ b/src/Microsoft.DotNet.XUnitConsoleRunner/src/Microsoft.DotNet.XUnitConsoleRunner.csproj @@ -1,4 +1,4 @@ - + Microsoft.DotNet.XUnitConsoleRunner @@ -24,6 +24,7 @@ + From ce7357e0972bc6326c623ad6ebe10fddc7f4e829 Mon Sep 17 00:00:00 2001 From: Michelle McDaniel Date: Thu, 29 Jul 2021 16:40:14 -0700 Subject: [PATCH 257/699] Add Validation documentation (#7669) * Add first attempt of Validation documentation * Add some more * add trailing new line * Clean up a thing or two * First bit responding to comments * Address the rest of the comments --- Documentation/Validation.md | 126 ++++++++++++++++++++++++++++++++++++ 1 file changed, 126 insertions(+) create mode 100644 Documentation/Validation.md diff --git a/Documentation/Validation.md b/Documentation/Validation.md new file mode 100644 index 00000000000..987bcb4b4aa --- /dev/null +++ b/Documentation/Validation.md @@ -0,0 +1,126 @@ +# Validating Product Builds + +Validating builds is an important part of producing a releasable product. There are several levels of validation that are performed on product builds at various phases of the process: + +* CI/PR build time + * Repository-level functional testing. Owned by the product teams and defined in the repositories, and used to identify bugs +* Official build time (optionally) + * Source code validation: this includes SDL testing and localization testing. Used to confirm that source code meets Microsoft's standards. + * Package validation: includes sourcelink validation, symbols validation, nupkg metadata validation. Used to confirm that customers will be able to install and debug packages from .NET. +* Nightly validation pipeline (optionally) + * Source code validation: this includes SDL testing and localization testing. Used to confirm that source code meets Microsoft's standards. + * Package validation: includes sourcelink validation, symbols validation, nupkg metadata validation. Used to confirm that customers will be able to install and debug packages from .NET. + * Signing validation: Used to validate that all bits that we ship have been signed properly. + +While many of these validation steps can be performed in official builds, the supported model is to onboard to the nightly validation pipeline. All of these steps will be performed as part of shipping the product, and all product teams have the option of running these exact validation steps at a nightly cadence. + +## How do we validate .NET? + +Pre-.NET 5, validation for the core .NET repositories were done during the official builds. For .NET 5, all post-build validation and source code validation was moved out of the official build and into a separate nightly pipeline, [Validate-DotNet](https://dev.azure.com/dnceng/internal/_build?definitionId=827). This pipeline runs all the same validation that is performed on the full product when we go to release, and is a smoke test for product teams so that they can address any issues well before release day. + +Validate-DotNet is controlled by a separate scheduling pipeline, which, once a day, looks for the newest build for each repository that has been onboarded on every channel that those repositories publish to. If no build is found from the previous 24 hours, no validation run will be started for that channel/repository combination. For any repository that has published a new build to the BAR database for a given channel, a new Validate-DotNet run will be created. + +To gather all of the assets to be validated, Validate-DotNet uses information found in the BAR database. Specifically, it uses the `darc gather-drop` command to pull down all of the assets that were created by a particular build (but no downstream assets). The pipeline will then sign the build before running the various validation checks on that build, including: + +* Signing Validation +* SDL Validation (which will open TSA issues for any failures found) +* Localization Validation +* NuGet Metadata Validation +* Sourcelink Validation +* Symbols Validation +* NuGet Package Icon Validation +* Checksums Validation + +Please note, we are always adding new validation steps to the pipeline, so this is not an exhaustive list. + +## Why move validation out of official builds? + +As a part of .NET 5, we had a goal of two hour build turn-around. In order to close in on that goal, we removed many things from official builds, including post-build validation. + +## How do I onboard to Validate-DotNet? + +[Validate-DotNet](https://dev.azure.com/dnceng/internal/_build?definitionId=827) is a pipeline that automatically runs nightly validation for all repositories that have been onboarded. Onboarding to Validate-DotNet is quite simple: + +1. Update the [list of repositories](https://dev.azure.com/dnceng/internal/_git/dotnet-release?path=%2Feng%2Fpipeline%2Ftools%2Frepos-to-validate.txt) in [dotnet-release](https://dev.azure.com/dnceng/internal/_git/dotnet-release) with your repository's URL. Please reach out to dnceng for PR approval. +2. To enable nightly SDL runs, add the [sdl-tsa-vars.config](https://github.com/dotnet/runtime/blob/main/eng/sdl-tsa-vars.config) file to your repository. This file should include all of the necessary information specific to your repository for creating SDL issues. + +Once the first step is complete, your repository will start validating on a nightly basis. Once the second step is complete, you will also get SDL validation. + +## How do I know if there are failures in my validation runs? + +There are two main ways of checking your validation results: manually, and using automatic notifications. + +### Manually looking at the pipeline + +Validate-DotNet runs each day at 4 PM Pacific Time. Each run is tagged with the repository name and the channel of the given run (to distinguish between the various versions). To look at the runs for only your repository, you can use the following URl, with your repository name in place of `` `https://dev.azure.com/dnceng/internal/_build?definitionId=827&tagFilter=`. For example, if you wanted to look at results for runtime, you would navigate to `https://dev.azure.com/dnceng/internal/_build?definitionId=827&tagFilter=runtime`. + +### Automatic Notifications + +[Build Monitor](https://github.com/dotnet/core-eng/blob/main/Documentation/BuildFailureManagement.md) automatically monitors Validate-DotNet builds for a particular repository and opens issues when failures occur. If an issue is already open for Validate-DotNet failures in your repository for builds on a given channel, it will append a new comment. + +To onboard, you will need to update both the `Builds` array and the `Issues` array in Build Monitor's [settings.json](https://github.com/dotnet/arcade-services/blob/main/src/DotNet.Status.Web/.config/settings.json#L23). + +The `Builds` array controls which Azure DevOps pipeline builds will be monitored. To monitor Validate-DotNet runs for your repository, you will need to add a new item with the following information: + +```json +{ + "Project": "internal", + "DefinitionPath": "\\dotnet-release\\Validate-DotNet", + "Branches": [ "main" ], + "IssuesId": , + "Tags": [ ] +} +``` + +For example, for runtime, we would add + +```json +{ + "Project": "internal", + "DefinitionPath": "\\dotnet-release\\Validate-DotNet", + "Branches": [ "main" ], + "IssuesId": "dotnet-runtime-infra", + "Tags": [ "runtime" ] +} +``` + +The `Issues` array controls where issues will be opened for builds that fail. You will need to update the `Issues` array in the same settings.json file, with the following information: + +```json +{ + "Id": , + "Owner": , + "Name": , + "Labels": [ ], + "UpdateExisting": true // True if you want issues to be updated. False if you want new issues for every failure +} +``` + +For example, for runtime, we would do: + +```json +{ + "Id": "dotnet-runtime-infra", + "Owner": "dotnet", + "Name": "runtime", + "Labels": [ "area-Infrastructure" ], + "UpdateExisting": true +} +``` + +### What do I do if an issue is opened in my repository? + +Validation failures come in many forms. Most will be actual problems found with the assets in a drop for your repository. These are the responsibility of the product teams to fix. Any failures in the `Required Validation` stage should be fixed as soon as possible, as they are possible release blockers. + +Some failures may be infrastructure issues. If you believe this is a case, please reach out to [DNCEng First Responders](https://github.com/dotnet/core-eng/wiki/How-to-get-a-hold-of-Engineering-Servicing), and someone will help diagnose and fix the issue found. + +Errors we commonly see in validation jobs include: + +* Signing Validation + * Files that are not intended to be signed are not listed in the `eng/SignCheckExclusionsFile.txt` for that repository, so validation complains that the files are not signed. Mitigation: add that file type to the `eng/SignCheckExclusionsFile.txt` in your repository. +* SDL Validation (which will open TSA issues for any failures found) + * Any pipeline failures in these legs should be reported to [DNCEng First Responders](https://github.com/dotnet/core-eng/wiki/How-to-get-a-hold-of-Engineering-Servicing), as it suggests an infrastructure failure. SDL failures should automatically create TSA issues, which you should address as appropriate. +* Localization Validation + * Localization is done closer to release time. Localization failures suggest that either the localization team hasn't finished translations, or the translation PR hasn't been checked into your repository and should be. The closer to release we get, the more important fixing these failures becomes. +* Nuget Metadata Validation + * Metadata is missing. These need to be fixed in the repository, and are shipping blockers. From 093cd72c60d4db50d900c67ecc19fab1ca6decbe Mon Sep 17 00:00:00 2001 From: Thefrank <1910378+Thefrank@users.noreply.github.com> Date: Thu, 29 Jul 2021 21:14:57 -0700 Subject: [PATCH 258/699] add terminfo-db to FreeBSD package requirements (#7588) * add terminfo-db to FreeBSD package requirements * runtime can use terminfo under FreeBSD but only with this additional package * from feedback: https://github.com/dotnet/runtime/pull/55152#issuecomment-873658905 * fix typo, bump FreeBSD12, remove lttng-ust from it lttng-ust removable depends on https://github.com/dotnet/runtime/pull/56435 merge * lttng-ust needs to stay * add FreeBSD13, add support for FreeBSD ABI also: use -j $JOBS during build while we are here --- eng/common/cross/build-rootfs.sh | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/eng/common/cross/build-rootfs.sh b/eng/common/cross/build-rootfs.sh index 735a4c82838..59714ff5c34 100755 --- a/eng/common/cross/build-rootfs.sh +++ b/eng/common/cross/build-rootfs.sh @@ -7,9 +7,9 @@ usage() echo "Usage: $0 [BuildArch] [CodeName] [lldbx.y] [--skipunmount] --rootfsdir ]" echo "BuildArch can be: arm(default), armel, arm64, x86" echo "CodeName - optional, Code name for Linux, can be: trusty, xenial(default), zesty, bionic, alpine, alpine3.9 or alpine3.13. If BuildArch is armel, LinuxCodeName is jessie(default) or tizen." - echo " for FreeBSD can be: freebsd11 or freebsd12." + echo " for FreeBSD can be: freebsd11, freebsd12, freebsd13" echo " for illumos can be: illumos." - echo "lldbx.y - optional, LLDB version, can be: lldb3.9(default), lldb4.0, lldb5.0, lldb6.0 no-lldb. Ignored for alpine and FReeBSD" + echo "lldbx.y - optional, LLDB version, can be: lldb3.9(default), lldb4.0, lldb5.0, lldb6.0 no-lldb. Ignored for alpine and FreeBSD" echo "--skipunmount - optional, will skip the unmount of rootfs folder." echo "--use-mirror - optional, use mirror URL to fetch resources, when available." exit 1 @@ -60,13 +60,15 @@ __AlpinePackages+=" krb5-dev" __AlpinePackages+=" openssl-dev" __AlpinePackages+=" zlib-dev" -__FreeBSDBase="12.1-RELEASE" +__FreeBSDBase="12.2-RELEASE" __FreeBSDPkg="1.12.0" +__FreeBSDABI="12" __FreeBSDPackages="libunwind" __FreeBSDPackages+=" icu" __FreeBSDPackages+=" libinotify" __FreeBSDPackages+=" lttng-ust" __FreeBSDPackages+=" krb5" +__FreeBSDPackages+=" terminfo-db" __IllumosPackages="icu-64.2nb2" __IllumosPackages+=" mit-krb5-1.16.2nb4" @@ -208,12 +210,20 @@ while :; do ;; freebsd11) __FreeBSDBase="11.3-RELEASE" + __FreeBSDABI="11" ;& freebsd12) __CodeName=freebsd __BuildArch=x64 __SkipUnmount=1 ;; + freebsd13) + __CodeName=freebsd + __FreeBSDBase="13.0-RELEASE" + __FreeBSDABI="13" + __BuildArch=x64 + __SkipUnmount=1 + ;; illumos) __CodeName=illumos __BuildArch=x64 @@ -291,9 +301,9 @@ if [[ "$__CodeName" == "alpine" ]]; then rm -r $__ApkToolsDir elif [[ "$__CodeName" == "freebsd" ]]; then mkdir -p $__RootfsDir/usr/local/etc + JOBS="$(getconf _NPROCESSORS_ONLN)" wget -O - https://download.freebsd.org/ftp/releases/amd64/${__FreeBSDBase}/base.txz | tar -C $__RootfsDir -Jxf - ./lib ./usr/lib ./usr/libdata ./usr/include ./usr/share/keys ./etc ./bin/freebsd-version - # For now, ask for 11 ABI even on 12. This can be revisited later. - echo "ABI = \"FreeBSD:11:amd64\"; FINGERPRINTS = \"${__RootfsDir}/usr/share/keys\"; REPOS_DIR = [\"${__RootfsDir}/etc/pkg\"]; REPO_AUTOUPDATE = NO; RUN_SCRIPTS = NO;" > ${__RootfsDir}/usr/local/etc/pkg.conf + echo "ABI = \"FreeBSD:${__FreeBSDABI}:amd64\"; FINGERPRINTS = \"${__RootfsDir}/usr/share/keys\"; REPOS_DIR = [\"${__RootfsDir}/etc/pkg\"]; REPO_AUTOUPDATE = NO; RUN_SCRIPTS = NO;" > ${__RootfsDir}/usr/local/etc/pkg.conf echo "FreeBSD: { url: "pkg+http://pkg.FreeBSD.org/\${ABI}/quarterly", mirror_type: \"srv\", signature_type: \"fingerprints\", fingerprints: \"${__RootfsDir}/usr/share/keys/pkg\", enabled: yes }" > ${__RootfsDir}/etc/pkg/FreeBSD.conf mkdir -p $__RootfsDir/tmp # get and build package manager @@ -301,7 +311,7 @@ elif [[ "$__CodeName" == "freebsd" ]]; then cd $__RootfsDir/tmp/pkg-${__FreeBSDPkg} # needed for install to succeed mkdir -p $__RootfsDir/host/etc - ./autogen.sh && ./configure --prefix=$__RootfsDir/host && make && make install + ./autogen.sh && ./configure --prefix=$__RootfsDir/host && make -j "$JOBS" && make install rm -rf $__RootfsDir/tmp/pkg-${__FreeBSDPkg} # install packages we need. INSTALL_AS_USER=$(whoami) $__RootfsDir/host/sbin/pkg -r $__RootfsDir -C $__RootfsDir/usr/local/etc/pkg.conf update From a50c27610c6a060c677090b801636cd7149cd591 Mon Sep 17 00:00:00 2001 From: Viktor Hofer Date: Mon, 2 Aug 2021 12:35:29 +0200 Subject: [PATCH 259/699] Move VerifyClosure tasks into M.D.PackageTesting (#7692) As we plan to deprecate the M.D.B.Tasks.Packaging project in the future, moving the tasks into the PackageTesting project. Fixes https://github.com/dotnet/arcade/issues/7474 --- ...rosoft.DotNet.Build.Tasks.Packaging.csproj | 4 +-- .../src/build/Packaging.common.targets | 2 -- ...crosoft.DotNet.PackageTesting.Tests.csproj | 2 ++ .../GetCompatiblePackageTargetFrameworks.cs | 26 +++++++++----- .../Microsoft.DotNet.PackageTesting.csproj | 1 - .../NupkgParser.cs | 13 ++++--- .../Package.cs | 10 +++--- .../VerifyClosure.cs | 7 ++-- .../VerifyTypes.cs | 7 ++-- .../Microsoft.DotNet.PackageTesting.props | 4 +++ ...icrosoft.DotNet.SharedFramework.Sdk.csproj | 4 +-- .../src/Packaging/Extensions.cs | 36 ------------------- 12 files changed, 48 insertions(+), 68 deletions(-) rename src/{Microsoft.DotNet.Build.Tasks.Packaging/src => Microsoft.DotNet.PackageTesting}/VerifyClosure.cs (98%) rename src/{Microsoft.DotNet.Build.Tasks.Packaging/src => Microsoft.DotNet.PackageTesting}/VerifyTypes.cs (97%) delete mode 100644 src/Microsoft.DotNet.SharedFramework.Sdk/src/Packaging/Extensions.cs diff --git a/src/Microsoft.DotNet.Build.Tasks.Packaging/src/Microsoft.DotNet.Build.Tasks.Packaging.csproj b/src/Microsoft.DotNet.Build.Tasks.Packaging/src/Microsoft.DotNet.Build.Tasks.Packaging.csproj index 31562d59343..7b4feb8805a 100644 --- a/src/Microsoft.DotNet.Build.Tasks.Packaging/src/Microsoft.DotNet.Build.Tasks.Packaging.csproj +++ b/src/Microsoft.DotNet.Build.Tasks.Packaging/src/Microsoft.DotNet.Build.Tasks.Packaging.csproj @@ -38,9 +38,7 @@ - SplitDependenciesBySupport - SplitReferences - UpdatePackageIndex -- ValidationTask -- VerifyClosure -- VerifyTypes +- ValidationTask **/*.Desktop.* $(BeforePack);AddRuntimeJson diff --git a/src/Microsoft.DotNet.Build.Tasks.Packaging/src/build/Packaging.common.targets b/src/Microsoft.DotNet.Build.Tasks.Packaging/src/build/Packaging.common.targets index 71ea8500609..c9a95a0ad95 100644 --- a/src/Microsoft.DotNet.Build.Tasks.Packaging/src/build/Packaging.common.targets +++ b/src/Microsoft.DotNet.Build.Tasks.Packaging/src/build/Packaging.common.targets @@ -44,7 +44,5 @@ - - diff --git a/src/Microsoft.DotNet.PackageTesting.Tests/Microsoft.DotNet.PackageTesting.Tests.csproj b/src/Microsoft.DotNet.PackageTesting.Tests/Microsoft.DotNet.PackageTesting.Tests.csproj index fb54391f150..6fde42f0d79 100644 --- a/src/Microsoft.DotNet.PackageTesting.Tests/Microsoft.DotNet.PackageTesting.Tests.csproj +++ b/src/Microsoft.DotNet.PackageTesting.Tests/Microsoft.DotNet.PackageTesting.Tests.csproj @@ -9,6 +9,8 @@ + + diff --git a/src/Microsoft.DotNet.PackageTesting/GetCompatiblePackageTargetFrameworks.cs b/src/Microsoft.DotNet.PackageTesting/GetCompatiblePackageTargetFrameworks.cs index ff00124037e..4fa94bfe4c8 100644 --- a/src/Microsoft.DotNet.PackageTesting/GetCompatiblePackageTargetFrameworks.cs +++ b/src/Microsoft.DotNet.PackageTesting/GetCompatiblePackageTargetFrameworks.cs @@ -13,7 +13,7 @@ namespace Microsoft.DotNet.PackageTesting { public class GetCompatiblePackageTargetFrameworks : BuildTask { - private static List allTargetFrameworks = allTargetFrameworks = new(); + private static List allTargetFrameworks = new(); private static Dictionary> packageTfmMapping = new(); [Required] @@ -27,12 +27,15 @@ public class GetCompatiblePackageTargetFrameworks : BuildTask public override bool Execute() { - bool result = true; - List testProjects = new List(); + List testProjects = new(); + try { Initialize(SupportedTestFrameworks); - string minDotnetTargetFramework = allTargetFrameworks.Where(t => t.Framework == ".NETCoreApp").OrderBy(t => t.Version).FirstOrDefault()?.GetShortFolderName(); + string minDotnetTargetFramework = allTargetFrameworks.Where(t => t.Framework == ".NETCoreApp") + .OrderBy(t => t.Version) + .FirstOrDefault()? + .GetShortFolderName(); foreach (var packagePath in PackagePaths) { @@ -50,25 +53,30 @@ public override bool Execute() Log.LogErrorFromException(e, showStackTrace: false); } - return result && !Log.HasLoggedErrors; + return !Log.HasLoggedErrors; } public static IEnumerable GetTestFrameworks(Package package, string minDotnetTargetFramework) { - List frameworksToTest= new List(); + List frameworksToTest= new(); IEnumerable packageTargetFrameworks = package.FrameworksInPackage; // Testing the package installation on all tfms linked with package targetframeworks. foreach (var item in packageTargetFrameworks) { if (packageTfmMapping.ContainsKey(item)) + { frameworksToTest.AddRange(packageTfmMapping[item]); + } + // Adding the frameworks in the packages to the test matrix. frameworksToTest.Add(item); } if (!string.IsNullOrEmpty(minDotnetTargetFramework) && frameworksToTest.Any(t => t.Framework == ".NETStandard")) + { frameworksToTest.Add(NuGetFramework.Parse(minDotnetTargetFramework)); + } return frameworksToTest.Where(tfm => allTargetFrameworks.Contains(tfm)).Distinct(); } @@ -97,12 +105,12 @@ public static void Initialize(string targetFrameworks) } } - public List CreateItemFromTestFramework(string packageId, string version, IEnumerable testFrameworks) + private static List CreateItemFromTestFramework(string packageId, string version, IEnumerable testFrameworks) { - List testprojects = new List(); + List testprojects = new(); foreach (var framework in testFrameworks) { - var supportedPackage = new TaskItem(packageId); + TaskItem supportedPackage = new(packageId); supportedPackage.SetMetadata("Version", version); supportedPackage.SetMetadata("TargetFramework", framework.ToString()); supportedPackage.SetMetadata("TargetFrameworkShort", framework.GetShortFolderName()); diff --git a/src/Microsoft.DotNet.PackageTesting/Microsoft.DotNet.PackageTesting.csproj b/src/Microsoft.DotNet.PackageTesting/Microsoft.DotNet.PackageTesting.csproj index 2f35e4aa96f..ef713a0f154 100644 --- a/src/Microsoft.DotNet.PackageTesting/Microsoft.DotNet.PackageTesting.csproj +++ b/src/Microsoft.DotNet.PackageTesting/Microsoft.DotNet.PackageTesting.csproj @@ -2,7 +2,6 @@ netcoreapp3.1;net472 - false MSBuildSdk false true diff --git a/src/Microsoft.DotNet.PackageTesting/NupkgParser.cs b/src/Microsoft.DotNet.PackageTesting/NupkgParser.cs index 919041292dc..d2d94dd9790 100644 --- a/src/Microsoft.DotNet.PackageTesting/NupkgParser.cs +++ b/src/Microsoft.DotNet.PackageTesting/NupkgParser.cs @@ -2,24 +2,29 @@ // The .NET Foundation licenses this file to you under the MIT license. using System.Linq; +using System.Collections.Generic; using NuGet.Frameworks; using NuGet.Packaging; namespace Microsoft.DotNet.PackageTesting { - public class NupkgParser + class NupkgParser { public static Package CreatePackageObject(string packagePath) { - PackageArchiveReader nupkgReader = new PackageArchiveReader(packagePath); + PackageArchiveReader nupkgReader = new(packagePath); NuspecReader nuspecReader = nupkgReader.NuspecReader; string packageId = nuspecReader.GetId(); string version = nuspecReader.GetVersion().ToString(); - NuGetFramework[] dependencyFrameworks = nuspecReader.GetDependencyGroups().Select(dg => dg.TargetFramework).Where(tfm => tfm != null).ToArray(); + NuGetFramework[] dependencyFrameworks = nuspecReader.GetDependencyGroups() + .Select(dg => dg.TargetFramework) + .Where(tfm => tfm != null) + .ToArray(); + IEnumerable files = nupkgReader.GetFiles()?.Where(t => t.EndsWith(packageId + ".dll")); - return new Package(packageId, version, nupkgReader.GetFiles()?.Where(t => t.EndsWith(packageId + ".dll")), dependencyFrameworks); + return new Package(packageId, version, files, dependencyFrameworks); } } } diff --git a/src/Microsoft.DotNet.PackageTesting/Package.cs b/src/Microsoft.DotNet.PackageTesting/Package.cs index 303d4713b76..3c6b7a1b845 100644 --- a/src/Microsoft.DotNet.PackageTesting/Package.cs +++ b/src/Microsoft.DotNet.PackageTesting/Package.cs @@ -11,6 +11,10 @@ namespace Microsoft.DotNet.PackageTesting { public class Package { + public IEnumerable FrameworksInPackage { get; } + public string PackageId { get; } + public string Version { get; } + public Package(string packageId, string version, IEnumerable packageAssetPaths, IEnumerable dependencyFrameworks) { PackageId = packageId; @@ -18,7 +22,7 @@ public Package(string packageId, string version, IEnumerable packageAsse ContentItemCollection packageAssets = new(); packageAssets.Load(packageAssetPaths); - ManagedCodeConventions conventions = new ManagedCodeConventions(null); + ManagedCodeConventions conventions = new(null); IEnumerable RefAssets = packageAssets.FindItems(conventions.Patterns.CompileRefAssemblies); IEnumerable LibAssets = packageAssets.FindItems(conventions.Patterns.CompileLibAssemblies); @@ -30,9 +34,5 @@ public Package(string packageId, string version, IEnumerable packageAsse FrameworksInPackageList.AddRange(dependencyFrameworks); FrameworksInPackage = FrameworksInPackageList.Distinct(); } - - public string PackageId { get; set; } - public string Version { get; set; } - public IEnumerable FrameworksInPackage { get; private set; } } } diff --git a/src/Microsoft.DotNet.Build.Tasks.Packaging/src/VerifyClosure.cs b/src/Microsoft.DotNet.PackageTesting/VerifyClosure.cs similarity index 98% rename from src/Microsoft.DotNet.Build.Tasks.Packaging/src/VerifyClosure.cs rename to src/Microsoft.DotNet.PackageTesting/VerifyClosure.cs index 8182b27a985..5b088259db1 100644 --- a/src/Microsoft.DotNet.Build.Tasks.Packaging/src/VerifyClosure.cs +++ b/src/Microsoft.DotNet.PackageTesting/VerifyClosure.cs @@ -2,6 +2,7 @@ // The .NET Foundation licenses this file to you under the MIT license. using Microsoft.Build.Framework; +using Microsoft.DotNet.Build.Tasks; using System; using System.Collections.Generic; using System.IO; @@ -12,7 +13,7 @@ using System.Text; using System.Xml.Linq; -namespace Microsoft.DotNet.Build.Tasks.Packaging +namespace Microsoft.DotNet.PackageTesting { /// /// Verifies the closure of a set of DLLs, making sure all files are present and no cycles exist @@ -125,7 +126,7 @@ private void AddSourceFile(string file) private void LoadIgnoredReferences() { - foreach (var ignoredReference in IgnoredReferences.NullAsEmpty()) + foreach (var ignoredReference in IgnoredReferences.DefaultIfEmpty()) { var name = ignoredReference.ItemSpec; var versionString = ignoredReference.GetMetadata("Version"); @@ -175,7 +176,7 @@ void CheckDependencies(Stack depStack) // check module references if (assm.State == CheckState.Unchecked && CheckModuleReferences) { - foreach(var moduleReference in assm.ModuleReferences.NullAsEmpty()) + foreach(var moduleReference in assm.ModuleReferences.DefaultIfEmpty()) { if (ShouldIgnore(moduleReference)) { diff --git a/src/Microsoft.DotNet.Build.Tasks.Packaging/src/VerifyTypes.cs b/src/Microsoft.DotNet.PackageTesting/VerifyTypes.cs similarity index 97% rename from src/Microsoft.DotNet.Build.Tasks.Packaging/src/VerifyTypes.cs rename to src/Microsoft.DotNet.PackageTesting/VerifyTypes.cs index 02e8b16a160..7fd15a1815e 100644 --- a/src/Microsoft.DotNet.Build.Tasks.Packaging/src/VerifyTypes.cs +++ b/src/Microsoft.DotNet.PackageTesting/VerifyTypes.cs @@ -2,21 +2,22 @@ // The .NET Foundation licenses this file to you under the MIT license. using Microsoft.Build.Framework; +using Microsoft.DotNet.Build.Tasks; using System; using System.Collections.Generic; using System.IO; +using System.Linq; using System.Reflection; using System.Reflection.Metadata; using System.Reflection.PortableExecutable; -namespace Microsoft.DotNet.Build.Tasks.Packaging +namespace Microsoft.DotNet.PackageTesting { /// /// Verifies no type overlap in a set of DLLs /// public class VerifyTypes : BuildTask { - /// /// Sources to scan. Items can be directories or files. /// @@ -124,7 +125,7 @@ private void AddSourceFile(string file) private void LoadIgnoredTypes() { - foreach(var ignoredType in IgnoredTypes.NullAsEmpty()) + foreach(var ignoredType in IgnoredTypes.DefaultIfEmpty()) { ignoredTypes.Add(ignoredType.ItemSpec); } diff --git a/src/Microsoft.DotNet.PackageTesting/build/Microsoft.DotNet.PackageTesting.props b/src/Microsoft.DotNet.PackageTesting/build/Microsoft.DotNet.PackageTesting.props index 5ecea08caeb..f568f711c5e 100644 --- a/src/Microsoft.DotNet.PackageTesting/build/Microsoft.DotNet.PackageTesting.props +++ b/src/Microsoft.DotNet.PackageTesting/build/Microsoft.DotNet.PackageTesting.props @@ -4,6 +4,10 @@ $(MSBuildThisFileDirectory)..\tools\netcoreapp3.1\Microsoft.DotNet.PackageTesting.dll + + + + diff --git a/src/Microsoft.DotNet.SharedFramework.Sdk/Microsoft.DotNet.SharedFramework.Sdk.csproj b/src/Microsoft.DotNet.SharedFramework.Sdk/Microsoft.DotNet.SharedFramework.Sdk.csproj index 31df0418e14..e1d14cb98c5 100644 --- a/src/Microsoft.DotNet.SharedFramework.Sdk/Microsoft.DotNet.SharedFramework.Sdk.csproj +++ b/src/Microsoft.DotNet.SharedFramework.Sdk/Microsoft.DotNet.SharedFramework.Sdk.csproj @@ -41,8 +41,8 @@ - - + + diff --git a/src/Microsoft.DotNet.SharedFramework.Sdk/src/Packaging/Extensions.cs b/src/Microsoft.DotNet.SharedFramework.Sdk/src/Packaging/Extensions.cs deleted file mode 100644 index be63e1cb5a5..00000000000 --- a/src/Microsoft.DotNet.SharedFramework.Sdk/src/Packaging/Extensions.cs +++ /dev/null @@ -1,36 +0,0 @@ -// Licensed to the .NET Foundation under one or more agreements. -// The .NET Foundation licenses this file to you under the MIT license. - -using Microsoft.Build.Framework; -using NuGet; -using NuGet.Frameworks; -using NuGet.Versioning; -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Linq.Expressions; -using System.Reflection; -using System.Runtime.Versioning; - -// This file implements a subset of the Extensions class in the -// Microsoft.DotNet.Build.Tasks.Packaging project to support -// the Shared Framework SDK's usage of the VerifyClosure and -// VerifyTypes tasks used in shared framework validation. - -namespace Microsoft.DotNet.Build.Tasks.Packaging -{ - public static class Extensions - { - public static IEnumerable NullAsEmpty(this IEnumerable source) - { - if (source == null) - { - return Enumerable.Empty(); - } - - return source; - } - } -} - From 68095e7839656456ab528c5ae3a062a79bfdc194 Mon Sep 17 00:00:00 2001 From: Joey Robichaud Date: Tue, 3 Aug 2021 05:11:55 -0700 Subject: [PATCH 260/699] Remove xml declaration from Tools.csproj (#7693) --- eng/common/internal/Tools.csproj | 1 - 1 file changed, 1 deletion(-) diff --git a/eng/common/internal/Tools.csproj b/eng/common/internal/Tools.csproj index 2067b8df8d9..beb9c4648ea 100644 --- a/eng/common/internal/Tools.csproj +++ b/eng/common/internal/Tools.csproj @@ -1,5 +1,4 @@ - net472 From 35a36a8ec705945b20275a7d63478affb396ff89 Mon Sep 17 00:00:00 2001 From: Nikola Milosavljevic Date: Tue, 3 Aug 2021 08:34:28 -0700 Subject: [PATCH 261/699] Fix OSX package versioning (#7695) --- .../build/installer.singlerid.targets | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/Microsoft.DotNet.Build.Tasks.Installers/build/installer.singlerid.targets b/src/Microsoft.DotNet.Build.Tasks.Installers/build/installer.singlerid.targets index 5e88f7150e4..ea33a56ee66 100644 --- a/src/Microsoft.DotNet.Build.Tasks.Installers/build/installer.singlerid.targets +++ b/src/Microsoft.DotNet.Build.Tasks.Installers/build/installer.singlerid.targets @@ -125,6 +125,10 @@ $([System.String]::Copy('$(InstallerPackageRelease)').Replace('-', '_')) + + $(VersionPrefix)-$(VersionSuffix) + + <_InstallerIntermediatesDir>$(IntermediateOutputPath)$(InstallerName)/$(InstallerPackageVersion)/ @@ -371,14 +375,14 @@ Properties="OutputPath=$(_OutputPathRoot)" RemoveProperties="@(_GlobalPropertiesToRemoveForPublish)" /> - <_MacOSVersionComponent Condition="'$(IncludeVersionInMacOSComponentName)' == 'true'">.$(ProductVersion) + <_MacOSVersionComponent Condition="'$(IncludeVersionInMacOSComponentName)' == 'true'">.$(InstallerPackageVersion) <_MacOSComponentName Condition="'$(_MacOSComponentName)' == ''">com.microsoft.dotnet.$(MacOSComponentNamePackType)$(_MacOSVersionComponent).component.osx.x64 <_MacOSSharedInstallDir>/usr/local/share/dotnet <_pkgArgs> <_pkgArgs>$(_pkgArgs) --root $(_OutputPathRoot) <_pkgArgs>$(_pkgArgs) --identifier $(_MacOSComponentName) - <_pkgArgs>$(_pkgArgs) --version $(ProductVersion) + <_pkgArgs>$(_pkgArgs) --version $(InstallerPackageVersion) <_pkgArgs>$(_pkgArgs) --install-location $(_MacOSSharedInstallDir) <_pkgArgs Condition="'$(MacOSScriptsDirectory)' != ''">$(_pkgArgs) --scripts $(MacOSScriptsDirectory) <_pkgArgs>$(_pkgArgs) $(_InstallerFile) From cd03aae5c0ce5cf2c6f35859c489b1dc6a5a9207 Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Tue, 3 Aug 2021 18:04:24 +0000 Subject: [PATCH 262/699] [main] Update dependencies from dotnet/xharness dotnet/xliff-tasks dotnet/arcade mono/linker (#7691) [main] Update dependencies from dotnet/xharness dotnet/xliff-tasks dotnet/arcade mono/linker --- eng/Version.Details.xml | 32 ++++++++++++++++---------------- eng/Versions.props | 12 ++++++------ global.json | 4 ++-- 3 files changed, 24 insertions(+), 24 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index bd9d43a3271..330762004b4 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -11,25 +11,25 @@ - + https://github.com/dotnet/arcade - dd3652e2ae5ea89703a2286295de9efe908974f1 + 62a8aafffd4c68ef887680f6837abdff906a662c - + https://github.com/dotnet/arcade - dd3652e2ae5ea89703a2286295de9efe908974f1 + 62a8aafffd4c68ef887680f6837abdff906a662c - + https://github.com/dotnet/arcade - dd3652e2ae5ea89703a2286295de9efe908974f1 + 62a8aafffd4c68ef887680f6837abdff906a662c - + https://github.com/dotnet/arcade - dd3652e2ae5ea89703a2286295de9efe908974f1 + 62a8aafffd4c68ef887680f6837abdff906a662c - + https://github.com/dotnet/arcade - dd3652e2ae5ea89703a2286295de9efe908974f1 + 62a8aafffd4c68ef887680f6837abdff906a662c https://github.com/dotnet/arcade-services @@ -39,17 +39,17 @@ https://github.com/dotnet/arcade-services cac955fe259cb611f6a29d09209bd717deb69037 - + https://github.com/dotnet/xharness - ccb49ae05b6d98b29871a1779408d4579e16d6e5 + 016171de04070fdd21472bd7514bb0272f0ad3aa https://github.com/dotnet/roslyn 246ce641f04b67ef017655275d850bf902a8e40f - + https://github.com/mono/linker - 0cb9250a903cfc90cbac602ed79c0cbc588d8d3f + ae18468b8712503aee67911228dd921601bd423a https://github.com/dotnet/sourcelink @@ -68,9 +68,9 @@ https://github.com/dotnet/symreader-converter c5ba7c88f92e2dde156c324a8c8edc04d9fa4fe0 - + https://github.com/dotnet/xliff-tasks - 85cac0820fcb9c066bdae0cb9886dcbc7748914e + 65d6700125d65051f9528f1557de29de796a60e3 diff --git a/eng/Versions.props b/eng/Versions.props index d343f4e0b3c..d47edfe566e 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -35,7 +35,7 @@ 2.1.1 2.1.0 3.10.0-4.21329.37 - 6.0.100-preview.6.21378.1 + 6.0.100-preview.6.21402.2 16.7.1 4.8.3 5.3.0.1 @@ -65,8 +65,8 @@ 2.4.1 2.0.3 2.4.1 - 6.0.0-beta.21378.2 - 6.0.0-beta.21378.2 + 6.0.0-beta.21379.2 + 6.0.0-beta.21379.2 1.22.0 1.1.2 2.0.0 @@ -77,10 +77,10 @@ 1.1.0-beta.20258.6 1.1.0-beta-21309-01 1.1.0-beta-21309-01 - 6.0.0-beta.21378.2 - 1.0.0-beta.21378.1 + 6.0.0-beta.21379.2 + 1.0.0-beta.21380.1 1.1.0-beta.21228.1 - 1.0.0-prerelease.21373.1 + 1.0.0-prerelease.21378.1 1.1.156602 1.1.156602 6.0.100-preview.5.21254.11 diff --git a/global.json b/global.json index aee2d816476..2533860e4c1 100644 --- a/global.json +++ b/global.json @@ -3,7 +3,7 @@ "dotnet": "6.0.100-preview.6.21355.2" }, "msbuild-sdks": { - "Microsoft.DotNet.Arcade.Sdk": "6.0.0-beta.21378.2", - "Microsoft.DotNet.Helix.Sdk": "6.0.0-beta.21378.2" + "Microsoft.DotNet.Arcade.Sdk": "6.0.0-beta.21379.2", + "Microsoft.DotNet.Helix.Sdk": "6.0.0-beta.21379.2" } } From 9fc83fbf76339c9dec4f5a8bf4718df2d42992a3 Mon Sep 17 00:00:00 2001 From: Michael Stuckey Date: Tue, 3 Aug 2021 13:32:31 -0700 Subject: [PATCH 263/699] Update dotnet sdk (#7697) * Update dotnet SDK to latest published in an effort to improve package restore reliability. * Update aspnetcore runtime version check Co-authored-by: Matt Galbraith --- global.json | 2 +- src/Microsoft.DotNet.Helix/Sdk/tools/dotnet-cli/DotNetCli.props | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/global.json b/global.json index 2533860e4c1..6ca652791b8 100644 --- a/global.json +++ b/global.json @@ -1,6 +1,6 @@ { "tools": { - "dotnet": "6.0.100-preview.6.21355.2" + "dotnet": "6.0.100-rc.1.21379.2" }, "msbuild-sdks": { "Microsoft.DotNet.Arcade.Sdk": "6.0.0-beta.21379.2", diff --git a/src/Microsoft.DotNet.Helix/Sdk/tools/dotnet-cli/DotNetCli.props b/src/Microsoft.DotNet.Helix/Sdk/tools/dotnet-cli/DotNetCli.props index 1244e50dc8b..9d2697f8d41 100644 --- a/src/Microsoft.DotNet.Helix/Sdk/tools/dotnet-cli/DotNetCli.props +++ b/src/Microsoft.DotNet.Helix/Sdk/tools/dotnet-cli/DotNetCli.props @@ -1,7 +1,7 @@ false - 6.0.0-preview.6.21355.2 + 6.0.0-rc.1.21378.2 runtime $(BundledNETCoreAppPackageVersion) From fb9fe2f56e19f8f67e59a5cbf3fbcab4fb7b9db1 Mon Sep 17 00:00:00 2001 From: Alitzel Mendez <6895254+AlitzelMendez@users.noreply.github.com> Date: Tue, 3 Aug 2021 14:54:42 -0700 Subject: [PATCH 264/699] [main] Update MicrosoftDotNetMaestroTasksVersion (#7684) * Update MicrosoftDotNetMaestroTasksVersion * update version * update version --- eng/Versions.props | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/eng/Versions.props b/eng/Versions.props index d47edfe566e..3d400ad0ec1 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -79,7 +79,7 @@ 1.1.0-beta-21309-01 6.0.0-beta.21379.2 1.0.0-beta.21380.1 - 1.1.0-beta.21228.1 + 1.1.0-beta.21378.2 1.0.0-prerelease.21378.1 1.1.156602 1.1.156602 From b34f07a98f88c53bdff6bb96b8ce901c37487fcc Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Wed, 4 Aug 2021 13:38:40 +0000 Subject: [PATCH 265/699] Update dependencies from https://github.com/mono/linker build 20210803.3 (#7706) [main] Update dependencies from mono/linker --- eng/Version.Details.xml | 4 ++-- eng/Versions.props | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index 330762004b4..9cfbc296717 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -47,9 +47,9 @@ https://github.com/dotnet/roslyn 246ce641f04b67ef017655275d850bf902a8e40f - + https://github.com/mono/linker - ae18468b8712503aee67911228dd921601bd423a + 7cb5aafb7314384229bd05b2aeb9e21805f463f9 https://github.com/dotnet/sourcelink diff --git a/eng/Versions.props b/eng/Versions.props index 3d400ad0ec1..d27c178a206 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -35,7 +35,7 @@ 2.1.1 2.1.0 3.10.0-4.21329.37 - 6.0.100-preview.6.21402.2 + 6.0.100-preview.6.21403.3 16.7.1 4.8.3 5.3.0.1 From 640dec9a11f7d4ea76d9dc210b624a994a9d21e3 Mon Sep 17 00:00:00 2001 From: Matt Mitchell Date: Wed, 4 Aug 2021 07:34:07 -0700 Subject: [PATCH 266/699] Fixes and tweaks to the preview flow scripts: (#7702) - Add flow for templating (internal and public) - Fix parameters in the flip-previewplus-flow.ps1 scripts - Remove wpf-int flow to internal (flow through public) --- scripts/create-net6-preview-flow.ps1 | 12 +++++++++--- scripts/flip-previewplus-flow.ps1 | 8 ++++---- 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/scripts/create-net6-preview-flow.ps1 b/scripts/create-net6-preview-flow.ps1 index c5a25d9f562..136648244a7 100644 --- a/scripts/create-net6-preview-flow.ps1 +++ b/scripts/create-net6-preview-flow.ps1 @@ -63,9 +63,12 @@ MakeDefaultChannel https://github.com/mono/linker $RuntimeBranch $RuntimeChannel if ($AddInternalFlow) { # Because of where internal fixes tend to be, we eliminate some leaves in the graph # and flow them through the normal public channels: emsdk, icu, linker. - # wpf-int gets assigned to the internal channel in addition (since there is no public->internal merge) + # wpf-int is flowed from the public channel (there is no internal branch or merge) due to + # an issue in the staging pipeline where it will give the test feed for the public preview build + # internal permissions in some cases because it sees the internal repo publishing locations before + # the public locations. The logic is such that if any asset has non-public permissions, the test feed will have + # internal permissions. Write-Host "Making default channels for internal branches of runtime repos" - MakeDefaultChannel https://dev.azure.com/dnceng/internal/_git/dotnet-wpf-int $RuntimeBranch $InternalRuntimeChannel MakeDefaultChannel https://dev.azure.com/dnceng/internal/_git/dotnet-aspnetcore $InternalRuntimeBranch $InternalRuntimeChannel MakeDefaultChannel https://dev.azure.com/dnceng/internal/_git/dotnet-efcore $InternalRuntimeBranch $InternalRuntimeChannel MakeDefaultChannel https://dev.azure.com/dnceng/internal/_git/dotnet-runtime $InternalRuntimeBranch $InternalRuntimeChannel @@ -86,6 +89,7 @@ if ($AddInternalFlow) { Write-Host "Making default channels for SDK repos" MakeDefaultChannel https://dev.azure.com/dnceng/internal/_git/dotnet-installer $InternalSdkBranch $InternalSdkChannel MakeDefaultChannel https://dev.azure.com/dnceng/internal/_git/dotnet-sdk $InternalSdkBranch $InternalSdkChannel + MakeDefaultChannel https://dev.azure.com/dnceng/internal/_git/dotnet-templating $InternalSdkBranch $InternalSdkChannel } Write-Host "Setting up batched merge policies" @@ -128,7 +132,6 @@ if ($AddInternalFlow) { Write-Host "Adding internal runtime -> internal runtime flow" AddBatchedFlow https://dev.azure.com/dnceng/internal/_git/dotnet-efcore $InternalRuntimeChannel https://dev.azure.com/dnceng/internal/_git/dotnet-aspnetcore $InternalRuntimeBranch EveryBuild AddBatchedFlow https://dev.azure.com/dnceng/internal/_git/dotnet-runtime $InternalRuntimeChannel https://dev.azure.com/dnceng/internal/_git/dotnet-aspnetcore $InternalRuntimeBranch EveryBuild - AddFlow https://dev.azure.com/dnceng/internal/_git/dotnet-wpf-int $InternalRuntimeChannel https://dev.azure.com/dnceng/internal/_git/dotnet-wpf $InternalRuntimeBranch EveryBuild AddFlow https://dev.azure.com/dnceng/internal/_git/dotnet-runtime $InternalRuntimeChannel https://dev.azure.com/dnceng/internal/_git/dotnet-efcore $InternalRuntimeBranch EveryBuild AddFlow https://dev.azure.com/dnceng/internal/_git/dotnet-runtime $InternalRuntimeChannel https://dev.azure.com/dnceng/internal/_git/dotnet-winforms $InternalRuntimeBranch EveryBuild AddFlow https://dev.azure.com/dnceng/internal/_git/dotnet-winforms $InternalRuntimeChannel https://dev.azure.com/dnceng/internal/_git/dotnet-wpf $InternalRuntimeBranch EveryBuild @@ -142,6 +145,7 @@ Write-Host "Add runtime->sdk flow" AddFlow https://github.com/dotnet/aspnetcore $RuntimeChannel https://github.com/dotnet/sdk $SdkBranch EveryBuild AddFlow https://github.com/dotnet/windowsdesktop $RuntimeChannel https://github.com/dotnet/sdk $SdkBranch EveryBuild AddFlow https://github.com/dotnet/runtime $RuntimeChannel https://github.com/dotnet/sdk $SdkBranch EveryBuild +AddFlow https://github.com/dotnet/runtime $RuntimeChannel https://github.com/dotnet/templating $SdkBranch EveryBuild AddFlow https://github.com/mono/linker $RuntimeChannel https://github.com/dotnet/sdk $SdkBranch EveryBuild if ($AddInternalFlow) { @@ -149,6 +153,7 @@ if ($AddInternalFlow) { AddFlow https://dev.azure.com/dnceng/internal/_git/dotnet-aspnetcore $InternalRuntimeChannel https://dev.azure.com/dnceng/internal/_git/dotnet-sdk $InternalSdkBranch EveryBuild AddFlow https://dev.azure.com/dnceng/internal/_git/dotnet-windowsdesktop $InternalRuntimeChannel https://dev.azure.com/dnceng/internal/_git/dotnet-sdk $InternalSdkBranch EveryBuild AddFlow https://dev.azure.com/dnceng/internal/_git/dotnet-runtime $InternalRuntimeChannel https://dev.azure.com/dnceng/internal/_git/dotnet-sdk $InternalSdkBranch EveryBuild + AddFlow https://dev.azure.com/dnceng/internal/_git/dotnet-runtime $InternalRuntimeChannel https://dev.azure.com/dnceng/internal/_git/dotnet-templating $InternalSdkBranch EveryBuild Write-Host "Disabling internal runtime->internal sdk flow" DisableFlow $InternalRuntimeChannel @@ -163,6 +168,7 @@ if ($AddInternalFlow) { Write-Host "Adding internal sdk->internal sdk flow" # Nothing but SDK->installer flows internally AddFlow https://dev.azure.com/dnceng/internal/_git/dotnet-sdk $InternalSdkChannel https://dev.azure.com/dnceng/internal/_git/dotnet-installer $InternalSdkBranch EveryBuild + AddFlow https://dev.azure.com/dnceng/internal/_git/dotnet-templating $InternalSdkChannel https://dev.azure.com/dnceng/internal/_git/dotnet-sdk $InternalSdkBranch EveryBuild Write-Host "Disabling internal sdk->internal sdk flow" DisableFlow $InternalSdkChannel diff --git a/scripts/flip-previewplus-flow.ps1 b/scripts/flip-previewplus-flow.ps1 index 00ab240dd8f..d09659e7752 100644 --- a/scripts/flip-previewplus-flow.ps1 +++ b/scripts/flip-previewplus-flow.ps1 @@ -1,9 +1,9 @@ param ( - [Parameter(Mandatory=$true)][string]"$RuntimeChannel", - [Parameter(Mandatory=$true)][string]"$SdkChannel", - [Parameter(Mandatory=$true)][string]"$InternalRuntimeChannel", - [Parameter(Mandatory=$true)][string]"$InternalSdkChannel", + [Parameter(Mandatory=$true)][string]$RuntimeChannel, + [Parameter(Mandatory=$true)][string]$SdkChannel, + [Parameter(Mandatory=$true)][string]$InternalRuntimeChannel, + [Parameter(Mandatory=$true)][string]$InternalSdkChannel, [Parameter(Mandatory=$true)][ValidateSet('Preview','Preview+')][string]$FlowType, [switch]$TriggerSubscriptions ) From cff9cf22452b8d6cdb656ee3aae910981f5d45e0 Mon Sep 17 00:00:00 2001 From: Matt Mitchell Date: Wed, 4 Aug 2021 09:12:03 -0700 Subject: [PATCH 267/699] Remove obselete phases templates (#7707) These got replaced by the job templates a long time ago and no longer recieve updates. There are only two places in dotnet (cli-migrate and dotnet-cli-archiver) that have references in their main branch, and they are both archived repos. --- eng/common/templates/phases/base.yml | 130 ------------------ .../templates/phases/publish-build-assets.yml | 52 ------- 2 files changed, 182 deletions(-) delete mode 100644 eng/common/templates/phases/base.yml delete mode 100644 eng/common/templates/phases/publish-build-assets.yml diff --git a/eng/common/templates/phases/base.yml b/eng/common/templates/phases/base.yml deleted file mode 100644 index 0123cf43b16..00000000000 --- a/eng/common/templates/phases/base.yml +++ /dev/null @@ -1,130 +0,0 @@ -parameters: - # Optional: Clean sources before building - clean: true - - # Optional: Git fetch depth - fetchDepth: '' - - # Optional: name of the phase (not specifying phase name may cause name collisions) - name: '' - # Optional: display name of the phase - displayName: '' - - # Optional: condition for the job to run - condition: '' - - # Optional: dependencies of the phase - dependsOn: '' - - # Required: A defined YAML queue - queue: {} - - # Required: build steps - steps: [] - - # Optional: variables - variables: {} - - # Optional: should run as a public build even in the internal project - # if 'true', the build won't run any of the internal only steps, even if it is running in non-public projects. - runAsPublic: false - - ## Telemetry variables - - # Optional: enable sending telemetry - # if 'true', these "variables" must be specified in the variables object or as part of the queue matrix - # _HelixBuildConfig - differentiate between Debug, Release, other - # _HelixSource - Example: build/product - # _HelixType - Example: official/dotnet/arcade/$(Build.SourceBranch) - enableTelemetry: false - - # Optional: Enable installing Microbuild plugin - # if 'true', these "variables" must be specified in the variables object or as part of the queue matrix - # _TeamName - the name of your team - # _SignType - 'test' or 'real' - enableMicrobuild: false - -# Internal resources (telemetry, microbuild) can only be accessed from non-public projects, -# and some (Microbuild) should only be applied to non-PR cases for internal builds. - -phases: -- phase: ${{ parameters.name }} - - ${{ if ne(parameters.displayName, '') }}: - displayName: ${{ parameters.displayName }} - - ${{ if ne(parameters.condition, '') }}: - condition: ${{ parameters.condition }} - - ${{ if ne(parameters.dependsOn, '') }}: - dependsOn: ${{ parameters.dependsOn }} - - queue: ${{ parameters.queue }} - - ${{ if ne(parameters.variables, '') }}: - variables: - ${{ insert }}: ${{ parameters.variables }} - - steps: - - checkout: self - clean: ${{ parameters.clean }} - ${{ if ne(parameters.fetchDepth, '') }}: - fetchDepth: ${{ parameters.fetchDepth }} - - - ${{ if eq(parameters.enableTelemetry, 'true') }}: - - template: /eng/common/templates/steps/telemetry-start.yml - parameters: - buildConfig: $(_HelixBuildConfig) - helixSource: $(_HelixSource) - helixType: $(_HelixType) - runAsPublic: ${{ parameters.runAsPublic }} - - - ${{ if eq(parameters.enableMicrobuild, 'true') }}: - # Internal only resource, and Microbuild signing shouldn't be applied to PRs. - - ${{ if and(eq(parameters.runAsPublic, 'false'), ne(variables['System.TeamProject'], 'public'), notin(variables['Build.Reason'], 'PullRequest')) }}: - - task: MicroBuildSigningPlugin@2 - displayName: Install MicroBuild plugin - inputs: - signType: $(_SignType) - zipSources: false - feedSource: https://dnceng.pkgs.visualstudio.com/_packaging/MicroBuildToolset/nuget/v3/index.json - - env: - TeamName: $(_TeamName) - continueOnError: false - condition: and(succeeded(), in(variables['_SignType'], 'real', 'test'), eq(variables['Agent.Os'], 'Windows_NT')) - - # Run provided build steps - - ${{ parameters.steps }} - - - ${{ if eq(parameters.enableMicrobuild, 'true') }}: - # Internal only resources - - ${{ if and(eq(parameters.runAsPublic, 'false'), ne(variables['System.TeamProject'], 'public'), notin(variables['Build.Reason'], 'PullRequest')) }}: - - task: MicroBuildCleanup@1 - displayName: Execute Microbuild cleanup tasks - condition: and(always(), in(variables['_SignType'], 'real', 'test'), eq(variables['Agent.Os'], 'Windows_NT')) - env: - TeamName: $(_TeamName) - - - ${{ if eq(parameters.enableTelemetry, 'true') }}: - - template: /eng/common/templates/steps/telemetry-end.yml - parameters: - helixSource: $(_HelixSource) - helixType: $(_HelixType) - - - ${{ if and(eq(parameters.runAsPublic, 'false'), ne(variables['System.TeamProject'], 'public'), notin(variables['Build.Reason'], 'PullRequest')) }}: - - task: CopyFiles@2 - displayName: Gather Asset Manifests - inputs: - SourceFolder: '$(Build.SourcesDirectory)/artifacts/log/$(_BuildConfig)/AssetManifest' - TargetFolder: '$(Build.StagingDirectory)/AssetManifests' - continueOnError: false - condition: and(succeeded(), eq(variables['_DotNetPublishToBlobFeed'], 'true')) - - task: PublishBuildArtifacts@1 - displayName: Push Asset Manifests - inputs: - PathtoPublish: '$(Build.StagingDirectory)/AssetManifests' - PublishLocation: Container - ArtifactName: AssetManifests - continueOnError: false - condition: and(succeeded(), eq(variables['_DotNetPublishToBlobFeed'], 'true')) diff --git a/eng/common/templates/phases/publish-build-assets.yml b/eng/common/templates/phases/publish-build-assets.yml deleted file mode 100644 index 4e51e472e2b..00000000000 --- a/eng/common/templates/phases/publish-build-assets.yml +++ /dev/null @@ -1,52 +0,0 @@ -parameters: - dependsOn: '' - queue: {} - configuration: 'Debug' - condition: succeeded() - continueOnError: false - runAsPublic: false - publishUsingPipelines: false -phases: - - phase: Asset_Registry_Publish - displayName: Publish to Build Asset Registry - dependsOn: ${{ parameters.dependsOn }} - queue: ${{ parameters.queue }} - variables: - _BuildConfig: ${{ parameters.configuration }} - steps: - - ${{ if and(eq(parameters.runAsPublic, 'false'), ne(variables['System.TeamProject'], 'public'), notin(variables['Build.Reason'], 'PullRequest')) }}: - - task: DownloadBuildArtifacts@0 - displayName: Download artifact - inputs: - artifactName: AssetManifests - downloadPath: '$(Build.StagingDirectory)/Download' - checkDownloadedFiles: true - condition: ${{ parameters.condition }} - continueOnError: ${{ parameters.continueOnError }} - - task: AzureKeyVault@1 - inputs: - azureSubscription: 'DotNet-Engineering-Services_KeyVault' - KeyVaultName: EngKeyVault - SecretsFilter: 'MaestroAccessToken' - condition: ${{ parameters.condition }} - continueOnError: ${{ parameters.continueOnError }} - - task: PowerShell@2 - displayName: Publish Build Assets - inputs: - filePath: eng\common\sdk-task.ps1 - arguments: -task PublishBuildAssets -restore -msbuildEngine dotnet - /p:ManifestsPath='$(Build.StagingDirectory)/Download/AssetManifests' - /p:BuildAssetRegistryToken=$(MaestroAccessToken) - /p:MaestroApiEndpoint=https://maestro-prod.westus2.cloudapp.azure.com - /p:PublishUsingPipelines=${{ parameters.publishUsingPipelines }} - /p:Configuration=$(_BuildConfig) - condition: ${{ parameters.condition }} - continueOnError: ${{ parameters.continueOnError }} - - task: PublishBuildArtifacts@1 - displayName: Publish Logs to VSTS - inputs: - PathtoPublish: '$(Build.SourcesDirectory)/artifacts/log/$(_BuildConfig)' - PublishLocation: Container - ArtifactName: $(Agent.Os)_Asset_Registry_Publish - continueOnError: true - condition: always() From 8cb32515f4e7e242d423a119077ee93cad65395e Mon Sep 17 00:00:00 2001 From: Alex Perovich Date: Wed, 4 Aug 2021 16:10:21 -0700 Subject: [PATCH 268/699] Add secret management build part (#7713) --- .config/dotnet-tools.json | 12 ++++++++++++ azure-pipelines-weekly.yaml | 36 ++++++++++++++++++++++++++++++++++++ 2 files changed, 48 insertions(+) create mode 100644 .config/dotnet-tools.json create mode 100644 azure-pipelines-weekly.yaml diff --git a/.config/dotnet-tools.json b/.config/dotnet-tools.json new file mode 100644 index 00000000000..bb75cfd04e7 --- /dev/null +++ b/.config/dotnet-tools.json @@ -0,0 +1,12 @@ +{ + "version": 1, + "isRoot": true, + "tools": { + "microsoft.dnceng.secretmanager": { + "version": "1.1.0-beta.21380.2", + "commands": [ + "secret-manager" + ] + } + } +} \ No newline at end of file diff --git a/azure-pipelines-weekly.yaml b/azure-pipelines-weekly.yaml new file mode 100644 index 00000000000..d12432a1580 --- /dev/null +++ b/azure-pipelines-weekly.yaml @@ -0,0 +1,36 @@ +schedules: +- cron: 0 12 * * 1 + displayName: Weekly Monday build + branches: + include: + - main + always: true + +name: $(Date:yyyMMdd)$(Rev:rr) +stages: + - stage: SynchronizeSecrets + jobs: + - job: Synchronize + pool: + vmImage: windows-2019 + steps: + - task: UseDotNet@2 + displayName: Install Correct .NET Version + inputs: + useGlobalJson: true + + - task: UseDotNet@2 + displayName: Install .NET 3.1 runtime + inputs: + packageType: runtime + version: 3.1.x + + - script: dotnet tool restore + + - task: AzureCLI@2 + inputs: + azureSubscription: DotNet Eng Services Secret Manager + scriptType: ps + scriptLocation: inlineScript + inlineScript: | + Get-ChildItem .vault-config/*.yaml |% { dotnet secret-manager synchronize $_} From f7270e0031e4e8e44122640ccaf5e776f6f438ef Mon Sep 17 00:00:00 2001 From: Jon Fortescue Date: Wed, 4 Aug 2021 16:28:33 -0700 Subject: [PATCH 269/699] Allow specifying AzDO org in CreateAzureDevOpsFeed (#7700) --- .../tools/SdkTasks/PublishSignedAssets.proj | 7 ++-- .../SdkTasks/PublishToSymbolServers.proj | 3 +- .../src/CreateAzureDevOpsFeed.cs | 32 ++++++++++--------- 3 files changed, 24 insertions(+), 18 deletions(-) diff --git a/src/Microsoft.DotNet.Arcade.Sdk/tools/SdkTasks/PublishSignedAssets.proj b/src/Microsoft.DotNet.Arcade.Sdk/tools/SdkTasks/PublishSignedAssets.proj index 484b4c35775..ce7e413169a 100644 --- a/src/Microsoft.DotNet.Arcade.Sdk/tools/SdkTasks/PublishSignedAssets.proj +++ b/src/Microsoft.DotNet.Arcade.Sdk/tools/SdkTasks/PublishSignedAssets.proj @@ -14,6 +14,7 @@ netcoreapp3.1 Publish + dnceng @@ -37,7 +38,8 @@ + FeedName="$(FeedName)-shipping" + AzureDevOpsOrg="$(AzureDevOpsOrg)"> @@ -45,7 +47,8 @@ + FeedName="$(FeedName)-nonshipping" + AzureDevOpsOrg="$(AzureDevOpsOrg)"> diff --git a/src/Microsoft.DotNet.Arcade.Sdk/tools/SdkTasks/PublishToSymbolServers.proj b/src/Microsoft.DotNet.Arcade.Sdk/tools/SdkTasks/PublishToSymbolServers.proj index 903d1b0e41b..ed621b99a27 100644 --- a/src/Microsoft.DotNet.Arcade.Sdk/tools/SdkTasks/PublishToSymbolServers.proj +++ b/src/Microsoft.DotNet.Arcade.Sdk/tools/SdkTasks/PublishToSymbolServers.proj @@ -44,6 +44,7 @@ true false true + false /// Number of characters from the commit SHA prefix that should be included in the feed name. @@ -105,11 +103,12 @@ private async Task ExecuteAsync() return false; } + string azureDevOpsFeedsBaseUrl = $"https://feeds.dev.azure.com/{AzureDevOpsOrg}/"; do { using (HttpClient client = new HttpClient(new HttpClientHandler { CheckCertificateRevocationList = true }) { - BaseAddress = new Uri(AzureDevOpsFeedsBaseUrl) + BaseAddress = new Uri(azureDevOpsFeedsBaseUrl) }) { client.DefaultRequestHeaders.Add( @@ -119,13 +118,12 @@ private async Task ExecuteAsync() "Basic", Convert.ToBase64String(Encoding.ASCII.GetBytes(string.Format("{0}:{1}", "", AzureDevOpsPersonalAccessToken)))); - AzureDevOpsArtifactFeed newFeed = new AzureDevOpsArtifactFeed(versionedFeedName); + AzureDevOpsArtifactFeed newFeed = new AzureDevOpsArtifactFeed(versionedFeedName, AzureDevOpsOrg); string body = JsonConvert.SerializeObject(newFeed, _serializerSettings); HttpRequestMessage postMessage = new HttpRequestMessage(HttpMethod.Post, $"{publicSegment}_apis/packaging/feeds"); postMessage.Content = new StringContent(body, Encoding.UTF8, "application/json"); - HttpResponseMessage response = await client.SendAsync(postMessage); if (response.StatusCode == HttpStatusCode.Created) @@ -180,20 +178,24 @@ public Permission(string identityDescriptor, int role) public class AzureDevOpsArtifactFeed { - public AzureDevOpsArtifactFeed(string name) + public AzureDevOpsArtifactFeed(string name, string organization) { Name = name; + if (organization == "dnceng") + { + Permissions = new List + { + // Mimic the permissions added to a feed when created in the browser + new Permission("Microsoft.TeamFoundation.ServiceIdentity;116cce53-b859-4624-9a95-934af41eccef:Build:b55de4ed-4b5a-4215-a8e4-0a0a5f71e7d8", 3), // Project Collection Build Service + new Permission("Microsoft.TeamFoundation.ServiceIdentity;116cce53-b859-4624-9a95-934af41eccef:Build:7ea9116e-9fac-403d-b258-b31fcf1bb293", 3), // internal Build Service + new Permission("Microsoft.TeamFoundation.Identity;S-1-9-1551374245-1349140002-2196814402-2899064621-3782482097-0-0-0-0-1", 4), // Feed administrators + new Permission("Microsoft.TeamFoundation.Identity;S-1-9-1551374245-1846651262-2896117056-2992157471-3474698899-1-2052915359-1158038602-2757432096-2854636005", 4) // Feed administrators and contributors + }; + } } public string Name { get; set; } - public readonly List Permissions = new List - { - // Mimic the permissions added to a feed when created in the browser - new Permission("Microsoft.TeamFoundation.ServiceIdentity;116cce53-b859-4624-9a95-934af41eccef:Build:b55de4ed-4b5a-4215-a8e4-0a0a5f71e7d8", 3), // Project Collection Build Service - new Permission("Microsoft.TeamFoundation.ServiceIdentity;116cce53-b859-4624-9a95-934af41eccef:Build:7ea9116e-9fac-403d-b258-b31fcf1bb293", 3), // internal Build Service - new Permission("Microsoft.TeamFoundation.Identity;S-1-9-1551374245-1349140002-2196814402-2899064621-3782482097-0-0-0-0-1", 4), // Feed administrators - new Permission("Microsoft.TeamFoundation.Identity;S-1-9-1551374245-1846651262-2896117056-2992157471-3474698899-1-2052915359-1158038602-2757432096-2854636005", 4) // Feed administrators and contributors - }; + public List Permissions { get; private set; } } } From a72e92b8ee864188a54339aa8b3aa9d9c31d15ee Mon Sep 17 00:00:00 2001 From: Viktor Hofer Date: Thu, 5 Aug 2021 08:36:19 +0200 Subject: [PATCH 270/699] Remove support of pkgproj in TargetFramework.Sdk (#7712) Pkgprojs are removed in the consuming part of dotnet/runtime (libraries) and the TargetFramework.Sdk hence need to support them anymore. --- ...et.Build.Tasks.TargetFramework.Sdk.targets | 37 +------------------ 1 file changed, 1 insertion(+), 36 deletions(-) diff --git a/src/Microsoft.DotNet.Build.Tasks.TargetFramework.Sdk/src/build/Microsoft.DotNet.Build.Tasks.TargetFramework.Sdk.targets b/src/Microsoft.DotNet.Build.Tasks.TargetFramework.Sdk/src/build/Microsoft.DotNet.Build.Tasks.TargetFramework.Sdk.targets index 09e974e52cf..97c20f3837b 100644 --- a/src/Microsoft.DotNet.Build.Tasks.TargetFramework.Sdk/src/build/Microsoft.DotNet.Build.Tasks.TargetFramework.Sdk.targets +++ b/src/Microsoft.DotNet.Build.Tasks.TargetFramework.Sdk/src/build/Microsoft.DotNet.Build.Tasks.TargetFramework.Sdk.targets @@ -1,5 +1,6 @@ + @@ -92,40 +93,4 @@ - - - - - - - - <_NonPkgProjProjectReferenceTargetFrameworkWithAdditionalProperties Include="@(_NonPkgProjProjectReferenceTargetFramework->'%(OriginalItemSpec)')"> - TargetFramework=%(_NonPkgProjProjectReferenceTargetFramework.Identity);%(_NonPkgProjProjectReferenceTargetFramework.AdditionalProperties) - - - - - - <_NonPkgProjProjectReference Remove="@(_NonPkgProjProjectReference)" /> - <_NonPkgProjProjectReference Include="@(_NonPkgProjProjectReferenceTargetFrameworkWithAdditionalProperties)" /> - - - - - - - - - - - @(PackageTargetFrameworksList) - - - From 02b4accb8f959345f9beb6e34d1e3c69257b3647 Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Thu, 5 Aug 2021 13:33:59 +0000 Subject: [PATCH 271/699] Update dependencies from https://github.com/dotnet/arcade build 20210803.5 (#7716) [main] Update dependencies from dotnet/arcade --- .config/dotnet-tools.json | 2 +- eng/Version.Details.xml | 20 ++++++++++---------- eng/Versions.props | 6 +++--- global.json | 4 ++-- 4 files changed, 16 insertions(+), 16 deletions(-) diff --git a/.config/dotnet-tools.json b/.config/dotnet-tools.json index bb75cfd04e7..af555c6a0cb 100644 --- a/.config/dotnet-tools.json +++ b/.config/dotnet-tools.json @@ -9,4 +9,4 @@ ] } } -} \ No newline at end of file +} diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index 9cfbc296717..eb75a29ba54 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -11,25 +11,25 @@ - + https://github.com/dotnet/arcade - 62a8aafffd4c68ef887680f6837abdff906a662c + 9fc83fbf76339c9dec4f5a8bf4718df2d42992a3 - + https://github.com/dotnet/arcade - 62a8aafffd4c68ef887680f6837abdff906a662c + 9fc83fbf76339c9dec4f5a8bf4718df2d42992a3 - + https://github.com/dotnet/arcade - 62a8aafffd4c68ef887680f6837abdff906a662c + 9fc83fbf76339c9dec4f5a8bf4718df2d42992a3 - + https://github.com/dotnet/arcade - 62a8aafffd4c68ef887680f6837abdff906a662c + 9fc83fbf76339c9dec4f5a8bf4718df2d42992a3 - + https://github.com/dotnet/arcade - 62a8aafffd4c68ef887680f6837abdff906a662c + 9fc83fbf76339c9dec4f5a8bf4718df2d42992a3 https://github.com/dotnet/arcade-services diff --git a/eng/Versions.props b/eng/Versions.props index d27c178a206..6c15afaab23 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -65,8 +65,8 @@ 2.4.1 2.0.3 2.4.1 - 6.0.0-beta.21379.2 - 6.0.0-beta.21379.2 + 6.0.0-beta.21403.5 + 6.0.0-beta.21403.5 1.22.0 1.1.2 2.0.0 @@ -77,7 +77,7 @@ 1.1.0-beta.20258.6 1.1.0-beta-21309-01 1.1.0-beta-21309-01 - 6.0.0-beta.21379.2 + 6.0.0-beta.21403.5 1.0.0-beta.21380.1 1.1.0-beta.21378.2 1.0.0-prerelease.21378.1 diff --git a/global.json b/global.json index 6ca652791b8..865a18a5ec1 100644 --- a/global.json +++ b/global.json @@ -3,7 +3,7 @@ "dotnet": "6.0.100-rc.1.21379.2" }, "msbuild-sdks": { - "Microsoft.DotNet.Arcade.Sdk": "6.0.0-beta.21379.2", - "Microsoft.DotNet.Helix.Sdk": "6.0.0-beta.21379.2" + "Microsoft.DotNet.Arcade.Sdk": "6.0.0-beta.21403.5", + "Microsoft.DotNet.Helix.Sdk": "6.0.0-beta.21403.5" } } From 0bb1ae8e4c33203b81c9ed24e418a2b70f3c17ab Mon Sep 17 00:00:00 2001 From: Viktor Hofer Date: Thu, 5 Aug 2021 16:06:25 +0200 Subject: [PATCH 272/699] Add null checks back in Verify* types (#7717) Regressed with https://github.com/dotnet/arcade/commit/a50c27610c6a060c677090b801636cd7149cd591 as the code paths don't protect anymore against null. --- src/Microsoft.DotNet.PackageTesting/VerifyClosure.cs | 8 +++++--- src/Microsoft.DotNet.PackageTesting/VerifyTypes.cs | 5 +++-- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/src/Microsoft.DotNet.PackageTesting/VerifyClosure.cs b/src/Microsoft.DotNet.PackageTesting/VerifyClosure.cs index 5b088259db1..f64f2bf9347 100644 --- a/src/Microsoft.DotNet.PackageTesting/VerifyClosure.cs +++ b/src/Microsoft.DotNet.PackageTesting/VerifyClosure.cs @@ -126,7 +126,9 @@ private void AddSourceFile(string file) private void LoadIgnoredReferences() { - foreach (var ignoredReference in IgnoredReferences.DefaultIfEmpty()) + if (IgnoredReferences == null || IgnoredReferences.Length == 0) return; + + foreach (var ignoredReference in IgnoredReferences) { var name = ignoredReference.ItemSpec; var versionString = ignoredReference.GetMetadata("Version"); @@ -174,9 +176,9 @@ void CheckDependencies(Stack depStack) AssemblyInfo assm = depStack.Peek(); // check module references - if (assm.State == CheckState.Unchecked && CheckModuleReferences) + if (assm.State == CheckState.Unchecked && CheckModuleReferences && assm.ModuleReferences != null) { - foreach(var moduleReference in assm.ModuleReferences.DefaultIfEmpty()) + foreach(var moduleReference in assm.ModuleReferences) { if (ShouldIgnore(moduleReference)) { diff --git a/src/Microsoft.DotNet.PackageTesting/VerifyTypes.cs b/src/Microsoft.DotNet.PackageTesting/VerifyTypes.cs index 7fd15a1815e..772a766b275 100644 --- a/src/Microsoft.DotNet.PackageTesting/VerifyTypes.cs +++ b/src/Microsoft.DotNet.PackageTesting/VerifyTypes.cs @@ -6,7 +6,6 @@ using System; using System.Collections.Generic; using System.IO; -using System.Linq; using System.Reflection; using System.Reflection.Metadata; using System.Reflection.PortableExecutable; @@ -125,7 +124,9 @@ private void AddSourceFile(string file) private void LoadIgnoredTypes() { - foreach(var ignoredType in IgnoredTypes.DefaultIfEmpty()) + if (IgnoredTypes == null || IgnoredTypes.Length == 0) return; + + foreach(var ignoredType in IgnoredTypes) { ignoredTypes.Add(ignoredType.ItemSpec); } From 7e675d42ae78b36a02fbb2b9ef8cdf6f3917391b Mon Sep 17 00:00:00 2001 From: Epsitha Ananth <47157394+epananth@users.noreply.github.com> Date: Thu, 5 Aug 2021 11:26:25 -0700 Subject: [PATCH 273/699] Should not publish the files in SymbolPublishingExclusionFile.txt (#7433) * feature to exclude some symbols from publishing to symbol server --- .../templates/job/publish-build-assets.yml | 26 ++++++++++++++++++- eng/publishing/v3/publish-assets.yml | 3 ++- .../src/PublishArtifactsInManifestBase.cs | 24 +++++++++++++++-- 3 files changed, 49 insertions(+), 4 deletions(-) diff --git a/eng/common/templates/job/publish-build-assets.yml b/eng/common/templates/job/publish-build-assets.yml index 3b9e2524ff3..fe9dfdf720c 100644 --- a/eng/common/templates/job/publish-build-assets.yml +++ b/eng/common/templates/job/publish-build-assets.yml @@ -94,7 +94,31 @@ jobs: PathtoPublish: '$(Build.StagingDirectory)/ReleaseConfigs.txt' PublishLocation: Container ArtifactName: ReleaseConfigs - + + - task: powershell@2 + displayName: Check if SymbolPublishingExclusionsFile.txt exists + inputs: + targetType: inline + script: | + $symbolExclusionfile = "$(Build.SourcesDirectory)/eng/SymbolPublishingExclusionsFile.txt" + if(Test-Path -Path $symbolExclusionfile) + { + Write-Host "SymbolExclusionFile exists" + Write-Host "##vso[task.setvariable variable=SymbolExclusionFile]true" + } + else{ + Write-Host "Symbols Exclusion file does not exists" + Write-Host "##vso[task.setvariable variable=SymbolExclusionFile]false" + } + + - task: PublishBuildArtifacts@1 + displayName: Publish SymbolPublishingExclusionsFile Artifact + condition: eq(variables['SymbolExclusionFile'], 'true') + inputs: + PathtoPublish: '$(Build.SourcesDirectory)/eng/SymbolPublishingExclusionsFile.txt' + PublishLocation: Container + ArtifactName: ReleaseConfigs + - ${{ if eq(parameters.enablePublishBuildArtifacts, 'true') }}: - template: /eng/common/templates/steps/publish-logs.yml parameters: diff --git a/eng/publishing/v3/publish-assets.yml b/eng/publishing/v3/publish-assets.yml index 33ef36c0979..60dca2adcde 100644 --- a/eng/publishing/v3/publish-assets.yml +++ b/eng/publishing/v3/publish-assets.yml @@ -43,6 +43,7 @@ jobs: AssetManifests/** BlobArtifacts/MergedManifest.xml PdbArtifacts/** + ReleaseConfigs/SymbolPublishingExclusionsFile.txt downloadPath: '$(Build.ArtifactStagingDirectory)' - task: NuGetToolInstaller@1 @@ -84,7 +85,7 @@ jobs: /p:AkaMSClientSecret=$(akams-client-secret) ${{ parameters.artifactsPublishingAdditionalParameters }} /p:PDBArtifactsBasePath='$(Build.ArtifactStagingDirectory)/PDBArtifacts/' - /p:SymbolPublishingExclusionsFile='$(Build.SourcesDirectory)/eng/SymbolPublishingExclusionsFile.txt' + /p:SymbolPublishingExclusionsFile='$(Build.ArtifactStagingDirectory)/ReleaseConfigs/SymbolPublishingExclusionsFile.txt' ${{ parameters.symbolPublishingAdditionalParameters}} /p:MsdlToken=$(microsoft-symbol-server-pat) /p:SymWebToken=$(symweb-symbol-server-pat) diff --git a/src/Microsoft.DotNet.Build.Tasks.Feed/src/PublishArtifactsInManifestBase.cs b/src/Microsoft.DotNet.Build.Tasks.Feed/src/PublishArtifactsInManifestBase.cs index 986f2668445..1d8614b0ec7 100644 --- a/src/Microsoft.DotNet.Build.Tasks.Feed/src/PublishArtifactsInManifestBase.cs +++ b/src/Microsoft.DotNet.Build.Tasks.Feed/src/PublishArtifactsInManifestBase.cs @@ -426,6 +426,26 @@ public async Task PublishSymbolsUsingStreamingAsync( HashSet feedConfigsForSymbols = FeedConfigs[symbolCategory]; Dictionary serversToPublish = GetTargetSymbolServers(feedConfigsForSymbols, msdlToken, symWebToken); + HashSet excludeFiles = new HashSet(); + + if(File.Exists(symbolPublishingExclusionsFile)) + { + Log.LogMessage(MessageImportance.Normal, $"SymbolPublishingExclusionFile exists"); + string[] files = File.ReadAllLines(symbolPublishingExclusionsFile); + + foreach(var file in files) + { + if(!string.IsNullOrEmpty(file)) + { + Log.LogMessage(MessageImportance.Normal, $"Exclude the file {file} from publishing to symbol server"); + excludeFiles.Add(file); + } + } + } + else + { + Log.LogMessage(MessageImportance.Normal, $"SymbolPublishingExclusionFile was not found at ${symbolPublishingExclusionsFile} "); + } if (symbolsToPublish != null && symbolsToPublish.Any()) { @@ -471,7 +491,7 @@ await PublishSymbolsHelper.PublishAsync( token, symbolFiles, null, - null, + excludeFiles, ExpirationInDays, false, publishSpecialClrFiles, @@ -537,7 +557,7 @@ await PublishSymbolsHelper.PublishAsync( token, null, filesToSymbolServer, - null, + excludeFiles, ExpirationInDays, false, publishSpecialClrFiles, From 2c21e7669df9964af9db0e5f6e6d91babe06fd03 Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Thu, 5 Aug 2021 21:56:06 +0000 Subject: [PATCH 274/699] Update dependencies from https://github.com/mono/linker build 20210804.1 (#7718) [main] Update dependencies from mono/linker --- eng/Version.Details.xml | 4 ++-- eng/Versions.props | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index eb75a29ba54..1c6a342d7f1 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -47,9 +47,9 @@ https://github.com/dotnet/roslyn 246ce641f04b67ef017655275d850bf902a8e40f - + https://github.com/mono/linker - 7cb5aafb7314384229bd05b2aeb9e21805f463f9 + d53322c1a4dd561414ae98f9aa1de9b186bcbd25 https://github.com/dotnet/sourcelink diff --git a/eng/Versions.props b/eng/Versions.props index 6c15afaab23..509df4854c7 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -35,7 +35,7 @@ 2.1.1 2.1.0 3.10.0-4.21329.37 - 6.0.100-preview.6.21403.3 + 6.0.100-preview.6.21404.1 16.7.1 4.8.3 5.3.0.1 From a14c2396d9b374ac34825b09820dd96e3bb495f2 Mon Sep 17 00:00:00 2001 From: Matt Mitchell Date: Thu, 5 Aug 2021 15:57:54 -0700 Subject: [PATCH 275/699] Fixup internal runtime support for source build (#7711) * Fixup internal runtime support for source build - Add internal runtime download arguments as msbuild parameters, replacing the script parameters - Add internal nuget feed support - Modify the source build command to save the WIP changes in the test repo, which will cover changes to the NuGet.config file - Set up the user name and email if not set to support WIP changes. * Re-add internal runtime script args This is necessary for aspnetcore to succeed (due to the way it does its initial tasks build) --- eng/common/templates/steps/source-build.yml | 35 ++++++++++++++++++--- 1 file changed, 30 insertions(+), 5 deletions(-) diff --git a/eng/common/templates/steps/source-build.yml b/eng/common/templates/steps/source-build.yml index 705b7a1c847..ba40dc82f14 100644 --- a/eng/common/templates/steps/source-build.yml +++ b/eng/common/templates/steps/source-build.yml @@ -18,6 +18,35 @@ steps: set -x df -h + # If building on the internal project, the artifact feeds variable may be available (usually only if needed) + # In that case, call the feed setup script to add internal feeds corresponding to public ones. + # In addition, add an msbuild argument to copy the WIP from the repo to the target build location. + # This is because SetupNuGetSources.sh will alter the current NuGet.config file, and we need to preserve those + # changes. + $internalRestoreArgs= + if [ '$(dn-bot-dnceng-artifact-feeds-rw)' != '$''(dn-bot-dnceng-artifact-feeds-rw)' ]; then + # Temporarily work around https://github.com/dotnet/arcade/issues/7709 + chmod +x $(Build.SourcesDirectory)/eng/common/SetupNugetSources.sh + $(Build.SourcesDirectory)/eng/common/SetupNugetSources.sh $(Build.SourcesDirectory)/NuGet.config $(dn-bot-dnceng-artifact-feeds-rw) + internalRestoreArgs='/p:CopyWipIntoInnerSourceBuildRepo=true' + + # The 'Copy WIP' feature of source build uses git stash to apply changes from the original repo. + # This only works if there is a username/email configured, which won't be the case in most CI runs. + git config --get user.email + if [ $? -ne 0 ]; then + git config user.email dn-bot@microsoft.com + git config user.name dn-bot + fi + fi + + # If building on the internal project, the internal storage variable may be available (usually only if needed) + # In that case, add variables to allow the download of internal runtimes if the specified versions are not found + # in the default public locations. + internalRuntimeDownloadArgs= + if [ '$(dotnetclimsrc-read-sas-token-base64)' != '$''(dotnetclimsrc-read-sas-token-base64)' ]; then + internalRuntimeDownloadArgs='/p:DotNetRuntimeSourceFeed=https://dotnetclimsrc.blob.core.windows.net/dotnet /p:DotNetRuntimeSourceFeedKey=$(dotnetclimsrc-read-sas-token-base64) --runtimesourcefeed https://dotnetclimsrc.blob.core.windows.net/dotnet --runtimesourcefeedkey $(dotnetclimsrc-read-sas-token-base64)' + fi + buildConfig=Release # Check if AzDO substitutes in a build config from a variable, and use it if so. if [ '$(_BuildConfig)' != '$''(_BuildConfig)' ]; then @@ -29,11 +58,6 @@ steps: officialBuildArgs='/p:DotNetPublishUsingPipelines=true /p:OfficialBuildId=$(BUILD.BUILDNUMBER)' fi - internalRuntimeDownloadArgs= - if [ '$(dotnetclimsrc-read-sas-token-base64)' != '$''(dotnetclimsrc-read-sas-token-base64)' ]; then - internalRuntimeDownloadArgs='--runtimesourcefeed https://dotnetclimsrc.blob.core.windows.net/dotnet --runtimesourcefeedkey $(dotnetclimsrc-read-sas-token-base64)' - fi - targetRidArgs= if [ '${{ parameters.platform.targetRID }}' != '' ]; then targetRidArgs='/p:TargetRid=${{ parameters.platform.targetRID }}' @@ -49,6 +73,7 @@ steps: --restore --build --pack $publishArgs -bl \ $officialBuildArgs \ $internalRuntimeDownloadArgs \ + $internalRestoreArgs \ $targetRidArgs \ /p:SourceBuildNonPortable=${{ parameters.platform.nonPortable }} \ /p:ArcadeBuildFromSource=true From 68277100891db502c5493ea1d335e74059d196aa Mon Sep 17 00:00:00 2001 From: Alitzel Mendez <6895254+AlitzelMendez@users.noreply.github.com> Date: Thu, 5 Aug 2021 16:49:50 -0700 Subject: [PATCH 276/699] Increase the timeout in the Azure libraries (#7719) * increase timeout to 300seconds * white spaces change * feedback * rename --- .../src/common/AzureStorageUtils.cs | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/Microsoft.DotNet.Build.Tasks.Feed/src/common/AzureStorageUtils.cs b/src/Microsoft.DotNet.Build.Tasks.Feed/src/common/AzureStorageUtils.cs index 40f5b28cc45..9a4c4033291 100644 --- a/src/Microsoft.DotNet.Build.Tasks.Feed/src/common/AzureStorageUtils.cs +++ b/src/Microsoft.DotNet.Build.Tasks.Feed/src/common/AzureStorageUtils.cs @@ -14,6 +14,8 @@ using System.Linq; using System.Security.Cryptography; using System.Threading.Tasks; +using Azure.Core.Pipeline; +using System.Net.Http; namespace Microsoft.DotNet.Build.CloudTestTasks { @@ -35,11 +37,17 @@ public class AzureStorageUtils public BlobContainerClient Container { get; set; } + private static readonly HttpClient s_httpClient = new HttpClient { Timeout = TimeSpan.FromSeconds(300) }; + private static readonly BlobClientOptions s_clientOptions = new BlobClientOptions() + { + Transport = new HttpClientTransport(s_httpClient) + }; + public AzureStorageUtils(string AccountName, string AccountKey, string ContainerName) { _credential = new StorageSharedKeyCredential(AccountName, AccountKey); Uri endpoint = new Uri($"https://{AccountName}.blob.core.windows.net"); - BlobServiceClient service = new BlobServiceClient(endpoint, _credential); + BlobServiceClient service = new BlobServiceClient(endpoint, _credential, s_clientOptions); Container = service.GetBlobContainerClient(ContainerName); } From 45be86f9967fa59c901e8d30969ededdceedbd46 Mon Sep 17 00:00:00 2001 From: Adeel Mujahid <3840695+am11@users.noreply.github.com> Date: Fri, 6 Aug 2021 14:26:41 +0300 Subject: [PATCH 277/699] Delete Ubuntu 14.04 (trusty) related code (#7694) --- eng/common/cross/arm/sources.list.trusty | 11 --- eng/common/cross/arm/trusty-lttng-2.4.patch | 71 -------------- eng/common/cross/arm/trusty.patch | 97 ------------------- eng/common/cross/arm64/sources.list.trusty | 11 --- eng/common/cross/build-rootfs.sh | 16 +-- eng/common/cross/x86/sources.list.trusty | 11 --- .../deb-package-tool/setup/build_setup.sh | 20 ---- .../deb-package-tool/setup/test_setup.sh | 27 ------ 8 files changed, 2 insertions(+), 262 deletions(-) delete mode 100644 eng/common/cross/arm/sources.list.trusty delete mode 100644 eng/common/cross/arm/trusty-lttng-2.4.patch delete mode 100644 eng/common/cross/arm/trusty.patch delete mode 100644 eng/common/cross/arm64/sources.list.trusty delete mode 100644 eng/common/cross/x86/sources.list.trusty delete mode 100644 src/Microsoft.DotNet.Build.Tasks.Installers/build/deb-package-tool/setup/build_setup.sh delete mode 100644 src/Microsoft.DotNet.Build.Tasks.Installers/build/deb-package-tool/setup/test_setup.sh diff --git a/eng/common/cross/arm/sources.list.trusty b/eng/common/cross/arm/sources.list.trusty deleted file mode 100644 index 07d8f88d82e..00000000000 --- a/eng/common/cross/arm/sources.list.trusty +++ /dev/null @@ -1,11 +0,0 @@ -deb http://ports.ubuntu.com/ubuntu-ports/ trusty main restricted universe -deb-src http://ports.ubuntu.com/ubuntu-ports/ trusty main restricted universe - -deb http://ports.ubuntu.com/ubuntu-ports/ trusty-updates main restricted universe -deb-src http://ports.ubuntu.com/ubuntu-ports/ trusty-updates main restricted universe - -deb http://ports.ubuntu.com/ubuntu-ports/ trusty-backports main restricted -deb-src http://ports.ubuntu.com/ubuntu-ports/ trusty-backports main restricted - -deb http://ports.ubuntu.com/ubuntu-ports/ trusty-security main restricted universe multiverse -deb-src http://ports.ubuntu.com/ubuntu-ports/ trusty-security main restricted universe multiverse \ No newline at end of file diff --git a/eng/common/cross/arm/trusty-lttng-2.4.patch b/eng/common/cross/arm/trusty-lttng-2.4.patch deleted file mode 100644 index 8e4dd7ae719..00000000000 --- a/eng/common/cross/arm/trusty-lttng-2.4.patch +++ /dev/null @@ -1,71 +0,0 @@ -From e72c9d7ead60e3317bd6d1fade995c07021c947b Mon Sep 17 00:00:00 2001 -From: Mathieu Desnoyers -Date: Thu, 7 May 2015 13:25:04 -0400 -Subject: [PATCH] Fix: building probe providers with C++ compiler - -Robert Daniels wrote: -> > I'm attempting to use lttng userspace tracing with a C++ application -> > on an ARM platform. I'm using GCC 4.8.4 on Linux 3.14 with the 2.6 -> > release of lttng. I've compiled lttng-modules, lttng-ust, and -> > lttng-tools and have been able to get a simple test working with C -> > code. When I attempt to run the hello.cxx test on my target it will -> > segfault. -> -> -> I spent a little time digging into this issue and finally discovered the -> cause of my segfault with ARM C++ tracepoints. -> -> There is a struct called 'lttng_event' in ust-events.h which contains an -> empty union 'u'. This was the cause of my issue. Under C, this empty union -> compiles to a zero byte member while under C++ it compiles to a one byte -> member, and in my case was four-byte aligned which caused my C++ code to -> have the 'cds_list_head node' offset incorrectly by four bytes. This lead -> to an incorrect linked list structure which caused my issue. -> -> Since this union is empty, I simply removed it from the struct and everything -> worked correctly. -> -> I don't know the history or purpose behind this empty union so I'd like to -> know if this is a safe fix. If it is I can submit a patch with the union -> removed. - -That's a very nice catch! - -We do not support building tracepoint probe provider with -g++ yet, as stated in lttng-ust(3): - -"- Note for C++ support: although an application instrumented with - tracepoints can be compiled with g++, tracepoint probes should be - compiled with gcc (only tested with gcc so far)." - -However, if it works fine with this fix, then I'm tempted to take it, -especially because removing the empty union does not appear to affect -the layout of struct lttng_event as seen from liblttng-ust, which must -be compiled with a C compiler, and from probe providers compiled with -a C compiler. So all we are changing is the layout of a probe provider -compiled with a C++ compiler, which is anyway buggy at the moment, -because it is not compatible with the layout expected by liblttng-ust -compiled with a C compiler. - -Reported-by: Robert Daniels -Signed-off-by: Mathieu Desnoyers ---- - include/lttng/ust-events.h | 2 -- - 1 file changed, 2 deletions(-) - -diff --git a/usr/include/lttng/ust-events.h b/usr/include/lttng/ust-events.h -index 328a875..3d7a274 100644 ---- a/usr/include/lttng/ust-events.h -+++ b/usr/include/lttng/ust-events.h -@@ -407,8 +407,6 @@ struct lttng_event { - void *_deprecated1; - struct lttng_ctx *ctx; - enum lttng_ust_instrumentation instrumentation; -- union { -- } u; - struct cds_list_head node; /* Event list in session */ - struct cds_list_head _deprecated2; - void *_deprecated3; --- -2.7.4 - diff --git a/eng/common/cross/arm/trusty.patch b/eng/common/cross/arm/trusty.patch deleted file mode 100644 index 2f2972f8eb5..00000000000 --- a/eng/common/cross/arm/trusty.patch +++ /dev/null @@ -1,97 +0,0 @@ -diff -u -r a/usr/include/urcu/uatomic/generic.h b/usr/include/urcu/uatomic/generic.h ---- a/usr/include/urcu/uatomic/generic.h 2014-03-28 06:04:42.000000000 +0900 -+++ b/usr/include/urcu/uatomic/generic.h 2017-02-13 10:35:21.189927116 +0900 -@@ -65,17 +65,17 @@ - switch (len) { - #ifdef UATOMIC_HAS_ATOMIC_BYTE - case 1: -- return __sync_val_compare_and_swap_1(addr, old, _new); -+ return __sync_val_compare_and_swap_1((uint8_t *) addr, old, _new); - #endif - #ifdef UATOMIC_HAS_ATOMIC_SHORT - case 2: -- return __sync_val_compare_and_swap_2(addr, old, _new); -+ return __sync_val_compare_and_swap_2((uint16_t *) addr, old, _new); - #endif - case 4: -- return __sync_val_compare_and_swap_4(addr, old, _new); -+ return __sync_val_compare_and_swap_4((uint32_t *) addr, old, _new); - #if (CAA_BITS_PER_LONG == 64) - case 8: -- return __sync_val_compare_and_swap_8(addr, old, _new); -+ return __sync_val_compare_and_swap_8((uint64_t *) addr, old, _new); - #endif - } - _uatomic_link_error(); -@@ -100,20 +100,20 @@ - switch (len) { - #ifdef UATOMIC_HAS_ATOMIC_BYTE - case 1: -- __sync_and_and_fetch_1(addr, val); -+ __sync_and_and_fetch_1((uint8_t *) addr, val); - return; - #endif - #ifdef UATOMIC_HAS_ATOMIC_SHORT - case 2: -- __sync_and_and_fetch_2(addr, val); -+ __sync_and_and_fetch_2((uint16_t *) addr, val); - return; - #endif - case 4: -- __sync_and_and_fetch_4(addr, val); -+ __sync_and_and_fetch_4((uint32_t *) addr, val); - return; - #if (CAA_BITS_PER_LONG == 64) - case 8: -- __sync_and_and_fetch_8(addr, val); -+ __sync_and_and_fetch_8((uint64_t *) addr, val); - return; - #endif - } -@@ -139,20 +139,20 @@ - switch (len) { - #ifdef UATOMIC_HAS_ATOMIC_BYTE - case 1: -- __sync_or_and_fetch_1(addr, val); -+ __sync_or_and_fetch_1((uint8_t *) addr, val); - return; - #endif - #ifdef UATOMIC_HAS_ATOMIC_SHORT - case 2: -- __sync_or_and_fetch_2(addr, val); -+ __sync_or_and_fetch_2((uint16_t *) addr, val); - return; - #endif - case 4: -- __sync_or_and_fetch_4(addr, val); -+ __sync_or_and_fetch_4((uint32_t *) addr, val); - return; - #if (CAA_BITS_PER_LONG == 64) - case 8: -- __sync_or_and_fetch_8(addr, val); -+ __sync_or_and_fetch_8((uint64_t *) addr, val); - return; - #endif - } -@@ -180,17 +180,17 @@ - switch (len) { - #ifdef UATOMIC_HAS_ATOMIC_BYTE - case 1: -- return __sync_add_and_fetch_1(addr, val); -+ return __sync_add_and_fetch_1((uint8_t *) addr, val); - #endif - #ifdef UATOMIC_HAS_ATOMIC_SHORT - case 2: -- return __sync_add_and_fetch_2(addr, val); -+ return __sync_add_and_fetch_2((uint16_t *) addr, val); - #endif - case 4: -- return __sync_add_and_fetch_4(addr, val); -+ return __sync_add_and_fetch_4((uint32_t *) addr, val); - #if (CAA_BITS_PER_LONG == 64) - case 8: -- return __sync_add_and_fetch_8(addr, val); -+ return __sync_add_and_fetch_8((uint64_t *) addr, val); - #endif - } - _uatomic_link_error(); diff --git a/eng/common/cross/arm64/sources.list.trusty b/eng/common/cross/arm64/sources.list.trusty deleted file mode 100644 index 07d8f88d82e..00000000000 --- a/eng/common/cross/arm64/sources.list.trusty +++ /dev/null @@ -1,11 +0,0 @@ -deb http://ports.ubuntu.com/ubuntu-ports/ trusty main restricted universe -deb-src http://ports.ubuntu.com/ubuntu-ports/ trusty main restricted universe - -deb http://ports.ubuntu.com/ubuntu-ports/ trusty-updates main restricted universe -deb-src http://ports.ubuntu.com/ubuntu-ports/ trusty-updates main restricted universe - -deb http://ports.ubuntu.com/ubuntu-ports/ trusty-backports main restricted -deb-src http://ports.ubuntu.com/ubuntu-ports/ trusty-backports main restricted - -deb http://ports.ubuntu.com/ubuntu-ports/ trusty-security main restricted universe multiverse -deb-src http://ports.ubuntu.com/ubuntu-ports/ trusty-security main restricted universe multiverse \ No newline at end of file diff --git a/eng/common/cross/build-rootfs.sh b/eng/common/cross/build-rootfs.sh index 59714ff5c34..5c05b39f101 100755 --- a/eng/common/cross/build-rootfs.sh +++ b/eng/common/cross/build-rootfs.sh @@ -6,7 +6,7 @@ usage() { echo "Usage: $0 [BuildArch] [CodeName] [lldbx.y] [--skipunmount] --rootfsdir ]" echo "BuildArch can be: arm(default), armel, arm64, x86" - echo "CodeName - optional, Code name for Linux, can be: trusty, xenial(default), zesty, bionic, alpine, alpine3.9 or alpine3.13. If BuildArch is armel, LinuxCodeName is jessie(default) or tizen." + echo "CodeName - optional, Code name for Linux, can be: xenial(default), zesty, bionic, alpine, alpine3.9 or alpine3.13. If BuildArch is armel, LinuxCodeName is jessie(default) or tizen." echo " for FreeBSD can be: freebsd11, freebsd12, freebsd13" echo " for illumos can be: illumos." echo "lldbx.y - optional, LLDB version, can be: lldb3.9(default), lldb4.0, lldb5.0, lldb6.0 no-lldb. Ignored for alpine and FreeBSD" @@ -146,11 +146,6 @@ while :; do no-lldb) unset __LLDB_Package ;; - trusty) # Ubuntu 14.04 - if [ "$__CodeName" != "jessie" ]; then - __CodeName=trusty - fi - ;; xenial) # Ubuntu 16.04 if [ "$__CodeName" != "jessie" ]; then __CodeName=xenial @@ -223,7 +218,7 @@ while :; do __FreeBSDABI="13" __BuildArch=x64 __SkipUnmount=1 - ;; + ;; illumos) __CodeName=illumos __BuildArch=x64 @@ -374,13 +369,6 @@ elif [[ -n $__CodeName ]]; then umount $__RootfsDir/* || true fi - if [[ "$__BuildArch" == "arm" && "$__CodeName" == "trusty" ]]; then - pushd $__RootfsDir - patch -p1 < $__CrossDir/$__BuildArch/trusty.patch - patch -p1 < $__CrossDir/$__BuildArch/trusty-lttng-2.4.patch - popd - fi - if [[ "$__BuildArch" == "armel" && "$__CodeName" == "jessie" ]]; then pushd $__RootfsDir patch -p1 < $__CrossDir/$__BuildArch/armel.jessie.patch diff --git a/eng/common/cross/x86/sources.list.trusty b/eng/common/cross/x86/sources.list.trusty deleted file mode 100644 index 9b3085436e9..00000000000 --- a/eng/common/cross/x86/sources.list.trusty +++ /dev/null @@ -1,11 +0,0 @@ -deb http://archive.ubuntu.com/ubuntu/ trusty main restricted universe -deb-src http://archive.ubuntu.com/ubuntu/ trusty main restricted universe - -deb http://archive.ubuntu.com/ubuntu/ trusty-updates main restricted universe -deb-src http://archive.ubuntu.com/ubuntu/ trusty-updates main restricted universe - -deb http://archive.ubuntu.com/ubuntu/ trusty-backports main restricted -deb-src http://archive.ubuntu.com/ubuntu/ trusty-backports main restricted - -deb http://archive.ubuntu.com/ubuntu/ trusty-security main restricted universe multiverse -deb-src http://archive.ubuntu.com/ubuntu/ trusty-security main restricted universe multiverse diff --git a/src/Microsoft.DotNet.Build.Tasks.Installers/build/deb-package-tool/setup/build_setup.sh b/src/Microsoft.DotNet.Build.Tasks.Installers/build/deb-package-tool/setup/build_setup.sh deleted file mode 100644 index a77cc192ecd..00000000000 --- a/src/Microsoft.DotNet.Build.Tasks.Installers/build/deb-package-tool/setup/build_setup.sh +++ /dev/null @@ -1,20 +0,0 @@ -# -# Licensed to the .NET Foundation under one or more agreements. -# The .NET Foundation licenses this file to you under the MIT license. -# - -install_dependencies(){ - # Add LLdb 3.6 package source - echo "deb http://llvm.org/apt/trusty/ llvm-toolchain-trusty-3.6 main" | tee /etc/apt/sources.list.d/llvm.list - wget -O - http://llvm.org/apt/llvm-snapshot.gpg.key | apt-key add - - - #Install Deps - apt-get update - apt-get install -y debhelper build-essential devscripts git liblttng-ust-dev lldb-3.6-dev -} - -setup(){ - install_dependencies -} - -setup diff --git a/src/Microsoft.DotNet.Build.Tasks.Installers/build/deb-package-tool/setup/test_setup.sh b/src/Microsoft.DotNet.Build.Tasks.Installers/build/deb-package-tool/setup/test_setup.sh deleted file mode 100644 index 287db6c51ea..00000000000 --- a/src/Microsoft.DotNet.Build.Tasks.Installers/build/deb-package-tool/setup/test_setup.sh +++ /dev/null @@ -1,27 +0,0 @@ -# -# Licensed to the .NET Foundation under one or more agreements. -# The .NET Foundation licenses this file to you under the MIT license. -# - -install_dependencies(){ - # Add LLdb 3.6 package source - echo "deb http://llvm.org/apt/trusty/ llvm-toolchain-trusty-3.6 main" | tee /etc/apt/sources.list.d/llvm.list - wget -O - http://llvm.org/apt/llvm-snapshot.gpg.key | apt-key add - - - #Install Deps - apt-get update - apt-get install -y debhelper build-essential devscripts git liblttng-ust-dev lldb-3.6-dev -} - -install_bats(){ - git clone https://github.com/sstephenson/bats.git - cd bats - ./install.sh /usr/local -} - -setup(){ - install_dependencies - install_bats -} - -setup From dc542a61f787a3cd62aa951931075eac72fa7506 Mon Sep 17 00:00:00 2001 From: Santiago Fernandez Madero Date: Fri, 6 Aug 2021 06:10:25 -0700 Subject: [PATCH 278/699] Hardcode retry iteration 1 to DownloadFromResultsContainer (#7723) --- .../Sdk/DownloadFromResultsContainer.cs | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/Microsoft.DotNet.Helix/Sdk/DownloadFromResultsContainer.cs b/src/Microsoft.DotNet.Helix/Sdk/DownloadFromResultsContainer.cs index d36ab9f4fe1..9130f079b8e 100644 --- a/src/Microsoft.DotNet.Helix/Sdk/DownloadFromResultsContainer.cs +++ b/src/Microsoft.DotNet.Helix/Sdk/DownloadFromResultsContainer.cs @@ -95,13 +95,17 @@ private async Task DownloadFilesForWorkItem(ITaskItem workItem, string directory string destinationFile = Path.Combine(destinationDir.FullName, file); Log.LogMessage(MessageImportance.Normal, $"Downloading {file} => {destinationFile}..."); - var uri = new Uri($"{ResultsContainer}{workItemName}/{file}"); + // Currently the blob storage includes the retry iteration, however there is no good way + // to get the "best" iteration number to download the files from. For now, use always iteration + // 1 until helix provides an API to get result files from the "good" iteration run. + // https://github.com/dotnet/core-eng/issues/13983 + var uri = new Uri($"{ResultsContainer}{workItemName}/1/{file}"); CloudBlob blob = string.IsNullOrEmpty(ResultsContainerReadSAS) ? new CloudBlob(uri) : new CloudBlob(uri, new StorageCredentials(ResultsContainerReadSAS)); await blob.DownloadToFileAsync(destinationFile, FileMode.Create); } catch (StorageException e) { - Log.LogWarning($"Failed to download {workItemName}/{file} blob from results container: {e.Message}"); + Log.LogWarning($"Failed to download {workItemName}/1/{file} blob from results container: {e.Message}"); } } }; From 2c76d9e1e564a711115979ca9987e528e712ebd9 Mon Sep 17 00:00:00 2001 From: Matt Mitchell Date: Fri, 6 Aug 2021 09:43:23 -0700 Subject: [PATCH 279/699] Fix Msi version string generation (#7725) Based on operator precedence, `0x3FFF << 4` was happening first, ensuring that we always cut off the lower 4 bits of the build number when generating an Msi version. The good news appears to be that the Major and Minor stay the same or go up, though the patch value will go down. Before: A build number major value of 30327 or 30328 and build number value of 9 would generate `48.0.30329` After: `48.3.26489` and `48.3.26505`, respectively. --- .../src/GenerateMsiVersion.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Microsoft.DotNet.Build.Tasks.Installers/src/GenerateMsiVersion.cs b/src/Microsoft.DotNet.Build.Tasks.Installers/src/GenerateMsiVersion.cs index 95ba0420bff..f0603ca7ad5 100644 --- a/src/Microsoft.DotNet.Build.Tasks.Installers/src/GenerateMsiVersion.cs +++ b/src/Microsoft.DotNet.Build.Tasks.Installers/src/GenerateMsiVersion.cs @@ -85,7 +85,7 @@ private void ParseBuildNumberMajorMinor() var minor = int.Parse(Minor) << 22; var patch = int.Parse(Patch) << 18; - var buildNumberMajor = int.Parse(BuildNumberMajor) & 0x3FFF << 4; + var buildNumberMajor = (int.Parse(BuildNumberMajor) & 0x3FFF) << 4; var buildNumberMinor = int.Parse(BuildNumberMinor) & 0xF; var msiVersionNumber = major | minor | patch | buildNumberMajor | buildNumberMinor; From 742bf02fb4649029565e9501cccf2884061dd3ee Mon Sep 17 00:00:00 2001 From: Jacques Eloff Date: Fri, 6 Aug 2021 10:34:08 -0700 Subject: [PATCH 280/699] Workloads: Additional Checks (#7679) - Enable shortname replacement for manifests - Fix provider keys for manifest installers - Remove invalid pack dependencies - Check for long path failures, similar to what VS manifest validation checks performs --- .../GenerateManifestMsiTests.cs | 22 ++ .../GenerateVisualStudioWorkloadTests.cs | 40 ++- .../TestHelper.cs | 19 ++ .../AbstractWorkloadsNonWindowsPacks.json | 262 ++++++++++++++++++ .../src/GenerateManifestMsi.cs | 27 +- .../src/GenerateTaskBase.cs | 11 + .../GenerateVisualStudioMsiPackageProject.cs | 4 + .../src/GenerateVisualStudioWorkload.cs | 3 + ...rosoft.DotNet.Build.Tasks.Workloads.csproj | 4 +- .../src/VisualStudioComponent.cs | 32 ++- 10 files changed, 404 insertions(+), 20 deletions(-) create mode 100644 src/Microsoft.DotNet.Build.Tasks.Workloads.Tests/GenerateManifestMsiTests.cs create mode 100644 src/Microsoft.DotNet.Build.Tasks.Workloads.Tests/TestHelper.cs create mode 100644 src/Microsoft.DotNet.Build.Tasks.Workloads.Tests/testassets/AbstractWorkloadsNonWindowsPacks.json diff --git a/src/Microsoft.DotNet.Build.Tasks.Workloads.Tests/GenerateManifestMsiTests.cs b/src/Microsoft.DotNet.Build.Tasks.Workloads.Tests/GenerateManifestMsiTests.cs new file mode 100644 index 00000000000..778467bfd73 --- /dev/null +++ b/src/Microsoft.DotNet.Build.Tasks.Workloads.Tests/GenerateManifestMsiTests.cs @@ -0,0 +1,22 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +using System; +using Xunit; + +namespace Microsoft.DotNet.Build.Tasks.Workloads.Tests +{ + public class GenerateManifestMsiTests + { + [WindowsOnlyFact] + public void ItThrowsIfPayloadRelativePathIsTooLong() + { + var task = new GenerateManifestMsi(); + task.MsiVersion = "1.2.3.11111"; + + Exception e = Assert.Throws(() => task.GenerateSwixPackageAuthoring(@"C:\Foo\Microsoft.NET.Workload.Mono.ToolChain.Manifest-6.0.100.6.0.0-preview.7.21377.12-x64.msi", + "Microsoft.NET.Workload.Mono.ToolChain.Manifest-6.0.100", "x64")); + Assert.Equal(@"Payload relative path exceeds max length (182): Microsoft.NET.Workload.Mono.ToolChain.Manifest-6.0.100,version=1.2.3,chip=x64,productarch=neutral\Microsoft.NET.Workload.Mono.ToolChain.Manifest-6.0.100.6.0.0-preview.7.21377.12-x64.msi", e.Message); + } + } +} diff --git a/src/Microsoft.DotNet.Build.Tasks.Workloads.Tests/GenerateVisualStudioWorkloadTests.cs b/src/Microsoft.DotNet.Build.Tasks.Workloads.Tests/GenerateVisualStudioWorkloadTests.cs index da88129a328..c298b028d1c 100644 --- a/src/Microsoft.DotNet.Build.Tasks.Workloads.Tests/GenerateVisualStudioWorkloadTests.cs +++ b/src/Microsoft.DotNet.Build.Tasks.Workloads.Tests/GenerateVisualStudioWorkloadTests.cs @@ -3,11 +3,11 @@ using System; using System.Collections.Generic; -using System.Linq; using System.IO; +using System.Linq; using Microsoft.Arcade.Test.Common; -using Microsoft.Build.Utilities; using Microsoft.Build.Framework; +using Microsoft.Build.Utilities; using Xunit; namespace Microsoft.DotNet.Build.Tasks.Workloads.Tests @@ -20,6 +20,42 @@ public class GenerateVisualStudioWorkloadTests public string TestIntermediateBaseOutputPath => Path.Combine(IntermediateBaseOutputPath, Path.GetFileNameWithoutExtension(Path.GetTempFileName())); + [Fact] + public void ItIgnoresNotApplicableAliasedPacks() + { + string workloadManifest = Path.Combine(AppContext.BaseDirectory, "testassets", "AbstractWorkloadsNonWindowsPacks.json"); + + var buildTask = new GenerateVisualStudioWorkload() + { + WorkloadManifests = new TaskItem[] + { + new TaskItem(workloadManifest) + }, + ComponentVersions = new TaskItem[] + { + new TaskItem("microsoft-net-runtime-ios", new Dictionary { { "Version", "6.5.38766" } }), + new TaskItem("runtimes-ios", new Dictionary { { "Version", "6.5.38766" } }), + new TaskItem("microsoft-net-runtime-mono-tooling", new Dictionary { { "Version", "6.5.38766" } }), + }, + GenerateMsis = false, + IntermediateBaseOutputPath = TestIntermediateBaseOutputPath, + WixToolsetPath = "", + BuildEngine = new MockBuildEngine() + }; + + Assert.True(buildTask.Execute()); + string outputPath = Path.GetDirectoryName(buildTask.SwixProjects[0].GetMetadata("FullPath")); + string componentSwr = File.ReadAllText(Path.Combine(outputPath, "component.swr")); + + Assert.Contains(@"package name=microsoft.net.runtime.ios", componentSwr); + Assert.DoesNotContain(@"vs.dependency id=Microsoft.NETCore.App.Runtime.AOT.Cross.ios-arm", componentSwr); + Assert.DoesNotContain(@"vs dependency id=Microsoft.NETCore.App.Runtime.AOT.Cross.ios-arm64", componentSwr); + Assert.DoesNotContain(@"vs dependency id=Microsoft.NETCore.App.Runtime.AOT.Cross.iossimulator-arm64", componentSwr); + Assert.DoesNotContain(@"vs dependency id=Microsoft.NETCore.App.Runtime.AOT.Cross.iossimulator-x64", componentSwr); + Assert.DoesNotContain(@"vs dependency id=Microsoft.NETCore.App.Runtime.AOT.Cross.iossimulator-x86", componentSwr); + Assert.Contains(@"vs.dependency id=runtimes.ios", componentSwr); + } + [Fact] public void ItGeneratesASwixProjectFromAWorkloadManifest() { diff --git a/src/Microsoft.DotNet.Build.Tasks.Workloads.Tests/TestHelper.cs b/src/Microsoft.DotNet.Build.Tasks.Workloads.Tests/TestHelper.cs new file mode 100644 index 00000000000..278b859b41a --- /dev/null +++ b/src/Microsoft.DotNet.Build.Tasks.Workloads.Tests/TestHelper.cs @@ -0,0 +1,19 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +using System; +using Xunit; + +namespace Microsoft.DotNet.Build.Tasks.Workloads.Tests +{ + public class WindowsOnlyFactAttribute : FactAttribute + { + public WindowsOnlyFactAttribute() + { + if (Environment.OSVersion.Platform != PlatformID.Win32NT) + { + Skip = "Not running on Windows"; + } + } + } +} diff --git a/src/Microsoft.DotNet.Build.Tasks.Workloads.Tests/testassets/AbstractWorkloadsNonWindowsPacks.json b/src/Microsoft.DotNet.Build.Tasks.Workloads.Tests/testassets/AbstractWorkloadsNonWindowsPacks.json new file mode 100644 index 00000000000..0494cc63651 --- /dev/null +++ b/src/Microsoft.DotNet.Build.Tasks.Workloads.Tests/testassets/AbstractWorkloadsNonWindowsPacks.json @@ -0,0 +1,262 @@ +{ + "version": "6.0.0-preview.7.21358.4", + "depends-on": { + "Microsoft.NET.Workload.Emscripten": "6.0.0-preview.7.21330.1" + }, + "workloads": { + "microsoft-net-runtime-ios": { + "abstract": true, + "description": "iOS Mono Runtime and AOT Workload", + "packs": [ + "Microsoft.NETCore.App.Runtime.AOT.Cross.ios-arm", + "Microsoft.NETCore.App.Runtime.AOT.Cross.ios-arm64", + "Microsoft.NETCore.App.Runtime.AOT.Cross.iossimulator-arm64", + "Microsoft.NETCore.App.Runtime.AOT.Cross.iossimulator-x64", + "Microsoft.NETCore.App.Runtime.AOT.Cross.iossimulator-x86" + ], + "extends": [ "runtimes-ios" ], + "platforms": [ "win-x64", "osx-arm64", "osx-x64" ] + }, + "runtimes-ios": { + "abstract": true, + "description": "iOS Mono Runtime Packs", + "packs": [ + "Microsoft.NETCore.App.Runtime.Mono.ios-arm", + "Microsoft.NETCore.App.Runtime.Mono.ios-arm64", + "Microsoft.NETCore.App.Runtime.Mono.iossimulator-arm64", + "Microsoft.NETCore.App.Runtime.Mono.iossimulator-x64", + "Microsoft.NETCore.App.Runtime.Mono.iossimulator-x86" + ], + "extends": [ "microsoft-net-runtime-mono-tooling" ], + "platforms": [ "win-x64", "osx-arm64", "osx-x64" ] + }, + "microsoft-net-runtime-mono-tooling": { + "abstract": true, + "description": "Shared native build tooling for Mono runtime", + "packs": [ + "Microsoft.NET.Runtime.MonoAOTCompiler.Task", + "Microsoft.NET.Runtime.MonoTargets.Sdk" + ] + }, + }, + "packs": { + "Microsoft.NET.Runtime.MonoAOTCompiler.Task": { + "kind": "Sdk", + "version": "2.3.4.5" + }, + "Microsoft.NET.Runtime.MonoTargets.Sdk": { + "kind": "Sdk", + "version": "2.3.4.5" + }, + "Microsoft.NET.Runtime.WebAssembly.Sdk": { + "kind": "Sdk", + "version": "2.3.4.5" + }, + "Microsoft.NETCore.App.Runtime.Mono.android-arm": { + "kind": "framework", + "version": "2.3.4.5" + }, + "Microsoft.NETCore.App.Runtime.Mono.android-arm64": { + "kind": "framework", + "version": "2.3.4.5" + }, + "Microsoft.NETCore.App.Runtime.Mono.android-x64": { + "kind": "framework", + "version": "2.3.4.5" + }, + "Microsoft.NETCore.App.Runtime.Mono.android-x86": { + "kind": "framework", + "version": "2.3.4.5" + }, + "Microsoft.NETCore.App.Runtime.AOT.Cross.android-x86": { + "kind": "Sdk", + "version": "2.3.4.5", + "alias-to": { + "win-x64": "Microsoft.NETCore.App.Runtime.AOT.win-x64.Cross.android-x86", + "linux-x64": "Microsoft.NETCore.App.Runtime.AOT.linux-x64.Cross.android-x86", + "osx-x64": "Microsoft.NETCore.App.Runtime.AOT.osx-x64.Cross.android-x86", + "osx-arm64": "Microsoft.NETCore.App.Runtime.AOT.osx-x64.Cross.android-x86" + } + }, + "Microsoft.NETCore.App.Runtime.AOT.Cross.android-x64": { + "kind": "Sdk", + "version": "2.3.4.5", + "alias-to": { + "win-x64": "Microsoft.NETCore.App.Runtime.AOT.win-x64.Cross.android-x64", + "linux-x64": "Microsoft.NETCore.App.Runtime.AOT.linux-x64.Cross.android-x64", + "osx-x64": "Microsoft.NETCore.App.Runtime.AOT.osx-x64.Cross.android-x64", + "osx-arm64": "Microsoft.NETCore.App.Runtime.AOT.osx-x64.Cross.android-x64" + } + }, + "Microsoft.NETCore.App.Runtime.AOT.Cross.android-arm": { + "kind": "Sdk", + "version": "2.3.4.5", + "alias-to": { + "win-x64": "Microsoft.NETCore.App.Runtime.AOT.win-x64.Cross.android-arm", + "linux-x64": "Microsoft.NETCore.App.Runtime.AOT.linux-x64.Cross.android-arm", + "osx-x64": "Microsoft.NETCore.App.Runtime.AOT.osx-x64.Cross.android-arm", + "osx-arm64": "Microsoft.NETCore.App.Runtime.AOT.osx-x64.Cross.android-arm" + } + }, + "Microsoft.NETCore.App.Runtime.AOT.Cross.android-arm64": { + "kind": "Sdk", + "version": "2.3.4.5", + "alias-to": { + "win-x64": "Microsoft.NETCore.App.Runtime.AOT.win-x64.Cross.android-arm64", + "linux-x64": "Microsoft.NETCore.App.Runtime.AOT.linux-x64.Cross.android-arm64", + "osx-x64": "Microsoft.NETCore.App.Runtime.AOT.osx-x64.Cross.android-arm64", + "osx-arm64": "Microsoft.NETCore.App.Runtime.AOT.osx-x64.Cross.android-arm64" + } + }, + "Microsoft.NETCore.App.Runtime.Mono.maccatalyst-arm64": { + "kind": "framework", + "version": "2.3.4.5" + }, + "Microsoft.NETCore.App.Runtime.Mono.maccatalyst-x64": { + "kind": "framework", + "version": "2.3.4.5" + }, + "Microsoft.NETCore.App.Runtime.Mono.osx-arm64": { + "kind": "framework", + "version": "2.3.4.5" + }, + "Microsoft.NETCore.App.Runtime.Mono.osx-x64": { + "kind": "framework", + "version": "2.3.4.5" + }, + "Microsoft.NETCore.App.Runtime.osx-arm64": { + "kind": "framework", + "version": "2.3.4.5" + }, + "Microsoft.NETCore.App.Runtime.osx-x64": { + "kind": "framework", + "version": "2.3.4.5" + }, + "Microsoft.NETCore.App.Runtime.Mono.ios-arm": { + "kind": "framework", + "version": "2.3.4.5" + }, + "Microsoft.NETCore.App.Runtime.Mono.ios-arm64": { + "kind": "framework", + "version": "2.3.4.5" + }, + "Microsoft.NETCore.App.Runtime.Mono.iossimulator-arm64": { + "kind": "framework", + "version": "2.3.4.5" + }, + "Microsoft.NETCore.App.Runtime.Mono.iossimulator-x64": { + "kind": "framework", + "version": "2.3.4.5" + }, + "Microsoft.NETCore.App.Runtime.Mono.iossimulator-x86": { + "kind": "framework", + "version": "2.3.4.5" + }, + "Microsoft.NETCore.App.Runtime.AOT.Cross.tvos-arm64": { + "kind": "Sdk", + "version": "2.3.4.5", + "alias-to": { + "osx-x64": "Microsoft.NETCore.App.Runtime.AOT.osx-x64.Cross.tvos-arm64", + "osx-arm64": "Microsoft.NETCore.App.Runtime.AOT.osx-x64.Cross.tvos-arm64" + } + }, + "Microsoft.NETCore.App.Runtime.Mono.tvos-arm64": { + "kind": "framework", + "version": "2.3.4.5" + }, + "Microsoft.NETCore.App.Runtime.Mono.tvossimulator-arm64": { + "kind": "framework", + "version": "2.3.4.5" + }, + "Microsoft.NETCore.App.Runtime.Mono.tvossimulator-x64": { + "kind": "framework", + "version": "2.3.4.5" + }, + "Microsoft.NETCore.App.Runtime.AOT.Cross.maccatalyst-arm64": { + "kind": "Sdk", + "version": "2.3.4.5", + "alias-to": { + "osx-arm64": "Microsoft.NETCore.App.Runtime.AOT.osx-x64.Cross.maccatalyst-arm64", + "osx-x64": "Microsoft.NETCore.App.Runtime.AOT.osx-x64.Cross.maccatalyst-arm64" + } + }, + "Microsoft.NETCore.App.Runtime.AOT.Cross.maccatalyst-x64": { + "kind": "Sdk", + "version": "2.3.4.5", + "alias-to": { + "osx-arm64": "Microsoft.NETCore.App.Runtime.AOT.osx-x64.Cross.maccatalyst-x64", + "osx-x64": "Microsoft.NETCore.App.Runtime.AOT.osx-x64.Cross.maccatalyst-x64" + } + }, + "Microsoft.NETCore.App.Runtime.AOT.Cross.tvossimulator-arm64": { + "kind": "Sdk", + "version": "2.3.4.5", + "alias-to": { + "osx-arm64": "Microsoft.NETCore.App.Runtime.AOT.osx-x64.Cross.tvossimulator-arm64", + "osx-x64": "Microsoft.NETCore.App.Runtime.AOT.osx-x64.Cross.tvossimulator-arm64" + } + }, + "Microsoft.NETCore.App.Runtime.AOT.Cross.tvossimulator-x64": { + "kind": "Sdk", + "version": "2.3.4.5", + "alias-to": { + "osx-arm64": "Microsoft.NETCore.App.Runtime.AOT.osx-x64.Cross.tvossimulator-x64", + "osx-x64": "Microsoft.NETCore.App.Runtime.AOT.osx-x64.Cross.tvossimulator-x64" + } + }, + "Microsoft.NETCore.App.Runtime.AOT.Cross.ios-arm": { + "kind": "Sdk", + "version": "2.3.4.5", + "alias-to": { + "osx-x64": "Microsoft.NETCore.App.Runtime.AOT.osx-x64.Cross.ios-arm", + "osx-arm64": "Microsoft.NETCore.App.Runtime.AOT.osx-x64.Cross.ios-arm" + } + }, + "Microsoft.NETCore.App.Runtime.AOT.Cross.ios-arm64": { + "kind": "Sdk", + "version": "2.3.4.5", + "alias-to": { + "osx-x64": "Microsoft.NETCore.App.Runtime.AOT.osx-x64.Cross.ios-arm64", + "osx-arm64": "Microsoft.NETCore.App.Runtime.AOT.osx-x64.Cross.ios-arm64" + } + }, + "Microsoft.NETCore.App.Runtime.AOT.Cross.iossimulator-arm64": { + "kind": "Sdk", + "version": "2.3.4.5", + "alias-to": { + "osx-arm64": "Microsoft.NETCore.App.Runtime.AOT.osx-x64.Cross.iossimulator-arm64", + "osx-x64": "Microsoft.NETCore.App.Runtime.AOT.osx-x64.Cross.iossimulator-arm64" + } + }, + "Microsoft.NETCore.App.Runtime.AOT.Cross.iossimulator-x64": { + "kind": "Sdk", + "version": "2.3.4.5", + "alias-to": { + "osx-arm64": "Microsoft.NETCore.App.Runtime.AOT.osx-x64.Cross.iossimulator-x64", + "osx-x64": "Microsoft.NETCore.App.Runtime.AOT.osx-x64.Cross.iossimulator-x64" + } + }, + "Microsoft.NETCore.App.Runtime.AOT.Cross.iossimulator-x86": { + "kind": "Sdk", + "version": "2.3.4.5", + "alias-to": { + "osx-arm64": "Microsoft.NETCore.App.Runtime.AOT.osx-x64.Cross.iossimulator-x86", + "osx-x64": "Microsoft.NETCore.App.Runtime.AOT.osx-x64.Cross.iossimulator-x86" + } + }, + "Microsoft.NETCore.App.Runtime.AOT.Cross.browser-wasm": { + "kind": "Sdk", + "version": "2.3.4.5", + "alias-to": { + "win-x64": "Microsoft.NETCore.App.Runtime.AOT.win-x64.Cross.browser-wasm", + "linux-x64": "Microsoft.NETCore.App.Runtime.AOT.linux-x64.Cross.browser-wasm", + "osx-x64": "Microsoft.NETCore.App.Runtime.AOT.osx-x64.Cross.browser-wasm", + "osx-arm64": "Microsoft.NETCore.App.Runtime.AOT.osx-x64.Cross.browser-wasm" + } + }, + "Microsoft.NETCore.App.Runtime.Mono.browser-wasm": { + "kind": "framework", + "version": "2.3.4.5" + } + } +} diff --git a/src/Microsoft.DotNet.Build.Tasks.Workloads/src/GenerateManifestMsi.cs b/src/Microsoft.DotNet.Build.Tasks.Workloads/src/GenerateManifestMsi.cs index 86b4bf68b90..a9ab8650c44 100644 --- a/src/Microsoft.DotNet.Build.Tasks.Workloads/src/GenerateManifestMsi.cs +++ b/src/Microsoft.DotNet.Build.Tasks.Workloads/src/GenerateManifestMsi.cs @@ -79,6 +79,15 @@ public string SdkVersion set; } + /// + /// An item group containing information to shorten the names of packages. + /// + public ITaskItem[] ShortNames + { + get; + set; + } + /// /// Semicolon sepearate list of ICEs to suppress. /// @@ -147,10 +156,6 @@ public override bool Execute() productName = nupkg.Id; } - - - - // Extract once, but harvest multiple times because some generated attributes are platform dependent. string packageContentsDirectory = Path.Combine(PackageDirectory, $"{nupkg.Identity}"); nupkg.Extract(packageContentsDirectory, Enumerable.Empty()); @@ -192,6 +197,8 @@ public override bool Execute() var productCode = Guid.NewGuid(); Log.LogMessage($"UC: {upgradeCode}, PC: {productCode}, {SdkFeatureBandVersion}, {SdkVersion}, {platform}"); + string providerKeyName = $"{ManifestId},{SdkFeatureBandVersion},{platform}"; + // Compile the MSI sources string candleIntermediateOutputPath = Path.Combine(IntermediateBaseOutputPath, "wixobj", $"{nupkg.Id}", $"{nupkg.Version}", platform); @@ -219,7 +226,7 @@ public override bool Execute() candle.PreprocessorDefinitions.Add($@"ProductCode={productCode}"); candle.PreprocessorDefinitions.Add($@"UpgradeCode={upgradeCode}"); // Override the default provider key - candle.PreprocessorDefinitions.Add($@"DependencyProviderKeyName={ManifestId},{SdkFeatureBandVersion},{platform}"); + candle.PreprocessorDefinitions.Add($@"DependencyProviderKeyName={providerKeyName}"); candle.PreprocessorDefinitions.Add($@"ProductName={productName}"); candle.PreprocessorDefinitions.Add($@"Platform={platform}"); candle.PreprocessorDefinitions.Add($@"SourceDir={packageContentsDataDirectory}"); @@ -273,7 +280,7 @@ public override bool Execute() Payload = Path.GetFileName(msiPath), ProductCode = MsiUtils.GetProperty(msiPath, "ProductCode"), ProductVersion = MsiUtils.GetProperty(msiPath, "ProductVersion"), - ProviderKeyName = $"{nupkg.Id},{nupkg.Version},{platform}", + ProviderKeyName = $"{providerKeyName}", UpgradeCode = MsiUtils.GetProperty(msiPath, "UpgradeCode"), RelatedProducts = MsiUtils.GetRelatedProducts(msiPath) }; @@ -289,7 +296,7 @@ public override bool Execute() if (GenerateSwixAuthoring && IsSupportedByVisualStudio(platform)) { - string swixPackageId = $"{nupkg.Id}"; + string swixPackageId = $"{nupkg.Id.ToString().Replace(ShortNames)}"; string swixProject = GenerateSwixPackageAuthoring(light.OutputFile, swixPackageId, platform); @@ -406,7 +413,7 @@ private void WriteItem(XmlWriter writer, string itemName, string include, string writer.WriteEndElement(); } - private string GenerateSwixPackageAuthoring(string msiPath, string packageId, string platform) + internal string GenerateSwixPackageAuthoring(string msiPath, string packageId, string platform) { GenerateVisualStudioMsiPackageProject swixTask = new() { @@ -414,9 +421,13 @@ private string GenerateSwixPackageAuthoring(string msiPath, string packageId, st IntermediateBaseOutputPath = this.IntermediateBaseOutputPath, PackageName = packageId, MsiPath = msiPath, + Version = !string.IsNullOrEmpty(MsiVersion) ? new Version(MsiVersion) : null, BuildEngine = this.BuildEngine, }; + string vsPayloadRelativePath = $"{swixTask.PackageName},version={swixTask.Version.ToString(3)},chip={swixTask.Chip},productarch={swixTask.ProductArch}\\{Path.GetFileName(msiPath)}"; + CheckRelativePayloadPath(vsPayloadRelativePath); + if (!swixTask.Execute()) { Log.LogError($"Failed to generate SWIX authoring for '{msiPath}'"); diff --git a/src/Microsoft.DotNet.Build.Tasks.Workloads/src/GenerateTaskBase.cs b/src/Microsoft.DotNet.Build.Tasks.Workloads/src/GenerateTaskBase.cs index 54f9f2cbbfb..5c0e0163053 100644 --- a/src/Microsoft.DotNet.Build.Tasks.Workloads/src/GenerateTaskBase.cs +++ b/src/Microsoft.DotNet.Build.Tasks.Workloads/src/GenerateTaskBase.cs @@ -12,6 +12,8 @@ namespace Microsoft.DotNet.Build.Tasks.Workloads { public abstract class GenerateTaskBase : Task { + public const int MaxPayloadRelativePath = 182; + public static readonly string[] SupportedVisualStudioPlatforms = { "x86", "x64" }; /// @@ -68,5 +70,14 @@ protected bool IsSupportedByVisualStudio(string platform) { return SupportedVisualStudioPlatforms.Contains(platform); } + + protected void CheckRelativePayloadPath(string relativePath) + { + if (relativePath.Length > MaxPayloadRelativePath) + { + // We'll let the task's execute method take care of logging this and terminating. + throw new Exception($"Payload relative path exceeds max length ({MaxPayloadRelativePath}): {relativePath}"); + } + } } } diff --git a/src/Microsoft.DotNet.Build.Tasks.Workloads/src/GenerateVisualStudioMsiPackageProject.cs b/src/Microsoft.DotNet.Build.Tasks.Workloads/src/GenerateVisualStudioMsiPackageProject.cs index e1583969a02..3b2573fa438 100644 --- a/src/Microsoft.DotNet.Build.Tasks.Workloads/src/GenerateVisualStudioMsiPackageProject.cs +++ b/src/Microsoft.DotNet.Build.Tasks.Workloads/src/GenerateVisualStudioMsiPackageProject.cs @@ -104,6 +104,10 @@ public override bool Execute() Log.LogMessage($"Using MSI version for package version: {Version}"); } + // Try to catch VS manifest validation errors before we get to VS. + string vsPayloadRelativePath = $"{PackageName},version={Version.ToString(3)},chip={Chip},productarch={ProductArch}\\{Path.GetFileName(MsiPath)}"; + CheckRelativePayloadPath(vsPayloadRelativePath); + string swixSourceDirectory = Path.Combine(SwixDirectory, PackageName, Chip); string msiSwr = EmbeddedTemplates.Extract("msi.swr", swixSourceDirectory); string fullProjectName = $"{PackageName}.{Version.ToString(3)}.{Chip}"; diff --git a/src/Microsoft.DotNet.Build.Tasks.Workloads/src/GenerateVisualStudioWorkload.cs b/src/Microsoft.DotNet.Build.Tasks.Workloads/src/GenerateVisualStudioWorkload.cs index a3eb28d860c..bf7af320a1b 100644 --- a/src/Microsoft.DotNet.Build.Tasks.Workloads/src/GenerateVisualStudioWorkload.cs +++ b/src/Microsoft.DotNet.Build.Tasks.Workloads/src/GenerateVisualStudioWorkload.cs @@ -239,6 +239,9 @@ internal IEnumerable ProcessWorkloadManifestFile(string workloadManif Log?.LogError($"Visual Studio components '{component.Name}' must have at least one dependency."); } + string vsPayloadRelativePath = $"{component.Name},version={component.Version}\\_package.json"; + CheckRelativePayloadPath(vsPayloadRelativePath); + swixProjects.Add(component.Generate(Path.Combine(SourceDirectory, $"{workloadDefinition.Id}.{manifest.Version}.0"))); } diff --git a/src/Microsoft.DotNet.Build.Tasks.Workloads/src/Microsoft.DotNet.Build.Tasks.Workloads.csproj b/src/Microsoft.DotNet.Build.Tasks.Workloads/src/Microsoft.DotNet.Build.Tasks.Workloads.csproj index 161b0654020..e44ad1cc54a 100644 --- a/src/Microsoft.DotNet.Build.Tasks.Workloads/src/Microsoft.DotNet.Build.Tasks.Workloads.csproj +++ b/src/Microsoft.DotNet.Build.Tasks.Workloads/src/Microsoft.DotNet.Build.Tasks.Workloads.csproj @@ -1,4 +1,4 @@ - + net472;netcoreapp3.1 @@ -34,7 +34,7 @@ - + diff --git a/src/Microsoft.DotNet.Build.Tasks.Workloads/src/VisualStudioComponent.cs b/src/Microsoft.DotNet.Build.Tasks.Workloads/src/VisualStudioComponent.cs index 22b083a99b5..47cb493151c 100644 --- a/src/Microsoft.DotNet.Build.Tasks.Workloads/src/VisualStudioComponent.cs +++ b/src/Microsoft.DotNet.Build.Tasks.Workloads/src/VisualStudioComponent.cs @@ -18,6 +18,8 @@ namespace Microsoft.DotNet.Build.Tasks.Workloads /// public class VisualStudioComponent { + private static readonly string[] s_SupportedRids = new string[] { "win7", "win10", "any", "win", "win-x64", "win-x86", "win-arm64" }; + /// /// The component category. /// @@ -262,16 +264,30 @@ public static VisualStudioComponent Create(TaskLoggingHelper log, WorkloadManife foreach (WorkloadPackId packId in packIds) { - log?.LogMessage(MessageImportance.Low, $"Adding component dependency for {packId} "); - - if (manifest.Packs.ContainsKey(packId)) + // Check whether the pack dependency is aliased to non-Windows RIDs. If so, we can't add a dependency for the pack + // because we won't be able to create installers. + if (manifest.Packs.TryGetValue(packId, out WorkloadPack pack)) { - component.AddDependency(manifest.Packs[packId]); - } - else - { - log?.LogMessage(MessageImportance.High, $"Missing Visual Studio component dependency, packId: {packId}."); + if (pack.IsAlias && !pack.AliasTo.Keys.Any(rid => s_SupportedRids.Contains(rid))) + { + log?.LogMessage($"Workload {workload.Id} supports Windows, but none of its aliased packs do. Only the following pack aliases were found: {String.Join("", "", pack.AliasTo.Keys)}."); + continue; + } + else + { + log?.LogMessage(MessageImportance.Low, $"Adding component dependency for {packId} "); + component.AddDependency(manifest.Packs[packId]); + } } + + //if (manifest.Packs.ContainsKey(packId)) + //{ + // component.AddDependency(manifest.Packs[packId]); + //} + //else + //{ + // log?.LogMessage(MessageImportance.High, $"Missing Visual Studio component dependency, packId: {packId}."); + //} } } From 382667fff0b58c362855a42c3529ba294fd0514c Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Fri, 6 Aug 2021 18:05:30 +0000 Subject: [PATCH 281/699] [main] Update dependencies from dotnet/xliff-tasks mono/linker (#7724) [main] Update dependencies from dotnet/xliff-tasks mono/linker --- eng/Version.Details.xml | 8 ++++---- eng/Versions.props | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index 1c6a342d7f1..98809dd33f1 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -47,9 +47,9 @@ https://github.com/dotnet/roslyn 246ce641f04b67ef017655275d850bf902a8e40f - + https://github.com/mono/linker - d53322c1a4dd561414ae98f9aa1de9b186bcbd25 + ffe71535ba927280e6e93db0ca04dd99bde07637 https://github.com/dotnet/sourcelink @@ -68,9 +68,9 @@ https://github.com/dotnet/symreader-converter c5ba7c88f92e2dde156c324a8c8edc04d9fa4fe0 - + https://github.com/dotnet/xliff-tasks - 65d6700125d65051f9528f1557de29de796a60e3 + 86f82b451c063d91b4be037300c41ad02191da3c diff --git a/eng/Versions.props b/eng/Versions.props index 509df4854c7..c48ce03be0f 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -35,7 +35,7 @@ 2.1.1 2.1.0 3.10.0-4.21329.37 - 6.0.100-preview.6.21404.1 + 6.0.100-preview.6.21405.1 16.7.1 4.8.3 5.3.0.1 @@ -78,7 +78,7 @@ 1.1.0-beta-21309-01 1.1.0-beta-21309-01 6.0.0-beta.21403.5 - 1.0.0-beta.21380.1 + 1.0.0-beta.21405.1 1.1.0-beta.21378.2 1.0.0-prerelease.21378.1 1.1.156602 From 7a788970f4405beb96deec2c05f0b04bbc9fd546 Mon Sep 17 00:00:00 2001 From: Ricardo Arenas Date: Fri, 6 Aug 2021 13:08:33 -0700 Subject: [PATCH 282/699] Update Arcade dependency to help with publishing HttpClient timeouts (#7726) --- eng/Version.Details.xml | 20 ++++++++++---------- eng/Versions.props | 6 +++--- global.json | 4 ++-- 3 files changed, 15 insertions(+), 15 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index 98809dd33f1..914e345ecff 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -11,25 +11,25 @@ - + https://github.com/dotnet/arcade - 9fc83fbf76339c9dec4f5a8bf4718df2d42992a3 + 68277100891db502c5493ea1d335e74059d196aa - + https://github.com/dotnet/arcade - 9fc83fbf76339c9dec4f5a8bf4718df2d42992a3 + 68277100891db502c5493ea1d335e74059d196aa - + https://github.com/dotnet/arcade - 9fc83fbf76339c9dec4f5a8bf4718df2d42992a3 + 68277100891db502c5493ea1d335e74059d196aa - + https://github.com/dotnet/arcade - 9fc83fbf76339c9dec4f5a8bf4718df2d42992a3 + 68277100891db502c5493ea1d335e74059d196aa - + https://github.com/dotnet/arcade - 9fc83fbf76339c9dec4f5a8bf4718df2d42992a3 + 68277100891db502c5493ea1d335e74059d196aa https://github.com/dotnet/arcade-services diff --git a/eng/Versions.props b/eng/Versions.props index c48ce03be0f..c1da86a81ed 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -65,8 +65,8 @@ 2.4.1 2.0.3 2.4.1 - 6.0.0-beta.21403.5 - 6.0.0-beta.21403.5 + 6.0.0-beta.21405.8 + 6.0.0-beta.21405.8 1.22.0 1.1.2 2.0.0 @@ -77,7 +77,7 @@ 1.1.0-beta.20258.6 1.1.0-beta-21309-01 1.1.0-beta-21309-01 - 6.0.0-beta.21403.5 + 6.0.0-beta.21405.8 1.0.0-beta.21405.1 1.1.0-beta.21378.2 1.0.0-prerelease.21378.1 diff --git a/global.json b/global.json index 865a18a5ec1..6e03e79cc12 100644 --- a/global.json +++ b/global.json @@ -3,7 +3,7 @@ "dotnet": "6.0.100-rc.1.21379.2" }, "msbuild-sdks": { - "Microsoft.DotNet.Arcade.Sdk": "6.0.0-beta.21403.5", - "Microsoft.DotNet.Helix.Sdk": "6.0.0-beta.21403.5" + "Microsoft.DotNet.Arcade.Sdk": "6.0.0-beta.21405.8", + "Microsoft.DotNet.Helix.Sdk": "6.0.0-beta.21405.8" } } From 7a04201a936a34bb070145302fa3f0af2a018508 Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Sun, 8 Aug 2021 04:53:48 +0000 Subject: [PATCH 283/699] Update dependencies from https://github.com/dotnet/arcade build 20210806.6 (#7727) [main] Update dependencies from dotnet/arcade --- eng/Version.Details.xml | 20 ++++++++++---------- eng/Versions.props | 6 +++--- global.json | 4 ++-- 3 files changed, 15 insertions(+), 15 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index 914e345ecff..2f05238303e 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -11,25 +11,25 @@ - + https://github.com/dotnet/arcade - 68277100891db502c5493ea1d335e74059d196aa + 382667fff0b58c362855a42c3529ba294fd0514c - + https://github.com/dotnet/arcade - 68277100891db502c5493ea1d335e74059d196aa + 382667fff0b58c362855a42c3529ba294fd0514c - + https://github.com/dotnet/arcade - 68277100891db502c5493ea1d335e74059d196aa + 382667fff0b58c362855a42c3529ba294fd0514c - + https://github.com/dotnet/arcade - 68277100891db502c5493ea1d335e74059d196aa + 382667fff0b58c362855a42c3529ba294fd0514c - + https://github.com/dotnet/arcade - 68277100891db502c5493ea1d335e74059d196aa + 382667fff0b58c362855a42c3529ba294fd0514c https://github.com/dotnet/arcade-services diff --git a/eng/Versions.props b/eng/Versions.props index c1da86a81ed..7f2bafb02a4 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -65,8 +65,8 @@ 2.4.1 2.0.3 2.4.1 - 6.0.0-beta.21405.8 - 6.0.0-beta.21405.8 + 6.0.0-beta.21406.6 + 6.0.0-beta.21406.6 1.22.0 1.1.2 2.0.0 @@ -77,7 +77,7 @@ 1.1.0-beta.20258.6 1.1.0-beta-21309-01 1.1.0-beta-21309-01 - 6.0.0-beta.21405.8 + 6.0.0-beta.21406.6 1.0.0-beta.21405.1 1.1.0-beta.21378.2 1.0.0-prerelease.21378.1 diff --git a/global.json b/global.json index 6e03e79cc12..34428aeca0e 100644 --- a/global.json +++ b/global.json @@ -3,7 +3,7 @@ "dotnet": "6.0.100-rc.1.21379.2" }, "msbuild-sdks": { - "Microsoft.DotNet.Arcade.Sdk": "6.0.0-beta.21405.8", - "Microsoft.DotNet.Helix.Sdk": "6.0.0-beta.21405.8" + "Microsoft.DotNet.Arcade.Sdk": "6.0.0-beta.21406.6", + "Microsoft.DotNet.Helix.Sdk": "6.0.0-beta.21406.6" } } From 0090a8d783cb83a6d6817a73e682a1f27427311a Mon Sep 17 00:00:00 2001 From: Larry Ewing Date: Mon, 9 Aug 2021 13:30:44 -0500 Subject: [PATCH 284/699] Revert "Should not publish the files in SymbolPublishingExclusionFile.txt (#7433)" (#7730) This reverts commit 7e675d42ae78b36a02fbb2b9ef8cdf6f3917391b. --- .../templates/job/publish-build-assets.yml | 26 +------------------ eng/publishing/v3/publish-assets.yml | 3 +-- .../src/PublishArtifactsInManifestBase.cs | 24 ++--------------- 3 files changed, 4 insertions(+), 49 deletions(-) diff --git a/eng/common/templates/job/publish-build-assets.yml b/eng/common/templates/job/publish-build-assets.yml index fe9dfdf720c..3b9e2524ff3 100644 --- a/eng/common/templates/job/publish-build-assets.yml +++ b/eng/common/templates/job/publish-build-assets.yml @@ -94,31 +94,7 @@ jobs: PathtoPublish: '$(Build.StagingDirectory)/ReleaseConfigs.txt' PublishLocation: Container ArtifactName: ReleaseConfigs - - - task: powershell@2 - displayName: Check if SymbolPublishingExclusionsFile.txt exists - inputs: - targetType: inline - script: | - $symbolExclusionfile = "$(Build.SourcesDirectory)/eng/SymbolPublishingExclusionsFile.txt" - if(Test-Path -Path $symbolExclusionfile) - { - Write-Host "SymbolExclusionFile exists" - Write-Host "##vso[task.setvariable variable=SymbolExclusionFile]true" - } - else{ - Write-Host "Symbols Exclusion file does not exists" - Write-Host "##vso[task.setvariable variable=SymbolExclusionFile]false" - } - - - task: PublishBuildArtifacts@1 - displayName: Publish SymbolPublishingExclusionsFile Artifact - condition: eq(variables['SymbolExclusionFile'], 'true') - inputs: - PathtoPublish: '$(Build.SourcesDirectory)/eng/SymbolPublishingExclusionsFile.txt' - PublishLocation: Container - ArtifactName: ReleaseConfigs - + - ${{ if eq(parameters.enablePublishBuildArtifacts, 'true') }}: - template: /eng/common/templates/steps/publish-logs.yml parameters: diff --git a/eng/publishing/v3/publish-assets.yml b/eng/publishing/v3/publish-assets.yml index 60dca2adcde..33ef36c0979 100644 --- a/eng/publishing/v3/publish-assets.yml +++ b/eng/publishing/v3/publish-assets.yml @@ -43,7 +43,6 @@ jobs: AssetManifests/** BlobArtifacts/MergedManifest.xml PdbArtifacts/** - ReleaseConfigs/SymbolPublishingExclusionsFile.txt downloadPath: '$(Build.ArtifactStagingDirectory)' - task: NuGetToolInstaller@1 @@ -85,7 +84,7 @@ jobs: /p:AkaMSClientSecret=$(akams-client-secret) ${{ parameters.artifactsPublishingAdditionalParameters }} /p:PDBArtifactsBasePath='$(Build.ArtifactStagingDirectory)/PDBArtifacts/' - /p:SymbolPublishingExclusionsFile='$(Build.ArtifactStagingDirectory)/ReleaseConfigs/SymbolPublishingExclusionsFile.txt' + /p:SymbolPublishingExclusionsFile='$(Build.SourcesDirectory)/eng/SymbolPublishingExclusionsFile.txt' ${{ parameters.symbolPublishingAdditionalParameters}} /p:MsdlToken=$(microsoft-symbol-server-pat) /p:SymWebToken=$(symweb-symbol-server-pat) diff --git a/src/Microsoft.DotNet.Build.Tasks.Feed/src/PublishArtifactsInManifestBase.cs b/src/Microsoft.DotNet.Build.Tasks.Feed/src/PublishArtifactsInManifestBase.cs index 1d8614b0ec7..986f2668445 100644 --- a/src/Microsoft.DotNet.Build.Tasks.Feed/src/PublishArtifactsInManifestBase.cs +++ b/src/Microsoft.DotNet.Build.Tasks.Feed/src/PublishArtifactsInManifestBase.cs @@ -426,26 +426,6 @@ public async Task PublishSymbolsUsingStreamingAsync( HashSet feedConfigsForSymbols = FeedConfigs[symbolCategory]; Dictionary serversToPublish = GetTargetSymbolServers(feedConfigsForSymbols, msdlToken, symWebToken); - HashSet excludeFiles = new HashSet(); - - if(File.Exists(symbolPublishingExclusionsFile)) - { - Log.LogMessage(MessageImportance.Normal, $"SymbolPublishingExclusionFile exists"); - string[] files = File.ReadAllLines(symbolPublishingExclusionsFile); - - foreach(var file in files) - { - if(!string.IsNullOrEmpty(file)) - { - Log.LogMessage(MessageImportance.Normal, $"Exclude the file {file} from publishing to symbol server"); - excludeFiles.Add(file); - } - } - } - else - { - Log.LogMessage(MessageImportance.Normal, $"SymbolPublishingExclusionFile was not found at ${symbolPublishingExclusionsFile} "); - } if (symbolsToPublish != null && symbolsToPublish.Any()) { @@ -491,7 +471,7 @@ await PublishSymbolsHelper.PublishAsync( token, symbolFiles, null, - excludeFiles, + null, ExpirationInDays, false, publishSpecialClrFiles, @@ -557,7 +537,7 @@ await PublishSymbolsHelper.PublishAsync( token, null, filesToSymbolServer, - excludeFiles, + null, ExpirationInDays, false, publishSpecialClrFiles, From 55aa112e402297ea840dfd0b107db980c8a230f7 Mon Sep 17 00:00:00 2001 From: Alex Perovich Date: Mon, 9 Aug 2021 13:30:56 -0700 Subject: [PATCH 285/699] Remove CI trigger from weekly build (#7731) --- azure-pipelines-weekly.yaml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/azure-pipelines-weekly.yaml b/azure-pipelines-weekly.yaml index d12432a1580..d1ce3994098 100644 --- a/azure-pipelines-weekly.yaml +++ b/azure-pipelines-weekly.yaml @@ -1,3 +1,5 @@ +trigger: none + schedules: - cron: 0 12 * * 1 displayName: Weekly Monday build From 4211eec3820b8db22e8dd85d8ad56336b65642e9 Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Tue, 10 Aug 2021 14:27:43 +0000 Subject: [PATCH 286/699] [main] Update dependencies from dotnet/xharness dotnet/xliff-tasks mono/linker (#7728) [main] Update dependencies from dotnet/xharness dotnet/xliff-tasks mono/linker --- eng/Version.Details.xml | 12 ++++++------ eng/Versions.props | 6 +++--- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index 2f05238303e..3469d85c5d6 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -39,17 +39,17 @@ https://github.com/dotnet/arcade-services cac955fe259cb611f6a29d09209bd717deb69037 - + https://github.com/dotnet/xharness - 016171de04070fdd21472bd7514bb0272f0ad3aa + e9669dc84ecd668d3bbb748758103e23b394ffef https://github.com/dotnet/roslyn 246ce641f04b67ef017655275d850bf902a8e40f - + https://github.com/mono/linker - ffe71535ba927280e6e93db0ca04dd99bde07637 + e21bb44ca909d33c18acf3ed0b68f94a413351a5 https://github.com/dotnet/sourcelink @@ -68,9 +68,9 @@ https://github.com/dotnet/symreader-converter c5ba7c88f92e2dde156c324a8c8edc04d9fa4fe0 - + https://github.com/dotnet/xliff-tasks - 86f82b451c063d91b4be037300c41ad02191da3c + 02e7fb72122e48122c784b8d8873faa721faf01b diff --git a/eng/Versions.props b/eng/Versions.props index 7f2bafb02a4..d0aa2ac1af3 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -35,7 +35,7 @@ 2.1.1 2.1.0 3.10.0-4.21329.37 - 6.0.100-preview.6.21405.1 + 6.0.100-preview.6.21409.3 16.7.1 4.8.3 5.3.0.1 @@ -78,9 +78,9 @@ 1.1.0-beta-21309-01 1.1.0-beta-21309-01 6.0.0-beta.21406.6 - 1.0.0-beta.21405.1 + 1.0.0-beta.21407.1 1.1.0-beta.21378.2 - 1.0.0-prerelease.21378.1 + 1.0.0-prerelease.21404.1 1.1.156602 1.1.156602 6.0.100-preview.5.21254.11 From 6c28cee90e01616bf0020c435b8e216602d6df26 Mon Sep 17 00:00:00 2001 From: Epsitha Ananth <47157394+epananth@users.noreply.github.com> Date: Tue, 10 Aug 2021 14:55:47 -0700 Subject: [PATCH 287/699] Excluding symbols in SymbolsPublishingExclusion.txt to publish to symbol server (#7733) * Excluding symbols in SymbolsPublishingExclusion.txt to publish to symbol server --- .../templates/job/publish-build-assets.yml | 26 ++++++++++++++++++- eng/publishing/v3/publish-assets.yml | 3 ++- .../src/PublishArtifactsInManifestBase.cs | 25 ++++++++++++++++-- 3 files changed, 50 insertions(+), 4 deletions(-) diff --git a/eng/common/templates/job/publish-build-assets.yml b/eng/common/templates/job/publish-build-assets.yml index 3b9e2524ff3..fe9dfdf720c 100644 --- a/eng/common/templates/job/publish-build-assets.yml +++ b/eng/common/templates/job/publish-build-assets.yml @@ -94,7 +94,31 @@ jobs: PathtoPublish: '$(Build.StagingDirectory)/ReleaseConfigs.txt' PublishLocation: Container ArtifactName: ReleaseConfigs - + + - task: powershell@2 + displayName: Check if SymbolPublishingExclusionsFile.txt exists + inputs: + targetType: inline + script: | + $symbolExclusionfile = "$(Build.SourcesDirectory)/eng/SymbolPublishingExclusionsFile.txt" + if(Test-Path -Path $symbolExclusionfile) + { + Write-Host "SymbolExclusionFile exists" + Write-Host "##vso[task.setvariable variable=SymbolExclusionFile]true" + } + else{ + Write-Host "Symbols Exclusion file does not exists" + Write-Host "##vso[task.setvariable variable=SymbolExclusionFile]false" + } + + - task: PublishBuildArtifacts@1 + displayName: Publish SymbolPublishingExclusionsFile Artifact + condition: eq(variables['SymbolExclusionFile'], 'true') + inputs: + PathtoPublish: '$(Build.SourcesDirectory)/eng/SymbolPublishingExclusionsFile.txt' + PublishLocation: Container + ArtifactName: ReleaseConfigs + - ${{ if eq(parameters.enablePublishBuildArtifacts, 'true') }}: - template: /eng/common/templates/steps/publish-logs.yml parameters: diff --git a/eng/publishing/v3/publish-assets.yml b/eng/publishing/v3/publish-assets.yml index 33ef36c0979..60dca2adcde 100644 --- a/eng/publishing/v3/publish-assets.yml +++ b/eng/publishing/v3/publish-assets.yml @@ -43,6 +43,7 @@ jobs: AssetManifests/** BlobArtifacts/MergedManifest.xml PdbArtifacts/** + ReleaseConfigs/SymbolPublishingExclusionsFile.txt downloadPath: '$(Build.ArtifactStagingDirectory)' - task: NuGetToolInstaller@1 @@ -84,7 +85,7 @@ jobs: /p:AkaMSClientSecret=$(akams-client-secret) ${{ parameters.artifactsPublishingAdditionalParameters }} /p:PDBArtifactsBasePath='$(Build.ArtifactStagingDirectory)/PDBArtifacts/' - /p:SymbolPublishingExclusionsFile='$(Build.SourcesDirectory)/eng/SymbolPublishingExclusionsFile.txt' + /p:SymbolPublishingExclusionsFile='$(Build.ArtifactStagingDirectory)/ReleaseConfigs/SymbolPublishingExclusionsFile.txt' ${{ parameters.symbolPublishingAdditionalParameters}} /p:MsdlToken=$(microsoft-symbol-server-pat) /p:SymWebToken=$(symweb-symbol-server-pat) diff --git a/src/Microsoft.DotNet.Build.Tasks.Feed/src/PublishArtifactsInManifestBase.cs b/src/Microsoft.DotNet.Build.Tasks.Feed/src/PublishArtifactsInManifestBase.cs index 986f2668445..b626d27ef90 100644 --- a/src/Microsoft.DotNet.Build.Tasks.Feed/src/PublishArtifactsInManifestBase.cs +++ b/src/Microsoft.DotNet.Build.Tasks.Feed/src/PublishArtifactsInManifestBase.cs @@ -426,6 +426,27 @@ public async Task PublishSymbolsUsingStreamingAsync( HashSet feedConfigsForSymbols = FeedConfigs[symbolCategory]; Dictionary serversToPublish = GetTargetSymbolServers(feedConfigsForSymbols, msdlToken, symWebToken); + HashSet excludeFiles = null; + + if(File.Exists(symbolPublishingExclusionsFile)) + { + Log.LogMessage(MessageImportance.Normal, $"SymbolPublishingExclusionFile exists"); + string[] files = File.ReadAllLines(symbolPublishingExclusionsFile); + excludeFiles = new HashSet(); + + foreach(var file in files) + { + if(!string.IsNullOrEmpty(file)) + { + Log.LogMessage(MessageImportance.Normal, $"Exclude the file {file} from publishing to symbol server"); + excludeFiles.Add(file); + } + } + } + else + { + Log.LogMessage(MessageImportance.Normal, $"SymbolPublishingExclusionFile was not found at ${symbolPublishingExclusionsFile} "); + } if (symbolsToPublish != null && symbolsToPublish.Any()) { @@ -471,7 +492,7 @@ await PublishSymbolsHelper.PublishAsync( token, symbolFiles, null, - null, + excludeFiles, ExpirationInDays, false, publishSpecialClrFiles, @@ -537,7 +558,7 @@ await PublishSymbolsHelper.PublishAsync( token, null, filesToSymbolServer, - null, + excludeFiles, ExpirationInDays, false, publishSpecialClrFiles, From 4e176afae850eefbf6a95803de3817fcde489706 Mon Sep 17 00:00:00 2001 From: Michael Stuckey Date: Tue, 10 Aug 2021 15:42:01 -0700 Subject: [PATCH 288/699] Retry feed artifact download on SocketException (#7736) --- .../src/PublishArtifactsInManifestBase.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/Microsoft.DotNet.Build.Tasks.Feed/src/PublishArtifactsInManifestBase.cs b/src/Microsoft.DotNet.Build.Tasks.Feed/src/PublishArtifactsInManifestBase.cs index b626d27ef90..86af0164d0a 100644 --- a/src/Microsoft.DotNet.Build.Tasks.Feed/src/PublishArtifactsInManifestBase.cs +++ b/src/Microsoft.DotNet.Build.Tasks.Feed/src/PublishArtifactsInManifestBase.cs @@ -12,6 +12,7 @@ using System.Net; using System.Net.Http; using System.Net.Http.Headers; +using System.Net.Sockets; using System.Reflection; using System.Text; using System.Text.RegularExpressions; @@ -956,7 +957,7 @@ public async Task DownloadFileAsync( return true; } - catch (Exception toStore) when (toStore is HttpRequestException || toStore is TaskCanceledException) + catch (Exception toStore) when (toStore is HttpRequestException || toStore is TaskCanceledException || toStore is SocketException) { mostRecentlyCaughtException = toStore; return false; From b4fd1cc3817e0e85213dcc219ff7f7252761659f Mon Sep 17 00:00:00 2001 From: Chad Nedzlek Date: Tue, 10 Aug 2021 16:46:34 -0700 Subject: [PATCH 289/699] Reporting changes (#7646) Reintroduce corrected #7383 This switches arcade from using a custom reporter, to using a reporter more tightly integrated with helix. That reporter has the capacity to handle local test retrying and reporting to Azure DevOps for "flaky" tests. To enable the retry, a file "eng/test-configuration.json" must be created following the documented schema. --- .gitignore | 6 + eng/test-configuration.json | 5 + .../HelpersTests.cs | 16 + .../Sdk/SendHelixJob.cs | 37 ++- ...crosoft.DotNet.Helix.Sdk.MonoQueue.targets | 10 +- .../AzurePipelines.MonoQueue.targets | 4 +- .../reporter/azure_devops_result_publisher.py | 273 ------------------ .../tools/azure-pipelines/reporter/defs.py | 98 ------- .../azure-pipelines/reporter/formats/junit.py | 2 +- .../reporter/formats/result_format.py | 10 +- .../azure-pipelines/reporter/formats/trx.py | 2 +- .../azure-pipelines/reporter/formats/xunit.py | 2 +- .../tools/azure-pipelines/reporter/run.bat | 40 --- .../Sdk/tools/azure-pipelines/reporter/run.py | 174 ++--------- .../Sdk/tools/azure-pipelines/reporter/run.sh | 42 --- .../reporter/test_results_reader/__init__.py | 15 +- 16 files changed, 119 insertions(+), 617 deletions(-) create mode 100644 eng/test-configuration.json delete mode 100644 src/Microsoft.DotNet.Helix/Sdk/tools/azure-pipelines/reporter/azure_devops_result_publisher.py delete mode 100644 src/Microsoft.DotNet.Helix/Sdk/tools/azure-pipelines/reporter/defs.py delete mode 100644 src/Microsoft.DotNet.Helix/Sdk/tools/azure-pipelines/reporter/run.bat delete mode 100755 src/Microsoft.DotNet.Helix/Sdk/tools/azure-pipelines/reporter/run.sh diff --git a/.gitignore b/.gitignore index 19c954ea8f3..aae2dbd6cf1 100644 --- a/.gitignore +++ b/.gitignore @@ -131,3 +131,9 @@ node_modules/ # Python Compile Outputs *.pyc + +# IntelliJ +.idea/ + +# vscode python env files +.env \ No newline at end of file diff --git a/eng/test-configuration.json b/eng/test-configuration.json new file mode 100644 index 00000000000..27fdfceca0d --- /dev/null +++ b/eng/test-configuration.json @@ -0,0 +1,5 @@ +{ + "version": 1, + "defaultOnFailure": "rerun", + "localRerunCount": 1 +} \ No newline at end of file diff --git a/src/Microsoft.DotNet.Helix/Sdk.Tests/Microsoft.DotNet.Helix.Sdk.Tests/HelpersTests.cs b/src/Microsoft.DotNet.Helix/Sdk.Tests/Microsoft.DotNet.Helix.Sdk.Tests/HelpersTests.cs index a971acd4da5..b14dab3163f 100644 --- a/src/Microsoft.DotNet.Helix/Sdk.Tests/Microsoft.DotNet.Helix.Sdk.Tests/HelpersTests.cs +++ b/src/Microsoft.DotNet.Helix/Sdk.Tests/Microsoft.DotNet.Helix.Sdk.Tests/HelpersTests.cs @@ -1,5 +1,8 @@ +using System; +using System.IO; using Xunit; using System.Net; +using Newtonsoft.Json; namespace Microsoft.DotNet.Helix.Sdk.Tests { @@ -35,5 +38,18 @@ public void VerifyNonEncodedFowardSlashIsConverted() Assert.Equal(workItemNameExpected, actual); } + + [Fact] + public void FailOnceThenPass() + { + string target = Path.Combine(Environment.GetEnvironmentVariable("HELIX_WORKITEM_ROOT") ?? Environment.GetEnvironmentVariable("TEMP"), "my-test-file-123456.snt"); + bool exists = File.Exists(target); + if (!exists) + { + File.WriteAllText(target, "Test failed once"); + } + + Assert.True(exists, $"File should exist: {target}"); + } } } diff --git a/src/Microsoft.DotNet.Helix/Sdk/SendHelixJob.cs b/src/Microsoft.DotNet.Helix/Sdk/SendHelixJob.cs index 6212882bbea..abbf3ef3d80 100644 --- a/src/Microsoft.DotNet.Helix/Sdk/SendHelixJob.cs +++ b/src/Microsoft.DotNet.Helix/Sdk/SendHelixJob.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.Globalization; using System.IO; +using System.IO.Compression; using System.Linq; using System.Text; using System.Threading; @@ -33,6 +34,7 @@ public static class MetadataNames public const string Uri = "Uri"; public const string Destination = "Destination"; public const string IncludeDirectoryName = "IncludeDirectoryName"; + public const string AsArchive = "AsArchive"; } /// @@ -521,16 +523,43 @@ private IJobDefinition AddCorrelationPayload(IJobDefinition def, ITaskItem corre if (Directory.Exists(path)) { string includeDirectoryNameStr = correlationPayload.GetMetadata(MetadataNames.IncludeDirectoryName); - bool.TryParse(includeDirectoryNameStr, out bool includeDirectoryName); + if (!bool.TryParse(includeDirectoryNameStr, out bool includeDirectoryName)) + { + includeDirectoryName = false; + } - Log.LogMessage(MessageImportance.Low, $"Adding Correlation Payload Directory '{path}', destination '{destination}'"); + Log.LogMessage( + MessageImportance.Low, + $"Adding Correlation Payload Directory '{path}', destination '{destination}'" + ); return def.WithCorrelationPayloadDirectory(path, includeDirectoryName, destination); + } if (File.Exists(path)) { - Log.LogMessage(MessageImportance.Low, $"Adding Correlation Payload Archive '{path}', destination '{destination}'"); - return def.WithCorrelationPayloadArchive(path, destination); + string asArchiveStr = correlationPayload.GetMetadata(MetadataNames.AsArchive); + if (!bool.TryParse(asArchiveStr, out bool asArchive)) + { + // With no other information, default to true, since that was the previous behavior + // before we added the option + asArchive = true; + } + + if (asArchive) + { + Log.LogMessage( + MessageImportance.Low, + $"Adding Correlation Payload Archive '{path}', destination '{destination}'" + ); + return def.WithCorrelationPayloadArchive(path, destination); + } + + Log.LogMessage( + MessageImportance.Low, + $"Adding Correlation Payload File '{path}', destination '{destination}'" + ); + return def.WithCorrelationPayloadFiles(path); } Log.LogError(FailureCategory.Build, $"Correlation Payload '{path}' not found."); diff --git a/src/Microsoft.DotNet.Helix/Sdk/tools/Microsoft.DotNet.Helix.Sdk.MonoQueue.targets b/src/Microsoft.DotNet.Helix/Sdk/tools/Microsoft.DotNet.Helix.Sdk.MonoQueue.targets index b271e821239..7f8604a40fa 100644 --- a/src/Microsoft.DotNet.Helix/Sdk/tools/Microsoft.DotNet.Helix.Sdk.MonoQueue.targets +++ b/src/Microsoft.DotNet.Helix/Sdk/tools/Microsoft.DotNet.Helix.Sdk.MonoQueue.targets @@ -3,7 +3,11 @@ false - + + + $(RepositoryEngineeringDir)/test-configuration.json + + @@ -36,6 +40,10 @@ + + + + diff --git a/src/Microsoft.DotNet.Helix/Sdk/tools/azure-pipelines/AzurePipelines.MonoQueue.targets b/src/Microsoft.DotNet.Helix/Sdk/tools/azure-pipelines/AzurePipelines.MonoQueue.targets index 9dc488962f1..d5fbcb4569f 100644 --- a/src/Microsoft.DotNet.Helix/Sdk/tools/azure-pipelines/AzurePipelines.MonoQueue.targets +++ b/src/Microsoft.DotNet.Helix/Sdk/tools/azure-pipelines/AzurePipelines.MonoQueue.targets @@ -7,11 +7,11 @@ $(HelixPostCommands); - /bin/sh $HELIX_CORRELATION_PAYLOAD/reporter/run.sh $(SYSTEM_TEAMFOUNDATIONCOLLECTIONURI) $(SYSTEM_TEAMPROJECT) $(TestRunId) $(SYSTEM_ACCESSTOKEN) || exit $? + $HELIX_PYTHONPATH $HELIX_CORRELATION_PAYLOAD/reporter/run.py $(SYSTEM_TEAMFOUNDATIONCOLLECTIONURI) $(SYSTEM_TEAMPROJECT) $(TestRunId) $(SYSTEM_ACCESSTOKEN) || exit $? $(HelixPostCommands); - call %HELIX_CORRELATION_PAYLOAD%\reporter\run.bat $(SYSTEM_TEAMFOUNDATIONCOLLECTIONURI) $(SYSTEM_TEAMPROJECT) $(TestRunId) $(SYSTEM_ACCESSTOKEN) || exit /b + %HELIX_PYTHONPATH% %HELIX_CORRELATION_PAYLOAD%\reporter\run.py $(SYSTEM_TEAMFOUNDATIONCOLLECTIONURI) $(SYSTEM_TEAMPROJECT) $(TestRunId) $(SYSTEM_ACCESSTOKEN) || exit /b diff --git a/src/Microsoft.DotNet.Helix/Sdk/tools/azure-pipelines/reporter/azure_devops_result_publisher.py b/src/Microsoft.DotNet.Helix/Sdk/tools/azure-pipelines/reporter/azure_devops_result_publisher.py deleted file mode 100644 index 47fc6454009..00000000000 --- a/src/Microsoft.DotNet.Helix/Sdk/tools/azure-pipelines/reporter/azure_devops_result_publisher.py +++ /dev/null @@ -1,273 +0,0 @@ -import base64 -import os -import logging -import time -from typing import Iterable, Mapping, List, Dict, Optional, Tuple -from builtins import str as text -from azure.devops.connection import Connection -from msrest.authentication import BasicTokenAuthentication, BasicAuthentication -from azure.devops.v5_1.test import TestClient -from azure.devops.v5_1.test.models import TestCaseResult, TestAttachmentRequestModel, TestSubResult -from azure.devops.exceptions import AzureDevOpsClientRequestError - -from helpers import get_env -from defs import TestResult - -log = logging.getLogger(__name__) - - -class AzureDevOpsTestResultPublisher: - def __init__(self, collection_uri, access_token, team_project, test_run_id=None): - """ - - :type collection_uri: str The team project collection uri - :type access_token: str The value of SYSTEM_ACCESSTOKEN from the azure pipelines build - """ - self.collection_uri = collection_uri - self.access_token = access_token - self.team_project = team_project - self.test_run_id = test_run_id - self.work_item_name = get_env("HELIX_WORKITEM_FRIENDLYNAME") - pass - - def upload_batch(self, results: Iterable[TestResult]): - results_with_attachments = {r.name: r for r in results if r is not None and r.attachments} - - (test_case_results, test_name_order) = self.convert_results(results) - - self.publish_results(test_case_results, test_name_order, results_with_attachments) - - def is_data_driven_test(self, r: str) -> bool: - return r.endswith(")") - - def get_ddt_base_name(self, r: str) -> str: - return r.split('(', 1)[0] - - def send_attachment(self, test_client, attachment, published_result): - try: - # Python 3 will throw a TypeError exception because b64encode expects bytes - stream = base64.b64encode(text(attachment.text)) - except TypeError: - # stream has to be a string but b64encode takes and returns bytes on Python 3 - stream = base64.b64encode(bytes(attachment.text, "utf-8")).decode("utf-8") - - test_client.create_test_result_attachment( - TestAttachmentRequestModel( - file_name=text(attachment.name), - stream=stream, - ), self.team_project, self.test_run_id, published_result.id) - - def send_sub_attachment(self, test_client, attachment, published_result, sub_result_id): - stream = base64.b64encode(bytes(attachment.text, "utf-8")).decode("utf-8") - - test_client.create_test_sub_result_attachment( - TestAttachmentRequestModel( - file_name=text(attachment.name), - stream=stream, - ), self.team_project, self.test_run_id, published_result.id, sub_result_id) - - def publish_results(self, test_case_results: Iterable[TestCaseResult], test_result_order: Dict[str, List[str]], - results_with_attachments: Mapping[str, TestResult]) -> None: - connection = self.get_connection() - test_client = connection.get_client("azure.devops.v5_1.test.TestClient") # type: TestClient - - tries_left = 10 - succeeded = False - test_run_ended = False - - while tries_left > 0 and not test_run_ended and not succeeded: - try: - published_results = test_client. \ - add_test_results_to_test_run(list(test_case_results), - self.team_project, - self.test_run_id) # type: List[TestCaseResult] - succeeded = True - - except AzureDevOpsClientRequestError as ex: - # Odd syntax here is to deal with checking substrings of the list of args in this exception - hit_503 = len([element for element in ex.args if ('invalid status code of 503' in element)]) != 0 - test_run_ended = len([element for element in ex.args if ('It may have been deleted' in element)]) != 0 - if hit_503: - tries_left -= 1 - log.warning("Hit HTTP 503 from Azure DevOps. Will wait three seconds and try again.") - time.sleep(3) - elif test_run_ended: # Not exceptional, don't retry. - tries_left = 0 - else: - raise ex - - if test_run_ended: - log.info("Test run has ended, skipping attaching results as it would fail.") - return - - # !succeeded means a 503 and not succeeding after 10 tries (otherwise we threw already), so give a nice error - if not succeeded: - raise Exception('Failed to report test results to Azure Dev Ops after retrying. Please contact dnceng.') - - for published_result in published_results: - - # Don't send attachments if the result was not accepted. - if published_result.id == -1: - continue - - # Does the test result have an attachment with an exact matching name? - if published_result.automated_test_name in results_with_attachments: - log.debug("Result {0} has an attachment".format(published_result.automated_test_name)) - result = results_with_attachments.get(published_result.automated_test_name) - - for attachment in result.attachments: - self.send_attachment(test_client, attachment, published_result) - - # Does the test result have an attachment with a sub-result matching name? - # The data structure returned from AzDO does not contain a subresult's name, only an - # index. The order of results is meant to be the same as was posted. This assumes that - # is true , and uses the order of test names recorded earlier to look-up the attachments. - elif published_result.sub_results is not None: - sub_results_order = test_result_order[published_result.automated_test_name] - - # Sanity check - if len(sub_results_order) != len(published_result.sub_results): - log.warning( - "Returned subresults list length does not match expected. Attachments may not pair correctly.") - - for (name, sub_result) in zip(sub_results_order, published_result.sub_results): - if name in results_with_attachments: - result = results_with_attachments.get(name) - for attachment in result.attachments: - self.send_sub_attachment(test_client, attachment, published_result, sub_result.id) - - def convert_results(self, results: Iterable[TestResult]) -> Tuple[Iterable[TestCaseResult], Dict[str, List[str]]]: - comment = "{{ \"HelixJobId\": \"{}\", \"HelixWorkItemName\": \"{}\" }}".format( - os.getenv("HELIX_CORRELATION_ID"), - os.getenv("HELIX_WORKITEM_FRIENDLYNAME"), - ) - - def convert_to_sub_test(r: TestResult) -> Optional[TestSubResult]: - if r.result == "Pass": - return TestSubResult( - comment=comment, - display_name=text(r.name), - duration_in_ms=r.duration_seconds * 1000, - outcome="Passed" - ) - if r.result == "Fail": - return TestSubResult( - comment=comment, - display_name=text(r.name), - duration_in_ms=r.duration_seconds * 1000, - outcome="Failed", - stack_trace=text(r.stack_trace) if r.stack_trace is not None else None, - error_message=text(r.failure_message) - ) - if r.result == "Skip": - return TestSubResult( - comment=comment, - display_name=text(r.name), - duration_in_ms=r.duration_seconds * 1000, - outcome="NotExecuted" - ) - log.warning("Unexpected result value {} for {}".format(r.result, r.name)) - return None - - def convert_result(r: TestResult) -> Optional[TestCaseResult]: - if r.result == "Pass": - return TestCaseResult( - test_case_title=text(r.name), - automated_test_name=text(r.name), - automated_test_type=text(r.kind), - automated_test_storage=self.work_item_name, - priority=1, - duration_in_ms=r.duration_seconds * 1000, - outcome="Passed", - state="Completed", - comment=comment, - ) - if r.result == "Fail": - return TestCaseResult( - test_case_title=text(r.name), - automated_test_name=text(r.name), - automated_test_type=text(r.kind), - automated_test_storage=self.work_item_name, - priority=1, - duration_in_ms=r.duration_seconds * 1000, - outcome="Failed", - state="Completed", - error_message=text(r.failure_message), - stack_trace=text(r.stack_trace) if r.stack_trace is not None else None, - comment=comment, - ) - - if r.result == "Skip": - return TestCaseResult( - test_case_title=text(r.name), - automated_test_name=text(r.name), - automated_test_type=text(r.kind), - automated_test_storage=self.work_item_name, - priority=1, - duration_in_ms=r.duration_seconds * 1000, - outcome="NotExecuted", - state="Completed", - error_message=text(r.skip_reason), - comment=comment, - ) - - log.warning("Unexpected result value {} for {}".format(r.result, r.name)) - return None - - unconverted_results = list(results) # type: List[TestResult] - log.debug("Count of unconverted_results: {0}".format(len(unconverted_results))) - - # Find all DDTs, determine parent, and add to dictionary - data_driven_tests = {} # type: Dict[str, TestCaseResult] - non_data_driven_tests = [] # type: List[TestCaseResult] - test_name_ordering = {} # type: Dict[str, List[str]] - - for r in unconverted_results: - if r is None: - continue - - if not self.is_data_driven_test(r.name): - non_data_driven_tests.append(convert_result(r)) - test_name_ordering[r.name] = [] - continue - - # Must be a DDT - base_name = self.get_ddt_base_name(r.name) - - if base_name in data_driven_tests: - sub_test = convert_to_sub_test(r) - if sub_test is None: - continue - - data_driven_tests[base_name].sub_results.append(sub_test) - test_name_ordering[base_name].append(r.name) - - # Mark parent test as Failed if any subresult is Failed - if sub_test.outcome == "Failed": - data_driven_tests[base_name].outcome = "Failed" - - else: - cr = convert_result(r) - csr = convert_to_sub_test(r) - - if cr is None or csr is None: - continue - - data_driven_tests[base_name] = cr - data_driven_tests[base_name].automated_test_name = base_name - data_driven_tests[base_name].result_group_type = "dataDriven" - data_driven_tests[base_name].sub_results = [csr] - test_name_ordering[base_name] = [r.name] - - return (list(data_driven_tests.values()) + non_data_driven_tests, test_name_ordering) - - def get_connection(self) -> Connection: - credentials = self.get_credentials() - return Connection(self.collection_uri, credentials) - - def get_credentials(self) -> BasicTokenAuthentication: - if self.access_token: - return BasicTokenAuthentication({'access_token': self.access_token}) - - token = get_env("VSTS_PAT") - return BasicAuthentication("ignored", token) diff --git a/src/Microsoft.DotNet.Helix/Sdk/tools/azure-pipelines/reporter/defs.py b/src/Microsoft.DotNet.Helix/Sdk/tools/azure-pipelines/reporter/defs.py deleted file mode 100644 index 53cc7f8b5c5..00000000000 --- a/src/Microsoft.DotNet.Helix/Sdk/tools/azure-pipelines/reporter/defs.py +++ /dev/null @@ -1,98 +0,0 @@ -from typing import List - - -class TestResult: - def __init__(self, name, kind, type_name, method, duration, result, exception_type, failure_message, stack_trace, - skip_reason, attachments): - """ - - :type name: unicode - :type kind: unicode - :type type_name: unicode - :type method: unicode - :type duration: float - :type result: unicode - :type exception_type: unicode - :type failure_message: unicode - :type stack_trace: unicode - :type skip_reason: unicode - :type attachments: List[TestResultAttachment] - """ - self._name = name - self._kind = kind - self._type = type_name - self._method = method - self._duration_seconds = duration - self._result = result - self._exception_type = exception_type - self._failure_message = failure_message - self._stack_trace = stack_trace - self._skip_reason = skip_reason - self._attachments = attachments - - @property - def name(self): - return self._name - - @property - def kind(self): - return self._kind - - @property - def type(self): - return self._type - - @property - def method(self): - return self._method - - @property - def duration_seconds(self): - return self._duration_seconds - - @property - def result(self): - return self._result - - @property - def exception_type(self): - return self._exception_type - - @property - def failure_message(self): - return self._failure_message - - @property - def stack_trace(self): - return self._stack_trace - - @property - def skip_reason(self): - return self._skip_reason - - @property - def output(self): - return self._output - - @property - def attachments(self): - return self._attachments - - -class TestResultAttachment: - def __init__(self, name, text): - """ - - :type name: unicode - :type text: unicode - """ - self._name = name - self._text = text - - @property - def name(self): - return self._name - - @property - def text(self): - return self._text diff --git a/src/Microsoft.DotNet.Helix/Sdk/tools/azure-pipelines/reporter/formats/junit.py b/src/Microsoft.DotNet.Helix/Sdk/tools/azure-pipelines/reporter/formats/junit.py index e5bdbf554cc..629f31b2165 100644 --- a/src/Microsoft.DotNet.Helix/Sdk/tools/azure-pipelines/reporter/formats/junit.py +++ b/src/Microsoft.DotNet.Helix/Sdk/tools/azure-pipelines/reporter/formats/junit.py @@ -1,6 +1,6 @@ import xml.etree.ElementTree from .result_format import ResultFormat -from defs import TestResult, TestResultAttachment +from helix.public import TestResult, TestResultAttachment class JUnitFormat(ResultFormat): diff --git a/src/Microsoft.DotNet.Helix/Sdk/tools/azure-pipelines/reporter/formats/result_format.py b/src/Microsoft.DotNet.Helix/Sdk/tools/azure-pipelines/reporter/formats/result_format.py index 43aa2a2bb40..8d7cc966311 100644 --- a/src/Microsoft.DotNet.Helix/Sdk/tools/azure-pipelines/reporter/formats/result_format.py +++ b/src/Microsoft.DotNet.Helix/Sdk/tools/azure-pipelines/reporter/formats/result_format.py @@ -1,5 +1,5 @@ from abc import ABCMeta, abstractmethod, abstractproperty -from defs import TestResult +from helix.public import TestResult from typing import Iterable @@ -10,15 +10,13 @@ def __init__(self): pass @abstractproperty - def name(self): + def name(self) -> str: pass @abstractproperty - def acceptable_file_suffixes(self): - # type: () -> Iterable[str] + def acceptable_file_suffixes(self) -> Iterable[str]: pass @abstractmethod - def read_results(self, path): - # type: (str) -> Iterable[TestResult] + def read_results(self, path) -> Iterable[TestResult]: pass diff --git a/src/Microsoft.DotNet.Helix/Sdk/tools/azure-pipelines/reporter/formats/trx.py b/src/Microsoft.DotNet.Helix/Sdk/tools/azure-pipelines/reporter/formats/trx.py index 9fabb0d88db..cb2afbec916 100644 --- a/src/Microsoft.DotNet.Helix/Sdk/tools/azure-pipelines/reporter/formats/trx.py +++ b/src/Microsoft.DotNet.Helix/Sdk/tools/azure-pipelines/reporter/formats/trx.py @@ -1,7 +1,7 @@ import glob import xml.etree.ElementTree from .result_format import ResultFormat -from defs import TestResult, TestResultAttachment +from helix.public import TestResult, TestResultAttachment class TRXFormat(ResultFormat): diff --git a/src/Microsoft.DotNet.Helix/Sdk/tools/azure-pipelines/reporter/formats/xunit.py b/src/Microsoft.DotNet.Helix/Sdk/tools/azure-pipelines/reporter/formats/xunit.py index b46a11f1964..bbf8ee6f96e 100644 --- a/src/Microsoft.DotNet.Helix/Sdk/tools/azure-pipelines/reporter/formats/xunit.py +++ b/src/Microsoft.DotNet.Helix/Sdk/tools/azure-pipelines/reporter/formats/xunit.py @@ -2,7 +2,7 @@ import xml.etree.ElementTree from .result_format import ResultFormat -from defs import TestResult, TestResultAttachment +from helix.public import TestResult, TestResultAttachment _unescape_char_map = { 'r': '\r', diff --git a/src/Microsoft.DotNet.Helix/Sdk/tools/azure-pipelines/reporter/run.bat b/src/Microsoft.DotNet.Helix/Sdk/tools/azure-pipelines/reporter/run.bat deleted file mode 100644 index 3a3c0f9d1ba..00000000000 --- a/src/Microsoft.DotNet.Helix/Sdk/tools/azure-pipelines/reporter/run.bat +++ /dev/null @@ -1,40 +0,0 @@ - -set ENV_PATH=%USERPROFILE%\.azdo-env -set TMP_ENV_PATH=%USERPROFILE%\.azdo-env-tmp - -REM Removing pythonpath forces a clean installation of the Azure DevOps client, but subsequent commands may use HELIX libraries -set _OLD_PYTHONPATH=%PYTHONPATH% -set PYTHONPATH= - -echo %date%-%time% - -if NOT EXIST %ENV_PATH%\Scripts\python.exe ( - rmdir /Q /S %TMP_ENV_PATH% - rmdir /Q /S %ENV_PATH% - %HELIX_PYTHONPATH% -m virtualenv --no-site-packages %TMP_ENV_PATH% - rename %TMP_ENV_PATH% .azdo-env -) -REM On certain slow machines python.exe keeps a handle open just long enough to break the rename; retry if so -set /a renameAttemptNumber=1 -:retryloop -if NOT EXIST %ENV_PATH%\Scripts\python.exe ( -set /a renameAttemptNumber+=1 -echo Error renaming venv folder; waiting 5 seconds and retrying up to 10x Attempt: %renameAttemptNumber% -ping -n 6 127.0.0.1 > nul -rename %TMP_ENV_PATH% .azdo-env -IF %renameAttemptNumber% GEQ 10 GOTO :renamingdone -GOTO :retryloop -) -:renamingdone - -%ENV_PATH%\Scripts\python.exe -c "import azure.devops" || %ENV_PATH%\Scripts\python.exe -m pip install azure-devops==5.0.0b9 - -%ENV_PATH%\Scripts\python.exe -c "import future" || %ENV_PATH%\Scripts\python.exe -m pip install future==0.17.1 - -echo %date%-%time% -%ENV_PATH%\Scripts\python.exe -B %~dp0run.py %* -set _uploaderExitCode=%ERRORLEVEL% -echo %date%-%time% - -set PYTHONPATH=%_OLD_PYTHONPATH% -exit /b %_uploaderExitCode% diff --git a/src/Microsoft.DotNet.Helix/Sdk/tools/azure-pipelines/reporter/run.py b/src/Microsoft.DotNet.Helix/Sdk/tools/azure-pipelines/reporter/run.py index e862eb2335d..00f77cf7cba 100644 --- a/src/Microsoft.DotNet.Helix/Sdk/tools/azure-pipelines/reporter/run.py +++ b/src/Microsoft.DotNet.Helix/Sdk/tools/azure-pipelines/reporter/run.py @@ -4,52 +4,15 @@ import time import traceback import logging +import shutil from queue import Queue from threading import Thread, Lock -from typing import Tuple, Optional, List - +from typing import Tuple, Optional + +from helpers import get_env from test_results_reader import read_results -from helpers import batch, get_env -from azure_devops_result_publisher import AzureDevOpsTestResultPublisher - -workerFailedLock = Lock() -workerFailed = False - - -class UploadWorker(Thread): - def __init__(self, queue, idx, collection_uri, team_project, test_run_id, access_token): - super(UploadWorker, self).__init__() - self.queue = queue - self.idx = idx - self.publisher = AzureDevOpsTestResultPublisher( - collection_uri=collection_uri, - access_token=access_token, - team_project=team_project, - test_run_id=test_run_id, - ) - self.total_uploaded = 0 - - def __print(self, msg): - sys.stdout.write('Worker {}: {}\n'.format(self.idx, msg)) - sys.stdout.flush() - - def __process(self, batch): - self.publisher.upload_batch(batch) - self.total_uploaded = self.total_uploaded + len(batch) - - def run(self): - global workerFailed, workerFailedLock - while True: - try: - item = self.queue.get() - self.__process(item) - except: - self.__print("got error: {}".format(traceback.format_exc())) - with workerFailedLock: - workerFailed = True - finally: - self.queue.task_done() +from helix.public import DefaultTestReporter, AzureDevOpsReportingParameters, PackingTestReporter def process_args() -> Tuple[str, str, str, Optional[str]]: if len(sys.argv) < 4 or len(sys.argv) > 5: @@ -70,109 +33,36 @@ def process_args() -> Tuple[str, str, str, Optional[str]]: return collection_uri, team_project, test_run_id, access_token -# This reporter will be phased out soon, but until then we need to deal with ADO outages and failures from client lib -# Currently only understands XUnit TestResults.xml (should not be around long enough to need more) -# See https://github.com/dotnet/arcade/issues/7371 for details -def check_passed_to_workaround_ado_api_failure(dirs_to_check: List[str]) -> bool: - print("Reporting has failed. Running mitigation for https://github.com/dotnet/arcade/issues/7371") - found_a_result = False - acceptable_xunit_file_names = [ - "testResults.xml", - "test-results.xml", - "test_results.xml", - "TestResults.xUnit.xml" - ] - - failure_count_found = 0 - - for dir_name in dirs_to_check: - print("Searching '{}' for test results files".format(dir_name)) - for root, dirs, files in os.walk(dir_name): - for file_name in files: - if file_name in acceptable_xunit_file_names: - file_path = os.path.join(root, file_name) - print('Found results file {} '.format(file_path)) - found_a_result = True - failure_count_found += get_failure_count(file_path) - - if found_a_result: - if failure_count_found == 0: - print("Reporter script has failed, but XUnit test results show no failures.") - return True - else: - print("Reporter script has failed, and we were able to find XUnit test results with failures ({})" - .format(str(failure_count_found))) - else: - print("Tried to mitigate but no results files found.") - return False - - -def get_failure_count(test_results_path: str): - fail_count = 0 - with open(test_results_path, encoding="utf-8") as result_file: - total_regex = re.compile(r'failed="(\d+)"') - for line in result_file: - if ' Iterable[TestResult]: found = False for dir in dirs_to_check: - print("Searching '{}' for test results files".format(dir)) + log.info("Searching '{}' for test results files".format(dir)) for root, dirs, files in os.walk(dir): for file_name in files: for f in all_formats: if file_name.endswith(tuple(f.acceptable_file_suffixes)): file_path = os.path.join(root, file_name) - print('Found results file {} with format {}'.format(file_path, f.name)) + log.info('Found results file {} with format {}'.format(file_path, f.name)) found = True file_results = (add_logs(tr, log_list) for tr in f.read_results(file_path)) for result in file_results: yield result if not found: - print('No results file found in any of the following formats: {}'.format(', '.join((f.name for f in all_formats)))) + log.warn('No results file found in any of the following formats: {}'.format(', '.join((f.name for f in all_formats)))) yield add_logs(__no_results_result(), log_list) From e10772e3594e46a031574c20a4145441737ac56d Mon Sep 17 00:00:00 2001 From: Epsitha Ananth <47157394+epananth@users.noreply.github.com> Date: Tue, 10 Aug 2021 19:22:30 -0700 Subject: [PATCH 290/699] Update dependencies to add symbol exclusion feature (#7737) * Arcade update to add symbol exclusion feature * retry update --- eng/Version.Details.xml | 20 ++++++++++---------- eng/Versions.props | 6 +++--- global.json | 4 ++-- 3 files changed, 15 insertions(+), 15 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index 3469d85c5d6..939ac084d99 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -11,25 +11,25 @@ - + https://github.com/dotnet/arcade - 382667fff0b58c362855a42c3529ba294fd0514c + 4e176afae850eefbf6a95803de3817fcde489706 - + https://github.com/dotnet/arcade - 382667fff0b58c362855a42c3529ba294fd0514c + 4e176afae850eefbf6a95803de3817fcde489706 - + https://github.com/dotnet/arcade - 382667fff0b58c362855a42c3529ba294fd0514c + 4e176afae850eefbf6a95803de3817fcde489706 - + https://github.com/dotnet/arcade - 382667fff0b58c362855a42c3529ba294fd0514c + 4e176afae850eefbf6a95803de3817fcde489706 - + https://github.com/dotnet/arcade - 382667fff0b58c362855a42c3529ba294fd0514c + 4e176afae850eefbf6a95803de3817fcde489706 https://github.com/dotnet/arcade-services diff --git a/eng/Versions.props b/eng/Versions.props index d0aa2ac1af3..a8f40490902 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -65,8 +65,8 @@ 2.4.1 2.0.3 2.4.1 - 6.0.0-beta.21406.6 - 6.0.0-beta.21406.6 + 6.0.0-beta.21410.6 + 6.0.0-beta.21410.6 1.22.0 1.1.2 2.0.0 @@ -77,7 +77,7 @@ 1.1.0-beta.20258.6 1.1.0-beta-21309-01 1.1.0-beta-21309-01 - 6.0.0-beta.21406.6 + 6.0.0-beta.21410.6 1.0.0-beta.21407.1 1.1.0-beta.21378.2 1.0.0-prerelease.21404.1 diff --git a/global.json b/global.json index 34428aeca0e..91add0bd26b 100644 --- a/global.json +++ b/global.json @@ -3,7 +3,7 @@ "dotnet": "6.0.100-rc.1.21379.2" }, "msbuild-sdks": { - "Microsoft.DotNet.Arcade.Sdk": "6.0.0-beta.21406.6", - "Microsoft.DotNet.Helix.Sdk": "6.0.0-beta.21406.6" + "Microsoft.DotNet.Arcade.Sdk": "6.0.0-beta.21410.6", + "Microsoft.DotNet.Helix.Sdk": "6.0.0-beta.21410.6" } } From 5388591e7c147cb96d59826bfe9aa6d300556562 Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Wed, 11 Aug 2021 19:48:16 +0000 Subject: [PATCH 291/699] Update dependencies from https://github.com/mono/linker build 20210811.1 (#7739) [main] Update dependencies from mono/linker --- eng/Version.Details.xml | 4 ++-- eng/Versions.props | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index 939ac084d99..a13b1e22b7c 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -47,9 +47,9 @@ https://github.com/dotnet/roslyn 246ce641f04b67ef017655275d850bf902a8e40f - + https://github.com/mono/linker - e21bb44ca909d33c18acf3ed0b68f94a413351a5 + 7bf5cd4505d6c36f6c33984789e2a23b8837b6f1 https://github.com/dotnet/sourcelink diff --git a/eng/Versions.props b/eng/Versions.props index a8f40490902..e1089a4e69b 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -35,7 +35,7 @@ 2.1.1 2.1.0 3.10.0-4.21329.37 - 6.0.100-preview.6.21409.3 + 6.0.100-preview.6.21411.1 16.7.1 4.8.3 5.3.0.1 From 70de8c7a1a5230d4dc8e273dcb0057805165ae19 Mon Sep 17 00:00:00 2001 From: Juan Hoyos Date: Wed, 11 Aug 2021 17:05:25 -0700 Subject: [PATCH 292/699] Support packing new R2R maps to SFX packages (#7738) --- .../targets/sharedfx.targets | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/Microsoft.DotNet.SharedFramework.Sdk/targets/sharedfx.targets b/src/Microsoft.DotNet.SharedFramework.Sdk/targets/sharedfx.targets index df74bf08695..511214ae5e7 100644 --- a/src/Microsoft.DotNet.SharedFramework.Sdk/targets/sharedfx.targets +++ b/src/Microsoft.DotNet.SharedFramework.Sdk/targets/sharedfx.targets @@ -7,7 +7,7 @@ true true true - $(AllowedOutputExtensionsInSymbolsPackageBuildOutputFolder);.map;.dbg;.debug;.dwarf + $(AllowedOutputExtensionsInSymbolsPackageBuildOutputFolder);.map;.r2rmap;.dbg;.debug;.dwarf <_DefaultHostJsonTargetPath>runtimes/$(RuntimeIdentifier)/lib/$(TargetFramework) $(_DefaultHostJsonTargetPath) false @@ -77,15 +77,19 @@ <_r2rSymbolFiles Include="@(ResolvedFileToPublish->'%(RootDir)%(Directory)%(FileName).ni.pdb')" /> + + <_r2rV1MapFiles Include="@(ResolvedFileToPublish->'%(RootDir)%(Directory)%(FileName).ni.r2rmap')" /> + <_r2rSymbolFilePattern>@(ResolvedFileToPublish->'%(RootDir)%(Directory)%(FileName).ni.*.map') + @@ -136,11 +140,16 @@ true PgoData + true + + + true + From 58ac7035021bd7277ef7582338afd25403fc9aea Mon Sep 17 00:00:00 2001 From: Steve Pfister Date: Thu, 12 Aug 2021 09:31:47 -0400 Subject: [PATCH 293/699] Modify the CreateXHarnessAppleWorkItems task to accept zip files as input (#7740) * Modify CreateXHarnessAppleWorkItems to accept a zip in addition to a folder. The .app files can be quite large and accepting zip allows us to reduce the size of essentially intermediate files * Move zip detection back into PrepareWorkItem Co-authored-by: Steve Pfister --- .../Sdk/CreateXHarnessAppleWorkItems.cs | 43 ++++++++++++------- 1 file changed, 28 insertions(+), 15 deletions(-) diff --git a/src/Microsoft.DotNet.Helix/Sdk/CreateXHarnessAppleWorkItems.cs b/src/Microsoft.DotNet.Helix/Sdk/CreateXHarnessAppleWorkItems.cs index a21be345429..d30a7289c4a 100644 --- a/src/Microsoft.DotNet.Helix/Sdk/CreateXHarnessAppleWorkItems.cs +++ b/src/Microsoft.DotNet.Helix/Sdk/CreateXHarnessAppleWorkItems.cs @@ -107,17 +107,19 @@ private async Task PrepareWorkItem( appFolderPath = appFolderPath.TrimEnd(Path.DirectorySeparatorChar); - if (!fileSystem.DirectoryExists(appFolderPath)) - { - Log.LogError($"App bundle not found in {appFolderPath}"); - return null; - } + bool isAlreadyArchived = workItemName.EndsWith(".zip"); - if (workItemName.EndsWith(".app")) + if (isAlreadyArchived || workItemName.EndsWith(".app")) { workItemName = workItemName.Substring(0, workItemName.Length - 4); } + if (!ValidateAppBundlePath(fileSystem, appFolderPath, isAlreadyArchived)) + { + Log.LogError($"App bundle not found in {appFolderPath}"); + return null; + } + var (testTimeout, workItemTimeout, expectedExitCode, customCommands) = ParseMetadata(appBundleItem); // Validation of any metadata specific to iOS stuff goes here @@ -170,15 +172,23 @@ private async Task PrepareWorkItem( customCommands = GetDefaultCommand(target, includesTestRunner, resetSimulator); } - string appName = fileSystem.GetFileName(appFolderPath); + string appName = isAlreadyArchived ? $"{fileSystem.GetFileNameWithoutExtension(appFolderPath)}.app" : fileSystem.GetFileName(appFolderPath); string helixCommand = GetHelixCommand(appName, target, testTimeout, launchTimeout, includesTestRunner, expectedExitCode, resetSimulator); - string payloadArchivePath = await CreateZipArchiveOfFolder(zipArchiveManager, fileSystem, workItemName, appFolderPath, customCommands); + string payloadArchivePath = await CreateZipArchiveOfFolder(zipArchiveManager, fileSystem, workItemName, isAlreadyArchived, appFolderPath, customCommands); Log.LogMessage($"Creating work item with properties Identity: {workItemName}, Payload: {appFolderPath}, Command: {helixCommand}"); return CreateTaskItem(workItemName, payloadArchivePath, helixCommand, workItemTimeout); } + private bool ValidateAppBundlePath( + IFileSystem fileSystem, + string appBundlePath, + bool isAlreadyArchived) + { + return isAlreadyArchived ? fileSystem.FileExists(appBundlePath) : fileSystem.DirectoryExists(appBundlePath); + } + private string GetDefaultCommand(string target, bool includesTestRunner, bool resetSimulator) => $"xharness apple {(includesTestRunner ? "test" : "run")} " + "--app \"$app\" " + @@ -218,15 +228,10 @@ private async Task CreateZipArchiveOfFolder( IZipArchiveManager zipArchiveManager, IFileSystem fileSystem, string workItemName, + bool isAlreadyArchived, string folderToZip, string injectedCommands) { - if (!fileSystem.DirectoryExists(folderToZip)) - { - Log.LogError($"Cannot find path containing app: '{folderToZip}'"); - return string.Empty; - } - string appFolderDirectory = fileSystem.GetDirectoryName(folderToZip); string fileName = $"xharness-app-payload-{workItemName.ToLowerInvariant()}.zip"; string outputZipPath = fileSystem.PathCombine(appFolderDirectory, fileName); @@ -237,7 +242,15 @@ private async Task CreateZipArchiveOfFolder( fileSystem.DeleteFile(outputZipPath); } - zipArchiveManager.ArchiveDirectory(folderToZip, outputZipPath, true); + if (!isAlreadyArchived) + { + zipArchiveManager.ArchiveDirectory(folderToZip, outputZipPath, true); + } + else + { + Log.LogMessage($"App payload '{workItemName}` has already been zipped. Copying to '{outputZipPath}` instead"); + fileSystem.FileCopy(folderToZip, outputZipPath); + } Log.LogMessage($"Adding the XHarness job scripts into the payload archive"); await zipArchiveManager.AddResourceFileToArchive(outputZipPath, ScriptNamespace + EntryPointScript, EntryPointScript); From 52284c74798c0d457aa56103da3ed9e545ec5315 Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Thu, 12 Aug 2021 14:17:29 +0000 Subject: [PATCH 294/699] [main] Update dependencies from dotnet/arcade mono/linker (#7743) [main] Update dependencies from dotnet/arcade mono/linker --- eng/Version.Details.xml | 24 ++++++++++++------------ eng/Versions.props | 8 ++++---- global.json | 4 ++-- 3 files changed, 18 insertions(+), 18 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index a13b1e22b7c..75dd0e0aad3 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -11,25 +11,25 @@ - + https://github.com/dotnet/arcade - 4e176afae850eefbf6a95803de3817fcde489706 + e10772e3594e46a031574c20a4145441737ac56d - + https://github.com/dotnet/arcade - 4e176afae850eefbf6a95803de3817fcde489706 + e10772e3594e46a031574c20a4145441737ac56d - + https://github.com/dotnet/arcade - 4e176afae850eefbf6a95803de3817fcde489706 + e10772e3594e46a031574c20a4145441737ac56d - + https://github.com/dotnet/arcade - 4e176afae850eefbf6a95803de3817fcde489706 + e10772e3594e46a031574c20a4145441737ac56d - + https://github.com/dotnet/arcade - 4e176afae850eefbf6a95803de3817fcde489706 + e10772e3594e46a031574c20a4145441737ac56d https://github.com/dotnet/arcade-services @@ -47,9 +47,9 @@ https://github.com/dotnet/roslyn 246ce641f04b67ef017655275d850bf902a8e40f - + https://github.com/mono/linker - 7bf5cd4505d6c36f6c33984789e2a23b8837b6f1 + 5d376b1f8963c5c0013482ec63d857d359658809 https://github.com/dotnet/sourcelink diff --git a/eng/Versions.props b/eng/Versions.props index e1089a4e69b..178674e1dde 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -35,7 +35,7 @@ 2.1.1 2.1.0 3.10.0-4.21329.37 - 6.0.100-preview.6.21411.1 + 6.0.100-preview.6.21411.3 16.7.1 4.8.3 5.3.0.1 @@ -65,8 +65,8 @@ 2.4.1 2.0.3 2.4.1 - 6.0.0-beta.21410.6 - 6.0.0-beta.21410.6 + 6.0.0-beta.21410.8 + 6.0.0-beta.21410.8 1.22.0 1.1.2 2.0.0 @@ -77,7 +77,7 @@ 1.1.0-beta.20258.6 1.1.0-beta-21309-01 1.1.0-beta-21309-01 - 6.0.0-beta.21410.6 + 6.0.0-beta.21410.8 1.0.0-beta.21407.1 1.1.0-beta.21378.2 1.0.0-prerelease.21404.1 diff --git a/global.json b/global.json index 91add0bd26b..7a6aa9d7c2d 100644 --- a/global.json +++ b/global.json @@ -3,7 +3,7 @@ "dotnet": "6.0.100-rc.1.21379.2" }, "msbuild-sdks": { - "Microsoft.DotNet.Arcade.Sdk": "6.0.0-beta.21410.6", - "Microsoft.DotNet.Helix.Sdk": "6.0.0-beta.21410.6" + "Microsoft.DotNet.Arcade.Sdk": "6.0.0-beta.21410.8", + "Microsoft.DotNet.Helix.Sdk": "6.0.0-beta.21410.8" } } From 8f2125b671e7684558239cdb4755365147ad3222 Mon Sep 17 00:00:00 2001 From: jakubstilec Date: Thu, 12 Aug 2021 17:26:37 +0200 Subject: [PATCH 295/699] Run test PublishToSymbolServers to validate sdk-tesk.ps1 script (#7734) --- azure-pipelines.yml | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 5a751ef9288..2a1c9e5de2f 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -123,6 +123,18 @@ stages: - checkout: self clean: true steps: + - task: PowerShell@2 + displayName: sdk-task verification + inputs: + filePath: eng\common\sdk-task.ps1 + arguments: -task PublishToSymbolServers /p:DryRun="true" -restore -msbuildEngine dotnet + /p:DotNetSymbolServerTokenMsdl=DryRunPTA + /p:DotNetSymbolServerTokenSymWeb=DryRunPTA + /p:PDBArtifactsDirectory='$(Build.ArtifactStagingDirectory)/PDBArtifacts/' + /p:BlobBasePath='$(Build.ArtifactStagingDirectory)/BlobArtifacts/' + /p:SymbolPublishingExclusionsFile='$(Build.SourcesDirectory)/eng/SymbolPublishingExclusionsFile.txt' + /p:Configuration=Release + /p:PublishToMSDL=false - powershell: eng\common\build.ps1 -configuration $(_BuildConfig) -prepareMachine From 5f00dd25263e2070c88d5094db7c2727520754b3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1=C5=A1=20Matou=C5=A1ek?= Date: Thu, 12 Aug 2021 13:17:44 -0700 Subject: [PATCH 296/699] Work around implicit usings breaking change (#7745) Work around https://github.com/dotnet/sdk/issues/19521 --- src/Microsoft.DotNet.Arcade.Sdk/tools/ProjectDefaults.props | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/Microsoft.DotNet.Arcade.Sdk/tools/ProjectDefaults.props b/src/Microsoft.DotNet.Arcade.Sdk/tools/ProjectDefaults.props index bebb3cacec2..cc7ff33c974 100644 --- a/src/Microsoft.DotNet.Arcade.Sdk/tools/ProjectDefaults.props +++ b/src/Microsoft.DotNet.Arcade.Sdk/tools/ProjectDefaults.props @@ -22,6 +22,9 @@ true + + + true false From 11129d393b9cac853aa3285d402b8da29a814184 Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Fri, 13 Aug 2021 14:11:29 +0000 Subject: [PATCH 297/699] [main] Update dependencies from dotnet/xliff-tasks mono/linker (#7748) [main] Update dependencies from dotnet/xliff-tasks mono/linker --- eng/Version.Details.xml | 8 ++++---- eng/Versions.props | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index 75dd0e0aad3..0c7839b18e4 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -47,9 +47,9 @@ https://github.com/dotnet/roslyn 246ce641f04b67ef017655275d850bf902a8e40f - + https://github.com/mono/linker - 5d376b1f8963c5c0013482ec63d857d359658809 + 4dd506a685d7d81a0e7782ca56d6c0db0064d7d4 https://github.com/dotnet/sourcelink @@ -68,9 +68,9 @@ https://github.com/dotnet/symreader-converter c5ba7c88f92e2dde156c324a8c8edc04d9fa4fe0 - + https://github.com/dotnet/xliff-tasks - 02e7fb72122e48122c784b8d8873faa721faf01b + e75ee06448aa07fa02853aac97a6cc4bff387ecb diff --git a/eng/Versions.props b/eng/Versions.props index 178674e1dde..6ca5a6acf7b 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -35,7 +35,7 @@ 2.1.1 2.1.0 3.10.0-4.21329.37 - 6.0.100-preview.6.21411.3 + 6.0.100-preview.6.21412.1 16.7.1 4.8.3 5.3.0.1 @@ -78,7 +78,7 @@ 1.1.0-beta-21309-01 1.1.0-beta-21309-01 6.0.0-beta.21410.8 - 1.0.0-beta.21407.1 + 1.0.0-beta.21412.1 1.1.0-beta.21378.2 1.0.0-prerelease.21404.1 1.1.156602 From 9ba7f0451d20999b93648d7738cc54ea8bac23f1 Mon Sep 17 00:00:00 2001 From: Matt Mitchell Date: Fri, 13 Aug 2021 16:04:15 -0700 Subject: [PATCH 298/699] Add .NET 7 channels (#7751) Add .NET 7 runtime and SDK channels --- .../src/model/PublishingConstants.cs | 32 +++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/src/Microsoft.DotNet.Build.Tasks.Feed/src/model/PublishingConstants.cs b/src/Microsoft.DotNet.Build.Tasks.Feed/src/model/PublishingConstants.cs index 488ca7ee6a5..af63e0d0285 100644 --- a/src/Microsoft.DotNet.Build.Tasks.Feed/src/model/PublishingConstants.cs +++ b/src/Microsoft.DotNet.Build.Tasks.Feed/src/model/PublishingConstants.cs @@ -96,6 +96,10 @@ public enum BuildQuality private const string FeedDotNet6Transport = "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet6-transport/nuget/v3/index.json"; private const string FeedDotNet6Symbols = "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet6-symbols/nuget/v3/index.json"; + private const string FeedDotNet7Shipping = "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet7/nuget/v3/index.json"; + private const string FeedDotNet7Transport = "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet7-transport/nuget/v3/index.json"; + private const string FeedDotNet7Symbols = "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet7-symbols/nuget/v3/index.json"; + private const string FeedDotNet6InternalShipping = "https://pkgs.dev.azure.com/dnceng/internal/_packaging/dotnet6-internal/nuget/v3/index.json"; private const string FeedDotNet6InternalTransport = "https://pkgs.dev.azure.com/dnceng/internal/_packaging/dotnet6-internal-transport/nuget/v3/index.json"; private const string FeedDotNet6InternalSymbols = "https://pkgs.dev.azure.com/dnceng/internal/_packaging/dotnet6-internal-symbols/nuget/v3/index.json"; @@ -133,6 +137,34 @@ public enum BuildQuality PublicAndInternalSymbolTargets, filenamesToExclude: FilenamesToExclude), + // ".NET 7", + new TargetChannelConfig( + 2236, + false, + PublishingInfraVersion.All, + "7.0", + FeedDotNet7Shipping, + FeedDotNet7Transport, + FeedDotNet7Symbols, + FeedForChecksums, + FeedForInstallers, + PublicAndInternalSymbolTargets, + filenamesToExclude: FilenamesToExclude), + + // ".NET 7 SDK 7.0.1xx", + new TargetChannelConfig( + 2237, + false, + PublishingInfraVersion.All, + "7.0.1xx", + FeedDotNet7Shipping, + FeedDotNet7Transport, + FeedDotNet7Symbols, + FeedForChecksums, + FeedForInstallers, + PublicAndInternalSymbolTargets, + filenamesToExclude: FilenamesToExclude), + // ".NET 6", new TargetChannelConfig( 1296, From 18a1daded0dcd1cb26111089408e201eb9bd3855 Mon Sep 17 00:00:00 2001 From: Ricardo Arenas Date: Fri, 13 Aug 2021 16:14:04 -0700 Subject: [PATCH 299/699] fix xml syntax in projectDefaults.props (#7752) --- src/Microsoft.DotNet.Arcade.Sdk/tools/ProjectDefaults.props | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Microsoft.DotNet.Arcade.Sdk/tools/ProjectDefaults.props b/src/Microsoft.DotNet.Arcade.Sdk/tools/ProjectDefaults.props index cc7ff33c974..962f5ec4781 100644 --- a/src/Microsoft.DotNet.Arcade.Sdk/tools/ProjectDefaults.props +++ b/src/Microsoft.DotNet.Arcade.Sdk/tools/ProjectDefaults.props @@ -24,7 +24,7 @@ true - true + true false From 9b7027ba718462aa6410cef61a8be5a4283e7528 Mon Sep 17 00:00:00 2001 From: Michael Stuckey Date: Fri, 13 Aug 2021 17:18:34 -0700 Subject: [PATCH 300/699] Retry PublishArtifacts download on all exceptions (#7750) --- .../PublishToSymbolServerTest.cs | 4 ++-- .../src/PublishArtifactsInManifestBase.cs | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Microsoft.DotNet.Build.Tasks.Feed.Tests/PublishToSymbolServerTest.cs b/src/Microsoft.DotNet.Build.Tasks.Feed.Tests/PublishToSymbolServerTest.cs index 9e08f09b226..cefc81c5c69 100644 --- a/src/Microsoft.DotNet.Build.Tasks.Feed.Tests/PublishToSymbolServerTest.cs +++ b/src/Microsoft.DotNet.Build.Tasks.Feed.Tests/PublishToSymbolServerTest.cs @@ -216,7 +216,7 @@ public async Task DownloadFileAsyncFailsForInValidUrlTest(HttpStatusCode httpSta "1234", "test.txt", path)); - Assert.Contains($"Failed to download local file '{path}' after {publishTask.RetryHandler.MaxAttempts} attempts. See inner exception for details,", actualError.Message); + Assert.Contains($"Failed to download local file '{path}' after {publishTask.RetryHandler.MaxAttempts} attempts. See inner exception for details.", actualError.Message); } [Theory] @@ -259,7 +259,7 @@ public async Task DownloadFailureWhenStatusCodeIsInvalid(HttpStatusCode httpStat "1234", "test.txt", path)); - Assert.Contains($"Failed to download local file '{path}' after {publishTask.RetryHandler.MaxAttempts} attempts. See inner exception for details,", actualError.Message); + Assert.Contains($"Failed to download local file '{path}' after {publishTask.RetryHandler.MaxAttempts} attempts. See inner exception for details.", actualError.Message); } [Theory] diff --git a/src/Microsoft.DotNet.Build.Tasks.Feed/src/PublishArtifactsInManifestBase.cs b/src/Microsoft.DotNet.Build.Tasks.Feed/src/PublishArtifactsInManifestBase.cs index 86af0164d0a..9e31325f149 100644 --- a/src/Microsoft.DotNet.Build.Tasks.Feed/src/PublishArtifactsInManifestBase.cs +++ b/src/Microsoft.DotNet.Build.Tasks.Feed/src/PublishArtifactsInManifestBase.cs @@ -957,7 +957,7 @@ public async Task DownloadFileAsync( return true; } - catch (Exception toStore) when (toStore is HttpRequestException || toStore is TaskCanceledException || toStore is SocketException) + catch (Exception toStore) { mostRecentlyCaughtException = toStore; return false; @@ -967,7 +967,7 @@ public async Task DownloadFileAsync( if (!success) { throw new Exception( - $"Failed to download local file '{path}' after {RetryHandler.MaxAttempts} attempts. See inner exception for details, {mostRecentlyCaughtException}"); + $"Failed to download local file '{path}' after {RetryHandler.MaxAttempts} attempts. See inner exception for details.", mostRecentlyCaughtException); } } From 1f7033b2376b4fdeeeb5aedfd69c698c9ba02bf2 Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Mon, 16 Aug 2021 09:04:35 -0700 Subject: [PATCH 301/699] [main] Update dependencies from dotnet/xliff-tasks dotnet/arcade mono/linker (#7753) * Update dependencies from https://github.com/dotnet/arcade build 20210812.1 Microsoft.DotNet.Build.Tasks.Feed , Microsoft.DotNet.Arcade.Sdk , Microsoft.DotNet.SwaggerGenerator.MSBuild , Microsoft.DotNet.SignTool , Microsoft.DotNet.Helix.Sdk From Version 6.0.0-beta.21410.8 -> To Version 6.0.0-beta.21412.1 * Update dependencies from https://github.com/mono/linker build 20210813.1 Microsoft.NET.ILLink.Tasks From Version 6.0.100-preview.6.21412.1 -> To Version 6.0.100-preview.6.21413.1 * Update dependencies from https://github.com/dotnet/xliff-tasks build 20210814.1 Microsoft.DotNet.XliffTasks From Version 1.0.0-beta.21412.1 -> To Version 1.0.0-beta.21414.1 Co-authored-by: dotnet-maestro[bot] --- eng/Version.Details.xml | 28 ++++++++++++++-------------- eng/Versions.props | 10 +++++----- global.json | 4 ++-- 3 files changed, 21 insertions(+), 21 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index 0c7839b18e4..2edecd5cef3 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -11,25 +11,25 @@ - + https://github.com/dotnet/arcade - e10772e3594e46a031574c20a4145441737ac56d + 58ac7035021bd7277ef7582338afd25403fc9aea - + https://github.com/dotnet/arcade - e10772e3594e46a031574c20a4145441737ac56d + 58ac7035021bd7277ef7582338afd25403fc9aea - + https://github.com/dotnet/arcade - e10772e3594e46a031574c20a4145441737ac56d + 58ac7035021bd7277ef7582338afd25403fc9aea - + https://github.com/dotnet/arcade - e10772e3594e46a031574c20a4145441737ac56d + 58ac7035021bd7277ef7582338afd25403fc9aea - + https://github.com/dotnet/arcade - e10772e3594e46a031574c20a4145441737ac56d + 58ac7035021bd7277ef7582338afd25403fc9aea https://github.com/dotnet/arcade-services @@ -47,9 +47,9 @@ https://github.com/dotnet/roslyn 246ce641f04b67ef017655275d850bf902a8e40f - + https://github.com/mono/linker - 4dd506a685d7d81a0e7782ca56d6c0db0064d7d4 + c321df28835445093009af394ddf3c31e9b1fc91 https://github.com/dotnet/sourcelink @@ -68,9 +68,9 @@ https://github.com/dotnet/symreader-converter c5ba7c88f92e2dde156c324a8c8edc04d9fa4fe0 - + https://github.com/dotnet/xliff-tasks - e75ee06448aa07fa02853aac97a6cc4bff387ecb + 5cc5c3fb5e3296788f60aeaeb1a370151b03ade7 diff --git a/eng/Versions.props b/eng/Versions.props index 6ca5a6acf7b..2d589a3a71f 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -35,7 +35,7 @@ 2.1.1 2.1.0 3.10.0-4.21329.37 - 6.0.100-preview.6.21412.1 + 6.0.100-preview.6.21413.1 16.7.1 4.8.3 5.3.0.1 @@ -65,8 +65,8 @@ 2.4.1 2.0.3 2.4.1 - 6.0.0-beta.21410.8 - 6.0.0-beta.21410.8 + 6.0.0-beta.21412.1 + 6.0.0-beta.21412.1 1.22.0 1.1.2 2.0.0 @@ -77,8 +77,8 @@ 1.1.0-beta.20258.6 1.1.0-beta-21309-01 1.1.0-beta-21309-01 - 6.0.0-beta.21410.8 - 1.0.0-beta.21412.1 + 6.0.0-beta.21412.1 + 1.0.0-beta.21414.1 1.1.0-beta.21378.2 1.0.0-prerelease.21404.1 1.1.156602 diff --git a/global.json b/global.json index 7a6aa9d7c2d..29f6035b606 100644 --- a/global.json +++ b/global.json @@ -3,7 +3,7 @@ "dotnet": "6.0.100-rc.1.21379.2" }, "msbuild-sdks": { - "Microsoft.DotNet.Arcade.Sdk": "6.0.0-beta.21410.8", - "Microsoft.DotNet.Helix.Sdk": "6.0.0-beta.21410.8" + "Microsoft.DotNet.Arcade.Sdk": "6.0.0-beta.21412.1", + "Microsoft.DotNet.Helix.Sdk": "6.0.0-beta.21412.1" } } From df04f7bfcf0bdd315d5468e158a8cf6696760190 Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Tue, 17 Aug 2021 14:11:16 +0000 Subject: [PATCH 302/699] [main] Update dependencies from dotnet/arcade dotnet/sourcelink mono/linker (#7757) [main] Update dependencies from dotnet/arcade dotnet/sourcelink mono/linker --- eng/Version.Details.xml | 32 ++++++++++++++++---------------- eng/Versions.props | 12 ++++++------ global.json | 4 ++-- 3 files changed, 24 insertions(+), 24 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index 2edecd5cef3..20ddd8c52e7 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -11,25 +11,25 @@ - + https://github.com/dotnet/arcade - 58ac7035021bd7277ef7582338afd25403fc9aea + 9b7027ba718462aa6410cef61a8be5a4283e7528 - + https://github.com/dotnet/arcade - 58ac7035021bd7277ef7582338afd25403fc9aea + 9b7027ba718462aa6410cef61a8be5a4283e7528 - + https://github.com/dotnet/arcade - 58ac7035021bd7277ef7582338afd25403fc9aea + 9b7027ba718462aa6410cef61a8be5a4283e7528 - + https://github.com/dotnet/arcade - 58ac7035021bd7277ef7582338afd25403fc9aea + 9b7027ba718462aa6410cef61a8be5a4283e7528 - + https://github.com/dotnet/arcade - 58ac7035021bd7277ef7582338afd25403fc9aea + 9b7027ba718462aa6410cef61a8be5a4283e7528 https://github.com/dotnet/arcade-services @@ -47,18 +47,18 @@ https://github.com/dotnet/roslyn 246ce641f04b67ef017655275d850bf902a8e40f - + https://github.com/mono/linker - c321df28835445093009af394ddf3c31e9b1fc91 + 5b2391c2c56af47350a5789375e8dbddc692e67f - + https://github.com/dotnet/sourcelink - 4b584dbc392bb1aad49c2eb1ab84d8b489b6dccc + eb501912e5ffca67618ed2c9b72b8555a919ee1d - + https://github.com/dotnet/sourcelink - 4b584dbc392bb1aad49c2eb1ab84d8b489b6dccc + eb501912e5ffca67618ed2c9b72b8555a919ee1d https://github.com/dotnet/symreader-converter diff --git a/eng/Versions.props b/eng/Versions.props index 2d589a3a71f..8398be67d89 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -35,7 +35,7 @@ 2.1.1 2.1.0 3.10.0-4.21329.37 - 6.0.100-preview.6.21413.1 + 6.0.100-preview.6.21416.1 16.7.1 4.8.3 5.3.0.1 @@ -65,8 +65,8 @@ 2.4.1 2.0.3 2.4.1 - 6.0.0-beta.21412.1 - 6.0.0-beta.21412.1 + 6.0.0-beta.21413.4 + 6.0.0-beta.21413.4 1.22.0 1.1.2 2.0.0 @@ -75,9 +75,9 @@ 2.0.4 1.1.0-beta2-19575-01 1.1.0-beta.20258.6 - 1.1.0-beta-21309-01 - 1.1.0-beta-21309-01 - 6.0.0-beta.21412.1 + 1.1.0-beta-21416-05 + 1.1.0-beta-21416-05 + 6.0.0-beta.21413.4 1.0.0-beta.21414.1 1.1.0-beta.21378.2 1.0.0-prerelease.21404.1 diff --git a/global.json b/global.json index 29f6035b606..f467e9a773f 100644 --- a/global.json +++ b/global.json @@ -3,7 +3,7 @@ "dotnet": "6.0.100-rc.1.21379.2" }, "msbuild-sdks": { - "Microsoft.DotNet.Arcade.Sdk": "6.0.0-beta.21412.1", - "Microsoft.DotNet.Helix.Sdk": "6.0.0-beta.21412.1" + "Microsoft.DotNet.Arcade.Sdk": "6.0.0-beta.21413.4", + "Microsoft.DotNet.Helix.Sdk": "6.0.0-beta.21413.4" } } From ac445d8450ddae69a13923a8b3a969c802fcc179 Mon Sep 17 00:00:00 2001 From: Jon Fortescue Date: Tue, 17 Aug 2021 09:10:44 -0700 Subject: [PATCH 303/699] Adjust AzDO feed pattern to accommodate dnceng-stage (#7756) --- .../src/model/PublishingConstants.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Microsoft.DotNet.Build.Tasks.Feed/src/model/PublishingConstants.cs b/src/Microsoft.DotNet.Build.Tasks.Feed/src/model/PublishingConstants.cs index af63e0d0285..e222e58fc1b 100644 --- a/src/Microsoft.DotNet.Build.Tasks.Feed/src/model/PublishingConstants.cs +++ b/src/Microsoft.DotNet.Build.Tasks.Feed/src/model/PublishingConstants.cs @@ -31,7 +31,7 @@ public class PublishingConstants // https://pkgs.dev.azure.com/dnceng/public/_packaging/public-feed-name/nuget/v3/index.json // or https://pkgs.dev.azure.com/dnceng/_packaging/internal-feed-name/nuget/v3/index.json public static readonly string AzDoNuGetFeedPattern = - @"https://pkgs.dev.azure.com/(?[a-zA-Z0-9]+)/(?[a-zA-Z0-9-]+/)?_packaging/(?.+)/nuget/v3/index.json"; + @"https://pkgs.dev.azure.com/(?[a-zA-Z0-9-]+)/(?[a-zA-Z0-9-]+/)?_packaging/(?.+)/nuget/v3/index.json"; public enum BuildQuality { From cd4a811405114fab93ff2a1939195339113a1af6 Mon Sep 17 00:00:00 2001 From: Matt Galbraith Date: Tue, 17 Aug 2021 17:59:38 -0700 Subject: [PATCH 304/699] Log client's IP when running build / restore operations (#7761) * https://github.com/dotnet/core-eng/issues/13691 - Log client when running build / restore to try to narrow down AzDO package feed issues * PR feedback; rename function --- eng/common/build.sh | 1 + eng/common/sdk-task.ps1 | 1 + eng/common/tools.ps1 | 21 +++++++++++++++++++++ eng/common/tools.sh | 7 +++++++ 4 files changed, 30 insertions(+) diff --git a/eng/common/build.sh b/eng/common/build.sh index 55b298f16cc..9d3042a943e 100755 --- a/eng/common/build.sh +++ b/eng/common/build.sh @@ -187,6 +187,7 @@ function InitializeCustomToolset { } function Build { + TryLogClientIpAddress InitializeToolset InitializeCustomToolset diff --git a/eng/common/sdk-task.ps1 b/eng/common/sdk-task.ps1 index b1bca63ab1d..7ffa3591e9c 100644 --- a/eng/common/sdk-task.ps1 +++ b/eng/common/sdk-task.ps1 @@ -83,6 +83,7 @@ try { } if ($restore) { + Try-LogClientIpAddress Build 'Restore' } diff --git a/eng/common/tools.ps1 b/eng/common/tools.ps1 index 5d526c74d51..e607aa43697 100644 --- a/eng/common/tools.ps1 +++ b/eng/common/tools.ps1 @@ -154,6 +154,9 @@ function InitializeDotNetCli([bool]$install, [bool]$createSdkLocationFile) { return $global:_DotNetInstallDir } + # In case of network error, try to log the current IP for reference + Try-LogClientIpAddress + # Don't resolve runtime, shared framework, or SDK from other locations to ensure build determinism $env:DOTNET_MULTILEVEL_LOOKUP=0 @@ -872,3 +875,21 @@ if (!$disableConfigureToolsetImport) { } } } + +function Try-LogClientIpAddress() +{ + Write-Host "Attempting to log this client's IP for Azure Package feed telemetry purposes" + try + { + $result = Invoke-WebRequest -Uri "http://co1.msedge.net/fdv2/diagnostics.aspx" -UseBasicParsing + $lines = $result.Content.Split([Environment]::NewLine) + $socketIp = $lines | Select-String -Pattern "^Socket IP:.*" + Write-Host $socketIp + $clientIp = $lines | Select-String -Pattern "^Client IP:.*" + Write-Host $clientIp + } + catch + { + Write-Host "Unable to get this machine's effective IP address for logging: $_" + } +} diff --git a/eng/common/tools.sh b/eng/common/tools.sh index 828119be411..3c5f3a12c0a 100755 --- a/eng/common/tools.sh +++ b/eng/common/tools.sh @@ -399,6 +399,13 @@ function StopProcesses { return 0 } +function TryLogClientIpAddress () { + echo 'Attempting to log this client''s IP for Azure Package feed telemetry purposes' + if command -v curl > /dev/null; then + curl -s 'http://co1.msedge.net/fdv2/diagnostics.aspx' | grep ' IP: ' + fi +} + function MSBuild { local args=$@ if [[ "$pipelines_log" == true ]]; then From ff0fd9299e4bedc52885920ce865b34865735d6a Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Wed, 18 Aug 2021 08:06:17 +0200 Subject: [PATCH 305/699] Update dependencies from https://github.com/dotnet/roslyn build 20210816.10 (#7760) Microsoft.Net.Compilers.Toolset From Version 3.10.0-4.21329.37 -> To Version 4.0.0-4.21416.10 Co-authored-by: dotnet-maestro[bot] --- eng/Version.Details.xml | 4 ++-- eng/Versions.props | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index 20ddd8c52e7..9f954d1086e 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -43,9 +43,9 @@ https://github.com/dotnet/xharness e9669dc84ecd668d3bbb748758103e23b394ffef - + https://github.com/dotnet/roslyn - 246ce641f04b67ef017655275d850bf902a8e40f + d3c561af0682fd0182b5897fb4f4d95a16da95c3 https://github.com/mono/linker diff --git a/eng/Versions.props b/eng/Versions.props index 8398be67d89..9ba37ab911e 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -34,7 +34,7 @@ 2.0.0 2.1.1 2.1.0 - 3.10.0-4.21329.37 + 4.0.0-4.21416.10 6.0.100-preview.6.21416.1 16.7.1 4.8.3 From c24ccf5e85f5d0b2dc2b64dd5145a4ae1d536e95 Mon Sep 17 00:00:00 2001 From: Michelle McDaniel Date: Wed, 18 Aug 2021 13:05:16 -0700 Subject: [PATCH 306/699] retry wait (#7758) --- eng/common/post-build/sourcelink-validation.ps1 | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/eng/common/post-build/sourcelink-validation.ps1 b/eng/common/post-build/sourcelink-validation.ps1 index 85c89861719..3b6fc953337 100644 --- a/eng/common/post-build/sourcelink-validation.ps1 +++ b/eng/common/post-build/sourcelink-validation.ps1 @@ -17,6 +17,7 @@ $global:RepoFiles = @{} $MaxParallelJobs = 16 $MaxRetries = 5 +$RetryWaitTimeInSeconds = 30 # Wait time between check for system load $SecondsBetweenLoadChecks = 10 @@ -99,9 +100,9 @@ $ValidatePackage = { $Status = 200 $Cache = $using:RepoFiles - $totalRetries = 0 + $attempts = 0 - while ($totalRetries -lt $using:MaxRetries) { + while ($attempts -lt $using:MaxRetries) { if ( !($Cache.ContainsKey($FilePath)) ) { try { $Uri = $Link -as [System.URI] @@ -113,7 +114,7 @@ $ValidatePackage = { else { # If it's not a github link, we want to break out of the loop and not retry. $Status = 0 - $totalRetries = $using:MaxRetries + $attempts = $using:MaxRetries } } catch { @@ -123,9 +124,15 @@ $ValidatePackage = { } if ($Status -ne 200) { - $totalRetries++ + $attempts++ - if ($totalRetries -ge $using:MaxRetries) { + if ($attempts -lt $using:MaxRetries) + { + $attemptsLeft = $using:MaxRetries - $attempts + Write-Warning "Download failed, $attemptsLeft attempts remaining, will retry in $using:RetryWaitTimeInSeconds seconds" + Start-Sleep -Seconds $using:RetryWaitTimeInSeconds + } + else { if ($NumFailedLinks -eq 0) { if ($FailedFiles.Value -eq 0) { Write-Host From c17de7fcb8e37291c7dff7e153cdabfdee4c5eb7 Mon Sep 17 00:00:00 2001 From: Jacques Eloff Date: Wed, 18 Aug 2021 13:41:45 -0700 Subject: [PATCH 307/699] Generate packs in parallel (#7764) --- .../src/GenerateMsiBase.cs | 4 ++-- .../src/GenerateWorkloadMsis.cs | 10 ++++++++-- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/src/Microsoft.DotNet.Build.Tasks.Workloads/src/GenerateMsiBase.cs b/src/Microsoft.DotNet.Build.Tasks.Workloads/src/GenerateMsiBase.cs index 3f36c9d0a11..c139e72dc51 100644 --- a/src/Microsoft.DotNet.Build.Tasks.Workloads/src/GenerateMsiBase.cs +++ b/src/Microsoft.DotNet.Build.Tasks.Workloads/src/GenerateMsiBase.cs @@ -157,7 +157,7 @@ protected IEnumerable Generate(string sourcePackage, string swixPacka File.Copy(sourcePackage, Path.Combine(packageContentsDirectory, Path.GetFileName(sourcePackage))); } - foreach (string platform in platforms) + System.Threading.Tasks.Parallel.ForEach(platforms, platform => { // Extract the MSI template and add it to the list of source files. List sourceFiles = new(); @@ -296,7 +296,7 @@ protected IEnumerable Generate(string sourcePackage, string swixPacka msi.SetMetadata(Metadata.PackageProject, GeneratePackageProject(msi.ItemSpec, msiJsonPath, platform, nupkg)); msis.Add(msi); - } + }); return msis; } diff --git a/src/Microsoft.DotNet.Build.Tasks.Workloads/src/GenerateWorkloadMsis.cs b/src/Microsoft.DotNet.Build.Tasks.Workloads/src/GenerateWorkloadMsis.cs index 6f34c971a29..50340821555 100644 --- a/src/Microsoft.DotNet.Build.Tasks.Workloads/src/GenerateWorkloadMsis.cs +++ b/src/Microsoft.DotNet.Build.Tasks.Workloads/src/GenerateWorkloadMsis.cs @@ -63,6 +63,8 @@ public override bool Execute() IEnumerable workloadPacks = GetWorkloadPacks(); List missingPackIds = new(workloadPacks.Select(p => $"{p.Id}")); + List<(string sourcePackage, string swixPackageId, string outputPath, WorkloadPackKind kind, string[] platforms)> packsToGenerate = new(); + foreach (WorkloadPack pack in workloadPacks) { Log.LogMessage($"Processing workload pack: {pack.Id}, Version: {pack.Version}"); @@ -88,11 +90,15 @@ public override bool Execute() string swixPackageId = $"{pack.Id.ToString().Replace(ShortNames)}.{pack.Version}"; // Always select the pack ID for the VS MSI package, even when aliased. - msis.AddRange(Generate(sourcePackage, swixPackageId, - OutputPath, pack.Kind, platforms)); + packsToGenerate.Add(new(sourcePackage, swixPackageId, OutputPath, pack.Kind, platforms)); } } + System.Threading.Tasks.Parallel.ForEach(packsToGenerate, p => + { + msis.AddRange(Generate(p.sourcePackage, p.swixPackageId, p.outputPath, p.kind, p.platforms)); + }); + Msis = msis.ToArray(); MissingPacks = missingPacks.ToArray(); } From 693912ce2ca8ad647e3ed2ff0714350b0acd4d46 Mon Sep 17 00:00:00 2001 From: Christopher Costa Date: Wed, 18 Aug 2021 14:55:30 -0700 Subject: [PATCH 308/699] Refactor source-index to use its own .net core (#7763) * Refactor source-index to use its own .net core * PR feedback: remove dotnet roll forward env var --- .../templates/job/source-index-stage1.yml | 21 +++++++------------ 1 file changed, 8 insertions(+), 13 deletions(-) diff --git a/eng/common/templates/job/source-index-stage1.yml b/eng/common/templates/job/source-index-stage1.yml index b58d42364b9..1cc0c29e4fd 100644 --- a/eng/common/templates/job/source-index-stage1.yml +++ b/eng/common/templates/job/source-index-stage1.yml @@ -34,29 +34,24 @@ jobs: inputs: packageType: sdk version: 3.1.x - - - task: UseDotNet@2 - displayName: Use .NET Core sdk - inputs: - useGlobalJson: true + installationPath: $(Agent.TempDirectory)/dotnet + workingDirectory: $(Agent.TempDirectory) - script: | - dotnet tool install BinLogToSln --version $(SourceIndexPackageVersion) --add-source $(SourceIndexPackageSource) --tool-path .source-index/tools - dotnet tool install UploadIndexStage1 --version $(SourceIndexPackageVersion) --add-source $(SourceIndexPackageSource) --tool-path .source-index/tools - echo ##vso[task.prependpath]$(Build.SourcesDirectory)/.source-index/tools + $(Agent.TempDirectory)/dotnet/dotnet tool install BinLogToSln --version $(SourceIndexPackageVersion) --add-source $(SourceIndexPackageSource) --tool-path $(Agent.TempDirectory)/.source-index/tools + $(Agent.TempDirectory)/dotnet/dotnet tool install UploadIndexStage1 --version $(SourceIndexPackageVersion) --add-source $(SourceIndexPackageSource) --tool-path $(Agent.TempDirectory)/.source-index/tools displayName: Download Tools + # Set working directory to temp directory so 'dotnet' doesn't try to use global.json and use the repo's sdk. + workingDirectory: $(Agent.TempDirectory) - script: ${{ parameters.sourceIndexBuildCommand }} displayName: Build Repository - - script: BinLogToSln -i $(BinlogPath) -r $(Build.SourcesDirectory) -n $(Build.Repository.Name) -o .source-index/stage1output + - script: $(Agent.TempDirectory)/.source-index/tools/BinLogToSln -i $(BinlogPath) -r $(Build.SourcesDirectory) -n $(Build.Repository.Name) -o .source-index/stage1output displayName: Process Binlog into indexable sln - env: - DOTNET_ROLL_FORWARD_ON_NO_CANDIDATE_FX: 2 - ${{ if and(eq(parameters.runAsPublic, 'false'), ne(variables['System.TeamProject'], 'public'), notin(variables['Build.Reason'], 'PullRequest')) }}: - - script: UploadIndexStage1 -i .source-index/stage1output -n $(Build.Repository.Name) + - script: $(Agent.TempDirectory)/.source-index/tools/UploadIndexStage1 -i .source-index/stage1output -n $(Build.Repository.Name) displayName: Upload stage1 artifacts to source index env: BLOB_CONTAINER_URL: $(source-dot-net-stage1-blob-container-url) - DOTNET_ROLL_FORWARD_ON_NO_CANDIDATE_FX: 2 From 312089f54f4a4dc908184bcb6b7bbf3ce77edd08 Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Wed, 18 Aug 2021 23:58:43 +0000 Subject: [PATCH 309/699] [main] Update dependencies from dotnet/xliff-tasks dotnet/arcade dotnet/sourcelink (#7762) [main] Update dependencies from dotnet/xliff-tasks dotnet/arcade dotnet/sourcelink --- eng/Version.Details.xml | 28 ++++++++++++++-------------- eng/Versions.props | 12 ++++++------ global.json | 4 ++-- 3 files changed, 22 insertions(+), 22 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index 9f954d1086e..a67186a80f6 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -11,25 +11,25 @@ - + https://github.com/dotnet/arcade - 9b7027ba718462aa6410cef61a8be5a4283e7528 + df04f7bfcf0bdd315d5468e158a8cf6696760190 - + https://github.com/dotnet/arcade - 9b7027ba718462aa6410cef61a8be5a4283e7528 + df04f7bfcf0bdd315d5468e158a8cf6696760190 - + https://github.com/dotnet/arcade - 9b7027ba718462aa6410cef61a8be5a4283e7528 + df04f7bfcf0bdd315d5468e158a8cf6696760190 - + https://github.com/dotnet/arcade - 9b7027ba718462aa6410cef61a8be5a4283e7528 + df04f7bfcf0bdd315d5468e158a8cf6696760190 - + https://github.com/dotnet/arcade - 9b7027ba718462aa6410cef61a8be5a4283e7528 + df04f7bfcf0bdd315d5468e158a8cf6696760190 https://github.com/dotnet/arcade-services @@ -51,12 +51,12 @@ https://github.com/mono/linker 5b2391c2c56af47350a5789375e8dbddc692e67f - + https://github.com/dotnet/sourcelink eb501912e5ffca67618ed2c9b72b8555a919ee1d - + https://github.com/dotnet/sourcelink eb501912e5ffca67618ed2c9b72b8555a919ee1d @@ -68,9 +68,9 @@ https://github.com/dotnet/symreader-converter c5ba7c88f92e2dde156c324a8c8edc04d9fa4fe0 - + https://github.com/dotnet/xliff-tasks - 5cc5c3fb5e3296788f60aeaeb1a370151b03ade7 + 956a13308e5bc4b812fce23e7fec796b25630ac8 diff --git a/eng/Versions.props b/eng/Versions.props index 9ba37ab911e..1038820791e 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -65,8 +65,8 @@ 2.4.1 2.0.3 2.4.1 - 6.0.0-beta.21413.4 - 6.0.0-beta.21413.4 + 6.0.0-beta.21417.1 + 6.0.0-beta.21417.1 1.22.0 1.1.2 2.0.0 @@ -75,10 +75,10 @@ 2.0.4 1.1.0-beta2-19575-01 1.1.0-beta.20258.6 - 1.1.0-beta-21416-05 - 1.1.0-beta-21416-05 - 6.0.0-beta.21413.4 - 1.0.0-beta.21414.1 + 1.1.0-beta-21417-01 + 1.1.0-beta-21417-01 + 6.0.0-beta.21417.1 + 1.0.0-beta.21417.1 1.1.0-beta.21378.2 1.0.0-prerelease.21404.1 1.1.156602 diff --git a/global.json b/global.json index f467e9a773f..704add88046 100644 --- a/global.json +++ b/global.json @@ -3,7 +3,7 @@ "dotnet": "6.0.100-rc.1.21379.2" }, "msbuild-sdks": { - "Microsoft.DotNet.Arcade.Sdk": "6.0.0-beta.21413.4", - "Microsoft.DotNet.Helix.Sdk": "6.0.0-beta.21413.4" + "Microsoft.DotNet.Arcade.Sdk": "6.0.0-beta.21417.1", + "Microsoft.DotNet.Helix.Sdk": "6.0.0-beta.21417.1" } } From ac8b7514ca8bcac1d071a16b7a92cb52f7058871 Mon Sep 17 00:00:00 2001 From: Chad Nedzlek Date: Wed, 18 Aug 2021 17:07:48 -0700 Subject: [PATCH 310/699] Add test-configuration.json documentation (#7749) --- src/Microsoft.DotNet.Helix/Sdk/Readme.md | 77 ++++++++++++++++++++++++ 1 file changed, 77 insertions(+) diff --git a/src/Microsoft.DotNet.Helix/Sdk/Readme.md b/src/Microsoft.DotNet.Helix/Sdk/Readme.md index ac3d16a0406..5b8774440e4 100644 --- a/src/Microsoft.DotNet.Helix/Sdk/Readme.md +++ b/src/Microsoft.DotNet.Helix/Sdk/Readme.md @@ -286,3 +286,80 @@ You may assume that all the following variables are set on any given Helix clien - **HELIX_CURRENT_LOG** : Path to the current work item's console log (note: will typically have file handles open) +## Test Retry +Helix supports retrying and reporting on partial successes for tests based on repository specific configuration. +When the configuration matches a test failure, the test assembly is reexecuted, and the results compared. +Tests that failed partially (only in some executions) will be reported to Azure DevOps as "Passed on Rerun", +which will include each iteration as a sub-result of the failing test. +If a test passes or fails in all attempts, only a single report is made representing the first execution. + +To opt-in and configure test retries when using helix, create file in the reporitory at "eng/test-configuration.json" + +### test-configuraion.json format +```json +{ + "version" : 1, + "defaultOnFailure": "fail", + "localRerunCount" : 2, + "retryOnRules": [ + {"testName": {"regex": "^System\\.Networking\\..*"}}, + {"testAssembly": {"wildcard": "System.SomethingElse.*" }}, + {"failureMessage": "network disconnected" }, + ], + "failOnRules": [ + ], + "quarantineRules": [ + ] +} +``` + +## Description +### version +Schema version for compatibility (curent version is 1) + +### defaultOnFailure +- default: "fail" + +One of "fail" or "rerun" +
+
fail
If a test fails, the default behavior if no rules match is to fail the test immediate
+
rerun
If a test fails, the default behavior is no rules match is to rerun the test according to the localRerun/remoteRerun counts
+
+ +## localRerunCount +- default: 1 + +This number indicates the number of times a test that needs to be "rerun" should be rerun on the local computer immediately. +This is the fastest rerun option, because the payloads don't need to be redownloaded, so it always the first attempted re-execution method. + +In the example, with a value of "2", that means that the test will need to fail 3 times before being marks as failed (1 intial failure, and 2 rerun failures). + +## rules +The three "rules" entries are lists of rules that will be used to match test to determine desired behavior. In the case of multiple rule matches: +- if a quarantine rule matches, the test is quarantined +- if the default behavior is "rerun" and a "fail" rule matches, the test is failed +- if the default behavior is "fail" and a "rerun" rule matches, the test is rerun +- default behavior is used + +A "rule" consists of a property, and then a rule object + +### Properties +
+
testName
The name of the test, including namespace, class name, and method name
+
testAssembly
The name of the assembly containing the test
+
failureMessage
The failure message logged by the test
+
callstack (multiline)
The callstack reported by the test execution
+
+ +### Rule object +For all rules, if a property is designated "multiline", then the rule must match a line, otherwise the entire value is used. + +All comparisons are case-insensitive +#### Raw string (e.g. "rule string") +True if the property value exactly matches the string +#### {"contains": "value"} +True if the property contains (case-insensitive) the value string +#### {"wildcard": "value with * wildcard"} +The same as a raw string, but "*" can match any number of characters, and "?" can match one character +#### {"regex": "value with .* regex"} +true if the property matches the regular expression From 65029c89ce7d1a4a8e61e0febb18fc0be5a1b2d4 Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Thu, 19 Aug 2021 14:28:59 +0000 Subject: [PATCH 311/699] [main] Update dependencies from dotnet/xliff-tasks dotnet/arcade mono/linker (#7768) [main] Update dependencies from dotnet/xliff-tasks dotnet/arcade mono/linker --- eng/Version.Details.xml | 26 +++++++++++++------------- eng/Versions.props | 10 +++++----- global.json | 4 ++-- 3 files changed, 20 insertions(+), 20 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index a67186a80f6..1ceeddcdd39 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -11,25 +11,25 @@
- + https://github.com/dotnet/arcade - df04f7bfcf0bdd315d5468e158a8cf6696760190 + ac8b7514ca8bcac1d071a16b7a92cb52f7058871 - + https://github.com/dotnet/arcade - df04f7bfcf0bdd315d5468e158a8cf6696760190 + ac8b7514ca8bcac1d071a16b7a92cb52f7058871 - + https://github.com/dotnet/arcade - df04f7bfcf0bdd315d5468e158a8cf6696760190 + ac8b7514ca8bcac1d071a16b7a92cb52f7058871 - + https://github.com/dotnet/arcade - df04f7bfcf0bdd315d5468e158a8cf6696760190 + ac8b7514ca8bcac1d071a16b7a92cb52f7058871 - + https://github.com/dotnet/arcade - df04f7bfcf0bdd315d5468e158a8cf6696760190 + ac8b7514ca8bcac1d071a16b7a92cb52f7058871 https://github.com/dotnet/arcade-services @@ -47,7 +47,7 @@ https://github.com/dotnet/roslyn d3c561af0682fd0182b5897fb4f4d95a16da95c3 - + https://github.com/mono/linker 5b2391c2c56af47350a5789375e8dbddc692e67f @@ -68,9 +68,9 @@ https://github.com/dotnet/symreader-converter c5ba7c88f92e2dde156c324a8c8edc04d9fa4fe0 - + https://github.com/dotnet/xliff-tasks - 956a13308e5bc4b812fce23e7fec796b25630ac8 + 1eb796ccdaef78f10078697459329952dd082462 diff --git a/eng/Versions.props b/eng/Versions.props index 1038820791e..a050a36cd7b 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -35,7 +35,7 @@ 2.1.1 2.1.0 4.0.0-4.21416.10 - 6.0.100-preview.6.21416.1 + 6.0.100-preview.6.21418.3 16.7.1 4.8.3 5.3.0.1 @@ -65,8 +65,8 @@ 2.4.1 2.0.3 2.4.1 - 6.0.0-beta.21417.1 - 6.0.0-beta.21417.1 + 6.0.0-beta.21418.12 + 6.0.0-beta.21418.12 1.22.0 1.1.2 2.0.0 @@ -77,8 +77,8 @@ 1.1.0-beta.20258.6 1.1.0-beta-21417-01 1.1.0-beta-21417-01 - 6.0.0-beta.21417.1 - 1.0.0-beta.21417.1 + 6.0.0-beta.21418.12 + 1.0.0-beta.21418.1 1.1.0-beta.21378.2 1.0.0-prerelease.21404.1 1.1.156602 diff --git a/global.json b/global.json index 704add88046..05c969c752d 100644 --- a/global.json +++ b/global.json @@ -3,7 +3,7 @@ "dotnet": "6.0.100-rc.1.21379.2" }, "msbuild-sdks": { - "Microsoft.DotNet.Arcade.Sdk": "6.0.0-beta.21417.1", - "Microsoft.DotNet.Helix.Sdk": "6.0.0-beta.21417.1" + "Microsoft.DotNet.Arcade.Sdk": "6.0.0-beta.21418.12", + "Microsoft.DotNet.Helix.Sdk": "6.0.0-beta.21418.12" } } From 23372e950114fb772652f79d9990129db55edff8 Mon Sep 17 00:00:00 2001 From: Michelle McDaniel Date: Thu, 19 Aug 2021 12:53:49 -0700 Subject: [PATCH 312/699] Adjust the algorithm in GetVersionForSingleSegment (#7769) * Adjust the algorithm in GetVersionForSingleSegment GetVersionForSingleSegment assumes that if we find a fully formed major.minor.patch in the name of a file, followed by something that is not part of the version, that is definitely the version of the file. However, there are instances where there are two well formed major.minor.patch versions in the file name. For example: `Microsoft.NET.Workload.Mono.ToolChain.Manifest-6.0.100.Msi.x64.6.0.0-rc.1.21380.2.symbols.nupkg`. Mono puts the Sdk version in the name of their packages, in addition to the version of the package itself. GetVersionForSingleSegment sees the 6.0.100 followed by .Msi, recognizes that .Msi is not part of a major.minor.patch, and returns 6.0.100, without considering that there is considerably more in the file name that should be considered. This change adds a dictionary to track every potential version in a segment, and where in the segment the potential version was found. It then will return the version that occurs the latest in the segment. * Add the asset name that broke to the csv * Address feedback * Fix testcase file * name them --- .../src/BuildManifest/VersionIdentifier.cs | 34 ++++++++++++++----- .../BuildManifest/VersionIdentiferTests.cs | 1 + .../VersionIdentifierTestsAssets.csv | 1 + 3 files changed, 27 insertions(+), 9 deletions(-) diff --git a/src/Microsoft.DotNet.VersionTools/lib/src/BuildManifest/VersionIdentifier.cs b/src/Microsoft.DotNet.VersionTools/lib/src/BuildManifest/VersionIdentifier.cs index 39d44ed7a95..0f010d83037 100644 --- a/src/Microsoft.DotNet.VersionTools/lib/src/BuildManifest/VersionIdentifier.cs +++ b/src/Microsoft.DotNet.VersionTools/lib/src/BuildManifest/VersionIdentifier.cs @@ -87,14 +87,19 @@ private static string GetVersionForSingleSegment(string assetPathSegment) // then look for a minor.patch, completing the major.minor.patch. Continue to do so until we get // to something that is NOT major.minor.patch (this is necessary because we sometimes see things like: // VS.Redist.Common.NetCore.Templates.x86.2.2.3.0.101-servicing-014320.nupkg + // Continue iterating until we find ALL potential versions. Return the one that is the latest in the segment + // This is to deal with files with multiple major.minor.patchs in the file name, for example: + // Microsoft.NET.Workload.Mono.ToolChain.Manifest-6.0.100.Msi.x64.6.0.0-rc.1.21380.2.symbols.nupkg int currentIndex = 0; // Stack of major.minor.patch. - Stack majorMinorPatchStack = new Stack(3); + Stack<(int versionNumber, int index)> majorMinorPatchStack = new Stack<(int,int)>(3); string majorMinorPatch = null; + int majorMinorPatchIndex = 0; StringBuilder versionSuffix = new StringBuilder(); char prevDelimiterCharacter = char.MinValue; char nextDelimiterCharacter = char.MinValue; + Dictionary majorMinorPatchDictionary = new Dictionary(); while (true) { string nextSegment; @@ -124,7 +129,7 @@ private static string GetVersionForSingleSegment(string assetPathSegment) if ((majorMinorPatchStack.Count == 0 && isNumber) || (majorMinorPatchStack.Count > 0 && prevDelimiterCharacter == '.' && isNumber)) { - majorMinorPatchStack.Push(potentialVersionSegment); + majorMinorPatchStack.Push((potentialVersionSegment, currentIndex)); } // Check for partial major.minor.patch cases, like: 2.2.bar or 2.2-100.bleh else if (majorMinorPatchStack.Count > 0 && majorMinorPatchStack.Count < 3 && @@ -137,10 +142,11 @@ private static string GetVersionForSingleSegment(string assetPathSegment) if (majorMinorPatchStack.Count >= 3 && (prevDelimiterCharacter != '.' || !isNumber || nextDelimiterIndex == -1)) { // Done with major.minor.patch, found. Pop the top 3 elements off the stack. - int patch = majorMinorPatchStack.Pop(); - int minor = majorMinorPatchStack.Pop(); - int major = majorMinorPatchStack.Pop(); + (int patch, int patchIndex) = majorMinorPatchStack.Pop(); + (int minor, int minorIndex) = majorMinorPatchStack.Pop(); + (int major, int majorIndex) = majorMinorPatchStack.Pop(); majorMinorPatch = $"{major}.{minor}.{patch}"; + majorMinorPatchIndex = majorIndex; } } @@ -160,11 +166,15 @@ private static string GetVersionForSingleSegment(string assetPathSegment) if (versionSuffix.Length == 0 && (prevDelimiterCharacter != '-' || !_knownTags.Any(tag => nextSegment.StartsWith(tag, StringComparison.OrdinalIgnoreCase)))) { - return majorMinorPatch; + majorMinorPatchDictionary.Add(majorMinorPatchIndex, majorMinorPatch); + majorMinorPatch = null; + versionSuffix = new StringBuilder(); } else if (versionSuffix.Length != 0 && !int.TryParse(nextSegment, out int potentialVersionSegment) && nextSegment != _finalSuffix) { - return $"{majorMinorPatch}{versionSuffix.ToString()}"; + majorMinorPatchDictionary.Add(majorMinorPatchIndex, $"{majorMinorPatch}{versionSuffix.ToString()}"); + majorMinorPatch = null; + versionSuffix = new StringBuilder(); } else { @@ -184,12 +194,18 @@ private static string GetVersionForSingleSegment(string assetPathSegment) } } - if (string.IsNullOrEmpty(majorMinorPatch)) + if(majorMinorPatch != null) + { + majorMinorPatchDictionary.Add(majorMinorPatchIndex, $"{majorMinorPatch}{versionSuffix.ToString()}"); + } + + if (!majorMinorPatchDictionary.Any()) { return null; } - return $"{majorMinorPatch}{versionSuffix.ToString()}"; + int maxKey = majorMinorPatchDictionary.Keys.Max(); + return majorMinorPatchDictionary[maxKey]; } /// diff --git a/src/Microsoft.DotNet.VersionTools/tests/BuildManifest/VersionIdentiferTests.cs b/src/Microsoft.DotNet.VersionTools/tests/BuildManifest/VersionIdentiferTests.cs index eaa6ad85c8d..4982b09128a 100644 --- a/src/Microsoft.DotNet.VersionTools/tests/BuildManifest/VersionIdentiferTests.cs +++ b/src/Microsoft.DotNet.VersionTools/tests/BuildManifest/VersionIdentiferTests.cs @@ -34,6 +34,7 @@ public class VersionTests [InlineData("What-Is-A.FooPackage.2.2.10.0.1", "10.0.1")] [InlineData("What-Is-A.FooPackage.2.2.10.0.1-beta.final", "10.0.1-beta.final")] [InlineData("What-Is-A.FooPackage.2.2.10.0.1-preview1.12345.1", "10.0.1-preview1.12345.1")] + [InlineData("What-Is-A.FooPackage.2.2.0.Extra.Stuff.10.0.1-preview1.12345.1", "10.0.1-preview1.12345.1")] [InlineData("What-Is-A.FooPackage", null)] [InlineData("What-Is-A.FooPackage-2.2-64", null)] [InlineData("What-Is-A.FooPackage-2.2.nupkg", null)] diff --git a/src/Microsoft.DotNet.VersionTools/tests/BuildManifest/VersionIdentifierTestsAssets.csv b/src/Microsoft.DotNet.VersionTools/tests/BuildManifest/VersionIdentifierTestsAssets.csv index b059326b8fa..0a98976aafc 100644 --- a/src/Microsoft.DotNet.VersionTools/tests/BuildManifest/VersionIdentifierTestsAssets.csv +++ b/src/Microsoft.DotNet.VersionTools/tests/BuildManifest/VersionIdentifierTestsAssets.csv @@ -4960,3 +4960,4 @@ Microsoft.DotNet.Web.ProjectTemplates.2.2.2.2.7.nupkg,2.2.7,Microsoft.DotNet.Web Microsoft.DotNet.Web.Spa.ProjectTemplates.2.2.2.2.7.nupkg,2.2.7,Microsoft.DotNet.Web.Spa.ProjectTemplates.2.2.nupkg runtime.win-x64.Microsoft.AspNetCore.All.2.2.7.nupkg,2.2.7,runtime.win-x64.Microsoft.AspNetCore.All.nupkg runtime.win-x64.Microsoft.AspNetCore.App.2.2.7.nupkg,2.2.7,runtime.win-x64.Microsoft.AspNetCore.App.nupkg +assets/symbols/Microsoft.NET.Workload.Mono.ToolChain.Manifest-6.0.100.Msi.x64.6.0.0-preview.7.21377.20.symbols.nupkg,6.0.0-preview.7.21377.20,assets/symbols/Microsoft.NET.Workload.Mono.ToolChain.Manifest-6.0.100.Msi.x64.symbols.nupkg From c8294557a38c03353c43f6b2a652baeb9f665f48 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C5=99emek=20Vysok=C3=BD?= Date: Fri, 20 Aug 2021 18:17:09 +0200 Subject: [PATCH 313/699] Fix Android retry/reboot in Helix SDK (#7771) --- .../xharness-helix-job.android.ps1 | 6 ++---- .../xharness-helix-job.android.sh | 16 +++++++--------- 2 files changed, 9 insertions(+), 13 deletions(-) diff --git a/src/Microsoft.DotNet.Helix/Sdk/tools/xharness-runner/xharness-helix-job.android.ps1 b/src/Microsoft.DotNet.Helix/Sdk/tools/xharness-runner/xharness-helix-job.android.ps1 index 9736ebf140c..f67b706f538 100644 --- a/src/Microsoft.DotNet.Helix/Sdk/tools/xharness-runner/xharness-helix-job.android.ps1 +++ b/src/Microsoft.DotNet.Helix/Sdk/tools/xharness-runner/xharness-helix-job.android.ps1 @@ -42,6 +42,7 @@ $reboot=$false switch ($exit_code) { + # ADB_DEVICE_ENUMERATION_FAILURE 85 { $ErrorActionPreference="Continue" Write-Error "Encountered ADB_DEVICE_ENUMERATION_FAILURE. This is typically not a failure of the work item. We will run it again and reboot this computer to help its devices" @@ -51,6 +52,7 @@ switch ($exit_code) Break } + # PACKAGE_INSTALLATION_FAILURE 78 { $ErrorActionPreference="Continue" Write-Error "Encountered PACKAGE_INSTALLATION_FAILURE. This is typically not a failure of the work item. We will try it again on another Helix agent" @@ -60,15 +62,11 @@ switch ($exit_code) } } -# ADB_DEVICE_ENUMERATION_FAILURE if ($retry) { - & "$Env:HELIX_PYTHONPATH" -c "from helix.workitemutil import request_infra_retry; request_infra_retry('Retrying because we could not enumerate all Android devices')" } -# PACKAGE_INSTALLATION_FAILURE if ($reboot) { - & "$Env:HELIX_PYTHONPATH" -c "from helix.workitemutil import request_reboot; request_reboot('Rebooting to allow Android emulator or device to restart')" } diff --git a/src/Microsoft.DotNet.Helix/Sdk/tools/xharness-runner/xharness-helix-job.android.sh b/src/Microsoft.DotNet.Helix/Sdk/tools/xharness-runner/xharness-helix-job.android.sh index 3f958fb5c1a..d6501bc00c3 100644 --- a/src/Microsoft.DotNet.Helix/Sdk/tools/xharness-runner/xharness-helix-job.android.sh +++ b/src/Microsoft.DotNet.Helix/Sdk/tools/xharness-runner/xharness-helix-job.android.sh @@ -81,9 +81,11 @@ reboot=false # Too see where these values come from, check out https://github.com/dotnet/xharness/blob/master/src/Microsoft.DotNet.XHarness.Common/CLI/ExitCode.cs # Avoid any helix-ism in the Xharness! +ADB_DEVICE_ENUMERATION_FAILURE=85 +PACKAGE_INSTALLATION_FAILURE=78 case "$exit_code" in - 85) + $ADB_DEVICE_ENUMERATION_FAILURE) # This handles issues where devices or emulators fail to start. # The only solution is to reboot the machine, so we request a work item retry + agent reboot when this happens echo 'Encountered ADB_DEVICE_ENUMERATION_FAILURE. This is typically not a failure of the work item. We will run it again and reboot this computer to help its devices' @@ -91,7 +93,7 @@ case "$exit_code" in retry=true reboot=true ;; - 78) + $PACKAGE_INSTALLATION_FAILURE) # This handles issues where APKs fail to install. # We already reboot a device inside XHarness and now request a work item retry when this happens echo 'Encountered PACKAGE_INSTALLATION_FAILURE. This is typically not a failure of the work item. We will try it again on another Helix agent' @@ -100,16 +102,12 @@ case "$exit_code" in ;; esac - - -ADB_DEVICE_ENUMERATION_FAILURE=85 -if [ "$retry"]; then +if [ "$retry" == true ]; then "$HELIX_PYTHONPATH" -c "from helix.workitemutil import request_infra_retry; request_infra_retry('Retrying because we could not enumerate all Android devices')" fi -PACKAGE_INSTALLATION_FAILURE=78 -if [ $exit_code -eq PACKAGE_INSTALLATION_FAILURE ]; then - "$HELIX_PYTHONPATH" -c "from helix.workitemutil import request_reboot; request_reboot('Rebooting to allow Android emulator or device to restart.')" +if [ "$reboot" == true ]; then + "$HELIX_PYTHONPATH" -c "from helix.workitemutil import request_reboot; request_reboot('Rebooting to allow Android emulator to restart')" fi exit $exit_code From fe787bd48ed72e51a98eb5e4e5e5af74edb531e5 Mon Sep 17 00:00:00 2001 From: Christopher Costa Date: Fri, 20 Aug 2021 14:34:38 -0700 Subject: [PATCH 314/699] Use an indexed array instead of an associative array (#7772) --- eng/common/init-tools-native.sh | 2 +- eng/common/native/common-library.sh | 8 ++++++-- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/eng/common/init-tools-native.sh b/eng/common/init-tools-native.sh index 5bd205b5da3..3e6a8d6acf2 100755 --- a/eng/common/init-tools-native.sh +++ b/eng/common/init-tools-native.sh @@ -10,7 +10,7 @@ force=false download_retries=5 retry_wait_time_seconds=30 global_json_file="$(dirname "$(dirname "${scriptroot}")")/global.json" -declare -A native_assets +declare -a native_assets . $scriptroot/pipeline-logging-functions.sh . $scriptroot/native/common-library.sh diff --git a/eng/common/native/common-library.sh b/eng/common/native/common-library.sh index bf272dcf55a..080c2c283ae 100755 --- a/eng/common/native/common-library.sh +++ b/eng/common/native/common-library.sh @@ -148,8 +148,12 @@ function NewScriptShim { fi if [[ ! -f $tool_file_path ]]; then - Write-PipelineTelemetryError -category 'NativeToolsBootstrap' "Specified tool file path:'$tool_file_path' does not exist" - return 1 + # try to see if the path is lower cased + tool_file_path="$(echo $tool_file_path | tr "[:upper:]" "[:lower:]")" + if [[ ! -f $tool_file_path ]]; then + Write-PipelineTelemetryError -category 'NativeToolsBootstrap' "Specified tool file path:'$tool_file_path' does not exist" + return 1 + fi fi local shim_contents=$'#!/usr/bin/env bash\n' From b8b66a734411ae984164f5c902d3e83f361e2240 Mon Sep 17 00:00:00 2001 From: Matt Galbraith Date: Mon, 23 Aug 2021 16:24:51 -0700 Subject: [PATCH 315/699] Ignore curl failures for no-network build scenario (#7781) * https://github.com/dotnet/arcade/issues/7778 - Ignore curl failures for no-network build scenario * https://github.com/dotnet/arcade/issues/7776 - only do logging when -ci is defined --- eng/common/build.sh | 5 ++++- eng/common/sdk-task.ps1 | 4 +++- eng/common/tools.ps1 | 6 +++--- eng/common/tools.sh | 2 +- 4 files changed, 11 insertions(+), 6 deletions(-) diff --git a/eng/common/build.sh b/eng/common/build.sh index 9d3042a943e..bc07a1c6848 100755 --- a/eng/common/build.sh +++ b/eng/common/build.sh @@ -187,7 +187,10 @@ function InitializeCustomToolset { } function Build { - TryLogClientIpAddress + + if [[ "$ci" == true ]]; then + TryLogClientIpAddress + fi InitializeToolset InitializeCustomToolset diff --git a/eng/common/sdk-task.ps1 b/eng/common/sdk-task.ps1 index 7ffa3591e9c..7ab9baac5c8 100644 --- a/eng/common/sdk-task.ps1 +++ b/eng/common/sdk-task.ps1 @@ -83,7 +83,9 @@ try { } if ($restore) { - Try-LogClientIpAddress + if ($ci) { + Try-LogClientIpAddress + } Build 'Restore' } diff --git a/eng/common/tools.ps1 b/eng/common/tools.ps1 index e607aa43697..56ee4a577ac 100644 --- a/eng/common/tools.ps1 +++ b/eng/common/tools.ps1 @@ -154,9 +154,6 @@ function InitializeDotNetCli([bool]$install, [bool]$createSdkLocationFile) { return $global:_DotNetInstallDir } - # In case of network error, try to log the current IP for reference - Try-LogClientIpAddress - # Don't resolve runtime, shared framework, or SDK from other locations to ensure build determinism $env:DOTNET_MULTILEVEL_LOOKUP=0 @@ -166,6 +163,9 @@ function InitializeDotNetCli([bool]$install, [bool]$createSdkLocationFile) { # Disable telemetry on CI. if ($ci) { $env:DOTNET_CLI_TELEMETRY_OPTOUT=1 + + # In case of network error, try to log the current IP for reference + Try-LogClientIpAddress } # Source Build uses DotNetCoreSdkDir variable diff --git a/eng/common/tools.sh b/eng/common/tools.sh index 3c5f3a12c0a..41e323104df 100755 --- a/eng/common/tools.sh +++ b/eng/common/tools.sh @@ -402,7 +402,7 @@ function StopProcesses { function TryLogClientIpAddress () { echo 'Attempting to log this client''s IP for Azure Package feed telemetry purposes' if command -v curl > /dev/null; then - curl -s 'http://co1.msedge.net/fdv2/diagnostics.aspx' | grep ' IP: ' + curl -s 'http://co1.msedge.net/fdv2/diagnostics.aspx' | grep ' IP: ' || true fi } From 3dd12f0a1d25fa29b84e38b7d2345a693f4ae45e Mon Sep 17 00:00:00 2001 From: Igor Velikorossov Date: Wed, 25 Aug 2021 09:10:40 +1000 Subject: [PATCH 316/699] Revert "Work around implicit usings breaking change (#7745)" (#7766) This reverts commit 5f00dd25263e2070c88d5094db7c2727520754b3. --- src/Microsoft.DotNet.Arcade.Sdk/tools/ProjectDefaults.props | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/Microsoft.DotNet.Arcade.Sdk/tools/ProjectDefaults.props b/src/Microsoft.DotNet.Arcade.Sdk/tools/ProjectDefaults.props index 962f5ec4781..bebb3cacec2 100644 --- a/src/Microsoft.DotNet.Arcade.Sdk/tools/ProjectDefaults.props +++ b/src/Microsoft.DotNet.Arcade.Sdk/tools/ProjectDefaults.props @@ -22,9 +22,6 @@ true - - - true false From 65c6d2fae35c9e7166b3d50aa7061115ebe26cdb Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Wed, 25 Aug 2021 14:31:19 +0000 Subject: [PATCH 317/699] [main] Update dependencies from dotnet/xliff-tasks dotnet/arcade dotnet/sourcelink mono/linker (#7770) [main] Update dependencies from dotnet/xliff-tasks dotnet/arcade dotnet/sourcelink mono/linker --- eng/Version.Details.xml | 36 ++++++++++++++++++------------------ eng/Versions.props | 14 +++++++------- global.json | 4 ++-- 3 files changed, 27 insertions(+), 27 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index 1ceeddcdd39..5660e53bbf2 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -11,25 +11,25 @@ - + https://github.com/dotnet/arcade - ac8b7514ca8bcac1d071a16b7a92cb52f7058871 + 3dd12f0a1d25fa29b84e38b7d2345a693f4ae45e - + https://github.com/dotnet/arcade - ac8b7514ca8bcac1d071a16b7a92cb52f7058871 + 3dd12f0a1d25fa29b84e38b7d2345a693f4ae45e - + https://github.com/dotnet/arcade - ac8b7514ca8bcac1d071a16b7a92cb52f7058871 + 3dd12f0a1d25fa29b84e38b7d2345a693f4ae45e - + https://github.com/dotnet/arcade - ac8b7514ca8bcac1d071a16b7a92cb52f7058871 + 3dd12f0a1d25fa29b84e38b7d2345a693f4ae45e - + https://github.com/dotnet/arcade - ac8b7514ca8bcac1d071a16b7a92cb52f7058871 + 3dd12f0a1d25fa29b84e38b7d2345a693f4ae45e https://github.com/dotnet/arcade-services @@ -47,18 +47,18 @@ https://github.com/dotnet/roslyn d3c561af0682fd0182b5897fb4f4d95a16da95c3 - + https://github.com/mono/linker - 5b2391c2c56af47350a5789375e8dbddc692e67f + edad7cbe1c568d299c196883de57fb5519fd6399 - + https://github.com/dotnet/sourcelink - eb501912e5ffca67618ed2c9b72b8555a919ee1d + 6dcc7d005e38829efb6714d2ecfc4c0cb383e7d9 - + https://github.com/dotnet/sourcelink - eb501912e5ffca67618ed2c9b72b8555a919ee1d + 6dcc7d005e38829efb6714d2ecfc4c0cb383e7d9 https://github.com/dotnet/symreader-converter @@ -68,9 +68,9 @@ https://github.com/dotnet/symreader-converter c5ba7c88f92e2dde156c324a8c8edc04d9fa4fe0 - + https://github.com/dotnet/xliff-tasks - 1eb796ccdaef78f10078697459329952dd082462 + 370da425b0478879d5f8f407b3e4db495bcdcc11 diff --git a/eng/Versions.props b/eng/Versions.props index a050a36cd7b..1ccb1da3feb 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -35,7 +35,7 @@ 2.1.1 2.1.0 4.0.0-4.21416.10 - 6.0.100-preview.6.21418.3 + 6.0.100-preview.6.21424.4 16.7.1 4.8.3 5.3.0.1 @@ -65,8 +65,8 @@ 2.4.1 2.0.3 2.4.1 - 6.0.0-beta.21418.12 - 6.0.0-beta.21418.12 + 6.0.0-beta.21424.3 + 6.0.0-beta.21424.3 1.22.0 1.1.2 2.0.0 @@ -75,10 +75,10 @@ 2.0.4 1.1.0-beta2-19575-01 1.1.0-beta.20258.6 - 1.1.0-beta-21417-01 - 1.1.0-beta-21417-01 - 6.0.0-beta.21418.12 - 1.0.0-beta.21418.1 + 1.1.0-beta-21423-02 + 1.1.0-beta-21423-02 + 6.0.0-beta.21424.3 + 1.0.0-beta.21421.1 1.1.0-beta.21378.2 1.0.0-prerelease.21404.1 1.1.156602 diff --git a/global.json b/global.json index 05c969c752d..80122916358 100644 --- a/global.json +++ b/global.json @@ -3,7 +3,7 @@ "dotnet": "6.0.100-rc.1.21379.2" }, "msbuild-sdks": { - "Microsoft.DotNet.Arcade.Sdk": "6.0.0-beta.21418.12", - "Microsoft.DotNet.Helix.Sdk": "6.0.0-beta.21418.12" + "Microsoft.DotNet.Arcade.Sdk": "6.0.0-beta.21424.3", + "Microsoft.DotNet.Helix.Sdk": "6.0.0-beta.21424.3" } } From cf9a9a6752af831d42f51fe620c94c2dbf09b685 Mon Sep 17 00:00:00 2001 From: Matt Galbraith Date: Wed, 25 Aug 2021 11:05:31 -0700 Subject: [PATCH 318/699] Include Helix Docker image for test reporting : Follow up from https://github.com/dotnet/arcade/pull/7383. This means we now depend on the Helix clients to do reporting, and the code path is somewhat different for Docker, so let's test one docker variation (#7790) --- .../Microsoft.DotNet.Helix.Sdk.Tests/HelpersTests.cs | 8 ++++++++ tests/UnitTests.proj | 2 ++ 2 files changed, 10 insertions(+) diff --git a/src/Microsoft.DotNet.Helix/Sdk.Tests/Microsoft.DotNet.Helix.Sdk.Tests/HelpersTests.cs b/src/Microsoft.DotNet.Helix/Sdk.Tests/Microsoft.DotNet.Helix.Sdk.Tests/HelpersTests.cs index b14dab3163f..11bd6c6921b 100644 --- a/src/Microsoft.DotNet.Helix/Sdk.Tests/Microsoft.DotNet.Helix.Sdk.Tests/HelpersTests.cs +++ b/src/Microsoft.DotNet.Helix/Sdk.Tests/Microsoft.DotNet.Helix.Sdk.Tests/HelpersTests.cs @@ -43,6 +43,14 @@ public void VerifyNonEncodedFowardSlashIsConverted() public void FailOnceThenPass() { string target = Path.Combine(Environment.GetEnvironmentVariable("HELIX_WORKITEM_ROOT") ?? Environment.GetEnvironmentVariable("TEMP"), "my-test-file-123456.snt"); + + // If we're inside a Helix Docker work item, GetTempPath() is cleaned every execution, + // but the work item's own directory is not (and is writeable from inside Docker), so use it. + if (!string.IsNullOrEmpty(Environment.GetEnvironmentVariable("HELIX_DOCKER_ENTRYPOINT"))) + { + target = Path.Combine(Environment.GetEnvironmentVariable("HELIX_WORKITEM_PAYLOAD"), "my-test-file-123456.snt"); + } + bool exists = File.Exists(target); if (!exists) { diff --git a/tests/UnitTests.proj b/tests/UnitTests.proj index e1f2e16a924..b200bcfd4a6 100644 --- a/tests/UnitTests.proj +++ b/tests/UnitTests.proj @@ -61,6 +61,7 @@ + @@ -73,6 +74,7 @@ + From 809cbb58dea1d1e477ab0e12855d1758d50844a8 Mon Sep 17 00:00:00 2001 From: Michelle McDaniel Date: Wed, 25 Aug 2021 13:12:19 -0700 Subject: [PATCH 319/699] Skip validating submodules sourcelinks (#7784) Currently, sourcelink is broken for submodules, where it will assume that the link is actually in the current repo, rather than having info based on the actual repo the submodule came from. There is work to fix submodule links in sourcelink, but until that fix is in, we should just ignore all links are from submodules. --- eng/common/post-build/sourcelink-validation.ps1 | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/eng/common/post-build/sourcelink-validation.ps1 b/eng/common/post-build/sourcelink-validation.ps1 index 3b6fc953337..e8ab29afeb3 100644 --- a/eng/common/post-build/sourcelink-validation.ps1 +++ b/eng/common/post-build/sourcelink-validation.ps1 @@ -107,8 +107,12 @@ $ValidatePackage = { try { $Uri = $Link -as [System.URI] - # Only GitHub links are valid - if ($Uri.AbsoluteURI -ne $null -and ($Uri.Host -match 'github' -or $Uri.Host -match 'githubusercontent')) { + if ($Link -match "submodules") { + # Skip submodule links until sourcelink properly handles submodules + $Status = 200 + } + elseif ($Uri.AbsoluteURI -ne $null -and ($Uri.Host -match 'github' -or $Uri.Host -match 'githubusercontent')) { + # Only GitHub links are valid $Status = (Invoke-WebRequest -Uri $Link -UseBasicParsing -Method HEAD -TimeoutSec 5).StatusCode } else { From 91c5da471db529ad34e052ad7b43ac9745b47ff7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C5=99emek=20Vysok=C3=BD?= Date: Thu, 26 Aug 2021 00:48:12 +0200 Subject: [PATCH 320/699] Use full .NET SDK to run XHarness (temporarily) (#7788) * Use full .NET SDK to run XHarness (temporarily) https://github.com/dotnet/arcade/issues/7787 * Add TODOs, lock the RC1 version better --- .../Sdk/tools/dotnet-cli/DotNetCli.props | 3 ++- .../Sdk/tools/xharness-runner/XHarnessRunner.targets | 10 ++++++++-- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/src/Microsoft.DotNet.Helix/Sdk/tools/dotnet-cli/DotNetCli.props b/src/Microsoft.DotNet.Helix/Sdk/tools/dotnet-cli/DotNetCli.props index 9d2697f8d41..a18693c65f8 100644 --- a/src/Microsoft.DotNet.Helix/Sdk/tools/dotnet-cli/DotNetCli.props +++ b/src/Microsoft.DotNet.Helix/Sdk/tools/dotnet-cli/DotNetCli.props @@ -1,7 +1,8 @@ false - 6.0.0-rc.1.21378.2 + + 6.0.100-rc.1.21379.2 runtime $(BundledNETCoreAppPackageVersion) diff --git a/src/Microsoft.DotNet.Helix/Sdk/tools/xharness-runner/XHarnessRunner.targets b/src/Microsoft.DotNet.Helix/Sdk/tools/xharness-runner/XHarnessRunner.targets index 113944554d5..d8f3802f7c3 100644 --- a/src/Microsoft.DotNet.Helix/Sdk/tools/xharness-runner/XHarnessRunner.targets +++ b/src/Microsoft.DotNet.Helix/Sdk/tools/xharness-runner/XHarnessRunner.targets @@ -3,8 +3,14 @@ true true - aspnetcore-runtime - 6.0.100-preview.2.21155.3 + + + sdk + 6.0.100-rc.1.21379.2 $(AspNetCoreRuntimeVersion) From 5c1cc8292a9eadebad94f32fdc40a0e0acf00632 Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Thu, 26 Aug 2021 11:33:16 +0000 Subject: [PATCH 321/699] Update dependencies from https://github.com/dotnet/xharness build 20210826.1 (#7796) [main] Update dependencies from dotnet/xharness --- eng/Version.Details.xml | 4 ++-- eng/Versions.props | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index 5660e53bbf2..955cf81cc43 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -39,9 +39,9 @@ https://github.com/dotnet/arcade-services cac955fe259cb611f6a29d09209bd717deb69037 - + https://github.com/dotnet/xharness - e9669dc84ecd668d3bbb748758103e23b394ffef + d78f6e0d1ed604c4409b6fdfc692dd08b27460a9 https://github.com/dotnet/roslyn diff --git a/eng/Versions.props b/eng/Versions.props index 1ccb1da3feb..11c4e2333f1 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -80,7 +80,7 @@ 6.0.0-beta.21424.3 1.0.0-beta.21421.1 1.1.0-beta.21378.2 - 1.0.0-prerelease.21404.1 + 1.0.0-prerelease.21426.1 1.1.156602 1.1.156602 6.0.100-preview.5.21254.11 From e737b1f920e7e1a37f99dae198bbd957c293b9c8 Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Thu, 26 Aug 2021 15:06:26 +0000 Subject: [PATCH 322/699] [main] Update dependencies from dotnet/xliff-tasks dotnet/arcade (#7797) [main] Update dependencies from dotnet/xliff-tasks dotnet/arcade --- eng/Version.Details.xml | 24 ++++++++++++------------ eng/Versions.props | 8 ++++---- global.json | 4 ++-- 3 files changed, 18 insertions(+), 18 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index 955cf81cc43..a2eb7b30940 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -11,25 +11,25 @@ - + https://github.com/dotnet/arcade - 3dd12f0a1d25fa29b84e38b7d2345a693f4ae45e + 809cbb58dea1d1e477ab0e12855d1758d50844a8 - + https://github.com/dotnet/arcade - 3dd12f0a1d25fa29b84e38b7d2345a693f4ae45e + 809cbb58dea1d1e477ab0e12855d1758d50844a8 - + https://github.com/dotnet/arcade - 3dd12f0a1d25fa29b84e38b7d2345a693f4ae45e + 809cbb58dea1d1e477ab0e12855d1758d50844a8 - + https://github.com/dotnet/arcade - 3dd12f0a1d25fa29b84e38b7d2345a693f4ae45e + 809cbb58dea1d1e477ab0e12855d1758d50844a8 - + https://github.com/dotnet/arcade - 3dd12f0a1d25fa29b84e38b7d2345a693f4ae45e + 809cbb58dea1d1e477ab0e12855d1758d50844a8 https://github.com/dotnet/arcade-services @@ -68,9 +68,9 @@ https://github.com/dotnet/symreader-converter c5ba7c88f92e2dde156c324a8c8edc04d9fa4fe0 - + https://github.com/dotnet/xliff-tasks - 370da425b0478879d5f8f407b3e4db495bcdcc11 + efd11df517e8f73e593602648d5ec9ce7ae9671a diff --git a/eng/Versions.props b/eng/Versions.props index 11c4e2333f1..a036bdeebcf 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -65,8 +65,8 @@ 2.4.1 2.0.3 2.4.1 - 6.0.0-beta.21424.3 - 6.0.0-beta.21424.3 + 6.0.0-beta.21425.3 + 6.0.0-beta.21425.3 1.22.0 1.1.2 2.0.0 @@ -77,8 +77,8 @@ 1.1.0-beta.20258.6 1.1.0-beta-21423-02 1.1.0-beta-21423-02 - 6.0.0-beta.21424.3 - 1.0.0-beta.21421.1 + 6.0.0-beta.21425.3 + 1.0.0-beta.21425.1 1.1.0-beta.21378.2 1.0.0-prerelease.21426.1 1.1.156602 diff --git a/global.json b/global.json index 80122916358..ff9ea7bb524 100644 --- a/global.json +++ b/global.json @@ -3,7 +3,7 @@ "dotnet": "6.0.100-rc.1.21379.2" }, "msbuild-sdks": { - "Microsoft.DotNet.Arcade.Sdk": "6.0.0-beta.21424.3", - "Microsoft.DotNet.Helix.Sdk": "6.0.0-beta.21424.3" + "Microsoft.DotNet.Arcade.Sdk": "6.0.0-beta.21425.3", + "Microsoft.DotNet.Helix.Sdk": "6.0.0-beta.21425.3" } } From 9e06b734560aac11047203d95765ef9c00d067a9 Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Thu, 26 Aug 2021 15:26:06 -0700 Subject: [PATCH 323/699] Update dependencies from https://github.com/dotnet/roslyn build 20210820.19 (#7777) Microsoft.Net.Compilers.Toolset From Version 4.0.0-4.21416.10 -> To Version 4.0.0-4.21420.19 Co-authored-by: dotnet-maestro[bot] Co-authored-by: Ricardo Arenas --- eng/Version.Details.xml | 4 ++-- eng/Versions.props | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index a2eb7b30940..e20b8a3b719 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -43,9 +43,9 @@ https://github.com/dotnet/xharness d78f6e0d1ed604c4409b6fdfc692dd08b27460a9 - + https://github.com/dotnet/roslyn - d3c561af0682fd0182b5897fb4f4d95a16da95c3 + 158f906df6b1e4ca99fe7cf6ed78822515d64230 https://github.com/mono/linker diff --git a/eng/Versions.props b/eng/Versions.props index a036bdeebcf..f6f97022af9 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -34,9 +34,9 @@ 2.0.0 2.1.1 2.1.0 - 4.0.0-4.21416.10 - 6.0.100-preview.6.21424.4 + 4.0.0-4.21420.19 16.7.1 + 6.0.100-preview.6.21424.4 4.8.3 5.3.0.1 2.3.0 From d3faddd971cfccde85e0a14c92e717bcba320859 Mon Sep 17 00:00:00 2001 From: Missy Messa <47990216+missymessa@users.noreply.github.com> Date: Thu, 26 Aug 2021 16:41:31 -0700 Subject: [PATCH 324/699] updating Microbuild task (#7800) --- eng/common/templates/job/job.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/eng/common/templates/job/job.yml b/eng/common/templates/job/job.yml index 86696793480..37dceb1bab0 100644 --- a/eng/common/templates/job/job.yml +++ b/eng/common/templates/job/job.yml @@ -103,7 +103,7 @@ jobs: - ${{ if and(eq(parameters.runAsPublic, 'false'), ne(variables['System.TeamProject'], 'public'), notin(variables['Build.Reason'], 'PullRequest')) }}: - ${{ if eq(parameters.enableMicrobuild, 'true') }}: - - task: MicroBuildSigningPlugin@2 + - task: MicroBuildSigningPlugin@3 displayName: Install MicroBuild plugin inputs: signType: $(_SignType) From 870d4582f5fe1a8a7ca9a14cc1de0fc88ee4d4f6 Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Fri, 27 Aug 2021 13:54:20 +0000 Subject: [PATCH 325/699] Update dependencies from https://github.com/dotnet/xliff-tasks build 20210826.1 (#7801) [main] Update dependencies from dotnet/xliff-tasks --- eng/Version.Details.xml | 4 ++-- eng/Versions.props | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index e20b8a3b719..533ab4bc7df 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -68,9 +68,9 @@ https://github.com/dotnet/symreader-converter c5ba7c88f92e2dde156c324a8c8edc04d9fa4fe0 - + https://github.com/dotnet/xliff-tasks - efd11df517e8f73e593602648d5ec9ce7ae9671a + 22d8cfd8807ba8e4f2e32eeb9f207010ca5e6f6d diff --git a/eng/Versions.props b/eng/Versions.props index f6f97022af9..5199a8ab0c1 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -78,7 +78,7 @@ 1.1.0-beta-21423-02 1.1.0-beta-21423-02 6.0.0-beta.21425.3 - 1.0.0-beta.21425.1 + 1.0.0-beta.21426.1 1.1.0-beta.21378.2 1.0.0-prerelease.21426.1 1.1.156602 From 84b26300de4e0bde9f672f8bfd73d017c56ee49e Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Fri, 27 Aug 2021 16:26:39 +0000 Subject: [PATCH 326/699] Update dependencies from https://github.com/dotnet/arcade build 20210826.2 (#7802) [main] Update dependencies from dotnet/arcade --- eng/Version.Details.xml | 20 ++++++++++---------- eng/Versions.props | 6 +++--- global.json | 4 ++-- 3 files changed, 15 insertions(+), 15 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index 533ab4bc7df..14fc2f0dc83 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -11,25 +11,25 @@ - + https://github.com/dotnet/arcade - 809cbb58dea1d1e477ab0e12855d1758d50844a8 + e737b1f920e7e1a37f99dae198bbd957c293b9c8 - + https://github.com/dotnet/arcade - 809cbb58dea1d1e477ab0e12855d1758d50844a8 + e737b1f920e7e1a37f99dae198bbd957c293b9c8 - + https://github.com/dotnet/arcade - 809cbb58dea1d1e477ab0e12855d1758d50844a8 + e737b1f920e7e1a37f99dae198bbd957c293b9c8 - + https://github.com/dotnet/arcade - 809cbb58dea1d1e477ab0e12855d1758d50844a8 + e737b1f920e7e1a37f99dae198bbd957c293b9c8 - + https://github.com/dotnet/arcade - 809cbb58dea1d1e477ab0e12855d1758d50844a8 + e737b1f920e7e1a37f99dae198bbd957c293b9c8 https://github.com/dotnet/arcade-services diff --git a/eng/Versions.props b/eng/Versions.props index 5199a8ab0c1..c16b72def89 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -65,8 +65,8 @@ 2.4.1 2.0.3 2.4.1 - 6.0.0-beta.21425.3 - 6.0.0-beta.21425.3 + 6.0.0-beta.21426.2 + 6.0.0-beta.21426.2 1.22.0 1.1.2 2.0.0 @@ -77,7 +77,7 @@ 1.1.0-beta.20258.6 1.1.0-beta-21423-02 1.1.0-beta-21423-02 - 6.0.0-beta.21425.3 + 6.0.0-beta.21426.2 1.0.0-beta.21426.1 1.1.0-beta.21378.2 1.0.0-prerelease.21426.1 diff --git a/global.json b/global.json index ff9ea7bb524..5d8c2303402 100644 --- a/global.json +++ b/global.json @@ -3,7 +3,7 @@ "dotnet": "6.0.100-rc.1.21379.2" }, "msbuild-sdks": { - "Microsoft.DotNet.Arcade.Sdk": "6.0.0-beta.21425.3", - "Microsoft.DotNet.Helix.Sdk": "6.0.0-beta.21425.3" + "Microsoft.DotNet.Arcade.Sdk": "6.0.0-beta.21426.2", + "Microsoft.DotNet.Helix.Sdk": "6.0.0-beta.21426.2" } } From 6308d16d0fa0679f8efbc63556ae9a73b20f2be8 Mon Sep 17 00:00:00 2001 From: Jacques Eloff Date: Fri, 27 Aug 2021 10:55:01 -0700 Subject: [PATCH 327/699] Add platform discriminator to workload pack record (#7803) * Add platform to workload pack records * fix formatting * Move platform to key path --- .../src/MsiTemplate/Registry.wxs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Microsoft.DotNet.Build.Tasks.Workloads/src/MsiTemplate/Registry.wxs b/src/Microsoft.DotNet.Build.Tasks.Workloads/src/MsiTemplate/Registry.wxs index 99f2127088e..8a206723b47 100644 --- a/src/Microsoft.DotNet.Build.Tasks.Workloads/src/MsiTemplate/Registry.wxs +++ b/src/Microsoft.DotNet.Build.Tasks.Workloads/src/MsiTemplate/Registry.wxs @@ -6,7 +6,7 @@ - + From 474307e526160c813c9fd58060eb8356ccca6099 Mon Sep 17 00:00:00 2001 From: Missy Messa <47990216+missymessa@users.noreply.github.com> Date: Fri, 27 Aug 2021 10:57:13 -0700 Subject: [PATCH 328/699] Updating Microbuild signing version (#7804) --- Documentation/ArcadeSdk.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Documentation/ArcadeSdk.md b/Documentation/ArcadeSdk.md index 5ef96cf064d..554bfd7bb92 100644 --- a/Documentation/ArcadeSdk.md +++ b/Documentation/ArcadeSdk.md @@ -630,7 +630,7 @@ The steps below assume the following variables to be defined: ### Signing plugin installation ```yml -- task: ms-vseng.MicroBuildTasks.30666190-6959-11e5-9f96-f56098202fef.MicroBuildSigningPlugin@1 +- task: MicroBuildSigningPlugin@3 displayName: Install Signing Plugin inputs: signType: real From e0260cb677c04cb0244aad7537c33bec4adce422 Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Mon, 30 Aug 2021 13:45:40 +0000 Subject: [PATCH 329/699] [main] Update dependencies from dotnet/xharness dotnet/xliff-tasks dotnet/arcade (#7809) [main] Update dependencies from dotnet/xharness dotnet/xliff-tasks dotnet/arcade --- eng/Version.Details.xml | 28 ++++++++++++++-------------- eng/Versions.props | 10 +++++----- global.json | 4 ++-- 3 files changed, 21 insertions(+), 21 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index 14fc2f0dc83..f510811d22e 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -11,25 +11,25 @@ - + https://github.com/dotnet/arcade - e737b1f920e7e1a37f99dae198bbd957c293b9c8 + 474307e526160c813c9fd58060eb8356ccca6099 - + https://github.com/dotnet/arcade - e737b1f920e7e1a37f99dae198bbd957c293b9c8 + 474307e526160c813c9fd58060eb8356ccca6099 - + https://github.com/dotnet/arcade - e737b1f920e7e1a37f99dae198bbd957c293b9c8 + 474307e526160c813c9fd58060eb8356ccca6099 - + https://github.com/dotnet/arcade - e737b1f920e7e1a37f99dae198bbd957c293b9c8 + 474307e526160c813c9fd58060eb8356ccca6099 - + https://github.com/dotnet/arcade - e737b1f920e7e1a37f99dae198bbd957c293b9c8 + 474307e526160c813c9fd58060eb8356ccca6099 https://github.com/dotnet/arcade-services @@ -39,9 +39,9 @@ https://github.com/dotnet/arcade-services cac955fe259cb611f6a29d09209bd717deb69037 - + https://github.com/dotnet/xharness - d78f6e0d1ed604c4409b6fdfc692dd08b27460a9 + 2e03d2d1081b606ad3c5f79709297a9c5627854d https://github.com/dotnet/roslyn @@ -68,9 +68,9 @@ https://github.com/dotnet/symreader-converter c5ba7c88f92e2dde156c324a8c8edc04d9fa4fe0 - + https://github.com/dotnet/xliff-tasks - 22d8cfd8807ba8e4f2e32eeb9f207010ca5e6f6d + 178ed3c7ed19e5bda54a8c3f15a5c441ee63ab93 diff --git a/eng/Versions.props b/eng/Versions.props index c16b72def89..66a51cf30ff 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -65,8 +65,8 @@ 2.4.1 2.0.3 2.4.1 - 6.0.0-beta.21426.2 - 6.0.0-beta.21426.2 + 6.0.0-beta.21427.6 + 6.0.0-beta.21427.6 1.22.0 1.1.2 2.0.0 @@ -77,10 +77,10 @@ 1.1.0-beta.20258.6 1.1.0-beta-21423-02 1.1.0-beta-21423-02 - 6.0.0-beta.21426.2 - 1.0.0-beta.21426.1 + 6.0.0-beta.21427.6 + 1.0.0-beta.21428.1 1.1.0-beta.21378.2 - 1.0.0-prerelease.21426.1 + 1.0.0-prerelease.21427.1 1.1.156602 1.1.156602 6.0.100-preview.5.21254.11 diff --git a/global.json b/global.json index 5d8c2303402..aefc817aafd 100644 --- a/global.json +++ b/global.json @@ -3,7 +3,7 @@ "dotnet": "6.0.100-rc.1.21379.2" }, "msbuild-sdks": { - "Microsoft.DotNet.Arcade.Sdk": "6.0.0-beta.21426.2", - "Microsoft.DotNet.Helix.Sdk": "6.0.0-beta.21426.2" + "Microsoft.DotNet.Arcade.Sdk": "6.0.0-beta.21427.6", + "Microsoft.DotNet.Helix.Sdk": "6.0.0-beta.21427.6" } } From 9c863771f98ce82f1d853fed2d0f15bec8390620 Mon Sep 17 00:00:00 2001 From: Nikola Milosavljevic Date: Mon, 30 Aug 2021 13:43:24 -0700 Subject: [PATCH 330/699] Additional RPMs for CBL-Mariner (#7812) --- .../build/installer.singlerid.targets | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/src/Microsoft.DotNet.Build.Tasks.Installers/build/installer.singlerid.targets b/src/Microsoft.DotNet.Build.Tasks.Installers/build/installer.singlerid.targets index ea33a56ee66..a692fecae35 100644 --- a/src/Microsoft.DotNet.Build.Tasks.Installers/build/installer.singlerid.targets +++ b/src/Microsoft.DotNet.Build.Tasks.Installers/build/installer.singlerid.targets @@ -145,6 +145,20 @@ $(PackageOutputPath)$(InstallerFileNameWithoutExtension).exe $(PackageOutputPath)$(InstallerFileNameWithoutExtension)-engine.exe + + + true + + false + + + + <_CblMarinerVersionSuffix>cm.1 + <_InstallerBuildPartCblMariner>$(Version)-$(_CblMarinerVersionSuffix)-$(InstallerTargetArchitecture) + <_InstallerFileNameWithoutExtensionCblMariner>$(InstallerName)-$(_InstallerBuildPartCblMariner)$(CrossArchContentsBuildPart) + <_InstallerFileCblMariner>$(PackageOutputPath)$(_InstallerFileNameWithoutExtensionCblMariner)$(InstallerExtension) + netcoreapp3.1 - net5.0 + net6.0 diff --git a/src/Common/Microsoft.Arcade.Common.Tests/Microsoft.Arcade.Common.Tests.csproj b/src/Common/Microsoft.Arcade.Common.Tests/Microsoft.Arcade.Common.Tests.csproj index 653588d240f..98b2095803f 100644 --- a/src/Common/Microsoft.Arcade.Common.Tests/Microsoft.Arcade.Common.Tests.csproj +++ b/src/Common/Microsoft.Arcade.Common.Tests/Microsoft.Arcade.Common.Tests.csproj @@ -3,6 +3,7 @@ netcoreapp3.1 enable + true diff --git a/src/Common/Microsoft.Arcade.Common/Microsoft.Arcade.Common.csproj b/src/Common/Microsoft.Arcade.Common/Microsoft.Arcade.Common.csproj index 324725f5426..ac04f51722d 100644 --- a/src/Common/Microsoft.Arcade.Common/Microsoft.Arcade.Common.csproj +++ b/src/Common/Microsoft.Arcade.Common/Microsoft.Arcade.Common.csproj @@ -2,6 +2,7 @@ net472;netstandard2.0 + netstandard2.0 true diff --git a/src/Common/Microsoft.Arcade.Test.Common/Microsoft.Arcade.Test.Common.csproj b/src/Common/Microsoft.Arcade.Test.Common/Microsoft.Arcade.Test.Common.csproj index bb3c5eeb152..bcc3d7179d4 100644 --- a/src/Common/Microsoft.Arcade.Test.Common/Microsoft.Arcade.Test.Common.csproj +++ b/src/Common/Microsoft.Arcade.Test.Common/Microsoft.Arcade.Test.Common.csproj @@ -3,6 +3,7 @@ netcoreapp3.1;net472 true + true diff --git a/src/Microsoft.DotNet.Arcade.Sdk/Microsoft.DotNet.Arcade.Sdk.csproj b/src/Microsoft.DotNet.Arcade.Sdk/Microsoft.DotNet.Arcade.Sdk.csproj index 7cc96f188ed..63544dd9c13 100644 --- a/src/Microsoft.DotNet.Arcade.Sdk/Microsoft.DotNet.Arcade.Sdk.csproj +++ b/src/Microsoft.DotNet.Arcade.Sdk/Microsoft.DotNet.Arcade.Sdk.csproj @@ -19,7 +19,7 @@ false false <_GeneratedVersionFilePath>$(IntermediateOutputPath)DefaultVersions.Generated.props - 3021;NU5105 + 3021;NU5105;SYSLIB0013 diff --git a/src/Microsoft.DotNet.Arcade.Sdk/src/CalculateAssemblyAndFileVersions.cs b/src/Microsoft.DotNet.Arcade.Sdk/src/CalculateAssemblyAndFileVersions.cs index b65c0985bc3..4eae5836756 100644 --- a/src/Microsoft.DotNet.Arcade.Sdk/src/CalculateAssemblyAndFileVersions.cs +++ b/src/Microsoft.DotNet.Arcade.Sdk/src/CalculateAssemblyAndFileVersions.cs @@ -12,7 +12,7 @@ namespace Microsoft.DotNet.Arcade.Sdk /// File version has 4 parts and need to increase every official build.This is especially important when building MSIs. /// See https://github.com/dotnet/arcade/blob/master/Documentation/CorePackages/Versioning.md#assembly-version. /// - public class CalculateAssemblyAndFileVersions : Task + public class CalculateAssemblyAndFileVersions : Microsoft.Build.Utilities.Task { private const int MaxMinor = 654; private const int MaxBuild = 9999; diff --git a/src/Microsoft.DotNet.Arcade.Sdk/src/CheckRequiredDotNetVersion.cs b/src/Microsoft.DotNet.Arcade.Sdk/src/CheckRequiredDotNetVersion.cs index 6819daa3016..8b49d82309c 100644 --- a/src/Microsoft.DotNet.Arcade.Sdk/src/CheckRequiredDotNetVersion.cs +++ b/src/Microsoft.DotNet.Arcade.Sdk/src/CheckRequiredDotNetVersion.cs @@ -11,7 +11,7 @@ namespace Microsoft.DotNet.Arcade.Sdk { - public class CheckRequiredDotNetVersion : Task + public class CheckRequiredDotNetVersion : Microsoft.Build.Utilities.Task { private static readonly string s_cacheKey = "CheckRequiredDotNetVersion-6ED0A075-A4B3-46B1-97D4-448558D515D3"; diff --git a/src/Microsoft.DotNet.Arcade.Sdk/src/CompareVersions.cs b/src/Microsoft.DotNet.Arcade.Sdk/src/CompareVersions.cs index 3a8586d471a..27be9af27db 100644 --- a/src/Microsoft.DotNet.Arcade.Sdk/src/CompareVersions.cs +++ b/src/Microsoft.DotNet.Arcade.Sdk/src/CompareVersions.cs @@ -7,7 +7,7 @@ namespace Microsoft.DotNet.Arcade.Sdk { - public class CompareVersions : Task + public class CompareVersions : Microsoft.Build.Utilities.Task { [Required] public string Left { get; set; } diff --git a/src/Microsoft.DotNet.Arcade.Sdk/src/DownloadFile.cs b/src/Microsoft.DotNet.Arcade.Sdk/src/DownloadFile.cs index 7f75eb23dae..3c8f19e9aca 100644 --- a/src/Microsoft.DotNet.Arcade.Sdk/src/DownloadFile.cs +++ b/src/Microsoft.DotNet.Arcade.Sdk/src/DownloadFile.cs @@ -13,7 +13,7 @@ namespace Microsoft.DotNet.Arcade.Sdk { - public class DownloadFile : Task, ICancelableTask + public class DownloadFile : Microsoft.Build.Utilities.Task, ICancelableTask { /// /// List of URls to attempt download from. Accepted metadata are: diff --git a/src/Microsoft.DotNet.Arcade.Sdk/src/ExtractNgenMethodList.cs b/src/Microsoft.DotNet.Arcade.Sdk/src/ExtractNgenMethodList.cs index 61d1373af99..579f86475e0 100644 --- a/src/Microsoft.DotNet.Arcade.Sdk/src/ExtractNgenMethodList.cs +++ b/src/Microsoft.DotNet.Arcade.Sdk/src/ExtractNgenMethodList.cs @@ -17,7 +17,7 @@ namespace Microsoft.DotNet.Arcade.Sdk /// Used to convert a raw XML dump from IBCMerge into the set of methods which will be NGEN'd when /// partial NGEN is enabled /// - public sealed class ExtractNgenMethodList : Task + public sealed class ExtractNgenMethodList : Microsoft.Build.Utilities.Task { /// /// This is the XML file produced by passing -dxml to ibcmerge. It will be transformed into the set of diff --git a/src/Microsoft.DotNet.Arcade.Sdk/src/GenerateChecksums.cs b/src/Microsoft.DotNet.Arcade.Sdk/src/GenerateChecksums.cs index 8fa04acf84b..6370ce65532 100644 --- a/src/Microsoft.DotNet.Arcade.Sdk/src/GenerateChecksums.cs +++ b/src/Microsoft.DotNet.Arcade.Sdk/src/GenerateChecksums.cs @@ -9,7 +9,7 @@ namespace Microsoft.DotNet.Arcade.Sdk { - public class GenerateChecksums : Task + public class GenerateChecksums : Microsoft.Build.Utilities.Task { /// /// An item collection of files for which to generate checksums. Each item must have metadata diff --git a/src/Microsoft.DotNet.Arcade.Sdk/src/GenerateResxSource.cs b/src/Microsoft.DotNet.Arcade.Sdk/src/GenerateResxSource.cs index 20eea4a6d3b..dd4168581b0 100644 --- a/src/Microsoft.DotNet.Arcade.Sdk/src/GenerateResxSource.cs +++ b/src/Microsoft.DotNet.Arcade.Sdk/src/GenerateResxSource.cs @@ -14,7 +14,7 @@ namespace Microsoft.DotNet.Arcade.Sdk { - public sealed class GenerateResxSource : Task + public sealed class GenerateResxSource : Microsoft.Build.Utilities.Task { private const int maxDocCommentLength = 256; diff --git a/src/Microsoft.DotNet.Arcade.Sdk/src/GenerateSourcePackageSourceLinkTargetsFile.cs b/src/Microsoft.DotNet.Arcade.Sdk/src/GenerateSourcePackageSourceLinkTargetsFile.cs index de64492076d..bdfc35ffd2f 100644 --- a/src/Microsoft.DotNet.Arcade.Sdk/src/GenerateSourcePackageSourceLinkTargetsFile.cs +++ b/src/Microsoft.DotNet.Arcade.Sdk/src/GenerateSourcePackageSourceLinkTargetsFile.cs @@ -12,7 +12,7 @@ namespace Microsoft.DotNet.Arcade.Sdk { - public sealed class GenerateSourcePackageSourceLinkTargetsFile : Task + public sealed class GenerateSourcePackageSourceLinkTargetsFile : Microsoft.Build.Utilities.Task { [Required] public string ProjectDirectory { get; set; } diff --git a/src/Microsoft.DotNet.Arcade.Sdk/src/GetAssemblyFullName.cs b/src/Microsoft.DotNet.Arcade.Sdk/src/GetAssemblyFullName.cs index e507dc6f8cc..f04c6095010 100644 --- a/src/Microsoft.DotNet.Arcade.Sdk/src/GetAssemblyFullName.cs +++ b/src/Microsoft.DotNet.Arcade.Sdk/src/GetAssemblyFullName.cs @@ -7,7 +7,7 @@ namespace Microsoft.DotNet.Arcade.Sdk { - public class GetAssemblyFullName : Task + public class GetAssemblyFullName : Microsoft.Build.Utilities.Task { [Required] public ITaskItem[] Items { get; set; } diff --git a/src/Microsoft.DotNet.Arcade.Sdk/src/GetLicenseFilePath.cs b/src/Microsoft.DotNet.Arcade.Sdk/src/GetLicenseFilePath.cs index 308fad34a81..d195c79398e 100644 --- a/src/Microsoft.DotNet.Arcade.Sdk/src/GetLicenseFilePath.cs +++ b/src/Microsoft.DotNet.Arcade.Sdk/src/GetLicenseFilePath.cs @@ -13,7 +13,7 @@ namespace Microsoft.DotNet.Arcade.Sdk /// Finds a license file in the given directory. /// File is considered a license file if its name matches 'license(.txt|.md|)', ignoring case. /// - public class GetLicenseFilePath : Task + public class GetLicenseFilePath : Microsoft.Build.Utilities.Task { /// /// Full path to the directory to search for the license file. diff --git a/src/Microsoft.DotNet.Arcade.Sdk/src/GroupItemsBy.cs b/src/Microsoft.DotNet.Arcade.Sdk/src/GroupItemsBy.cs index 649668f8727..cf8b54f8e31 100644 --- a/src/Microsoft.DotNet.Arcade.Sdk/src/GroupItemsBy.cs +++ b/src/Microsoft.DotNet.Arcade.Sdk/src/GroupItemsBy.cs @@ -30,7 +30,7 @@ namespace Microsoft.DotNet.Arcade.Sdk /// ]]> /// /// - public sealed class GroupItemsBy : Task + public sealed class GroupItemsBy : Microsoft.Build.Utilities.Task { /// /// Items to group by their ItemSpec. diff --git a/src/Microsoft.DotNet.Arcade.Sdk/src/InstallDotNetCore.cs b/src/Microsoft.DotNet.Arcade.Sdk/src/InstallDotNetCore.cs index 4e3a8f71e0e..c4369b78d95 100644 --- a/src/Microsoft.DotNet.Arcade.Sdk/src/InstallDotNetCore.cs +++ b/src/Microsoft.DotNet.Arcade.Sdk/src/InstallDotNetCore.cs @@ -19,7 +19,7 @@ public class InstallDotNetCore : AppDomainIsolatedTask { static InstallDotNetCore() => AssemblyResolution.Initialize(); #else - public class InstallDotNetCore : Task + public class InstallDotNetCore : Microsoft.Build.Utilities.Task { #endif public string VersionsPropsPath { get; set; } diff --git a/src/Microsoft.DotNet.Arcade.Sdk/src/LocateDotNet.cs b/src/Microsoft.DotNet.Arcade.Sdk/src/LocateDotNet.cs index 6a2b1433839..de9e57de048 100644 --- a/src/Microsoft.DotNet.Arcade.Sdk/src/LocateDotNet.cs +++ b/src/Microsoft.DotNet.Arcade.Sdk/src/LocateDotNet.cs @@ -10,7 +10,7 @@ namespace Microsoft.DotNet.Arcade.Sdk { - public class LocateDotNet : Task + public class LocateDotNet : Microsoft.Build.Utilities.Task { private static readonly string s_cacheKey = "LocateDotNet-FCDFF825-F35B-4601-9CB5-74DCA498B589"; diff --git a/src/Microsoft.DotNet.Arcade.Sdk/src/SaveItems.cs b/src/Microsoft.DotNet.Arcade.Sdk/src/SaveItems.cs index 05dc27ee121..48c57dc7dc5 100644 --- a/src/Microsoft.DotNet.Arcade.Sdk/src/SaveItems.cs +++ b/src/Microsoft.DotNet.Arcade.Sdk/src/SaveItems.cs @@ -14,7 +14,7 @@ namespace Microsoft.DotNet.Arcade.Sdk /// This task writes msbuild Items with their metadata to a props file. /// Useful to statically save a status of an Item that will be used later on by just importing the generated file. /// - public class SaveItems : Task + public class SaveItems : Microsoft.Build.Utilities.Task { [Required] public string ItemName { get; set; } diff --git a/src/Microsoft.DotNet.Arcade.Sdk/src/SetCorFlags.cs b/src/Microsoft.DotNet.Arcade.Sdk/src/SetCorFlags.cs index 6db35be225d..593ba369bc9 100644 --- a/src/Microsoft.DotNet.Arcade.Sdk/src/SetCorFlags.cs +++ b/src/Microsoft.DotNet.Arcade.Sdk/src/SetCorFlags.cs @@ -18,7 +18,7 @@ public class SetCorFlags : AppDomainIsolatedTask { static SetCorFlags() => AssemblyResolution.Initialize(); #else - public class SetCorFlags : Task + public class SetCorFlags : Microsoft.Build.Utilities.Task { #endif [Required] diff --git a/src/Microsoft.DotNet.Arcade.Sdk/src/SingleError.cs b/src/Microsoft.DotNet.Arcade.Sdk/src/SingleError.cs index d190df39854..779f1e2698d 100644 --- a/src/Microsoft.DotNet.Arcade.Sdk/src/SingleError.cs +++ b/src/Microsoft.DotNet.Arcade.Sdk/src/SingleError.cs @@ -6,7 +6,7 @@ namespace Microsoft.DotNet.Arcade.Sdk { - public sealed class SingleError : Task + public sealed class SingleError : Microsoft.Build.Utilities.Task { private static readonly string s_cacheKeyPrefix = "SingleError-F88E25C6-1488-4E81-A458-A0921794E6E3:"; diff --git a/src/Microsoft.DotNet.Arcade.Sdk/src/SourceBuild/AddSourceToNuGetConfig.cs b/src/Microsoft.DotNet.Arcade.Sdk/src/SourceBuild/AddSourceToNuGetConfig.cs index b30fe953721..30a5c3447b5 100644 --- a/src/Microsoft.DotNet.Arcade.Sdk/src/SourceBuild/AddSourceToNuGetConfig.cs +++ b/src/Microsoft.DotNet.Arcade.Sdk/src/SourceBuild/AddSourceToNuGetConfig.cs @@ -15,7 +15,7 @@ namespace Microsoft.DotNet.Arcade.Sdk.SourceBuild /// also by default adds a 'clear' element if none exists, to avoid /// unintended leaks from the build environment. /// - public class AddSourceToNuGetConfig : Task + public class AddSourceToNuGetConfig : Microsoft.Build.Utilities.Task { [Required] public string NuGetConfigFile { get; set; } diff --git a/src/Microsoft.DotNet.Arcade.Sdk/src/SourceBuild/ReadSourceBuildIntermediateNupkgDependencies.cs b/src/Microsoft.DotNet.Arcade.Sdk/src/SourceBuild/ReadSourceBuildIntermediateNupkgDependencies.cs index 806fa0f9869..0a2488a9ed9 100644 --- a/src/Microsoft.DotNet.Arcade.Sdk/src/SourceBuild/ReadSourceBuildIntermediateNupkgDependencies.cs +++ b/src/Microsoft.DotNet.Arcade.Sdk/src/SourceBuild/ReadSourceBuildIntermediateNupkgDependencies.cs @@ -13,7 +13,7 @@ namespace Microsoft.DotNet.Arcade.Sdk.SourceBuild /// Reads entries in a Version.Details.xml file to find intermediate nupkg dependencies. For /// each dependency with a "SourceBuild" element, adds an item to the "Dependencies" output. ///
- public class ReadSourceBuildIntermediateNupkgDependencies : Task + public class ReadSourceBuildIntermediateNupkgDependencies : Microsoft.Build.Utilities.Task { [Required] public string VersionDetailsXmlFile { get; set; } diff --git a/src/Microsoft.DotNet.Arcade.Sdk/src/Unsign.cs b/src/Microsoft.DotNet.Arcade.Sdk/src/Unsign.cs index 11ea33e31a4..934939e265d 100644 --- a/src/Microsoft.DotNet.Arcade.Sdk/src/Unsign.cs +++ b/src/Microsoft.DotNet.Arcade.Sdk/src/Unsign.cs @@ -18,7 +18,7 @@ public sealed class Unsign : AppDomainIsolatedTask { static Unsign() => AssemblyResolution.Initialize(); #else - public class Unsign : Task + public class Unsign : Microsoft.Build.Utilities.Task { #endif [Required] diff --git a/src/Microsoft.DotNet.Arcade.Sdk/src/ValidateLicense.cs b/src/Microsoft.DotNet.Arcade.Sdk/src/ValidateLicense.cs index 94f2e37a041..7cff00a0888 100644 --- a/src/Microsoft.DotNet.Arcade.Sdk/src/ValidateLicense.cs +++ b/src/Microsoft.DotNet.Arcade.Sdk/src/ValidateLicense.cs @@ -13,7 +13,7 @@ namespace Microsoft.DotNet.Arcade.Sdk /// /// Checks that the content of two license files is the same modulo line breaks, leading and trailing whitespace. /// - public class ValidateLicense : Task + public class ValidateLicense : Microsoft.Build.Utilities.Task { /// /// Full path to the file that contains the license text to be validated. diff --git a/src/Microsoft.DotNet.Build.Tasks.Feed/src/ConfigureInputFeed.cs b/src/Microsoft.DotNet.Build.Tasks.Feed/src/ConfigureInputFeed.cs index fc3817a1235..4ccefc8586c 100644 --- a/src/Microsoft.DotNet.Build.Tasks.Feed/src/ConfigureInputFeed.cs +++ b/src/Microsoft.DotNet.Build.Tasks.Feed/src/ConfigureInputFeed.cs @@ -8,7 +8,7 @@ namespace Microsoft.DotNet.Build.Tasks.Feed { - public class ConfigureInputFeed : Task + public class ConfigureInputFeed : Microsoft.Build.Utilities.Task { [Required] public ITaskItem[] EnableFeeds { get; set; } diff --git a/src/Microsoft.DotNet.Build.Tasks.Feed/src/LaunchDebugger.cs b/src/Microsoft.DotNet.Build.Tasks.Feed/src/LaunchDebugger.cs index a85b837ff22..86eba95f8e1 100644 --- a/src/Microsoft.DotNet.Build.Tasks.Feed/src/LaunchDebugger.cs +++ b/src/Microsoft.DotNet.Build.Tasks.Feed/src/LaunchDebugger.cs @@ -3,7 +3,7 @@ namespace Microsoft.DotNet.Build.Tasks.Feed { - public class LaunchDebugger : Task + public class LaunchDebugger : Microsoft.Build.Utilities.Task { public override bool Execute() { diff --git a/src/Microsoft.DotNet.Build.Tasks.Feed/src/common/AzureConnectionStringBuildTask.cs b/src/Microsoft.DotNet.Build.Tasks.Feed/src/common/AzureConnectionStringBuildTask.cs index 82faa5ab514..f49268710b5 100644 --- a/src/Microsoft.DotNet.Build.Tasks.Feed/src/common/AzureConnectionStringBuildTask.cs +++ b/src/Microsoft.DotNet.Build.Tasks.Feed/src/common/AzureConnectionStringBuildTask.cs @@ -6,7 +6,7 @@ namespace Microsoft.DotNet.Build.CloudTestTasks { - public abstract class AzureConnectionStringBuildTask : Task + public abstract class AzureConnectionStringBuildTask : Microsoft.Build.Utilities.Task { /// /// Azure Storage account connection string. Supersedes Account Key / Name. diff --git a/src/Microsoft.DotNet.Build.Tasks.Packaging/src/GenerateNuSpec.cs b/src/Microsoft.DotNet.Build.Tasks.Packaging/src/GenerateNuSpec.cs index 00f126a2222..7e1604b853d 100644 --- a/src/Microsoft.DotNet.Build.Tasks.Packaging/src/GenerateNuSpec.cs +++ b/src/Microsoft.DotNet.Build.Tasks.Packaging/src/GenerateNuSpec.cs @@ -19,7 +19,7 @@ namespace Microsoft.DotNet.Build.Tasks.Packaging { - public class GenerateNuSpec : Task + public class GenerateNuSpec : Microsoft.Build.Utilities.Task { private static readonly XNamespace NuSpecXmlNamespace = @"http://schemas.microsoft.com/packaging/2013/01/nuspec.xsd"; diff --git a/src/Microsoft.DotNet.Build.Tasks.Packaging/src/GetRuntimeJsonValues.cs b/src/Microsoft.DotNet.Build.Tasks.Packaging/src/GetRuntimeJsonValues.cs index 43a35e4fec3..910dd33ce4d 100644 --- a/src/Microsoft.DotNet.Build.Tasks.Packaging/src/GetRuntimeJsonValues.cs +++ b/src/Microsoft.DotNet.Build.Tasks.Packaging/src/GetRuntimeJsonValues.cs @@ -9,7 +9,7 @@ namespace Microsoft.DotNet.Build.Tasks.Packaging { // Read a runtime.json file into an msbuild item group - public class GetRuntimeJsonValues : Task + public class GetRuntimeJsonValues : Microsoft.Build.Utilities.Task { // runtime.json file path [Required] diff --git a/src/Microsoft.DotNet.Build.Tasks.Packaging/src/GetRuntimeTargets.cs b/src/Microsoft.DotNet.Build.Tasks.Packaging/src/GetRuntimeTargets.cs index 4cb5bd43827..960d9f830a9 100644 --- a/src/Microsoft.DotNet.Build.Tasks.Packaging/src/GetRuntimeTargets.cs +++ b/src/Microsoft.DotNet.Build.Tasks.Packaging/src/GetRuntimeTargets.cs @@ -8,7 +8,7 @@ namespace Microsoft.DotNet.Build.Tasks.Packaging { - public class GetRuntimeTargets : Task + public class GetRuntimeTargets : Microsoft.Build.Utilities.Task { // runtime.json file path [Required] diff --git a/src/Microsoft.DotNet.Build.Tasks.Packaging/src/Microsoft.DotNet.Build.Tasks.Packaging.csproj b/src/Microsoft.DotNet.Build.Tasks.Packaging/src/Microsoft.DotNet.Build.Tasks.Packaging.csproj index 7b4feb8805a..57f5cfb9da9 100644 --- a/src/Microsoft.DotNet.Build.Tasks.Packaging/src/Microsoft.DotNet.Build.Tasks.Packaging.csproj +++ b/src/Microsoft.DotNet.Build.Tasks.Packaging/src/Microsoft.DotNet.Build.Tasks.Packaging.csproj @@ -87,7 +87,7 @@ <_candidatePackageFolder>%(_candidatPackageFolders.Identity) - <_runtimeJsonSubPath>Microsoft.NETCore.Platforms\2.1.0\runtime.json + <_runtimeJsonSubPath>Microsoft.NETCore.Platforms\$(MicrosoftNETCorePlatformsVersion)\runtime.json <_runtimeJsonPath Condition="'$(_runtimeJsonPath)' == '' AND Exists('$(_candidatePackageFolder)\$(_runtimeJsonSubPath)')">$(_candidatePackageFolder)\$(_runtimeJsonSubPath) <_runtimeJsonPath Condition="'$(_runtimeJsonPath)' == '' AND Exists('$(_candidatePackageFolder)\$(_runtimeJsonSubPath.ToLower())')">$(_candidatePackageFolder)\$(_runtimeJsonSubPath.ToLower()) diff --git a/src/Microsoft.DotNet.Build.Tasks.Templating/src/GenerateFileFromTemplate.cs b/src/Microsoft.DotNet.Build.Tasks.Templating/src/GenerateFileFromTemplate.cs index 140e1bd01a1..955e73da518 100644 --- a/src/Microsoft.DotNet.Build.Tasks.Templating/src/GenerateFileFromTemplate.cs +++ b/src/Microsoft.DotNet.Build.Tasks.Templating/src/GenerateFileFromTemplate.cs @@ -27,7 +27,7 @@ namespace Microsoft.DotNet.Build.Tasks.Templating /// /// /// - public class GenerateFileFromTemplate : Task + public class GenerateFileFromTemplate : Microsoft.Build.Utilities.Task { /// /// The template file using the variable syntax ${VarName}. diff --git a/src/Microsoft.DotNet.Build.Tasks.VisualStudio/OptProf/FindLatestDrop.cs b/src/Microsoft.DotNet.Build.Tasks.VisualStudio/OptProf/FindLatestDrop.cs index 7609b913522..4fe8d7add66 100644 --- a/src/Microsoft.DotNet.Build.Tasks.VisualStudio/OptProf/FindLatestDrop.cs +++ b/src/Microsoft.DotNet.Build.Tasks.VisualStudio/OptProf/FindLatestDrop.cs @@ -14,7 +14,7 @@ namespace Microsoft.DotNet.Build.Tasks.VisualStudio /// /// Find the latest drop in a JSON list of VS drops. /// - public sealed class FindLatestDrop : Task + public sealed class FindLatestDrop : Microsoft.Build.Utilities.Task { /// /// Full path to JSON file containing list of drops. diff --git a/src/Microsoft.DotNet.Build.Tasks.VisualStudio/OptProf/GenerateTrainingInputFiles.cs b/src/Microsoft.DotNet.Build.Tasks.VisualStudio/OptProf/GenerateTrainingInputFiles.cs index efc47343913..e80f4b68501 100644 --- a/src/Microsoft.DotNet.Build.Tasks.VisualStudio/OptProf/GenerateTrainingInputFiles.cs +++ b/src/Microsoft.DotNet.Build.Tasks.VisualStudio/OptProf/GenerateTrainingInputFiles.cs @@ -16,7 +16,7 @@ namespace Microsoft.DotNet.Build.Tasks.VisualStudio /// Generates OptProf training input files for VS components listed in OptProf.json file and /// their VSIX files located in the specified directory. /// - public sealed class GenerateTrainingInputFiles : Task + public sealed class GenerateTrainingInputFiles : Microsoft.Build.Utilities.Task { /// /// Absolute path to the OptProf.json config file. diff --git a/src/Microsoft.DotNet.Build.Tasks.VisualStudio/OptProf/GenerateTrainingPropsFile.cs b/src/Microsoft.DotNet.Build.Tasks.VisualStudio/OptProf/GenerateTrainingPropsFile.cs index 4a7f5c59c46..9b182998d8f 100644 --- a/src/Microsoft.DotNet.Build.Tasks.VisualStudio/OptProf/GenerateTrainingPropsFile.cs +++ b/src/Microsoft.DotNet.Build.Tasks.VisualStudio/OptProf/GenerateTrainingPropsFile.cs @@ -12,7 +12,7 @@ namespace Microsoft.DotNet.Build.Tasks.VisualStudio /// /// Generates a .props file pointing to a drops URL where IBC optimization inputs will be uploaded. /// - public sealed class GenerateTrainingPropsFile : Task + public sealed class GenerateTrainingPropsFile : Microsoft.Build.Utilities.Task { private const string ProductDropNamePrefix = "Products/"; diff --git a/src/Microsoft.DotNet.Build.Tasks.VisualStudio/OptProf/GetRunSettingsSessionConfiguration.cs b/src/Microsoft.DotNet.Build.Tasks.VisualStudio/OptProf/GetRunSettingsSessionConfiguration.cs index a541891e895..f827518d6bc 100644 --- a/src/Microsoft.DotNet.Build.Tasks.VisualStudio/OptProf/GetRunSettingsSessionConfiguration.cs +++ b/src/Microsoft.DotNet.Build.Tasks.VisualStudio/OptProf/GetRunSettingsSessionConfiguration.cs @@ -15,7 +15,7 @@ namespace Microsoft.DotNet.Build.Tasks.VisualStudio /// Calculates the SessionConfiguration to be used in .runsettings for OptProf training /// based on given OptProf.json configuration and VS bootstrapper information. /// - public sealed class GetRunSettingsSessionConfiguration : Task + public sealed class GetRunSettingsSessionConfiguration : Microsoft.Build.Utilities.Task { /// /// Absolute path to the OptProf.json config file. diff --git a/src/Microsoft.DotNet.Build.Tasks.VisualStudio/Vsix/FinalizeInsertionVsixFile.cs b/src/Microsoft.DotNet.Build.Tasks.VisualStudio/Vsix/FinalizeInsertionVsixFile.cs index 7ac388f9f34..ad8211eb5cd 100644 --- a/src/Microsoft.DotNet.Build.Tasks.VisualStudio/Vsix/FinalizeInsertionVsixFile.cs +++ b/src/Microsoft.DotNet.Build.Tasks.VisualStudio/Vsix/FinalizeInsertionVsixFile.cs @@ -20,7 +20,7 @@ namespace Microsoft.DotNet.Build.Tasks.VisualStudio /// /// Replaces Experimental="true" attribute of the Installation element with SystemComponent="true" in the VSIX manifest file. /// - public sealed class FinalizeInsertionVsixFile : Task + public sealed class FinalizeInsertionVsixFile : Microsoft.Build.Utilities.Task { private const string VsixManifestPartName = "/extension.vsixmanifest"; private const string VsixNamespace = "http://schemas.microsoft.com/developer/vsx-schema/2011"; diff --git a/src/Microsoft.DotNet.Build.Tasks.VisualStudio/Vsix/GetPkgDefAssemblyDependencyGuid.cs b/src/Microsoft.DotNet.Build.Tasks.VisualStudio/Vsix/GetPkgDefAssemblyDependencyGuid.cs index 2830793fab2..220842ad890 100644 --- a/src/Microsoft.DotNet.Build.Tasks.VisualStudio/Vsix/GetPkgDefAssemblyDependencyGuid.cs +++ b/src/Microsoft.DotNet.Build.Tasks.VisualStudio/Vsix/GetPkgDefAssemblyDependencyGuid.cs @@ -17,7 +17,7 @@ namespace Microsoft.DotNet.Build.Tasks.VisualStudio /// Calculates Guid used in .pkgdef files for codeBase and bindingRedirect entries. /// The implementation matches Microsoft.VisualStudio.Shell.ProvideDependentAssemblyAttribute. /// - public sealed class GetPkgDefAssemblyDependencyGuid : Task + public sealed class GetPkgDefAssemblyDependencyGuid : Microsoft.Build.Utilities.Task { [Required] public ITaskItem[] Items { get; set; } diff --git a/src/Microsoft.DotNet.Build.Tasks.Workloads/src/GenerateTaskBase.cs b/src/Microsoft.DotNet.Build.Tasks.Workloads/src/GenerateTaskBase.cs index 5c0e0163053..2f64819c60a 100644 --- a/src/Microsoft.DotNet.Build.Tasks.Workloads/src/GenerateTaskBase.cs +++ b/src/Microsoft.DotNet.Build.Tasks.Workloads/src/GenerateTaskBase.cs @@ -10,7 +10,7 @@ namespace Microsoft.DotNet.Build.Tasks.Workloads { - public abstract class GenerateTaskBase : Task + public abstract class GenerateTaskBase : Microsoft.Build.Utilities.Task { public const int MaxPayloadRelativePath = 182; diff --git a/src/Microsoft.DotNet.Build.Tasks.Workloads/src/GenerateVisualStudioManifest.cs b/src/Microsoft.DotNet.Build.Tasks.Workloads/src/GenerateVisualStudioManifest.cs index cf86b4d756e..825d9e887a4 100644 --- a/src/Microsoft.DotNet.Build.Tasks.Workloads/src/GenerateVisualStudioManifest.cs +++ b/src/Microsoft.DotNet.Build.Tasks.Workloads/src/GenerateVisualStudioManifest.cs @@ -14,7 +14,7 @@ namespace Microsoft.DotNet.Build.Tasks.Workloads /// MSBuild task for generating a Visual Studio manifest project (.vsmanproj). The generated project can be used /// to create a manifest (.vsman) by merging JSON manifest files produced from one or more SWIX project. /// - public class GenerateVisualStudioManifest : Task + public class GenerateVisualStudioManifest : Microsoft.Build.Utilities.Task { ///
/// The base path where the project source will be generated. diff --git a/src/Microsoft.DotNet.Build.Tasks.Workloads/src/GetWorkloadPackPackageReferences.cs b/src/Microsoft.DotNet.Build.Tasks.Workloads/src/GetWorkloadPackPackageReferences.cs index ddfac1f4afb..7af8eba77db 100644 --- a/src/Microsoft.DotNet.Build.Tasks.Workloads/src/GetWorkloadPackPackageReferences.cs +++ b/src/Microsoft.DotNet.Build.Tasks.Workloads/src/GetWorkloadPackPackageReferences.cs @@ -12,7 +12,7 @@ namespace Microsoft.DotNet.Build.Tasks.Workloads { - public class GetWorkloadPackPackageReferences : Task + public class GetWorkloadPackPackageReferences : Microsoft.Build.Utilities.Task { public string ProjectFile { diff --git a/src/Microsoft.DotNet.Deployment.Tasks.Links/Microsoft.DotNet.Deployment.Tasks.Links.csproj b/src/Microsoft.DotNet.Deployment.Tasks.Links/Microsoft.DotNet.Deployment.Tasks.Links.csproj index 30474e210e3..c964fbea18d 100644 --- a/src/Microsoft.DotNet.Deployment.Tasks.Links/Microsoft.DotNet.Deployment.Tasks.Links.csproj +++ b/src/Microsoft.DotNet.Deployment.Tasks.Links/Microsoft.DotNet.Deployment.Tasks.Links.csproj @@ -3,7 +3,7 @@ netcoreapp3.1;net472 - netcoreapp3.1 + net6.0 true Aka.ms link manager diff --git a/src/Microsoft.DotNet.GenFacades/Microsoft.DotNet.GenFacades.csproj b/src/Microsoft.DotNet.GenFacades/Microsoft.DotNet.GenFacades.csproj index db51ae171ed..bca9958d17e 100644 --- a/src/Microsoft.DotNet.GenFacades/Microsoft.DotNet.GenFacades.csproj +++ b/src/Microsoft.DotNet.GenFacades/Microsoft.DotNet.GenFacades.csproj @@ -2,6 +2,7 @@ $(TargetFrameworkForNETSDK);net472 + $(TargetFrameworkForNETSDK) MSBuildSdk false true diff --git a/src/Microsoft.DotNet.Helix/Sdk/BaseTask.cs b/src/Microsoft.DotNet.Helix/Sdk/BaseTask.cs index 333047b7ae0..cc63c88b124 100644 --- a/src/Microsoft.DotNet.Helix/Sdk/BaseTask.cs +++ b/src/Microsoft.DotNet.Helix/Sdk/BaseTask.cs @@ -2,7 +2,7 @@ namespace Microsoft.DotNet.Helix { - public abstract partial class BaseTask : Task + public abstract partial class BaseTask : Microsoft.Build.Utilities.Task { } } diff --git a/src/Microsoft.DotNet.NuGetRepack/tasks/Microsoft.DotNet.NuGetRepack.Tasks.csproj b/src/Microsoft.DotNet.NuGetRepack/tasks/Microsoft.DotNet.NuGetRepack.Tasks.csproj index c532b91fa4d..d00c49a4d0b 100644 --- a/src/Microsoft.DotNet.NuGetRepack/tasks/Microsoft.DotNet.NuGetRepack.Tasks.csproj +++ b/src/Microsoft.DotNet.NuGetRepack/tasks/Microsoft.DotNet.NuGetRepack.Tasks.csproj @@ -2,7 +2,7 @@ net472;netcoreapp3.1 - netcoreapp3.1 + net6.0 true MSBuildSdk diff --git a/src/Microsoft.DotNet.NuGetRepack/tasks/src/ReplacePackageParts.cs b/src/Microsoft.DotNet.NuGetRepack/tasks/src/ReplacePackageParts.cs index 8e6563b8d14..0d9d22ec6a5 100644 --- a/src/Microsoft.DotNet.NuGetRepack/tasks/src/ReplacePackageParts.cs +++ b/src/Microsoft.DotNet.NuGetRepack/tasks/src/ReplacePackageParts.cs @@ -23,7 +23,7 @@ public sealed class ReplacePackageParts : AppDomainIsolatedTask { static ReplacePackageParts() => AssemblyResolution.Initialize(); #else - public sealed class ReplacePackageParts : Task + public sealed class ReplacePackageParts : Microsoft.Build.Utilities.Task { #endif /// diff --git a/src/Microsoft.DotNet.NuGetRepack/tasks/src/UpdatePackageVersionTask.cs b/src/Microsoft.DotNet.NuGetRepack/tasks/src/UpdatePackageVersionTask.cs index 863dd049ca4..8f922025d15 100644 --- a/src/Microsoft.DotNet.NuGetRepack/tasks/src/UpdatePackageVersionTask.cs +++ b/src/Microsoft.DotNet.NuGetRepack/tasks/src/UpdatePackageVersionTask.cs @@ -16,7 +16,7 @@ public sealed class UpdatePackageVersionTask : AppDomainIsolatedTask { static UpdatePackageVersionTask() => AssemblyResolution.Initialize(); #else - public class UpdatePackageVersionTask : Task + public class UpdatePackageVersionTask : Microsoft.Build.Utilities.Task { #endif public string VersionKind { get; set; } diff --git a/src/Microsoft.DotNet.PackageTesting/Microsoft.DotNet.PackageTesting.csproj b/src/Microsoft.DotNet.PackageTesting/Microsoft.DotNet.PackageTesting.csproj index ef713a0f154..824dc8b66c1 100644 --- a/src/Microsoft.DotNet.PackageTesting/Microsoft.DotNet.PackageTesting.csproj +++ b/src/Microsoft.DotNet.PackageTesting/Microsoft.DotNet.PackageTesting.csproj @@ -2,6 +2,7 @@ netcoreapp3.1;net472 + net6.0 MSBuildSdk false true diff --git a/src/Microsoft.DotNet.SharedFramework.Sdk/Microsoft.DotNet.SharedFramework.Sdk.csproj b/src/Microsoft.DotNet.SharedFramework.Sdk/Microsoft.DotNet.SharedFramework.Sdk.csproj index e1d14cb98c5..9627a033768 100644 --- a/src/Microsoft.DotNet.SharedFramework.Sdk/Microsoft.DotNet.SharedFramework.Sdk.csproj +++ b/src/Microsoft.DotNet.SharedFramework.Sdk/Microsoft.DotNet.SharedFramework.Sdk.csproj @@ -2,6 +2,7 @@ net472;netcoreapp3.1 + net6.0 preview false diff --git a/src/Microsoft.DotNet.SignTool/Microsoft.DotNet.SignTool.csproj b/src/Microsoft.DotNet.SignTool/Microsoft.DotNet.SignTool.csproj index 8ec571aeb81..7a89dfe9dfc 100644 --- a/src/Microsoft.DotNet.SignTool/Microsoft.DotNet.SignTool.csproj +++ b/src/Microsoft.DotNet.SignTool/Microsoft.DotNet.SignTool.csproj @@ -2,7 +2,7 @@ net472;netcoreapp3.1 - netcoreapp3.1 + net6.0 true Latest true diff --git a/src/Microsoft.DotNet.SourceBuild/tasks/src/ReadNuGetPackageInfos.cs b/src/Microsoft.DotNet.SourceBuild/tasks/src/ReadNuGetPackageInfos.cs index 4df9c4df567..bcb95bf3191 100644 --- a/src/Microsoft.DotNet.SourceBuild/tasks/src/ReadNuGetPackageInfos.cs +++ b/src/Microsoft.DotNet.SourceBuild/tasks/src/ReadNuGetPackageInfos.cs @@ -10,7 +10,7 @@ namespace Microsoft.DotNet.SourceBuild.Tasks { - public class ReadNuGetPackageInfos : Task + public class ReadNuGetPackageInfos : Microsoft.Build.Utilities.Task { [Required] public string[] PackagePaths { get; set; } diff --git a/src/Microsoft.DotNet.SourceBuild/tasks/src/UsageReport/ValidateUsageAgainstBaseline.cs b/src/Microsoft.DotNet.SourceBuild/tasks/src/UsageReport/ValidateUsageAgainstBaseline.cs index 5cb140d023d..f8b389b5268 100644 --- a/src/Microsoft.DotNet.SourceBuild/tasks/src/UsageReport/ValidateUsageAgainstBaseline.cs +++ b/src/Microsoft.DotNet.SourceBuild/tasks/src/UsageReport/ValidateUsageAgainstBaseline.cs @@ -12,7 +12,7 @@ namespace Microsoft.DotNet.SourceBuild.Tasks.UsageReport { - public class ValidateUsageAgainstBaseline : Task + public class ValidateUsageAgainstBaseline : Microsoft.Build.Utilities.Task { [Required] public string DataFile { get; set; } diff --git a/src/Microsoft.DotNet.SourceBuild/tasks/src/UsageReport/WritePackageUsageData.cs b/src/Microsoft.DotNet.SourceBuild/tasks/src/UsageReport/WritePackageUsageData.cs index 15b504d0112..caf7252a163 100644 --- a/src/Microsoft.DotNet.SourceBuild/tasks/src/UsageReport/WritePackageUsageData.cs +++ b/src/Microsoft.DotNet.SourceBuild/tasks/src/UsageReport/WritePackageUsageData.cs @@ -17,7 +17,7 @@ namespace Microsoft.DotNet.SourceBuild.Tasks.UsageReport { - public class WritePackageUsageData : Task + public class WritePackageUsageData : Microsoft.Build.Utilities.Task { public string[] RestoredPackageFiles { get; set; } public string[] TarballPrebuiltPackageFiles { get; set; } diff --git a/src/Microsoft.DotNet.SourceBuild/tasks/src/UsageReport/WriteUsageReports.cs b/src/Microsoft.DotNet.SourceBuild/tasks/src/UsageReport/WriteUsageReports.cs index 784919651f9..e44e94f30be 100644 --- a/src/Microsoft.DotNet.SourceBuild/tasks/src/UsageReport/WriteUsageReports.cs +++ b/src/Microsoft.DotNet.SourceBuild/tasks/src/UsageReport/WriteUsageReports.cs @@ -12,7 +12,7 @@ namespace Microsoft.DotNet.SourceBuild.Tasks.UsageReport { - public class WriteUsageReports : Task + public class WriteUsageReports : Microsoft.Build.Utilities.Task { private const string SnapshotPrefix = "PackageVersions.props.pre."; private const string SnapshotSuffix = ".xml"; diff --git a/src/Microsoft.DotNet.SourceBuild/tasks/src/WriteBuildOutputProps.cs b/src/Microsoft.DotNet.SourceBuild/tasks/src/WriteBuildOutputProps.cs index 4ac4cbcf166..1b32c5f1112 100644 --- a/src/Microsoft.DotNet.SourceBuild/tasks/src/WriteBuildOutputProps.cs +++ b/src/Microsoft.DotNet.SourceBuild/tasks/src/WriteBuildOutputProps.cs @@ -13,7 +13,7 @@ namespace Microsoft.DotNet.SourceBuild.Tasks { - public class WriteBuildOutputProps : Task + public class WriteBuildOutputProps : Microsoft.Build.Utilities.Task { private static readonly Regex InvalidElementNameCharRegex = new Regex(@"(^|[^A-Za-z0-9])(?.)"); diff --git a/src/Microsoft.DotNet.SwaggerGenerator/Microsoft.DotNet.SwaggerGenerator.MSBuild/GenerateSwaggerCode.cs b/src/Microsoft.DotNet.SwaggerGenerator/Microsoft.DotNet.SwaggerGenerator.MSBuild/GenerateSwaggerCode.cs index 6482632531c..2c03502ec39 100644 --- a/src/Microsoft.DotNet.SwaggerGenerator/Microsoft.DotNet.SwaggerGenerator.MSBuild/GenerateSwaggerCode.cs +++ b/src/Microsoft.DotNet.SwaggerGenerator/Microsoft.DotNet.SwaggerGenerator.MSBuild/GenerateSwaggerCode.cs @@ -13,7 +13,7 @@ namespace Microsoft.DotNet.SwaggerGenerator.MSBuild { - public class GenerateSwaggerCode : Task + public class GenerateSwaggerCode : Microsoft.Build.Utilities.Task { [Required] public string SwaggerDocumentUri { get; set; } diff --git a/src/Microsoft.DotNet.VersionTools/tasks/Microsoft.DotNet.VersionTools.Tasks.csproj b/src/Microsoft.DotNet.VersionTools/tasks/Microsoft.DotNet.VersionTools.Tasks.csproj index 208ffb033a2..2dfa124f05b 100644 --- a/src/Microsoft.DotNet.VersionTools/tasks/Microsoft.DotNet.VersionTools.Tasks.csproj +++ b/src/Microsoft.DotNet.VersionTools/tasks/Microsoft.DotNet.VersionTools.Tasks.csproj @@ -2,7 +2,7 @@ net472;netcoreapp3.1 - netcoreapp3.1 + net6.0 MSBuildSdk diff --git a/src/Microsoft.DotNet.VersionTools/tasks/src/BaseDependenciesTask.cs b/src/Microsoft.DotNet.VersionTools/tasks/src/BaseDependenciesTask.cs index c5e114065dc..936c37fbe8b 100644 --- a/src/Microsoft.DotNet.VersionTools/tasks/src/BaseDependenciesTask.cs +++ b/src/Microsoft.DotNet.VersionTools/tasks/src/BaseDependenciesTask.cs @@ -23,7 +23,7 @@ namespace Microsoft.DotNet.Build.Tasks.VersionTools { - public abstract class BaseDependenciesTask : Task + public abstract class BaseDependenciesTask : Microsoft.Build.Utilities.Task { internal const string RawUrlMetadataName = "RawUrl"; internal const string RawVersionsBaseUrlMetadataName = "RawVersionsBaseUrl"; diff --git a/src/Microsoft.DotNet.VersionTools/tasks/src/SubmitPullRequest.cs b/src/Microsoft.DotNet.VersionTools/tasks/src/SubmitPullRequest.cs index f3ea2050c83..7072b49765d 100644 --- a/src/Microsoft.DotNet.VersionTools/tasks/src/SubmitPullRequest.cs +++ b/src/Microsoft.DotNet.VersionTools/tasks/src/SubmitPullRequest.cs @@ -12,7 +12,7 @@ namespace Microsoft.DotNet.Build.Tasks.VersionTools { - public class SubmitPullRequest : Task + public class SubmitPullRequest : Microsoft.Build.Utilities.Task { [Required] public string PullRequestServiceType { get; set; } From 761d2e6545a31d2ebf9cb60443ed2a9c2f8268b5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C5=99emek=20Vysok=C3=BD?= Date: Tue, 31 Aug 2021 12:10:39 +0200 Subject: [PATCH 332/699] Accept zip files as input for XHarnessApkToTest (#7811) --- .../ZipArchiveManager.cs | 23 +++++++-- .../CreateXHarnessAndroidWorkItemsTests.cs | 38 ++++++++++++++ .../CreateXHarnessAppleWorkItemsTests.cs | 48 +++++++++++++++++ .../Sdk/CreateXHarnessAndroidWorkItems.cs | 51 ++++++++++++++----- .../Sdk/CreateXHarnessAppleWorkItems.cs | 10 ++-- .../Sdk/ProvisioningProfileProvider.cs | 19 ++++++- .../Sdk/XharnessTaskBase.cs | 8 ++- .../xharness-helix-job.android.sh | 4 -- 8 files changed, 172 insertions(+), 29 deletions(-) diff --git a/src/Common/Microsoft.Arcade.Common/ZipArchiveManager.cs b/src/Common/Microsoft.Arcade.Common/ZipArchiveManager.cs index 93edcb7bb03..b022fe7238f 100644 --- a/src/Common/Microsoft.Arcade.Common/ZipArchiveManager.cs +++ b/src/Common/Microsoft.Arcade.Common/ZipArchiveManager.cs @@ -3,6 +3,7 @@ using System.IO; using System.IO.Compression; +using System.Linq; using System.Reflection; using System.Text; using System.Threading.Tasks; @@ -22,11 +23,19 @@ public void ArchiveDirectory(string directoryPath, string archivePath, bool incl public void ArchiveFile(string filePath, string archivePath) { - using (FileStream fs = File.OpenWrite(archivePath)) - using (var zip = new ZipArchive(fs, ZipArchiveMode.Create, false)) + bool archiveExists = File.Exists(archivePath); + string entryName = Path.GetFileName(filePath); + + using FileStream fs = File.OpenWrite(archivePath); + using ZipArchive zip = new(fs, archiveExists ? ZipArchiveMode.Update : ZipArchiveMode.Create, false); + + // Overwrite previous file, if any (otherwise dual records were created) + if (archiveExists) { - zip.CreateEntryFromFile(filePath, Path.GetFileName(filePath)); + zip.Entries.FirstOrDefault(e => e.FullName == entryName)?.Delete(); } + + zip.CreateEntryFromFile(filePath, entryName); } public Task AddContentToArchive(string archivePath, string targetFilename, string content) @@ -34,8 +43,12 @@ public Task AddContentToArchive(string archivePath, string targetFilename, strin public async Task AddContentToArchive(string archivePath, string targetFilename, Stream content) { - using FileStream archiveStream = new FileStream(archivePath, FileMode.Open); - using ZipArchive archive = new ZipArchive(archiveStream, ZipArchiveMode.Update); + using FileStream archiveStream = new(archivePath, FileMode.Open); + using ZipArchive archive = new(archiveStream, ZipArchiveMode.Update); + + // Overwrite previous file, if any (otherwise dual records were created) + archive.Entries.FirstOrDefault(e => e.FullName == targetFilename)?.Delete(); + ZipArchiveEntry entry = archive.CreateEntry(targetFilename); using Stream targetStream = entry.Open(); await content.CopyToAsync(targetStream); diff --git a/src/Microsoft.DotNet.Helix/Sdk.Tests/Microsoft.DotNet.Helix.Sdk.Tests/CreateXHarnessAndroidWorkItemsTests.cs b/src/Microsoft.DotNet.Helix/Sdk.Tests/Microsoft.DotNet.Helix.Sdk.Tests/CreateXHarnessAndroidWorkItemsTests.cs index 8115f06826c..82716bbea64 100644 --- a/src/Microsoft.DotNet.Helix/Sdk.Tests/Microsoft.DotNet.Helix.Sdk.Tests/CreateXHarnessAndroidWorkItemsTests.cs +++ b/src/Microsoft.DotNet.Helix/Sdk.Tests/Microsoft.DotNet.Helix.Sdk.Tests/CreateXHarnessAndroidWorkItemsTests.cs @@ -85,6 +85,8 @@ public void AndroidXHarnessWorkItemIsCreated() var command = workItem.GetMetadata("Command"); command.Should().Contain("-timeout \"00:08:55\""); + _zipArchiveManager + .Verify(x => x.ArchiveFile("/apks/System.Foo.apk", payloadArchive), Times.Once); _zipArchiveManager .Verify(x => x.AddResourceFileToArchive(payloadArchive, It.Is(s => s.Contains("xharness-helix-job.android.sh")), "xharness-helix-job.android.sh"), Times.AtLeastOnce); _zipArchiveManager @@ -157,6 +159,42 @@ public void ApkIsReused() _fileSystem.FileExists(payloadArchive).Should().BeTrue(); } + [Fact] + public void ZippedApkIsProvided() + { + var collection = CreateMockServiceCollection(); + _task.ConfigureServices(collection); + _task.Apks = new[] + { + CreateApk("/apks/System.Foo.zip", "System.Foo", "00:15:42", "00:08:55") + }; + + // Act + using var provider = collection.BuildServiceProvider(); + _task.InvokeExecute(provider).Should().BeTrue(); + + // Verify + _task.WorkItems.Length.Should().Be(1); + + var workItem = _task.WorkItems.First(); + workItem.GetMetadata("Identity").Should().Be("System.Foo"); + workItem.GetMetadata("Timeout").Should().Be("00:15:42"); + + var payloadArchive = workItem.GetMetadata("PayloadArchive"); + payloadArchive.Should().NotBeNullOrEmpty(); + _fileSystem.FileExists(payloadArchive).Should().BeTrue(); + + var command = workItem.GetMetadata("Command"); + command.Should().Contain("-timeout \"00:08:55\""); + + _zipArchiveManager + .Verify(x => x.ArchiveFile(It.IsAny(), It.IsAny()), Times.Never); + _zipArchiveManager + .Verify(x => x.AddResourceFileToArchive(payloadArchive, It.Is(s => s.Contains("xharness-helix-job.android.sh")), "xharness-helix-job.android.sh"), Times.AtLeastOnce); + _zipArchiveManager + .Verify(x => x.AddResourceFileToArchive(payloadArchive, It.Is(s => s.Contains("xharness-helix-job.android.ps1")), "xharness-helix-job.android.ps1"), Times.AtLeastOnce); + } + [Fact] public void AreDependenciesRegistered() { diff --git a/src/Microsoft.DotNet.Helix/Sdk.Tests/Microsoft.DotNet.Helix.Sdk.Tests/CreateXHarnessAppleWorkItemsTests.cs b/src/Microsoft.DotNet.Helix/Sdk.Tests/Microsoft.DotNet.Helix.Sdk.Tests/CreateXHarnessAppleWorkItemsTests.cs index 86e5f9366b5..3033a9bd1dd 100644 --- a/src/Microsoft.DotNet.Helix/Sdk.Tests/Microsoft.DotNet.Helix.Sdk.Tests/CreateXHarnessAppleWorkItemsTests.cs +++ b/src/Microsoft.DotNet.Helix/Sdk.Tests/Microsoft.DotNet.Helix.Sdk.Tests/CreateXHarnessAppleWorkItemsTests.cs @@ -93,6 +93,8 @@ public void AppleXHarnessWorkItemIsCreated() _profileProvider .Verify(x => x.AddProfilesToBundles(It.Is(bundles => bundles.Any(b => b.ItemSpec == "/apps/System.Foo.app"))), Times.Once); + _zipArchiveManager + .Verify(x => x.ArchiveDirectory("/apps/System.Foo.app", payloadArchive, true), Times.Once); _zipArchiveManager .Verify(x => x.AddResourceFileToArchive(payloadArchive, It.Is(s => s.Contains("xharness-helix-job.apple.sh")), "xharness-helix-job.apple.sh"), Times.Once); _zipArchiveManager @@ -201,6 +203,52 @@ public void AppBundleIsReused() command.Should().Contain("--target \"ios-simulator-64_13.5\""); } + [Fact] + public void ZippedAppIsProvided() + { + var collection = CreateMockServiceCollection(); + _task.ConfigureServices(collection); + _task.AppBundles = new[] + { + CreateAppBundle("/apps/System.Foo.zip", "ios-device_13.5", "00:15:42", "00:08:55", "00:02:33") + }; + _task.TmpDir = "/tmp"; + _fileSystem.Files.Add("/apps/System.Foo.zip", "zipped payload"); + _fileSystem.Directories.Remove("/apps/System.Foo.zip"); + + // Act + using var provider = collection.BuildServiceProvider(); + _task.InvokeExecute(provider).Should().BeTrue(); + + // Verify + _task.WorkItems.Length.Should().Be(1); + + var workItem = _task.WorkItems.First(); + workItem.GetMetadata("Identity").Should().Be("System.Foo"); + workItem.GetMetadata("Timeout").Should().Be("00:15:42"); + + var payloadArchive = workItem.GetMetadata("PayloadArchive"); + payloadArchive.Should().NotBeNullOrEmpty(); + _fileSystem.FileExists(payloadArchive).Should().BeTrue(); + + var command = workItem.GetMetadata("Command"); + command.Should().Contain("System.Foo.app"); + command.Should().Contain("--target \"ios-device_13.5\""); + command.Should().Contain("--timeout \"00:08:55\""); + command.Should().Contain("--launch-timeout \"00:02:33\""); + + _profileProvider + .Verify(x => x.AddProfilesToBundles(It.Is(bundles => bundles.Any(b => b.ItemSpec == "/apps/System.Foo.zip"))), Times.Once); + _zipArchiveManager + .Verify(x => x.ArchiveDirectory("/apps/System.Foo.app", payloadArchive, true), Times.Never); + _zipArchiveManager + .Verify(x => x.AddResourceFileToArchive(payloadArchive, It.Is(s => s.Contains("xharness-helix-job.apple.sh")), "xharness-helix-job.apple.sh"), Times.Once); + _zipArchiveManager + .Verify(x => x.AddResourceFileToArchive(payloadArchive, It.Is(s => s.Contains("xharness-runner.apple.sh")), "xharness-runner.apple.sh"), Times.Once); + _zipArchiveManager + .Verify(x => x.AddContentToArchive(payloadArchive, "command.sh", It.Is(s => s.Contains("xharness apple test"))), Times.Once); + } + [Fact] public void AreDependenciesRegistered() { diff --git a/src/Microsoft.DotNet.Helix/Sdk/CreateXHarnessAndroidWorkItems.cs b/src/Microsoft.DotNet.Helix/Sdk/CreateXHarnessAndroidWorkItems.cs index bcec332732f..d533f984427 100644 --- a/src/Microsoft.DotNet.Helix/Sdk/CreateXHarnessAndroidWorkItems.cs +++ b/src/Microsoft.DotNet.Helix/Sdk/CreateXHarnessAndroidWorkItems.cs @@ -88,32 +88,45 @@ private async Task PrepareWorkItem(IZipArchiveManager zipArchiveManag return null; } - if (!fileSystem.GetExtension(apkPath).Equals(".apk", StringComparison.OrdinalIgnoreCase)) - { - Log.LogError($"Unsupported app package type: {fileSystem.GetFileName(apkPath)}"); - return null; - } + string extension = fileSystem.GetExtension(apkPath).ToLowerInvariant(); + bool isAlreadyArchived = (extension == ".zip"); - // Validation of any metadata specific to Android stuff goes here - if (!appPackage.GetRequiredMetadata(Log, MetadataNames.AndroidPackageName, out string androidPackageName)) + if (!isAlreadyArchived && extension != ".apk") { - Log.LogError($"{MetadataNames.AndroidPackageName} metadata must be specified; this may match, but can vary from file name"); + Log.LogError($"Unsupported payload file `{fileSystem.GetFileName(apkPath)}`; expecting .apk or .zip"); return null; } var (testTimeout, workItemTimeout, expectedExitCode, customCommands) = ParseMetadata(appPackage); + appPackage.TryGetMetadata(MetadataNames.AndroidPackageName, out string androidPackageName); if (customCommands == null) { // When no user commands are specified, we add the default `android test ...` command customCommands = GetDefaultCommand(appPackage, expectedExitCode); + + // Validation of any metadata specific to Android stuff goes here + if (string.IsNullOrEmpty(androidPackageName)) + { + Log.LogError($"{MetadataNames.AndroidPackageName} metadata must be specified when not supplying custom commands"); + return null; + } } - string command = GetHelixCommand(appPackage, apkPath, androidPackageName, testTimeout, expectedExitCode); + string apkName = Path.GetFileName(apkPath); + if (isAlreadyArchived) { + apkName = apkName.Replace(".zip", ".apk"); + } - Log.LogMessage($"Creating work item with properties Identity: {workItemName}, Payload: {apkPath}, Command: {command}"); + string command = GetHelixCommand(appPackage, apkName, androidPackageName, testTimeout, expectedExitCode); - string workItemZip = await CreateZipArchiveOfPackageAsync(zipArchiveManager, fileSystem, workItemName, apkPath, customCommands); + string workItemZip = await CreateZipArchiveOfPackageAsync( + zipArchiveManager, + fileSystem, + workItemName, + isAlreadyArchived, + apkPath, + customCommands); return CreateTaskItem(workItemName, workItemZip, command, workItemTimeout); } @@ -143,7 +156,7 @@ private string GetDefaultCommand(ITaskItem appPackage, int expectedExitCode) $"{ devOutArg } { instrumentationArg } { exitCodeArg } { extraArguments } { passthroughArgs }"; } - private string GetHelixCommand(ITaskItem appPackage, string apkPath, string androidPackageName, TimeSpan xHarnessTimeout, int expectedExitCode) + private string GetHelixCommand(ITaskItem appPackage, string apkName, string androidPackageName, TimeSpan xHarnessTimeout, int expectedExitCode) { appPackage.TryGetMetadata(MetadataNames.AndroidInstrumentationName, out string androidInstrumentationName); appPackage.TryGetMetadata(MetadataNames.DeviceOutputPath, out string deviceOutputPath); @@ -155,7 +168,7 @@ private string GetHelixCommand(ITaskItem appPackage, string apkPath, string andr // We either call .ps1 or .sh so we need to format the arguments well (PS has -argument, bash has --argument) string dash = IsPosixShell ? "--" : "-"; string xharnessRunCommand = $"{xharnessHelixWrapperScript} " + - $"{dash}app \"{Path.GetFileName(apkPath)}\" " + + $"{dash}app \"{apkName}\" " + $"{dash}timeout \"{xHarnessTimeout}\" " + $"{dash}package_name \"{androidPackageName}\" " + (expectedExitCode != 0 ? $" {dash}expected_exit_code \"{expectedExitCode}\" " : string.Empty) + @@ -171,6 +184,7 @@ private async Task CreateZipArchiveOfPackageAsync( IZipArchiveManager zipArchiveManager, IFileSystem fileSystem, string workItemName, + bool isAlreadyArchived, string fileToZip, string injectedCommands) { @@ -183,10 +197,19 @@ private async Task CreateZipArchiveOfPackageAsync( fileSystem.DeleteFile(outputZipPath); } - zipArchiveManager.ArchiveFile(fileToZip, outputZipPath); + if (!isAlreadyArchived) + { + zipArchiveManager.ArchiveFile(fileToZip, outputZipPath); + } + else + { + Log.LogMessage($"App payload '{workItemName}` has already been zipped. Copying to '{outputZipPath}` instead"); + fileSystem.FileCopy(fileToZip, outputZipPath); + } // WorkItem payloads of APKs can be reused if sent to multiple queues at once, // so we'll always include both scripts (very small) + Log.LogMessage($"Adding the XHarness job scripts into the payload archive"); await zipArchiveManager.AddResourceFileToArchive(outputZipPath, ScriptNamespace + PosixAndroidWrapperScript, PosixAndroidWrapperScript); await zipArchiveManager.AddResourceFileToArchive(outputZipPath, ScriptNamespace + NonPosixAndroidWrapperScript, NonPosixAndroidWrapperScript); await zipArchiveManager.AddContentToArchive(outputZipPath, CustomCommandsScript + (IsPosixShell ? ".sh" : ".ps1"), injectedCommands); diff --git a/src/Microsoft.DotNet.Helix/Sdk/CreateXHarnessAppleWorkItems.cs b/src/Microsoft.DotNet.Helix/Sdk/CreateXHarnessAppleWorkItems.cs index d30a7289c4a..43e164a9382 100644 --- a/src/Microsoft.DotNet.Helix/Sdk/CreateXHarnessAppleWorkItems.cs +++ b/src/Microsoft.DotNet.Helix/Sdk/CreateXHarnessAppleWorkItems.cs @@ -109,11 +109,17 @@ private async Task PrepareWorkItem( bool isAlreadyArchived = workItemName.EndsWith(".zip"); - if (isAlreadyArchived || workItemName.EndsWith(".app")) + if (isAlreadyArchived) { workItemName = workItemName.Substring(0, workItemName.Length - 4); } + if (workItemName.EndsWith(".app")) + { + // If someone named the zip something.app.zip, we want both gone + workItemName = workItemName.Substring(0, workItemName.Length - 4); + } + if (!ValidateAppBundlePath(fileSystem, appFolderPath, isAlreadyArchived)) { Log.LogError($"App bundle not found in {appFolderPath}"); @@ -176,8 +182,6 @@ private async Task PrepareWorkItem( string helixCommand = GetHelixCommand(appName, target, testTimeout, launchTimeout, includesTestRunner, expectedExitCode, resetSimulator); string payloadArchivePath = await CreateZipArchiveOfFolder(zipArchiveManager, fileSystem, workItemName, isAlreadyArchived, appFolderPath, customCommands); - Log.LogMessage($"Creating work item with properties Identity: {workItemName}, Payload: {appFolderPath}, Command: {helixCommand}"); - return CreateTaskItem(workItemName, payloadArchivePath, helixCommand, workItemTimeout); } diff --git a/src/Microsoft.DotNet.Helix/Sdk/ProvisioningProfileProvider.cs b/src/Microsoft.DotNet.Helix/Sdk/ProvisioningProfileProvider.cs index b1c88bc5ace..0dcfdcdfbb7 100644 --- a/src/Microsoft.DotNet.Helix/Sdk/ProvisioningProfileProvider.cs +++ b/src/Microsoft.DotNet.Helix/Sdk/ProvisioningProfileProvider.cs @@ -62,6 +62,17 @@ public void AddProfilesToBundles(ITaskItem[] appBundles) foreach (var appBundle in appBundles) { + string appBundlePath; + if (appBundle.TryGetMetadata(CreateXHarnessAppleWorkItems.MetadataNames.AppBundlePath, out string pathMetadata) + && !string.IsNullOrEmpty(pathMetadata)) + { + appBundlePath = pathMetadata; + } + else + { + appBundlePath = appBundle.ItemSpec; + } + if (!appBundle.TryGetMetadata(CreateXHarnessAppleWorkItems.MetadataNames.Target, out string bundleTargets)) { _log.LogError("'Targets' metadata must be specified - " + @@ -69,6 +80,12 @@ public void AddProfilesToBundles(ITaskItem[] appBundles) continue; } + if (appBundlePath.EndsWith(".zip")) + { + // TODO: We need to be able to add provisioning profiles into a zipped payload too + continue; + } + foreach (var pair in s_targetNames) { var platform = pair.Key; @@ -80,7 +97,7 @@ public void AddProfilesToBundles(ITaskItem[] appBundles) } // App comes with a profile already - var provisioningProfileDestPath = _fileSystem.PathCombine(appBundle.ItemSpec, "embedded.mobileprovision"); + var provisioningProfileDestPath = _fileSystem.PathCombine(appBundlePath, "embedded.mobileprovision"); if (_fileSystem.FileExists(provisioningProfileDestPath)) { _log.LogMessage($"Bundle already contains a provisioning profile at `{provisioningProfileDestPath}`"); diff --git a/src/Microsoft.DotNet.Helix/Sdk/XharnessTaskBase.cs b/src/Microsoft.DotNet.Helix/Sdk/XharnessTaskBase.cs index 205bf33a6dd..311aeed96d4 100644 --- a/src/Microsoft.DotNet.Helix/Sdk/XharnessTaskBase.cs +++ b/src/Microsoft.DotNet.Helix/Sdk/XharnessTaskBase.cs @@ -95,13 +95,17 @@ public class MetadataName return (testTimeout, workItemTimeout, expectedExitCode, customCommands); } - protected Build.Utilities.TaskItem CreateTaskItem(string workItemName, string payloadArchivePath, string command, TimeSpan timeout) => - new (workItemName, new Dictionary() + protected Build.Utilities.TaskItem CreateTaskItem(string workItemName, string payloadArchivePath, string command, TimeSpan timeout) + { + Log.LogMessage($"Creating work item with properties Identity: {workItemName}, Payload: {payloadArchivePath}, Command: {command}"); + + return new(workItemName, new Dictionary() { { "Identity", workItemName }, { "PayloadArchive", payloadArchivePath }, { "Command", command }, { "Timeout", timeout.ToString() }, }); + } } } diff --git a/src/Microsoft.DotNet.Helix/Sdk/tools/xharness-runner/xharness-helix-job.android.sh b/src/Microsoft.DotNet.Helix/Sdk/tools/xharness-runner/xharness-helix-job.android.sh index d6501bc00c3..036b4c8deb9 100644 --- a/src/Microsoft.DotNet.Helix/Sdk/tools/xharness-runner/xharness-helix-job.android.sh +++ b/src/Microsoft.DotNet.Helix/Sdk/tools/xharness-runner/xharness-helix-job.android.sh @@ -58,10 +58,6 @@ if [ -z "$timeout" ]; then die "No timeout was provided"; fi -if [ -z "$package_name" ]; then - die "Package name path wasn't provided"; -fi - if [ -z "$output_directory" ]; then die "No output directory provided"; fi From ca8ebd397fffb437282c32f4be79c74ac21c2724 Mon Sep 17 00:00:00 2001 From: Matt Galbraith Date: Tue, 31 Aug 2021 13:31:15 -0700 Subject: [PATCH 333/699] Update to SDK that understands NUGET_ENABLE_EXPERIMENTAL_HTTP_RETRY (#7814) Update to an SDK that understands NUGET_ENABLE_EXPERIMENTAL_HTTP_RETRY, and set some values in common entry points (validated in binlogs) Users who need these values set from non-arcade execution paths can set them globally via yaml or their own scripts. --- eng/common/tools.ps1 | 11 +++++++++++ eng/common/tools.sh | 9 +++++++++ global.json | 2 +- .../src/build/Packaging.targets | 4 ++++ .../src/Microsoft.DotNet.RemoteExecutor.csproj | 2 +- 5 files changed, 26 insertions(+), 2 deletions(-) diff --git a/eng/common/tools.ps1 b/eng/common/tools.ps1 index 56ee4a577ac..02347914f5d 100644 --- a/eng/common/tools.ps1 +++ b/eng/common/tools.ps1 @@ -709,6 +709,15 @@ function MSBuild() { Write-PipelineSetVariable -Name 'NUGET_PLUGIN_REQUEST_TIMEOUT_IN_SECONDS' -Value '20' } + if ($ci) { + $env:NUGET_ENABLE_EXPERIMENTAL_HTTP_RETRY = 'true' + $env:NUGET_EXPERIMENTAL_MAX_NETWORK_TRY_COUNT = 6 + $env:NUGET_EXPERIMENTAL_NETWORK_RETRY_DELAY_MILLISECONDS = 1000 + Write-PipelineSetVariable -Name 'NUGET_ENABLE_EXPERIMENTAL_HTTP_RETRY' -Value 'true' + Write-PipelineSetVariable -Name 'NUGET_EXPERIMENTAL_MAX_NETWORK_TRY_COUNT' -Value '6' + Write-PipelineSetVariable -Name 'NUGET_EXPERIMENTAL_NETWORK_RETRY_DELAY_MILLISECONDS' -Value '1000' + } + $toolsetBuildProject = InitializeToolset $basePath = Split-Path -parent $toolsetBuildProject $possiblePaths = @( @@ -717,6 +726,8 @@ function MSBuild() { (Join-Path $basePath (Join-Path $buildTool.Framework 'Microsoft.DotNet.Arcade.Sdk.dll')), (Join-Path $basePath (Join-Path netcoreapp2.1 'Microsoft.DotNet.ArcadeLogging.dll')), (Join-Path $basePath (Join-Path netcoreapp2.1 'Microsoft.DotNet.Arcade.Sdk.dll')) + (Join-Path $basePath (Join-Path netcoreapp3.1 'Microsoft.DotNet.ArcadeLogging.dll')), + (Join-Path $basePath (Join-Path netcoreapp3.1 'Microsoft.DotNet.Arcade.Sdk.dll')) ) $selectedPath = $null foreach ($path in $possiblePaths) { diff --git a/eng/common/tools.sh b/eng/common/tools.sh index 41e323104df..6a4871ef72b 100755 --- a/eng/common/tools.sh +++ b/eng/common/tools.sh @@ -417,6 +417,13 @@ function MSBuild { export NUGET_PLUGIN_REQUEST_TIMEOUT_IN_SECONDS=20 Write-PipelineSetVariable -name "NUGET_PLUGIN_HANDSHAKE_TIMEOUT_IN_SECONDS" -value "20" Write-PipelineSetVariable -name "NUGET_PLUGIN_REQUEST_TIMEOUT_IN_SECONDS" -value "20" + + export NUGET_ENABLE_EXPERIMENTAL_HTTP_RETRY=true + export NUGET_EXPERIMENTAL_MAX_NETWORK_TRY_COUNT=6 + export NUGET_EXPERIMENTAL_NETWORK_RETRY_DELAY_MILLISECONDS=1000 + Write-PipelineSetVariable -name "NUGET_ENABLE_EXPERIMENTAL_HTTP_RETRY" -value "true" + Write-PipelineSetVariable -name "NUGET_EXPERIMENTAL_MAX_NETWORK_TRY_COUNT" -value "6" + Write-PipelineSetVariable -name "NUGET_EXPERIMENTAL_NETWORK_RETRY_DELAY_MILLISECONDS" -value "1000" fi local toolset_dir="${_InitializeToolset%/*}" @@ -427,6 +434,8 @@ function MSBuild { possiblePaths+=( "$toolset_dir/$_InitializeBuildToolFramework/Microsoft.DotNet.Arcade.Sdk.dll" ) possiblePaths+=( "$toolset_dir/netcoreapp2.1/Microsoft.DotNet.ArcadeLogging.dll" ) possiblePaths+=( "$toolset_dir/netcoreapp2.1/Microsoft.DotNet.Arcade.Sdk.dll" ) + possiblePaths+=( "$toolset_dir/netcoreapp3.1/Microsoft.DotNet.ArcadeLogging.dll" ) + possiblePaths+=( "$toolset_dir/netcoreapp3.1/Microsoft.DotNet.Arcade.Sdk.dll" ) for path in "${possiblePaths[@]}"; do if [[ -f $path ]]; then selectedPath=$path diff --git a/global.json b/global.json index aefc817aafd..48ed24b673e 100644 --- a/global.json +++ b/global.json @@ -1,6 +1,6 @@ { "tools": { - "dotnet": "6.0.100-rc.1.21379.2" + "dotnet": "6.0.100-rc.1.21430.12" }, "msbuild-sdks": { "Microsoft.DotNet.Arcade.Sdk": "6.0.0-beta.21427.6", diff --git a/src/Microsoft.DotNet.Build.Tasks.Packaging/src/build/Packaging.targets b/src/Microsoft.DotNet.Build.Tasks.Packaging/src/build/Packaging.targets index ccdfb455ffa..8d8af6a664d 100644 --- a/src/Microsoft.DotNet.Build.Tasks.Packaging/src/build/Packaging.targets +++ b/src/Microsoft.DotNet.Build.Tasks.Packaging/src/build/Packaging.targets @@ -929,6 +929,10 @@ @(NETCoreApp30RIDs) + + + @(NETCoreApp31RIDs) + @(NETCoreApp50RIDs) diff --git a/src/Microsoft.DotNet.RemoteExecutor/src/Microsoft.DotNet.RemoteExecutor.csproj b/src/Microsoft.DotNet.RemoteExecutor/src/Microsoft.DotNet.RemoteExecutor.csproj index 24b5c5f1caf..8da0c48f81d 100644 --- a/src/Microsoft.DotNet.RemoteExecutor/src/Microsoft.DotNet.RemoteExecutor.csproj +++ b/src/Microsoft.DotNet.RemoteExecutor/src/Microsoft.DotNet.RemoteExecutor.csproj @@ -4,7 +4,7 @@ Exe - netcoreapp2.1;net461 + netcoreapp3.1;net461 This package provides support for running tests out-of-process. true true From 75af90887dd03c59d5f91fc159ae6fc9699ac5fe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C5=99emek=20Vysok=C3=BD?= Date: Wed, 1 Sep 2021 15:48:57 +0200 Subject: [PATCH 334/699] Bump SDK used by XHarness while we're on RC1 (#7823) Follow-up for #7814 --- .../Sdk/tools/xharness-runner/XHarnessRunner.targets | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Microsoft.DotNet.Helix/Sdk/tools/xharness-runner/XHarnessRunner.targets b/src/Microsoft.DotNet.Helix/Sdk/tools/xharness-runner/XHarnessRunner.targets index d8f3802f7c3..91573291c8b 100644 --- a/src/Microsoft.DotNet.Helix/Sdk/tools/xharness-runner/XHarnessRunner.targets +++ b/src/Microsoft.DotNet.Helix/Sdk/tools/xharness-runner/XHarnessRunner.targets @@ -10,7 +10,7 @@ $(AspNetCoreRuntimeVersion) --> sdk - 6.0.100-rc.1.21379.2 + 6.0.100-rc.1.21430.12 $(AspNetCoreRuntimeVersion) From 4d1fbd8bf06ff258d26f747d83d4320a8db6c6aa Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Wed, 1 Sep 2021 14:50:30 +0000 Subject: [PATCH 335/699] Update dependencies from https://github.com/dotnet/roslyn build 20210827.11 (#7810) [main] Update dependencies from dotnet/roslyn --- eng/Version.Details.xml | 4 ++-- eng/Versions.props | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index f510811d22e..9e1215e8f76 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -43,9 +43,9 @@ https://github.com/dotnet/xharness 2e03d2d1081b606ad3c5f79709297a9c5627854d - + https://github.com/dotnet/roslyn - 158f906df6b1e4ca99fe7cf6ed78822515d64230 + 7f1cd24517a65bac2e6e921bf89c9b8d4e2696ca https://github.com/mono/linker diff --git a/eng/Versions.props b/eng/Versions.props index 66a51cf30ff..d10c37422f2 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -34,7 +34,7 @@ 2.0.0 2.1.1 2.1.0 - 4.0.0-4.21420.19 + 4.0.0-4.21427.11 16.7.1 6.0.100-preview.6.21424.4 4.8.3 From b0aeac99a3e5dada7553a5ebf61b57c6b6be4b3f Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Wed, 1 Sep 2021 14:50:43 +0000 Subject: [PATCH 336/699] [main] Update dependencies from dotnet/xliff-tasks dotnet/arcade mono/linker (#7816) [main] Update dependencies from dotnet/xliff-tasks dotnet/arcade mono/linker --- eng/Version.Details.xml | 28 ++++++++++++++-------------- eng/Versions.props | 10 +++++----- global.json | 4 ++-- 3 files changed, 21 insertions(+), 21 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index 9e1215e8f76..ba0d62ca607 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -11,25 +11,25 @@ - + https://github.com/dotnet/arcade - 474307e526160c813c9fd58060eb8356ccca6099 + e0260cb677c04cb0244aad7537c33bec4adce422 - + https://github.com/dotnet/arcade - 474307e526160c813c9fd58060eb8356ccca6099 + e0260cb677c04cb0244aad7537c33bec4adce422 - + https://github.com/dotnet/arcade - 474307e526160c813c9fd58060eb8356ccca6099 + e0260cb677c04cb0244aad7537c33bec4adce422 - + https://github.com/dotnet/arcade - 474307e526160c813c9fd58060eb8356ccca6099 + e0260cb677c04cb0244aad7537c33bec4adce422 - + https://github.com/dotnet/arcade - 474307e526160c813c9fd58060eb8356ccca6099 + e0260cb677c04cb0244aad7537c33bec4adce422 https://github.com/dotnet/arcade-services @@ -47,9 +47,9 @@ https://github.com/dotnet/roslyn 7f1cd24517a65bac2e6e921bf89c9b8d4e2696ca - + https://github.com/mono/linker - edad7cbe1c568d299c196883de57fb5519fd6399 + a1f528d854ee057290682490a74e59a809fe453f https://github.com/dotnet/sourcelink @@ -68,9 +68,9 @@ https://github.com/dotnet/symreader-converter c5ba7c88f92e2dde156c324a8c8edc04d9fa4fe0 - + https://github.com/dotnet/xliff-tasks - 178ed3c7ed19e5bda54a8c3f15a5c441ee63ab93 + bc3233146e1fcd393ed471d5005333c83363e0fe diff --git a/eng/Versions.props b/eng/Versions.props index d10c37422f2..45828dc0875 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -36,7 +36,7 @@ 2.1.0 4.0.0-4.21427.11 16.7.1 - 6.0.100-preview.6.21424.4 + 6.0.100-preview.6.21430.2 4.8.3 5.3.0.1 2.3.0 @@ -65,8 +65,8 @@ 2.4.1 2.0.3 2.4.1 - 6.0.0-beta.21427.6 - 6.0.0-beta.21427.6 + 6.0.0-beta.21430.1 + 6.0.0-beta.21430.1 1.22.0 1.1.2 2.0.0 @@ -77,8 +77,8 @@ 1.1.0-beta.20258.6 1.1.0-beta-21423-02 1.1.0-beta-21423-02 - 6.0.0-beta.21427.6 - 1.0.0-beta.21428.1 + 6.0.0-beta.21430.1 + 1.0.0-beta.21431.1 1.1.0-beta.21378.2 1.0.0-prerelease.21427.1 1.1.156602 diff --git a/global.json b/global.json index 48ed24b673e..f4d5c7a6ee4 100644 --- a/global.json +++ b/global.json @@ -3,7 +3,7 @@ "dotnet": "6.0.100-rc.1.21430.12" }, "msbuild-sdks": { - "Microsoft.DotNet.Arcade.Sdk": "6.0.0-beta.21427.6", - "Microsoft.DotNet.Helix.Sdk": "6.0.0-beta.21427.6" + "Microsoft.DotNet.Arcade.Sdk": "6.0.0-beta.21430.1", + "Microsoft.DotNet.Helix.Sdk": "6.0.0-beta.21430.1" } } From 923c95ec2e9512285f801c84145a8af3728b1e3b Mon Sep 17 00:00:00 2001 From: Jon Fortescue Date: Wed, 1 Sep 2021 10:03:47 -0700 Subject: [PATCH 337/699] Update OneLoc links (#7821) --- Documentation/OneLocBuild.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Documentation/OneLocBuild.md b/Documentation/OneLocBuild.md index 0cc4f6858a9..5ad1b1f506c 100644 --- a/Documentation/OneLocBuild.md +++ b/Documentation/OneLocBuild.md @@ -29,7 +29,7 @@ To prevent OneLocBuild from running in the public project where it will fail. 3. Run the pipeline you want to use OneLocBuild on your test branch. 4. Open a ticket with the localization team using - [this template](https://ceapex.visualstudio.com/CEINTL/_workitems/create/Loc%20Request?templateId=60b0dcf9-9892-4910-934e-d5becddd1bc1&ownerId=c2e38d3d-0e9e-429f-955d-6e39fc6f0457). + [this template](https://aka.ms/ceChangeLocConfig). Include the link to the test build you've done. 5. The loc team will generate an LCL package for you and send you its ID. It will be something like `LCL-JUNO-PROD-YOURREPO`. @@ -61,7 +61,7 @@ As a further note, the template by default assumes that your mirror repository i organization. If that is not the case, you will need to specify `GitHubOrg` as well. 8. Merge the changes to your main branch and then open a - [repo modification ticket](https://ceapex.visualstudio.com/CEINTL/_workitems/create/Loc%20Request?templateId=415a0569-35ed-45c3-9321-8b1affff1f52&ownerId=c2e38d3d-0e9e-429f-955d-6e39fc6f0457) + [repo modification ticket](https://aka.ms/ceChangeLocConfig) with the loc team to let them know to retarget the branch. @@ -82,7 +82,7 @@ If you're releasing from any other branch (including servicing branches), you mu ```yaml MirrorBranch: target-branch ``` -2. Open a [repo modification ticket](https://ceapex.visualstudio.com/CEINTL/_workitems/create/Loc%20Request?templateId=415a0569-35ed-45c3-9321-8b1affff1f52&ownerId=c2e38d3d-0e9e-429f-955d-6e39fc6f0457) with the +2. Open a [repo modification ticket](https://aka.ms/ceChangeLocConfig) with the loc team at least two weeks before the release and request that they re-target your repository to the release branch. 3. Merge the OneLocBuild PRs to your release branch. 4. After the release, open another repo modification ticket to re-target your repository to the `main` branch again. From 7168d631952ce619c8b685e57e4486b9029cde4f Mon Sep 17 00:00:00 2001 From: Peter Collins Date: Thu, 2 Sep 2021 09:51:04 -0400 Subject: [PATCH 338/699] [workloads] Add locks for parallel NuGet access (#7813) Android workload pack conversion has been failing intermittently: Generating package project: 'obj\Debug\src\msiPackage\x86\Microsoft.Android.Sdk.Windows\msi.csproj' convert.proj(72,5): error : One or more errors occurred. convert.proj(72,5): error : Failed to generate MSIs for workload packs. C:\Users\AzDevOps\.nuget\packages\wix\3.14.0-dotnet\tools\heat.exe dir obj\Debug\pkg\Microsoft.Android.Templates.31.0.100-rc.2.14 -cg CG_PackageContent -var var.SourceDir -ag -srd -sreg -dr InstallDir -o obj\Debug\src\msi\Microsoft.Android.Templates\31.0.100-rc.2.14\x64\PackageContent.wxs ##[error]light.exe(0,0): Error LGHT0001: The system cannot find the file specified. (Exception from HRESULT: 0x80070002) light.exe : error LGHT0001: The system cannot find the file specified. (Exception from HRESULT: 0x80070002) [C:\a\1\s\nuget-msi-convert\convert-v2\convert.proj] Exception Type: System.IO.FileNotFoundException Stack Trace: at Microsoft.Tools.WindowsInstallerXml.Cab.Interop.NativeMethods.CreateCabFinish(IntPtr contextHandle, IntPtr newCabNamesCallBackAddress) at Microsoft.Tools.WindowsInstallerXml.Cab.WixCreateCab.Complete(IntPtr newCabNamesCallBackAddress) at Microsoft.Tools.WindowsInstallerXml.CabinetBuilder.CreateCabinet(CabinetWorkItem cabinetWorkItem) at Microsoft.Tools.WindowsInstallerXml.CabinetBuilder.ProcessWorkItems() I've added a lock to attempt to synchronize some .nupkg file access that seemed to be problematic when executing asynchronously. --- .../src/GenerateMsiBase.cs | 23 +++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/src/Microsoft.DotNet.Build.Tasks.Workloads/src/GenerateMsiBase.cs b/src/Microsoft.DotNet.Build.Tasks.Workloads/src/GenerateMsiBase.cs index c139e72dc51..11b7560fa4b 100644 --- a/src/Microsoft.DotNet.Build.Tasks.Workloads/src/GenerateMsiBase.cs +++ b/src/Microsoft.DotNet.Build.Tasks.Workloads/src/GenerateMsiBase.cs @@ -110,6 +110,11 @@ public string SuppressIces set; } + /// + /// Used to synchronize access to the NuGet being extracted. + /// + private readonly object extractNuGetLock = new object(); + /// /// Generate a set of MSIs for the specified platforms using the specified NuGet package. /// @@ -118,7 +123,11 @@ public string SuppressIces /// protected IEnumerable Generate(string sourcePackage, string swixPackageId, string outputPath, WorkloadPackKind kind, params string[] platforms) { - NugetPackage nupkg = new(sourcePackage, Log); + NugetPackage nupkg = null; + lock (extractNuGetLock) + { + nupkg = new(sourcePackage, Log); + } List msis = new(); // MSI ProductName defaults to the package title and fallback to the package ID with a warning. @@ -139,7 +148,10 @@ protected IEnumerable Generate(string sourcePackage, string swixPacka if ((kind != WorkloadPackKind.Library) && (kind != WorkloadPackKind.Template)) { Log.LogMessage(MessageImportance.Low, $"Extracting '{sourcePackage}' to '{packageContentsDirectory}'"); - nupkg.Extract(packageContentsDirectory, exclusions); + lock (extractNuGetLock) + { + nupkg.Extract(packageContentsDirectory, exclusions); + } } else { @@ -188,9 +200,12 @@ protected IEnumerable Generate(string sourcePackage, string swixPacka SourceDirectory = packageContentsDirectory }; - if (!heat.Execute()) + lock (extractNuGetLock) { - throw new Exception($"Failed to harvest package contents."); + if (!heat.Execute()) + { + throw new Exception($"Failed to harvest package contents."); + } } // Compile the MSI sources From eecf5030126490497f2ff9fe4b7ecd4c546c0f30 Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Thu, 2 Sep 2021 14:50:21 +0000 Subject: [PATCH 339/699] Update dependencies from https://github.com/dotnet/arcade build 20210901.3 (#7826) [main] Update dependencies from dotnet/arcade --- eng/Version.Details.xml | 20 ++++++++++---------- eng/Versions.props | 6 +++--- global.json | 4 ++-- 3 files changed, 15 insertions(+), 15 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index ba0d62ca607..fa877beeab1 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -11,25 +11,25 @@ - + https://github.com/dotnet/arcade - e0260cb677c04cb0244aad7537c33bec4adce422 + 923c95ec2e9512285f801c84145a8af3728b1e3b - + https://github.com/dotnet/arcade - e0260cb677c04cb0244aad7537c33bec4adce422 + 923c95ec2e9512285f801c84145a8af3728b1e3b - + https://github.com/dotnet/arcade - e0260cb677c04cb0244aad7537c33bec4adce422 + 923c95ec2e9512285f801c84145a8af3728b1e3b - + https://github.com/dotnet/arcade - e0260cb677c04cb0244aad7537c33bec4adce422 + 923c95ec2e9512285f801c84145a8af3728b1e3b - + https://github.com/dotnet/arcade - e0260cb677c04cb0244aad7537c33bec4adce422 + 923c95ec2e9512285f801c84145a8af3728b1e3b https://github.com/dotnet/arcade-services diff --git a/eng/Versions.props b/eng/Versions.props index 45828dc0875..ea1863cf98f 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -65,8 +65,8 @@ 2.4.1 2.0.3 2.4.1 - 6.0.0-beta.21430.1 - 6.0.0-beta.21430.1 + 6.0.0-beta.21451.3 + 6.0.0-beta.21451.3 1.22.0 1.1.2 2.0.0 @@ -77,7 +77,7 @@ 1.1.0-beta.20258.6 1.1.0-beta-21423-02 1.1.0-beta-21423-02 - 6.0.0-beta.21430.1 + 6.0.0-beta.21451.3 1.0.0-beta.21431.1 1.1.0-beta.21378.2 1.0.0-prerelease.21427.1 diff --git a/global.json b/global.json index f4d5c7a6ee4..b90c255f11d 100644 --- a/global.json +++ b/global.json @@ -3,7 +3,7 @@ "dotnet": "6.0.100-rc.1.21430.12" }, "msbuild-sdks": { - "Microsoft.DotNet.Arcade.Sdk": "6.0.0-beta.21430.1", - "Microsoft.DotNet.Helix.Sdk": "6.0.0-beta.21430.1" + "Microsoft.DotNet.Arcade.Sdk": "6.0.0-beta.21451.3", + "Microsoft.DotNet.Helix.Sdk": "6.0.0-beta.21451.3" } } From 4002b722b0a7596fe55c5654998b70fa1d00d70a Mon Sep 17 00:00:00 2001 From: Epsitha Ananth <47157394+epananth@users.noreply.github.com> Date: Thu, 2 Sep 2021 14:26:21 -0700 Subject: [PATCH 340/699] Update version (#7829) --- eng/Versions.props | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/eng/Versions.props b/eng/Versions.props index ea1863cf98f..00420b59f4f 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -2,7 +2,7 @@ - 6.0.0 + 7.0.0 beta false From 00949c51badfda4edd51d217a82ba607db7c4576 Mon Sep 17 00:00:00 2001 From: Epsitha Ananth <47157394+epananth@users.noreply.github.com> Date: Thu, 2 Sep 2021 15:50:39 -0700 Subject: [PATCH 341/699] Added .Net 6 Eng and Validation channels (#7832) --- .../src/model/PublishingConstants.cs | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/src/Microsoft.DotNet.Build.Tasks.Feed/src/model/PublishingConstants.cs b/src/Microsoft.DotNet.Build.Tasks.Feed/src/model/PublishingConstants.cs index e222e58fc1b..9c778de99ef 100644 --- a/src/Microsoft.DotNet.Build.Tasks.Feed/src/model/PublishingConstants.cs +++ b/src/Microsoft.DotNet.Build.Tasks.Feed/src/model/PublishingConstants.cs @@ -739,6 +739,20 @@ public enum BuildQuality PublicAndInternalSymbolTargets, flatten: false), + // ".NET 6 Eng", + new TargetChannelConfig( + 2293, + false, + PublishingInfraVersion.Next, + "eng/net6", + FeedDotNetEngShipping, + FeedDotNetEngTransport, + FeedDotNetEngSymbols, + FeedForChecksums, + FeedForInstallers, + PublicAndInternalSymbolTargets, + filenamesToExclude: FilenamesToExclude), + // ".NET Eng - Validation", new TargetChannelConfig( 9, @@ -767,6 +781,20 @@ public enum BuildQuality PublicAndInternalSymbolTargets, flatten: false), + // ".NET 6 Eng - Validation", + new TargetChannelConfig( + 2294, + false, + PublishingInfraVersion.Next, + "eng/net6validation", + FeedDotNetEngShipping, + FeedDotNetEngTransport, + FeedDotNetEngSymbols, + FeedForChecksums, + FeedForInstallers, + PublicAndInternalSymbolTargets, + flatten: false), + // "General Testing", new TargetChannelConfig( 529, From 0ec8dbacaefa7ccdb4bc96e120e07dc60c6eda98 Mon Sep 17 00:00:00 2001 From: Eric StJohn Date: Fri, 3 Sep 2021 16:00:25 -0700 Subject: [PATCH 342/699] Adding detection and retargeting of DOTNETHOME (#7785) * Adding detection and retargeting of DOTNETHOME When x64 is installed on non-x64 machine, place in an x64 subdirectory. * Remove test value of dotnet folder * Fix ProgramFilesFolder preprocessor variable usage * Refactor Set_DOTNETHOME_x64 into a single shared source file * Add CA ID for INSTALLING_IN_EMULATION. * Define Platform consistently * Move workload registration to platform specific * Refactor INSTALLING_IN_EMULATION property Don't need to use a registry search since environment of the MSIServer process can be read (TBD pending reccomendation from MSI team). Also make property work for any architecture, in case we wish to use it more generically (EG: to condition PATH entry in host installer). * Make platform comparison case insensitive * Respond to feedback --- src/Common/wix/dotnethome_x64.wxs | 38 +++++++++++++++++++ ...osoft.DotNet.Build.Tasks.Installers.csproj | 1 + .../build/wix/product/product.wxs | 6 ++- .../build/wix/wix.targets | 1 + .../src/GenerateManifestMsi.cs | 1 + .../src/GenerateMsiBase.cs | 1 + ...rosoft.DotNet.Build.Tasks.Workloads.csproj | 1 + .../src/MsiTemplate/Directories.wxs | 4 ++ .../src/MsiTemplate/ManifestProduct.wxs | 4 ++ 9 files changed, 56 insertions(+), 1 deletion(-) create mode 100644 src/Common/wix/dotnethome_x64.wxs diff --git a/src/Common/wix/dotnethome_x64.wxs b/src/Common/wix/dotnethome_x64.wxs new file mode 100644 index 00000000000..5e30f98719d --- /dev/null +++ b/src/Common/wix/dotnethome_x64.wxs @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + ? + + + + + + NOT %PROCESSOR_ARCHITECTURE="$(var.InstallerArchitecture)" + + + + + + + + NON_NATIVE_ARCHITECTURE AND NOT DOTNETHOME + + + + \ No newline at end of file diff --git a/src/Microsoft.DotNet.Build.Tasks.Installers/Microsoft.DotNet.Build.Tasks.Installers.csproj b/src/Microsoft.DotNet.Build.Tasks.Installers/Microsoft.DotNet.Build.Tasks.Installers.csproj index 17fa172fe3f..45eb895e1dc 100644 --- a/src/Microsoft.DotNet.Build.Tasks.Installers/Microsoft.DotNet.Build.Tasks.Installers.csproj +++ b/src/Microsoft.DotNet.Build.Tasks.Installers/Microsoft.DotNet.Build.Tasks.Installers.csproj @@ -25,6 +25,7 @@ build + diff --git a/src/Microsoft.DotNet.Build.Tasks.Installers/build/wix/product/product.wxs b/src/Microsoft.DotNet.Build.Tasks.Installers/build/wix/product/product.wxs index 1bf18ed9e2d..28a564cd295 100644 --- a/src/Microsoft.DotNet.Build.Tasks.Installers/build/wix/product/product.wxs +++ b/src/Microsoft.DotNet.Build.Tasks.Installers/build/wix/product/product.wxs @@ -1,4 +1,5 @@ + @@ -51,6 +52,9 @@ - + + + + diff --git a/src/Microsoft.DotNet.Build.Tasks.Installers/build/wix/wix.targets b/src/Microsoft.DotNet.Build.Tasks.Installers/build/wix/wix.targets index 7890004666d..86ee8067fe3 100644 --- a/src/Microsoft.DotNet.Build.Tasks.Installers/build/wix/wix.targets +++ b/src/Microsoft.DotNet.Build.Tasks.Installers/build/wix/wix.targets @@ -108,6 +108,7 @@ + diff --git a/src/Microsoft.DotNet.Build.Tasks.Workloads/src/GenerateManifestMsi.cs b/src/Microsoft.DotNet.Build.Tasks.Workloads/src/GenerateManifestMsi.cs index a9ab8650c44..d5178ef9bd5 100644 --- a/src/Microsoft.DotNet.Build.Tasks.Workloads/src/GenerateManifestMsi.cs +++ b/src/Microsoft.DotNet.Build.Tasks.Workloads/src/GenerateManifestMsi.cs @@ -167,6 +167,7 @@ public override bool Execute() List sourceFiles = new(); string msiSourcePath = Path.Combine(MsiDirectory, $"{nupkg.Id}", $"{nupkg.Version}", platform); sourceFiles.Add(EmbeddedTemplates.Extract("DependencyProvider.wxs", msiSourcePath)); + sourceFiles.Add(EmbeddedTemplates.Extract("dotnethome_x64.wxs", msiSourcePath)); sourceFiles.Add(EmbeddedTemplates.Extract("ManifestProduct.wxs", msiSourcePath)); string EulaRtfPath = Path.Combine(msiSourcePath, "eula.rtf"); diff --git a/src/Microsoft.DotNet.Build.Tasks.Workloads/src/GenerateMsiBase.cs b/src/Microsoft.DotNet.Build.Tasks.Workloads/src/GenerateMsiBase.cs index 11b7560fa4b..c9a4bf14510 100644 --- a/src/Microsoft.DotNet.Build.Tasks.Workloads/src/GenerateMsiBase.cs +++ b/src/Microsoft.DotNet.Build.Tasks.Workloads/src/GenerateMsiBase.cs @@ -176,6 +176,7 @@ protected IEnumerable Generate(string sourcePackage, string swixPacka string msiSourcePath = Path.Combine(MsiDirectory, $"{nupkg.Id}", $"{nupkg.Version}", platform); sourceFiles.Add(EmbeddedTemplates.Extract("DependencyProvider.wxs", msiSourcePath)); sourceFiles.Add(EmbeddedTemplates.Extract("Directories.wxs", msiSourcePath)); + sourceFiles.Add(EmbeddedTemplates.Extract("dotnethome_x64.wxs", msiSourcePath)); sourceFiles.Add(EmbeddedTemplates.Extract("Product.wxs", msiSourcePath)); sourceFiles.Add(EmbeddedTemplates.Extract("Registry.wxs", msiSourcePath)); diff --git a/src/Microsoft.DotNet.Build.Tasks.Workloads/src/Microsoft.DotNet.Build.Tasks.Workloads.csproj b/src/Microsoft.DotNet.Build.Tasks.Workloads/src/Microsoft.DotNet.Build.Tasks.Workloads.csproj index e44ad1cc54a..19cf67b52d7 100644 --- a/src/Microsoft.DotNet.Build.Tasks.Workloads/src/Microsoft.DotNet.Build.Tasks.Workloads.csproj +++ b/src/Microsoft.DotNet.Build.Tasks.Workloads/src/Microsoft.DotNet.Build.Tasks.Workloads.csproj @@ -52,6 +52,7 @@ + diff --git a/src/Microsoft.DotNet.Build.Tasks.Workloads/src/MsiTemplate/Directories.wxs b/src/Microsoft.DotNet.Build.Tasks.Workloads/src/MsiTemplate/Directories.wxs index 709bbb08563..e40ac5bb203 100644 --- a/src/Microsoft.DotNet.Build.Tasks.Workloads/src/MsiTemplate/Directories.wxs +++ b/src/Microsoft.DotNet.Build.Tasks.Workloads/src/MsiTemplate/Directories.wxs @@ -16,5 +16,9 @@ + + + + diff --git a/src/Microsoft.DotNet.Build.Tasks.Workloads/src/MsiTemplate/ManifestProduct.wxs b/src/Microsoft.DotNet.Build.Tasks.Workloads/src/MsiTemplate/ManifestProduct.wxs index 128fe2200bb..7a78f090232 100644 --- a/src/Microsoft.DotNet.Build.Tasks.Workloads/src/MsiTemplate/ManifestProduct.wxs +++ b/src/Microsoft.DotNet.Build.Tasks.Workloads/src/MsiTemplate/ManifestProduct.wxs @@ -35,6 +35,10 @@ + + + + From 7309c692126e24bc10702f39fe45b2a295b224d2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C5=99emek=20Vysok=C3=BD?= Date: Mon, 6 Sep 2021 18:01:34 +0200 Subject: [PATCH 343/699] Deduplicate XHarness Apple/Android code in Helix SDK (#7840) Deduplicating how we parse metadata and create .zip archives in Helix SDK (debt from #7811) --- .../Microsoft.Arcade.Common/FileSystem.cs | 2 + .../Microsoft.Arcade.Common/IFileSystem.cs | 2 + .../MockFileSystem.cs | 12 +++ .../CreateXHarnessAndroidWorkItemsTests.cs | 10 +-- .../CreateXHarnessAppleWorkItemsTests.cs | 10 +-- .../Sdk/CreateXHarnessAndroidWorkItems.cs | 63 +++------------ .../Sdk/CreateXHarnessAppleWorkItems.cs | 70 +++-------------- .../Sdk/XharnessTaskBase.cs | 77 ++++++++++++++++++- 8 files changed, 123 insertions(+), 123 deletions(-) diff --git a/src/Common/Microsoft.Arcade.Common/FileSystem.cs b/src/Common/Microsoft.Arcade.Common/FileSystem.cs index d5a12c3d3eb..83fd1df0dcf 100644 --- a/src/Common/Microsoft.Arcade.Common/FileSystem.cs +++ b/src/Common/Microsoft.Arcade.Common/FileSystem.cs @@ -36,5 +36,7 @@ public void WriteToFile(string path, string content) public void FileCopy(string sourceFileName, string destFileName) => File.Copy(sourceFileName, destFileName); public Stream GetFileStream(string path, FileMode mode, FileAccess access) => new FileStream(path, mode, access); + + public FileAttributes GetAttributes(string path) => File.GetAttributes(path); } } diff --git a/src/Common/Microsoft.Arcade.Common/IFileSystem.cs b/src/Common/Microsoft.Arcade.Common/IFileSystem.cs index 538f7d71030..2aed8429879 100644 --- a/src/Common/Microsoft.Arcade.Common/IFileSystem.cs +++ b/src/Common/Microsoft.Arcade.Common/IFileSystem.cs @@ -31,5 +31,7 @@ public interface IFileSystem void FileCopy(string sourceFileName, string destFileName); Stream GetFileStream(string path, FileMode mode, FileAccess access); + + FileAttributes GetAttributes(string path); } } diff --git a/src/Common/Microsoft.Arcade.Test.Common/MockFileSystem.cs b/src/Common/Microsoft.Arcade.Test.Common/MockFileSystem.cs index d1a17a32858..ed126d9d21a 100644 --- a/src/Common/Microsoft.Arcade.Test.Common/MockFileSystem.cs +++ b/src/Common/Microsoft.Arcade.Test.Common/MockFileSystem.cs @@ -59,6 +59,18 @@ public void DeleteFile(string path) public Stream GetFileStream(string path, FileMode mode, FileAccess access) => FileExists(path) ? new MemoryStream() : new MockFileStream(this, path); + public FileAttributes GetAttributes(string path) + { + var attributes = FileAttributes.Normal; + + if (Directories.Contains(path)) + { + attributes |= FileAttributes.Directory; + } + + return attributes; + } + #endregion /// diff --git a/src/Microsoft.DotNet.Helix/Sdk.Tests/Microsoft.DotNet.Helix.Sdk.Tests/CreateXHarnessAndroidWorkItemsTests.cs b/src/Microsoft.DotNet.Helix/Sdk.Tests/Microsoft.DotNet.Helix.Sdk.Tests/CreateXHarnessAndroidWorkItemsTests.cs index 82716bbea64..450f915700b 100644 --- a/src/Microsoft.DotNet.Helix/Sdk.Tests/Microsoft.DotNet.Helix.Sdk.Tests/CreateXHarnessAndroidWorkItemsTests.cs +++ b/src/Microsoft.DotNet.Helix/Sdk.Tests/Microsoft.DotNet.Helix.Sdk.Tests/CreateXHarnessAndroidWorkItemsTests.cs @@ -88,9 +88,9 @@ public void AndroidXHarnessWorkItemIsCreated() _zipArchiveManager .Verify(x => x.ArchiveFile("/apks/System.Foo.apk", payloadArchive), Times.Once); _zipArchiveManager - .Verify(x => x.AddResourceFileToArchive(payloadArchive, It.Is(s => s.Contains("xharness-helix-job.android.sh")), "xharness-helix-job.android.sh"), Times.AtLeastOnce); + .Verify(x => x.AddResourceFileToArchive(payloadArchive, It.Is(s => s.Contains("xharness-helix-job.android.sh")), "xharness-helix-job.android.sh"), Times.AtLeastOnce); _zipArchiveManager - .Verify(x => x.AddResourceFileToArchive(payloadArchive, It.Is(s => s.Contains("xharness-helix-job.android.ps1")), "xharness-helix-job.android.ps1"), Times.AtLeastOnce); + .Verify(x => x.AddResourceFileToArchive(payloadArchive, It.Is(s => s.Contains("xharness-helix-job.android.ps1")), "xharness-helix-job.android.ps1"), Times.AtLeastOnce); } [Fact] @@ -104,7 +104,7 @@ public void ArchivePayloadIsOverwritten() CreateApk("apks/System.Bar.apk", "System.Bar"), }; - _fileSystem.Files.Add("apks/xharness-apk-payload-system.foo.zip", "archive"); + _fileSystem.Files.Add("apks/xharness-payload-system.foo.zip", "archive"); // Act using var provider = collection.BuildServiceProvider(); @@ -190,9 +190,9 @@ public void ZippedApkIsProvided() _zipArchiveManager .Verify(x => x.ArchiveFile(It.IsAny(), It.IsAny()), Times.Never); _zipArchiveManager - .Verify(x => x.AddResourceFileToArchive(payloadArchive, It.Is(s => s.Contains("xharness-helix-job.android.sh")), "xharness-helix-job.android.sh"), Times.AtLeastOnce); + .Verify(x => x.AddResourceFileToArchive(payloadArchive, It.Is(s => s.Contains("xharness-helix-job.android.sh")), "xharness-helix-job.android.sh"), Times.AtLeastOnce); _zipArchiveManager - .Verify(x => x.AddResourceFileToArchive(payloadArchive, It.Is(s => s.Contains("xharness-helix-job.android.ps1")), "xharness-helix-job.android.ps1"), Times.AtLeastOnce); + .Verify(x => x.AddResourceFileToArchive(payloadArchive, It.Is(s => s.Contains("xharness-helix-job.android.ps1")), "xharness-helix-job.android.ps1"), Times.AtLeastOnce); } [Fact] diff --git a/src/Microsoft.DotNet.Helix/Sdk.Tests/Microsoft.DotNet.Helix.Sdk.Tests/CreateXHarnessAppleWorkItemsTests.cs b/src/Microsoft.DotNet.Helix/Sdk.Tests/Microsoft.DotNet.Helix.Sdk.Tests/CreateXHarnessAppleWorkItemsTests.cs index 3033a9bd1dd..4652965fbaf 100644 --- a/src/Microsoft.DotNet.Helix/Sdk.Tests/Microsoft.DotNet.Helix.Sdk.Tests/CreateXHarnessAppleWorkItemsTests.cs +++ b/src/Microsoft.DotNet.Helix/Sdk.Tests/Microsoft.DotNet.Helix.Sdk.Tests/CreateXHarnessAppleWorkItemsTests.cs @@ -96,9 +96,9 @@ public void AppleXHarnessWorkItemIsCreated() _zipArchiveManager .Verify(x => x.ArchiveDirectory("/apps/System.Foo.app", payloadArchive, true), Times.Once); _zipArchiveManager - .Verify(x => x.AddResourceFileToArchive(payloadArchive, It.Is(s => s.Contains("xharness-helix-job.apple.sh")), "xharness-helix-job.apple.sh"), Times.Once); + .Verify(x => x.AddResourceFileToArchive(payloadArchive, It.Is(s => s.Contains("xharness-helix-job.apple.sh")), "xharness-helix-job.apple.sh"), Times.Once); _zipArchiveManager - .Verify(x => x.AddResourceFileToArchive(payloadArchive, It.Is(s => s.Contains("xharness-runner.apple.sh")), "xharness-runner.apple.sh"), Times.Once); + .Verify(x => x.AddResourceFileToArchive(payloadArchive, It.Is(s => s.Contains("xharness-runner.apple.sh")), "xharness-runner.apple.sh"), Times.Once); _zipArchiveManager .Verify(x => x.AddContentToArchive(payloadArchive, "command.sh", It.Is(s => s.Contains("xharness apple test"))), Times.Once); } @@ -114,7 +114,7 @@ public void ArchivePayloadIsOverwritten() CreateAppBundle("apps/System.Bar.app", "ios-simulator-64_13.5"), }; - _fileSystem.Files.Add("apps/xharness-app-payload-system.foo.zip", "archive"); + _fileSystem.Files.Add("apps/xharness-payload-system.foo.zip", "archive"); // Act using var provider = collection.BuildServiceProvider(); @@ -242,9 +242,9 @@ public void ZippedAppIsProvided() _zipArchiveManager .Verify(x => x.ArchiveDirectory("/apps/System.Foo.app", payloadArchive, true), Times.Never); _zipArchiveManager - .Verify(x => x.AddResourceFileToArchive(payloadArchive, It.Is(s => s.Contains("xharness-helix-job.apple.sh")), "xharness-helix-job.apple.sh"), Times.Once); + .Verify(x => x.AddResourceFileToArchive(payloadArchive, It.Is(s => s.Contains("xharness-helix-job.apple.sh")), "xharness-helix-job.apple.sh"), Times.Once); _zipArchiveManager - .Verify(x => x.AddResourceFileToArchive(payloadArchive, It.Is(s => s.Contains("xharness-runner.apple.sh")), "xharness-runner.apple.sh"), Times.Once); + .Verify(x => x.AddResourceFileToArchive(payloadArchive, It.Is(s => s.Contains("xharness-runner.apple.sh")), "xharness-runner.apple.sh"), Times.Once); _zipArchiveManager .Verify(x => x.AddContentToArchive(payloadArchive, "command.sh", It.Is(s => s.Contains("xharness apple test"))), Times.Once); } diff --git a/src/Microsoft.DotNet.Helix/Sdk/CreateXHarnessAndroidWorkItems.cs b/src/Microsoft.DotNet.Helix/Sdk/CreateXHarnessAndroidWorkItems.cs index d533f984427..7752e58eb6a 100644 --- a/src/Microsoft.DotNet.Helix/Sdk/CreateXHarnessAndroidWorkItems.cs +++ b/src/Microsoft.DotNet.Helix/Sdk/CreateXHarnessAndroidWorkItems.cs @@ -67,20 +67,7 @@ public bool ExecuteTask(IZipArchiveManager zipArchiveManager, IFileSystem fileSy /// An ITaskItem instance representing the prepared HelixWorkItem. private async Task PrepareWorkItem(IZipArchiveManager zipArchiveManager, IFileSystem fileSystem, ITaskItem appPackage) { - // The user can re-use the same .apk for 2 work items so the name of the work item will come from ItemSpec and path from metadata - // This can be useful when we want to run the same app with different parameters or run the same app on different test targets, e.g. iOS 13 and 13.5 - string workItemName; - string apkPath; - if (appPackage.TryGetMetadata(MetadataNames.ApkPath, out string apkPathMetadata) && !string.IsNullOrEmpty(apkPathMetadata)) - { - workItemName = appPackage.ItemSpec; - apkPath = apkPathMetadata; - } - else - { - workItemName = fileSystem.GetFileNameWithoutExtension(appPackage.ItemSpec); - apkPath = appPackage.ItemSpec; - } + var (workItemName, apkPath) = GetNameAndPath(appPackage, MetadataNames.ApkPath, fileSystem); if (!fileSystem.FileExists(apkPath)) { @@ -120,13 +107,20 @@ private async Task PrepareWorkItem(IZipArchiveManager zipArchiveManag string command = GetHelixCommand(appPackage, apkName, androidPackageName, testTimeout, expectedExitCode); - string workItemZip = await CreateZipArchiveOfPackageAsync( + string workItemZip = await CreatePayloadArchive( zipArchiveManager, fileSystem, workItemName, isAlreadyArchived, + IsPosixShell, apkPath, - customCommands); + customCommands, + new[] + { + // WorkItem payloads of APKs can be reused if sent to multiple queues at once, + // so we'll always include both scripts (very small) + PosixAndroidWrapperScript, NonPosixAndroidWrapperScript + }); return CreateTaskItem(workItemName, workItemZip, command, workItemTimeout); } @@ -179,42 +173,5 @@ private string GetHelixCommand(ITaskItem appPackage, string apkName, string andr return xharnessRunCommand; } - - private async Task CreateZipArchiveOfPackageAsync( - IZipArchiveManager zipArchiveManager, - IFileSystem fileSystem, - string workItemName, - bool isAlreadyArchived, - string fileToZip, - string injectedCommands) - { - string fileName = $"xharness-apk-payload-{workItemName.ToLowerInvariant()}.zip"; - string outputZipPath = fileSystem.PathCombine(fileSystem.GetDirectoryName(fileToZip), fileName); - - if (fileSystem.FileExists(outputZipPath)) - { - Log.LogMessage($"Zip archive '{outputZipPath}' already exists, overwriting.."); - fileSystem.DeleteFile(outputZipPath); - } - - if (!isAlreadyArchived) - { - zipArchiveManager.ArchiveFile(fileToZip, outputZipPath); - } - else - { - Log.LogMessage($"App payload '{workItemName}` has already been zipped. Copying to '{outputZipPath}` instead"); - fileSystem.FileCopy(fileToZip, outputZipPath); - } - - // WorkItem payloads of APKs can be reused if sent to multiple queues at once, - // so we'll always include both scripts (very small) - Log.LogMessage($"Adding the XHarness job scripts into the payload archive"); - await zipArchiveManager.AddResourceFileToArchive(outputZipPath, ScriptNamespace + PosixAndroidWrapperScript, PosixAndroidWrapperScript); - await zipArchiveManager.AddResourceFileToArchive(outputZipPath, ScriptNamespace + NonPosixAndroidWrapperScript, NonPosixAndroidWrapperScript); - await zipArchiveManager.AddContentToArchive(outputZipPath, CustomCommandsScript + (IsPosixShell ? ".sh" : ".ps1"), injectedCommands); - - return outputZipPath; - } } } diff --git a/src/Microsoft.DotNet.Helix/Sdk/CreateXHarnessAppleWorkItems.cs b/src/Microsoft.DotNet.Helix/Sdk/CreateXHarnessAppleWorkItems.cs index 43e164a9382..b9667c4bdc2 100644 --- a/src/Microsoft.DotNet.Helix/Sdk/CreateXHarnessAppleWorkItems.cs +++ b/src/Microsoft.DotNet.Helix/Sdk/CreateXHarnessAppleWorkItems.cs @@ -91,30 +91,12 @@ private async Task PrepareWorkItem( IFileSystem fileSystem, ITaskItem appBundleItem) { - // The user can re-use the same .apk for 2 work items so the name of the work item will come from ItemSpec and path from metadata - string workItemName; - string appFolderPath; - if (appBundleItem.TryGetMetadata(MetadataNames.AppBundlePath, out string appPathMetadata) && !string.IsNullOrEmpty(appPathMetadata)) - { - workItemName = appBundleItem.ItemSpec; - appFolderPath = appPathMetadata; - } - else - { - workItemName = fileSystem.GetFileName(appBundleItem.ItemSpec); - appFolderPath = appBundleItem.ItemSpec; - } + var (workItemName, appFolderPath) = GetNameAndPath(appBundleItem, MetadataNames.AppBundlePath, fileSystem); appFolderPath = appFolderPath.TrimEnd(Path.DirectorySeparatorChar); - bool isAlreadyArchived = workItemName.EndsWith(".zip"); - - if (isAlreadyArchived) - { - workItemName = workItemName.Substring(0, workItemName.Length - 4); - } - - if (workItemName.EndsWith(".app")) + bool isAlreadyArchived = appFolderPath.EndsWith(".zip"); + if (isAlreadyArchived && workItemName.EndsWith(".app")) { // If someone named the zip something.app.zip, we want both gone workItemName = workItemName.Substring(0, workItemName.Length - 4); @@ -180,7 +162,15 @@ private async Task PrepareWorkItem( string appName = isAlreadyArchived ? $"{fileSystem.GetFileNameWithoutExtension(appFolderPath)}.app" : fileSystem.GetFileName(appFolderPath); string helixCommand = GetHelixCommand(appName, target, testTimeout, launchTimeout, includesTestRunner, expectedExitCode, resetSimulator); - string payloadArchivePath = await CreateZipArchiveOfFolder(zipArchiveManager, fileSystem, workItemName, isAlreadyArchived, appFolderPath, customCommands); + string payloadArchivePath = await CreatePayloadArchive( + zipArchiveManager, + fileSystem, + workItemName, + isAlreadyArchived, + isPosix: true, + appFolderPath, + customCommands, + new[] { EntryPointScript, RunnerScript }); return CreateTaskItem(workItemName, payloadArchivePath, helixCommand, workItemTimeout); } @@ -227,41 +217,5 @@ private string GetHelixCommand( $"--expected-exit-code \"{expectedExitCode}\" " + (!string.IsNullOrEmpty(XcodeVersion) ? $" --xcode-version \"{XcodeVersion}\"" : string.Empty) + (!string.IsNullOrEmpty(AppArguments) ? $" --app-arguments \"{AppArguments}\"" : string.Empty); - - private async Task CreateZipArchiveOfFolder( - IZipArchiveManager zipArchiveManager, - IFileSystem fileSystem, - string workItemName, - bool isAlreadyArchived, - string folderToZip, - string injectedCommands) - { - string appFolderDirectory = fileSystem.GetDirectoryName(folderToZip); - string fileName = $"xharness-app-payload-{workItemName.ToLowerInvariant()}.zip"; - string outputZipPath = fileSystem.PathCombine(appFolderDirectory, fileName); - - if (fileSystem.FileExists(outputZipPath)) - { - Log.LogMessage($"Zip archive '{outputZipPath}' already exists, overwriting.."); - fileSystem.DeleteFile(outputZipPath); - } - - if (!isAlreadyArchived) - { - zipArchiveManager.ArchiveDirectory(folderToZip, outputZipPath, true); - } - else - { - Log.LogMessage($"App payload '{workItemName}` has already been zipped. Copying to '{outputZipPath}` instead"); - fileSystem.FileCopy(folderToZip, outputZipPath); - } - - Log.LogMessage($"Adding the XHarness job scripts into the payload archive"); - await zipArchiveManager.AddResourceFileToArchive(outputZipPath, ScriptNamespace + EntryPointScript, EntryPointScript); - await zipArchiveManager.AddResourceFileToArchive(outputZipPath, ScriptNamespace + RunnerScript, RunnerScript); - await zipArchiveManager.AddContentToArchive(outputZipPath, CustomCommandsScript + ".sh", injectedCommands); - - return outputZipPath; - } } } diff --git a/src/Microsoft.DotNet.Helix/Sdk/XharnessTaskBase.cs b/src/Microsoft.DotNet.Helix/Sdk/XharnessTaskBase.cs index 311aeed96d4..af666f56325 100644 --- a/src/Microsoft.DotNet.Helix/Sdk/XharnessTaskBase.cs +++ b/src/Microsoft.DotNet.Helix/Sdk/XharnessTaskBase.cs @@ -1,5 +1,7 @@ using System; using System.Collections.Generic; +using System.IO; +using System.Threading.Tasks; using Microsoft.Arcade.Common; using Microsoft.Build.Framework; @@ -21,8 +23,8 @@ public class MetadataName public const string CustomCommands = "CustomCommands"; } - protected const string ScriptNamespace = "tools.xharness_runner."; - protected const string CustomCommandsScript = "command"; + private const string ScriptNamespace = "tools.xharness_runner."; + private const string CustomCommandsScript = "command"; /// /// Extra arguments that will be passed to the iOS/Android/... app that is being run @@ -107,5 +109,76 @@ protected Build.Utilities.TaskItem CreateTaskItem(string workItemName, string pa { "Timeout", timeout.ToString() }, }); } + + /// + /// This method parses the name for the Helix work item and path of the app from the item's metadata. + /// The user can re-use the same .apk for 2 work items so the name of the work item will come from ItemSpec and path from metadata. + /// + protected (string WorkItemName, string AppPath) GetNameAndPath(ITaskItem item, string pathMetadataName, IFileSystem fileSystem) + { + if (item.TryGetMetadata(pathMetadataName, out string appPathMetadata) && !string.IsNullOrEmpty(appPathMetadata)) + { + return (item.ItemSpec, appPathMetadata); + } + else + { + return (fileSystem.GetFileNameWithoutExtension(item.ItemSpec), item.ItemSpec); + } + } + + protected async Task CreatePayloadArchive( + IZipArchiveManager zipArchiveManager, + IFileSystem fileSystem, + string workItemName, + bool isAlreadyArchived, + bool isPosix, + string pathToZip, + string injectedCommands, + string[] payloadScripts) + { + string appFolderDirectory = fileSystem.GetDirectoryName(pathToZip); + string fileName = $"xharness-payload-{workItemName.ToLowerInvariant()}.zip"; + string outputZipPath = fileSystem.PathCombine(appFolderDirectory, fileName); + + if (fileSystem.FileExists(outputZipPath)) + { + Log.LogMessage($"Zip archive '{outputZipPath}' already exists, overwriting.."); + fileSystem.DeleteFile(outputZipPath); + } + + if (!isAlreadyArchived) + { + if (fileSystem.GetAttributes(pathToZip).HasFlag(FileAttributes.Directory)) + { + zipArchiveManager.ArchiveDirectory(pathToZip, outputZipPath, true); + } + else + { + zipArchiveManager.ArchiveFile(pathToZip, outputZipPath); + } + } + else + { + Log.LogMessage($"App payload '{workItemName}` has already been zipped. Copying to '{outputZipPath}` instead"); + fileSystem.FileCopy(pathToZip, outputZipPath); + } + + Log.LogMessage($"Adding the XHarness job scripts into the payload archive"); + + foreach (var payloadScript in payloadScripts) + { + await zipArchiveManager.AddResourceFileToArchive( + outputZipPath, + ScriptNamespace + payloadScript, + payloadScript); + } + + await zipArchiveManager.AddContentToArchive( + outputZipPath, + CustomCommandsScript + (isPosix ? ".sh" : ".ps1"), + injectedCommands); + + return outputZipPath; + } } } From d70e912c6a60971d5281163dd0b2159fdfc643e3 Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Tue, 7 Sep 2021 09:29:56 +0000 Subject: [PATCH 344/699] [main] Update dependencies from dotnet/xliff-tasks dotnet/arcade dotnet/sourcelink mono/linker dotnet/xharness (#7834) [main] Update dependencies from dotnet/xliff-tasks dotnet/arcade dotnet/sourcelink mono/linker dotnet/xharness --- eng/Version.Details.xml | 40 ++++++++++++++++++++-------------------- eng/Versions.props | 16 ++++++++-------- global.json | 4 ++-- 3 files changed, 30 insertions(+), 30 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index fa877beeab1..4ea1f1267b2 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -11,25 +11,25 @@ - + https://github.com/dotnet/arcade - 923c95ec2e9512285f801c84145a8af3728b1e3b + 0ec8dbacaefa7ccdb4bc96e120e07dc60c6eda98 - + https://github.com/dotnet/arcade - 923c95ec2e9512285f801c84145a8af3728b1e3b + 0ec8dbacaefa7ccdb4bc96e120e07dc60c6eda98 - + https://github.com/dotnet/arcade - 923c95ec2e9512285f801c84145a8af3728b1e3b + 0ec8dbacaefa7ccdb4bc96e120e07dc60c6eda98 - + https://github.com/dotnet/arcade - 923c95ec2e9512285f801c84145a8af3728b1e3b + 0ec8dbacaefa7ccdb4bc96e120e07dc60c6eda98 - + https://github.com/dotnet/arcade - 923c95ec2e9512285f801c84145a8af3728b1e3b + 0ec8dbacaefa7ccdb4bc96e120e07dc60c6eda98 https://github.com/dotnet/arcade-services @@ -39,26 +39,26 @@ https://github.com/dotnet/arcade-services cac955fe259cb611f6a29d09209bd717deb69037 - + https://github.com/dotnet/xharness - 2e03d2d1081b606ad3c5f79709297a9c5627854d + c8c452d7746015847956618cf0c56f931ed8647a https://github.com/dotnet/roslyn 7f1cd24517a65bac2e6e921bf89c9b8d4e2696ca - + https://github.com/mono/linker - a1f528d854ee057290682490a74e59a809fe453f + 8a5c446a84922bddccfcfc6d3cb5c117dc3babd4 - + https://github.com/dotnet/sourcelink - 6dcc7d005e38829efb6714d2ecfc4c0cb383e7d9 + b47f05da7091ea0f69a43d4589c0fda3fdbb1ec7 - + https://github.com/dotnet/sourcelink - 6dcc7d005e38829efb6714d2ecfc4c0cb383e7d9 + b47f05da7091ea0f69a43d4589c0fda3fdbb1ec7 https://github.com/dotnet/symreader-converter @@ -68,9 +68,9 @@ https://github.com/dotnet/symreader-converter c5ba7c88f92e2dde156c324a8c8edc04d9fa4fe0 - + https://github.com/dotnet/xliff-tasks - bc3233146e1fcd393ed471d5005333c83363e0fe + b8baaa09bffb260ba0a9725d56e9d7d83db9d17e diff --git a/eng/Versions.props b/eng/Versions.props index 00420b59f4f..08dde6fdcf4 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -36,7 +36,7 @@ 2.1.0 4.0.0-4.21427.11 16.7.1 - 6.0.100-preview.6.21430.2 + 6.0.100-preview.6.21452.4 4.8.3 5.3.0.1 2.3.0 @@ -65,8 +65,8 @@ 2.4.1 2.0.3 2.4.1 - 6.0.0-beta.21451.3 - 6.0.0-beta.21451.3 + 7.0.0-beta.21453.2 + 7.0.0-beta.21453.2 1.22.0 1.1.2 2.0.0 @@ -75,12 +75,12 @@ 2.0.4 1.1.0-beta2-19575-01 1.1.0-beta.20258.6 - 1.1.0-beta-21423-02 - 1.1.0-beta-21423-02 - 6.0.0-beta.21451.3 - 1.0.0-beta.21431.1 + 1.1.0-beta-21453-01 + 1.1.0-beta-21453-01 + 7.0.0-beta.21453.2 + 1.0.0-beta.21452.1 1.1.0-beta.21378.2 - 1.0.0-prerelease.21427.1 + 1.0.0-prerelease.21456.1 1.1.156602 1.1.156602 6.0.100-preview.5.21254.11 diff --git a/global.json b/global.json index b90c255f11d..2d322fe876f 100644 --- a/global.json +++ b/global.json @@ -3,7 +3,7 @@ "dotnet": "6.0.100-rc.1.21430.12" }, "msbuild-sdks": { - "Microsoft.DotNet.Arcade.Sdk": "6.0.0-beta.21451.3", - "Microsoft.DotNet.Helix.Sdk": "6.0.0-beta.21451.3" + "Microsoft.DotNet.Arcade.Sdk": "7.0.0-beta.21453.2", + "Microsoft.DotNet.Helix.Sdk": "7.0.0-beta.21453.2" } } From 1e11251dfea77c00eea2228660c1afa011347d17 Mon Sep 17 00:00:00 2001 From: Eric StJohn Date: Tue, 7 Sep 2021 12:31:07 -0700 Subject: [PATCH 345/699] Ensure workloads can find embedded dotnethome_x64.wxs (#7845) --- .../src/EmbeddedTemplates.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Microsoft.DotNet.Build.Tasks.Workloads/src/EmbeddedTemplates.cs b/src/Microsoft.DotNet.Build.Tasks.Workloads/src/EmbeddedTemplates.cs index 1ad0d3a7662..2fbabf1bcae 100644 --- a/src/Microsoft.DotNet.Build.Tasks.Workloads/src/EmbeddedTemplates.cs +++ b/src/Microsoft.DotNet.Build.Tasks.Workloads/src/EmbeddedTemplates.cs @@ -64,6 +64,7 @@ static EmbeddedTemplates() { { "DependencyProvider.wxs", $"{s_namespace}.MsiTemplate.DependencyProvider.wxs" }, { "Directories.wxs", $"{s_namespace}.MsiTemplate.Directories.wxs" }, + { "dotnethome_x64.wxs", $"{s_namespace}.MsiTemplate.dotnethome_x64.wxs" }, { "ManifestProduct.wxs", $"{s_namespace}.MsiTemplate.ManifestProduct.wxs" }, { "Product.wxs", $"{s_namespace}.MsiTemplate.Product.wxs" }, { "Registry.wxs", $"{s_namespace}.MsiTemplate.Registry.wxs" }, From 52cba7902029917da65fb1d16df13dd554b725eb Mon Sep 17 00:00:00 2001 From: Michelle McDaniel Date: Tue, 7 Sep 2021 14:07:00 -0700 Subject: [PATCH 346/699] Fix sourcelink repository url (#7844) * Fix sourcelink repository url When we updated the ScmRepositoryUrl to handle devdiv links, we never updated the version used in SourceRoot, which is used by sourcelink, and also needed to be updated to remove -trusted from the link. By not removing -trusted, the translation pattern can't identify the url as something that needs to be translated, and so just uses the azdo url. This change adds the code to remove -trusted to fix the issue. * Remove second item group --- src/Microsoft.DotNet.Arcade.Sdk/tools/RepositoryInfo.targets | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/Microsoft.DotNet.Arcade.Sdk/tools/RepositoryInfo.targets b/src/Microsoft.DotNet.Arcade.Sdk/tools/RepositoryInfo.targets index 5d426527496..c4e4f350c6c 100644 --- a/src/Microsoft.DotNet.Arcade.Sdk/tools/RepositoryInfo.targets +++ b/src/Microsoft.DotNet.Arcade.Sdk/tools/RepositoryInfo.targets @@ -72,6 +72,9 @@ + + $([System.String]::Copy(%(SourceRoot.ScmRepositoryUrl)).ToLower().Replace(`-trusted`,``)) + $([System.Text.RegularExpressions.Regex]::Replace(%(SourceRoot.ScmRepositoryUrl), $(_TranslateUrlPattern), $(_TranslateUrlReplacement))) From 527af90c5cd48da96efef5ee0b3350ff37fce279 Mon Sep 17 00:00:00 2001 From: Michael Stuckey Date: Tue, 7 Sep 2021 17:54:57 -0700 Subject: [PATCH 347/699] Force safe version of System.Text.Encodings.Web, even in test projects (#7833) --- .../Microsoft.DotNet.Build.Tasks.Feed.Tests.csproj | 2 ++ .../Microsoft.DotNet.Build.Tasks.Feed.csproj | 7 ++++--- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/src/Microsoft.DotNet.Build.Tasks.Feed.Tests/Microsoft.DotNet.Build.Tasks.Feed.Tests.csproj b/src/Microsoft.DotNet.Build.Tasks.Feed.Tests/Microsoft.DotNet.Build.Tasks.Feed.Tests.csproj index dba28495f16..062e998cfe1 100644 --- a/src/Microsoft.DotNet.Build.Tasks.Feed.Tests/Microsoft.DotNet.Build.Tasks.Feed.Tests.csproj +++ b/src/Microsoft.DotNet.Build.Tasks.Feed.Tests/Microsoft.DotNet.Build.Tasks.Feed.Tests.csproj @@ -19,6 +19,8 @@ + + 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 9c590b7caa7..5d85ef6bc24 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 @@ -14,14 +14,15 @@ + - - + - + + From efff4250dd2252663c1fc6f65f771cfd086aaed2 Mon Sep 17 00:00:00 2001 From: Matt Galbraith Date: Tue, 7 Sep 2021 18:02:48 -0700 Subject: [PATCH 348/699] Use ProductVersion.txt where possible (#7837) * Add ProductVersion.txt support where possible; get the version of the inner package from productVersion.txt, NOT from the specified version. Allows "non-stable" outer container with "stable" inner contents https://github.com/dotnet/arcade/issues/7836 --- .../Sdk/FindDotNetCliPackage.cs | 75 +++++++++++++++++-- .../Sdk/Microsoft.DotNet.Helix.Sdk.csproj | 1 + 2 files changed, 68 insertions(+), 8 deletions(-) diff --git a/src/Microsoft.DotNet.Helix/Sdk/FindDotNetCliPackage.cs b/src/Microsoft.DotNet.Helix/Sdk/FindDotNetCliPackage.cs index 5d82a45f509..1e00efe249b 100644 --- a/src/Microsoft.DotNet.Helix/Sdk/FindDotNetCliPackage.cs +++ b/src/Microsoft.DotNet.Helix/Sdk/FindDotNetCliPackage.cs @@ -3,6 +3,7 @@ using System.Net.Http; using System.Threading.Tasks; using Microsoft.Build.Framework; +using NuGet.Versioning; namespace Microsoft.DotNet.Helix.Sdk { @@ -30,7 +31,7 @@ public class FindDotNetCliPackage : BaseTask public string Runtime { get; set; } /// - /// 'sdk', 'runtime' or 'aspnetcore-runtime' + /// 'sdk', 'runtime' or 'aspnetcore-runtime' (default is runtime) /// [Required] public string PackageType { get; set; } @@ -49,7 +50,7 @@ private async Task ExecuteAsync() NormalizeParameters(); await ResolveVersionAsync(); - string downloadUrl = GetDownloadUrl(); + string downloadUrl = await GetDownloadUrlAsync(); Log.LogMessage($"Retrieved dotnet cli {PackageType} version {Version} package uri {downloadUrl}, testing..."); @@ -80,17 +81,75 @@ private async Task ExecuteAsync() } } - private string GetDownloadUrl() + private async Task GetDownloadUrlAsync() { string extension = Runtime.StartsWith("win") ? "zip" : "tar.gz"; + string effectiveVersion = await GetEffectiveVersion(); + return PackageType switch { - "sdk" => $"{DotNetCliAzureFeed}/Sdk/{Version}/dotnet-sdk-{Version}-{Runtime}.{extension}", - "aspnetcore-runtime" => $"{DotNetCliAzureFeed}/aspnetcore/Runtime/{Version}/aspnetcore-runtime-{Version}-{Runtime}.{extension}", - _ => $"{DotNetCliAzureFeed}/Runtime/{Version}/dotnet-runtime-{Version}-{Runtime}.{extension}" + "sdk" => $"{DotNetCliAzureFeed}/Sdk/{Version}/dotnet-sdk-{effectiveVersion}-{Runtime}.{extension}", + "aspnetcore-runtime" => $"{DotNetCliAzureFeed}/aspnetcore/Runtime/{Version}/aspnetcore-runtime-{effectiveVersion}-{Runtime}.{extension}", + _ => $"{DotNetCliAzureFeed}/Runtime/{Version}/dotnet-runtime-{effectiveVersion}-{Runtime}.{extension}" }; } + private async Task GetEffectiveVersion() + { + if (NuGetVersion.TryParse(Version, out NuGetVersion semanticVersion)) + { + // Pared down version of the logic from https://github.com/dotnet/install-scripts/blob/main/src/dotnet-install.ps1 + // If this functionality stops working, review changes made there. + // Current strategy is to start with a runtime-specific name then fall back to 'productVersion.txt' + string effectiveVersion = Version; + + // Do nothing for older runtimes; the file won't exist + if (semanticVersion >= new NuGetVersion("5.0.0")) + { + var productVersionText = PackageType switch + { + "sdk" => await GetMatchingProductVersionTxtContents($"{DotNetCliAzureFeed}/Sdk/{Version}", "sdk-productVersion.txt"), + "aspnetcore-runtime" => await GetMatchingProductVersionTxtContents($"{DotNetCliAzureFeed}/aspnetcore/Runtime/{Version}", "aspnetcore-productVersion.txt"), + _ => await GetMatchingProductVersionTxtContents($"{DotNetCliAzureFeed}/Runtime/{Version}", "runtime-productVersion.txt") + }; + + if (!productVersionText.Equals(Version)) + { + effectiveVersion = productVersionText; + Log.LogMessage($"Switched to effective .NET Core version '{productVersionText}' from matching productVersion.txt"); + } + } + return effectiveVersion; + } + else + { + throw new ArgumentException($"'{Version}' is not a valid semantic version."); + } + } + private async Task GetMatchingProductVersionTxtContents(string baseUri, string customVersionTextFileName) + { + using HttpResponseMessage specificResponse = await _client.GetAsync($"{baseUri}/{customVersionTextFileName}"); + if (specificResponse.StatusCode == HttpStatusCode.NotFound) + { + using HttpResponseMessage genericResponse = await _client.GetAsync($"{baseUri}/productVersion.txt"); + if (genericResponse.StatusCode != HttpStatusCode.NotFound) + { + genericResponse.EnsureSuccessStatusCode(); + return (await genericResponse.Content.ReadAsStringAsync()).Trim(); + } + else + { + Log.LogMessage(MessageImportance.Low, $"No *productVersion.txt files found for {Version} under {baseUri}"); + } + } + else + { + specificResponse.EnsureSuccessStatusCode(); + return (await specificResponse.Content.ReadAsStringAsync()).Trim(); + } + return Version; + } + private void NormalizeParameters() { if (string.Equals(Channel, "lts", StringComparison.OrdinalIgnoreCase)) @@ -136,9 +195,9 @@ private async Task ResolveVersionAsync() Log.LogMessage(MessageImportance.Low, "Resolving latest dotnet cli version."); string latestVersionUrl = PackageType switch { - "sdk" => $"{DotNetCliAzureFeed}/Sdk/{Channel}/latest.version", + "sdk" => $"{DotNetCliAzureFeed}/Sdk/{Channel}/latest.version", "aspnetcore-runtime" => $"{DotNetCliAzureFeed}/aspnetcore/Runtime/{Channel}/latest.version", - _ => $"{DotNetCliAzureFeed}/Runtime/{Channel}/latest.version" + _ => $"{DotNetCliAzureFeed}/Runtime/{Channel}/latest.version" }; Log.LogMessage(MessageImportance.Low, $"Resolving latest version from url {latestVersionUrl}"); diff --git a/src/Microsoft.DotNet.Helix/Sdk/Microsoft.DotNet.Helix.Sdk.csproj b/src/Microsoft.DotNet.Helix/Sdk/Microsoft.DotNet.Helix.Sdk.csproj index 2e510066ae4..7c4a029a946 100644 --- a/src/Microsoft.DotNet.Helix/Sdk/Microsoft.DotNet.Helix.Sdk.csproj +++ b/src/Microsoft.DotNet.Helix/Sdk/Microsoft.DotNet.Helix.Sdk.csproj @@ -12,6 +12,7 @@ + From 3e6b1609cffa3dd9c7115f192b6cba9970b7fae4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C5=99emek=20Vysok=C3=BD?= Date: Wed, 8 Sep 2021 13:37:41 +0200 Subject: [PATCH 349/699] Collect XHarness diagnostics data and upload to App Insights (#7842) --- .../Sdk/Microsoft.DotNet.Helix.Sdk.csproj | 3 ++ .../Sdk/XharnessTaskBase.cs | 6 +++ .../xharness-runner/XHarnessRunner.targets | 6 +++ .../xharness-event-reporter.py | 44 +++++++++++++++++++ .../xharness-helix-job.android.ps1 | 6 ++- .../xharness-helix-job.apple.sh | 3 ++ .../xharness-runner/xharness-runner.apple.sh | 4 ++ tests/UnitTests.XHarness.Common.props | 1 + 8 files changed, 71 insertions(+), 2 deletions(-) create mode 100644 src/Microsoft.DotNet.Helix/Sdk/tools/xharness-runner/xharness-event-reporter.py diff --git a/src/Microsoft.DotNet.Helix/Sdk/Microsoft.DotNet.Helix.Sdk.csproj b/src/Microsoft.DotNet.Helix/Sdk/Microsoft.DotNet.Helix.Sdk.csproj index 7c4a029a946..bdd3f36214f 100644 --- a/src/Microsoft.DotNet.Helix/Sdk/Microsoft.DotNet.Helix.Sdk.csproj +++ b/src/Microsoft.DotNet.Helix/Sdk/Microsoft.DotNet.Helix.Sdk.csproj @@ -32,6 +32,9 @@ + + Never + Never diff --git a/src/Microsoft.DotNet.Helix/Sdk/XharnessTaskBase.cs b/src/Microsoft.DotNet.Helix/Sdk/XharnessTaskBase.cs index af666f56325..a1de1cc2428 100644 --- a/src/Microsoft.DotNet.Helix/Sdk/XharnessTaskBase.cs +++ b/src/Microsoft.DotNet.Helix/Sdk/XharnessTaskBase.cs @@ -25,6 +25,7 @@ public class MetadataName private const string ScriptNamespace = "tools.xharness_runner."; private const string CustomCommandsScript = "command"; + private const string DiagnosticsScript = "xharness-event-reporter.py"; /// /// Extra arguments that will be passed to the iOS/Android/... app that is being run @@ -173,6 +174,11 @@ await zipArchiveManager.AddResourceFileToArchive( payloadScript); } + await zipArchiveManager.AddResourceFileToArchive( + outputZipPath, + ScriptNamespace + DiagnosticsScript, + DiagnosticsScript); + await zipArchiveManager.AddContentToArchive( outputZipPath, CustomCommandsScript + (isPosix ? ".sh" : ".ps1"), diff --git a/src/Microsoft.DotNet.Helix/Sdk/tools/xharness-runner/XHarnessRunner.targets b/src/Microsoft.DotNet.Helix/Sdk/tools/xharness-runner/XHarnessRunner.targets index 91573291c8b..644b3bc2751 100644 --- a/src/Microsoft.DotNet.Helix/Sdk/tools/xharness-runner/XHarnessRunner.targets +++ b/src/Microsoft.DotNet.Helix/Sdk/tools/xharness-runner/XHarnessRunner.targets @@ -60,6 +60,9 @@ $(HelixPreCommands);export XHARNESS_DISABLE_COLORED_OUTPUT=true $(HelixPreCommands);export XHARNESS_LOG_WITH_TIMESTAMPS=true $(HelixPreCommands);export XHARNESS_CLI_PATH=$HELIX_CORRELATION_PAYLOAD/microsoft.dotnet.xharness.cli/$(_XHarnessPackageVersion)/tools/net6.0/any/Microsoft.DotNet.XHarness.CLI.dll + + $(HelixPreCommands);export XHARNESS_DIAGNOSTICS_PATH=$HELIX_WORKITEM_ROOT/diagnostics.json + "$HELIX_PYTHONPATH" "$HELIX_WORKITEM_PAYLOAD/xharness-event-reporter.py";$(HelixPostCommands) @@ -68,6 +71,9 @@ $(HelixPreCommands);set XHARNESS_LOG_WITH_TIMESTAMPS=true $(HelixPreCommands);set XHARNESS_CLI_PATH=%HELIX_CORRELATION_PAYLOAD%\microsoft.dotnet.xharness.cli\$(_XHarnessPackageVersion)\tools\net6.0\any\Microsoft.DotNet.XHarness.CLI.dll $(HelixPreCommands);doskey xharness="dotnet exec %XHARNESS_CLI_PATH%" + + $(HelixPreCommands);set XHARNESS_DIAGNOSTICS_PATH=%HELIX_WORKITEM_ROOT%\diagnostics.json + "%HELIX_PYTHONPATH%" "%HELIX_WORKITEM_PAYLOAD%\xharness-event-reporter.py";$(HelixPostCommands) diff --git a/src/Microsoft.DotNet.Helix/Sdk/tools/xharness-runner/xharness-event-reporter.py b/src/Microsoft.DotNet.Helix/Sdk/tools/xharness-runner/xharness-event-reporter.py new file mode 100644 index 00000000000..dde82f0e391 --- /dev/null +++ b/src/Microsoft.DotNet.Helix/Sdk/tools/xharness-runner/xharness-event-reporter.py @@ -0,0 +1,44 @@ +import getopt +import json +import os +import sys + +from helix.appinsights import app_insights + +opts, args = getopt.gnu_getopt(sys.argv[1:], 'd:', ['diagnostics-data=']) +opt_dict = dict(opts) + +diagnostics_file = None + +if '--data' in opt_dict: + diagnostics_file = opt_dict['--data'] +elif '-d' in opt_dict: + diagnostics_file = opt_dict['-d'] +else: + diagnostics_file = os.getenv('XHARNESS_DIAGNOSTICS_PATH') + +if not diagnostics_file: + print('ERROR: Expected path to the diagnostics JSON file generated by XHarness') + exit(1) + +if not os.path.isfile(diagnostics_file): + print(f"WARNING: Diagnostics file not found at `{diagnostics_file}`") + exit(2) + +# The JSON should be an array of objects (one per each executed XHarness command) +operations = json.load(open(diagnostics_file)) + +for operation in operations: + custom_dimensions = dict() + + custom_dimensions['command'] = operation['command'] + custom_dimensions['platform'] = operation['platform'] + + if 'target' in operation: + if 'targetOS' in operation: + custom_dimensions['target'] = operation['target'] + '_' + operation['targetOS'] + else: + custom_dimensions['target'] = operation['target'] + + app_insights.send_metric('XHarnessOperation', operation['exitCode'], properties=custom_dimensions) + app_insights.send_metric('XHarnessOperationDuration', operation['duration'], properties=custom_dimensions) diff --git a/src/Microsoft.DotNet.Helix/Sdk/tools/xharness-runner/xharness-helix-job.android.ps1 b/src/Microsoft.DotNet.Helix/Sdk/tools/xharness-runner/xharness-helix-job.android.ps1 index f67b706f538..f9e0066068b 100644 --- a/src/Microsoft.DotNet.Helix/Sdk/tools/xharness-runner/xharness-helix-job.android.ps1 +++ b/src/Microsoft.DotNet.Helix/Sdk/tools/xharness-runner/xharness-helix-job.android.ps1 @@ -32,9 +32,13 @@ function xharness() { dotnet exec $Env:XHARNESS_CLI_PATH @args } +$ErrorActionPreference="Continue" + # Act out the actual commands . "$PSScriptRoot\command.ps1" +$ErrorActionPreference="Continue" + $exit_code=$LASTEXITCODE $retry=$false @@ -44,7 +48,6 @@ switch ($exit_code) { # ADB_DEVICE_ENUMERATION_FAILURE 85 { - $ErrorActionPreference="Continue" Write-Error "Encountered ADB_DEVICE_ENUMERATION_FAILURE. This is typically not a failure of the work item. We will run it again and reboot this computer to help its devices" Write-Error "If this occurs repeatedly, please check for architectural mismatch, e.g. sending x86 or x86_64 APKs to an arm64_v8a-only queue." $retry=$true @@ -54,7 +57,6 @@ switch ($exit_code) # PACKAGE_INSTALLATION_FAILURE 78 { - $ErrorActionPreference="Continue" Write-Error "Encountered PACKAGE_INSTALLATION_FAILURE. This is typically not a failure of the work item. We will try it again on another Helix agent" Write-Error "If this occurs repeatedly, please check for architectural mismatch, e.g. requesting installation on arm64_v8a-only queue for x86 or x86_64 APKs." $retry=$true diff --git a/src/Microsoft.DotNet.Helix/Sdk/tools/xharness-runner/xharness-helix-job.apple.sh b/src/Microsoft.DotNet.Helix/Sdk/tools/xharness-runner/xharness-helix-job.apple.sh index a6e535f629f..15e6af638be 100644 --- a/src/Microsoft.DotNet.Helix/Sdk/tools/xharness-runner/xharness-helix-job.apple.sh +++ b/src/Microsoft.DotNet.Helix/Sdk/tools/xharness-runner/xharness-helix-job.apple.sh @@ -27,6 +27,8 @@ set -x # It is important we call the script via `launchctl asuser` in order to be able to spawn # the simulator which needs to run in a user session with GUI rendering capabilities. +# The problem with launchctl is that the spawned process won't share environment variables +# so we have to pass all of them as parameters are set them again. chmod +x xharness-runner.apple.sh helix_runner_uid=$(id -u) sudo launchctl asuser "$helix_runner_uid" sh ./xharness-runner.apple.sh \ @@ -34,6 +36,7 @@ sudo launchctl asuser "$helix_runner_uid" sh ./xharness-runner.apple.sh \ --app "$HELIX_WORKITEM_ROOT/$app" \ --xharness-cli-path "$XHARNESS_CLI_PATH" \ --output-directory "$HELIX_WORKITEM_UPLOAD_ROOT" \ + --diagnostics-path "$XHARNESS_DIAGNOSTICS_PATH" \ exit_code=$? diff --git a/src/Microsoft.DotNet.Helix/Sdk/tools/xharness-runner/xharness-runner.apple.sh b/src/Microsoft.DotNet.Helix/Sdk/tools/xharness-runner/xharness-runner.apple.sh index 6096d835d48..90d21b98cba 100644 --- a/src/Microsoft.DotNet.Helix/Sdk/tools/xharness-runner/xharness-runner.apple.sh +++ b/src/Microsoft.DotNet.Helix/Sdk/tools/xharness-runner/xharness-runner.apple.sh @@ -29,6 +29,10 @@ while [[ $# -gt 0 ]]; do output_directory="$2" shift ;; + --diagnostics-path) + export XHARNESS_DIAGNOSTICS_PATH="$2" + shift + ;; --target) target="$2" shift diff --git a/tests/UnitTests.XHarness.Common.props b/tests/UnitTests.XHarness.Common.props index d657a6d9e5c..cf6fd72ed5b 100644 --- a/tests/UnitTests.XHarness.Common.props +++ b/tests/UnitTests.XHarness.Common.props @@ -18,6 +18,7 @@ true true https://helix.dot.net + true From 27689e05a173b63f04b5b1b69fe8bde99f86e805 Mon Sep 17 00:00:00 2001 From: Jon Fortescue Date: Wed, 8 Sep 2021 10:37:51 -0700 Subject: [PATCH 350/699] Add pool specification (ubuntu-latest) to promote-build (#7848) --- eng/promote-build.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/eng/promote-build.yml b/eng/promote-build.yml index 49584685e8f..c758db21a81 100644 --- a/eng/promote-build.yml +++ b/eng/promote-build.yml @@ -58,6 +58,9 @@ trigger: none variables: _DotNetArtifactsCategory: .NETCore +pool: + vmImage: ubuntu-latest + stages: - stage: prepare_promotion displayName: Prepare for Promotion From 89db4b3b7dc2f19eec43f948ad51efc0d496fc8c Mon Sep 17 00:00:00 2001 From: Matt Galbraith Date: Wed, 8 Sep 2021 10:42:16 -0700 Subject: [PATCH 351/699] Address https://github.com/dotnet/arcade/issues/7850 - handle the lack of a ScmRepositoryUrl when batch updating (#7852) --- src/Microsoft.DotNet.Arcade.Sdk/tools/RepositoryInfo.targets | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Microsoft.DotNet.Arcade.Sdk/tools/RepositoryInfo.targets b/src/Microsoft.DotNet.Arcade.Sdk/tools/RepositoryInfo.targets index c4e4f350c6c..65ecb7ee20c 100644 --- a/src/Microsoft.DotNet.Arcade.Sdk/tools/RepositoryInfo.targets +++ b/src/Microsoft.DotNet.Arcade.Sdk/tools/RepositoryInfo.targets @@ -67,7 +67,7 @@ - $(ScmRepositoryUrl.ToLower().Replace(`-trusted`,``)) + $([System.String]::Copy(%(SourceRoot.ScmRepositoryUrl)).ToLower().Replace(`-trusted`,``)) $([System.Text.RegularExpressions.Regex]::Replace($(ScmRepositoryUrl), $(_TranslateUrlPattern), $(_TranslateUrlReplacement))) From 74201f313bf10a4bbcf64d1dbdecbd66ff65e7b9 Mon Sep 17 00:00:00 2001 From: Prashanth Govindarajan Date: Wed, 8 Sep 2021 10:45:43 -0700 Subject: [PATCH 352/699] Suppress CA2252 related warnings (#7846) --- src/Microsoft.DotNet.GenFacades/SourceGenerator.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Microsoft.DotNet.GenFacades/SourceGenerator.cs b/src/Microsoft.DotNet.GenFacades/SourceGenerator.cs index f7014698b41..b34212138a4 100644 --- a/src/Microsoft.DotNet.GenFacades/SourceGenerator.cs +++ b/src/Microsoft.DotNet.GenFacades/SourceGenerator.cs @@ -47,7 +47,7 @@ public bool GenerateSource( StringBuilder sb = new StringBuilder(); sb.AppendLine("// "); // Adding this because the following code is autogenerated. - sb.AppendLine("#pragma warning disable CS0618"); // Adding this to avoid warnings while adding typeforwards for obselete types. + sb.AppendLine("#pragma warning disable CS0618,CA2252"); // Adding this to avoid warnings while adding typeforwards for obselete types. CA2252 suppresses warnings on preview APIs bool result = true; From ecea74904fb2a0226e4ad3e0ddadae01d9791279 Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Wed, 8 Sep 2021 19:09:43 +0000 Subject: [PATCH 353/699] [main] Update dependencies from dotnet/arcade dotnet/sourcelink (#7843) [main] Update dependencies from dotnet/arcade dotnet/sourcelink --- eng/Version.Details.xml | 28 ++++++++++++++-------------- eng/Versions.props | 10 +++++----- global.json | 4 ++-- 3 files changed, 21 insertions(+), 21 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index 4ea1f1267b2..2957473f596 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -11,25 +11,25 @@ - + https://github.com/dotnet/arcade - 0ec8dbacaefa7ccdb4bc96e120e07dc60c6eda98 + 7309c692126e24bc10702f39fe45b2a295b224d2 - + https://github.com/dotnet/arcade - 0ec8dbacaefa7ccdb4bc96e120e07dc60c6eda98 + 7309c692126e24bc10702f39fe45b2a295b224d2 - + https://github.com/dotnet/arcade - 0ec8dbacaefa7ccdb4bc96e120e07dc60c6eda98 + 7309c692126e24bc10702f39fe45b2a295b224d2 - + https://github.com/dotnet/arcade - 0ec8dbacaefa7ccdb4bc96e120e07dc60c6eda98 + 7309c692126e24bc10702f39fe45b2a295b224d2 - + https://github.com/dotnet/arcade - 0ec8dbacaefa7ccdb4bc96e120e07dc60c6eda98 + 7309c692126e24bc10702f39fe45b2a295b224d2 https://github.com/dotnet/arcade-services @@ -51,14 +51,14 @@ https://github.com/mono/linker 8a5c446a84922bddccfcfc6d3cb5c117dc3babd4 - + https://github.com/dotnet/sourcelink - b47f05da7091ea0f69a43d4589c0fda3fdbb1ec7 + 389b28318be327cc8c48259f8134b784e52799f8 - + https://github.com/dotnet/sourcelink - b47f05da7091ea0f69a43d4589c0fda3fdbb1ec7 + 389b28318be327cc8c48259f8134b784e52799f8 https://github.com/dotnet/symreader-converter diff --git a/eng/Versions.props b/eng/Versions.props index 08dde6fdcf4..381fdae944c 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -65,8 +65,8 @@ 2.4.1 2.0.3 2.4.1 - 7.0.0-beta.21453.2 - 7.0.0-beta.21453.2 + 7.0.0-beta.21456.1 + 7.0.0-beta.21456.1 1.22.0 1.1.2 2.0.0 @@ -75,9 +75,9 @@ 2.0.4 1.1.0-beta2-19575-01 1.1.0-beta.20258.6 - 1.1.0-beta-21453-01 - 1.1.0-beta-21453-01 - 7.0.0-beta.21453.2 + 1.1.0-beta-21456-02 + 1.1.0-beta-21456-02 + 7.0.0-beta.21456.1 1.0.0-beta.21452.1 1.1.0-beta.21378.2 1.0.0-prerelease.21456.1 diff --git a/global.json b/global.json index 2d322fe876f..c61ed429bc6 100644 --- a/global.json +++ b/global.json @@ -3,7 +3,7 @@ "dotnet": "6.0.100-rc.1.21430.12" }, "msbuild-sdks": { - "Microsoft.DotNet.Arcade.Sdk": "7.0.0-beta.21453.2", - "Microsoft.DotNet.Helix.Sdk": "7.0.0-beta.21453.2" + "Microsoft.DotNet.Arcade.Sdk": "7.0.0-beta.21456.1", + "Microsoft.DotNet.Helix.Sdk": "7.0.0-beta.21456.1" } } From ae0ffc22e728ec379f894c02d7659484d8fe4441 Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Wed, 8 Sep 2021 19:11:52 +0000 Subject: [PATCH 354/699] Update dependencies from https://github.com/dotnet/roslyn build 20210903.15 (#7839) [main] Update dependencies from dotnet/roslyn --- eng/Version.Details.xml | 4 ++-- eng/Versions.props | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index 2957473f596..f5438681175 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -43,9 +43,9 @@ https://github.com/dotnet/xharness c8c452d7746015847956618cf0c56f931ed8647a - + https://github.com/dotnet/roslyn - 7f1cd24517a65bac2e6e921bf89c9b8d4e2696ca + 2bbf85baa30a90f9d491699734e814050356da32 https://github.com/mono/linker diff --git a/eng/Versions.props b/eng/Versions.props index 381fdae944c..aeca7bcb41a 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -34,7 +34,7 @@ 2.0.0 2.1.1 2.1.0 - 4.0.0-4.21427.11 + 4.0.0-5.21453.15 16.7.1 6.0.100-preview.6.21452.4 4.8.3 From 20daa7891e53bd30fc12640fad4a0a9de15ec953 Mon Sep 17 00:00:00 2001 From: Eric StJohn Date: Wed, 8 Sep 2021 15:45:09 -0700 Subject: [PATCH 355/699] Remove Bundle override of DOTNETHOME (#7855) The bundle was passing in a hardcoded DOTNETHOME value unconditionally to MSIs in the chain. This value doesn't have the redirection we're adding to the MSI. We can't add that redirection in the bundle, since Burn doesn't have conditional variables. It can only set variables as a result of a search to either the value of the search (if successful) or 1/0. --- .../build/wix/bundle/bundle.wxs | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/src/Microsoft.DotNet.Build.Tasks.Installers/build/wix/bundle/bundle.wxs b/src/Microsoft.DotNet.Build.Tasks.Installers/build/wix/bundle/bundle.wxs index cd908f06756..7f968434f10 100644 --- a/src/Microsoft.DotNet.Build.Tasks.Installers/build/wix/bundle/bundle.wxs +++ b/src/Microsoft.DotNet.Build.Tasks.Installers/build/wix/bundle/bundle.wxs @@ -43,9 +43,7 @@ - - - + @@ -54,9 +52,7 @@ - - - + From bc261325df8833eaf1278eedd158a2e76bbd0af5 Mon Sep 17 00:00:00 2001 From: Ulises Hernandez Date: Wed, 8 Sep 2021 17:27:33 -0700 Subject: [PATCH 356/699] Use 1ES pools (#7856) --- azure-pipelines-richnav.yml | 4 ++-- azure-pipelines.yml | 4 ++-- eng/validate-sdk.yml | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/azure-pipelines-richnav.yml b/azure-pipelines-richnav.yml index ed02de46f8b..5e11d8e30c3 100644 --- a/azure-pipelines-richnav.yml +++ b/azure-pipelines-richnav.yml @@ -24,8 +24,8 @@ stages: - job: Windows_NT timeoutInMinutes: 90 pool: - name: NetCorePublic-Pool - queue: BuildPool.Server.Amd64.VS2017.Arcade.Open + name: NetCore1ESPool-Public + demands: ImageOverride -equals Build.Server.Amd64.VS2017.Open preSteps: - checkout: self clean: true diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 2a1c9e5de2f..be4aeeb3b0f 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -52,8 +52,8 @@ stages: ${{ if eq(variables._RunAsPublic, True) }}: vmImage: windows-latest ${{ if eq(variables._RunAsInternal, True) }}: - name: NetCoreInternal-Pool - queue: BuildPool.Server.Amd64.VS2017.Arcade + name: NetCore1ESPool-Internal + demands: ImageOverride -equals Build.Server.Amd64.VS2017 strategy: matrix: Build_Release: diff --git a/eng/validate-sdk.yml b/eng/validate-sdk.yml index 937f5cae1da..ff9f7d01bb1 100644 --- a/eng/validate-sdk.yml +++ b/eng/validate-sdk.yml @@ -19,8 +19,8 @@ jobs: name: Logs_ValidateSdk_Windows_NT_Release timeoutInMinutes: 90 pool: - name: NetCoreInternal-Pool - queue: BuildPool.Server.Amd64.VS2017.Arcade + name: NetCore1ESPool-Internal + demands: ImageOverride -equals Build.Server.Amd64.VS2017.Arcade variables: - group: DotNet-Blob-Feed - group: Publish-Build-Assets From 5aa9d32c0fd7f412ea60aba2b9650fcbd3b8766c Mon Sep 17 00:00:00 2001 From: Peter Collins Date: Wed, 8 Sep 2021 22:03:18 -0400 Subject: [PATCH 357/699] [workloads] Allow disabling most parallelization (#7857) The changes in 7168d63 did fix Android msi generation issues for me locally, but CI attempts have still been failing. A new `RunInParallel` task parameter has been added to allow consumers to opt-out of most parallelization until these issues are fixed. --- .../src/GenerateVisualStudioWorkload.cs | 10 +++++++ .../src/GenerateWorkloadMsis.cs | 27 ++++++++++++++++--- 2 files changed, 33 insertions(+), 4 deletions(-) diff --git a/src/Microsoft.DotNet.Build.Tasks.Workloads/src/GenerateVisualStudioWorkload.cs b/src/Microsoft.DotNet.Build.Tasks.Workloads/src/GenerateVisualStudioWorkload.cs index bf7af320a1b..5d4a7c1aeed 100644 --- a/src/Microsoft.DotNet.Build.Tasks.Workloads/src/GenerateVisualStudioWorkload.cs +++ b/src/Microsoft.DotNet.Build.Tasks.Workloads/src/GenerateVisualStudioWorkload.cs @@ -108,6 +108,15 @@ public string SuppressIces set; } + /// + /// Generate msis in parallel. + /// + public bool RunInParallel + { + get; + set; + } = true; + /// /// The paths of the generated .swixproj files. /// @@ -182,6 +191,7 @@ internal IEnumerable GenerateMsisFromManifests(ITaskItem[] workloadMa IntermediateBaseOutputPath = this.IntermediateBaseOutputPath, OutputPath = this.OutputPath, PackagesPath = this.PackagesPath, + RunInParallel = this.RunInParallel, ShortNames = this.ShortNames, SuppressIces = this.SuppressIces, WixToolsetPath = this.WixToolsetPath, diff --git a/src/Microsoft.DotNet.Build.Tasks.Workloads/src/GenerateWorkloadMsis.cs b/src/Microsoft.DotNet.Build.Tasks.Workloads/src/GenerateWorkloadMsis.cs index 50340821555..8179d2164dc 100644 --- a/src/Microsoft.DotNet.Build.Tasks.Workloads/src/GenerateWorkloadMsis.cs +++ b/src/Microsoft.DotNet.Build.Tasks.Workloads/src/GenerateWorkloadMsis.cs @@ -35,6 +35,15 @@ public string PackagesPath set; } + /// + /// Generate msis in parallel. + /// + public bool RunInParallel + { + get; + set; + } = true; + /// /// Gets the set of missing workload packs. /// @@ -90,14 +99,24 @@ public override bool Execute() string swixPackageId = $"{pack.Id.ToString().Replace(ShortNames)}.{pack.Version}"; // Always select the pack ID for the VS MSI package, even when aliased. - packsToGenerate.Add(new(sourcePackage, swixPackageId, OutputPath, pack.Kind, platforms)); + if (RunInParallel) + { + packsToGenerate.Add(new(sourcePackage, swixPackageId, OutputPath, pack.Kind, platforms)); + } + else + { + msis.AddRange(Generate(sourcePackage, swixPackageId, OutputPath, pack.Kind, platforms)); + } } } - System.Threading.Tasks.Parallel.ForEach(packsToGenerate, p => + if (RunInParallel) { - msis.AddRange(Generate(p.sourcePackage, p.swixPackageId, p.outputPath, p.kind, p.platforms)); - }); + System.Threading.Tasks.Parallel.ForEach(packsToGenerate, p => + { + msis.AddRange(Generate(p.sourcePackage, p.swixPackageId, p.outputPath, p.kind, p.platforms)); + }); + } Msis = msis.ToArray(); MissingPacks = missingPacks.ToArray(); From 06b4a81e66be2eb5ef86d72ee016e6b0a4d1972f Mon Sep 17 00:00:00 2001 From: Sarah Oslund Date: Thu, 9 Sep 2021 11:58:01 -0700 Subject: [PATCH 358/699] Account for target installer arch in mac pkg id generation (#7831) --- .../build/installer.singlerid.targets | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Microsoft.DotNet.Build.Tasks.Installers/build/installer.singlerid.targets b/src/Microsoft.DotNet.Build.Tasks.Installers/build/installer.singlerid.targets index a692fecae35..2651a4588fd 100644 --- a/src/Microsoft.DotNet.Build.Tasks.Installers/build/installer.singlerid.targets +++ b/src/Microsoft.DotNet.Build.Tasks.Installers/build/installer.singlerid.targets @@ -399,7 +399,7 @@ RemoveProperties="@(_GlobalPropertiesToRemoveForPublish)" /> <_MacOSVersionComponent Condition="'$(IncludeVersionInMacOSComponentName)' == 'true'">.$(InstallerPackageVersion) - <_MacOSComponentName Condition="'$(_MacOSComponentName)' == ''">com.microsoft.dotnet.$(MacOSComponentNamePackType)$(_MacOSVersionComponent).component.osx.x64 + <_MacOSComponentName Condition="'$(_MacOSComponentName)' == ''">com.microsoft.dotnet.$(MacOSComponentNamePackType)$(_MacOSVersionComponent).component.osx.$(InstallerTargetArchitecture) <_MacOSSharedInstallDir>/usr/local/share/dotnet <_pkgArgs> From e4bce715260e7c65611ff652ce41afc7fd202a93 Mon Sep 17 00:00:00 2001 From: Matt Galbraith Date: Thu, 9 Sep 2021 11:58:52 -0700 Subject: [PATCH 359/699] Fix SourceLinkUrl calculation in another place (#7870) * Originally didn't fix it in both places, but also using [MSBuild]::ValueOrDefault() API * PR feedback: No longer need '%(SourceRoot.ScmRepositoryUrl)' != '' when using ValueOrDefault --- src/Microsoft.DotNet.Arcade.Sdk/tools/RepositoryInfo.targets | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Microsoft.DotNet.Arcade.Sdk/tools/RepositoryInfo.targets b/src/Microsoft.DotNet.Arcade.Sdk/tools/RepositoryInfo.targets index 65ecb7ee20c..e5c6b9b39e1 100644 --- a/src/Microsoft.DotNet.Arcade.Sdk/tools/RepositoryInfo.targets +++ b/src/Microsoft.DotNet.Arcade.Sdk/tools/RepositoryInfo.targets @@ -67,13 +67,13 @@ - $([System.String]::Copy(%(SourceRoot.ScmRepositoryUrl)).ToLower().Replace(`-trusted`,``)) + $([MSBuild]::ValueOrDefault(`%(SourceRoot.ScmRepositoryUrl)`, ``).ToLower().Replace(`-trusted`,``)) $([System.Text.RegularExpressions.Regex]::Replace($(ScmRepositoryUrl), $(_TranslateUrlPattern), $(_TranslateUrlReplacement))) - $([System.String]::Copy(%(SourceRoot.ScmRepositoryUrl)).ToLower().Replace(`-trusted`,``)) + $([MSBuild]::ValueOrDefault(`%(SourceRoot.ScmRepositoryUrl)`, ``).ToLower().Replace(`-trusted`,``)) $([System.Text.RegularExpressions.Regex]::Replace(%(SourceRoot.ScmRepositoryUrl), $(_TranslateUrlPattern), $(_TranslateUrlReplacement))) From f2e719c5b28635340ec612ddec6a630438369dc3 Mon Sep 17 00:00:00 2001 From: Matt Galbraith Date: Thu, 9 Sep 2021 12:58:02 -0700 Subject: [PATCH 360/699] Fix image name for validate sdk (#7874) https://github.com/dotnet/arcade/issues/7873 --- eng/validate-sdk.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/eng/validate-sdk.yml b/eng/validate-sdk.yml index ff9f7d01bb1..17e32c46d60 100644 --- a/eng/validate-sdk.yml +++ b/eng/validate-sdk.yml @@ -20,7 +20,7 @@ jobs: timeoutInMinutes: 90 pool: name: NetCore1ESPool-Internal - demands: ImageOverride -equals Build.Server.Amd64.VS2017.Arcade + demands: ImageOverride -equals Build.Server.Amd64.VS2017 variables: - group: DotNet-Blob-Feed - group: Publish-Build-Assets From fa4a48044d33222537e6dbd000f8a2adaa7a15c7 Mon Sep 17 00:00:00 2001 From: Jeremy Koritzinsky Date: Thu, 9 Sep 2021 14:04:09 -0700 Subject: [PATCH 361/699] Update version file template based on feedback in dotnet/runtime#58674 (#7872) --- src/Microsoft.DotNet.Arcade.Sdk/tools/Version.targets | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Microsoft.DotNet.Arcade.Sdk/tools/Version.targets b/src/Microsoft.DotNet.Arcade.Sdk/tools/Version.targets index 95f6e729771..818dc305efe 100644 --- a/src/Microsoft.DotNet.Arcade.Sdk/tools/Version.targets +++ b/src/Microsoft.DotNet.Arcade.Sdk/tools/Version.targets @@ -82,7 +82,7 @@ #define VER_ORIGINALFILENAME_STR VER_FILEDESCRIPTION_STR #endif #ifndef VER_PRODUCTNAME_STR -#define VER_PRODUCTNAME_STR "Microsoft\xae .NET Framework" +#define VER_PRODUCTNAME_STR ".NET" #endif #undef VER_PRODUCTVERSION #define VER_PRODUCTVERSION $(_WindowsFileVersion) From 0b38c9ef855c97ca613ba5c19364715b9794f4f0 Mon Sep 17 00:00:00 2001 From: Viktor Hofer Date: Fri, 10 Sep 2021 11:30:27 +0200 Subject: [PATCH 362/699] Don't strip .NETFramework tfms (#7863) With https://github.com/dotnet/runtime/pull/58558, .NETFramework tfms which include a RID (i.e. net461-windows) aren't used and supported in dotnet/runtime anymore. Removing the support from the TargetFramework.Sdk as .NETFramework tfms with a RID aren't supported by NuGet anyways and throw. --- .../Microsoft.DotNet.Build.Tasks.TargetFramework.Sdk.props | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Microsoft.DotNet.Build.Tasks.TargetFramework.Sdk/src/build/Microsoft.DotNet.Build.Tasks.TargetFramework.Sdk.props b/src/Microsoft.DotNet.Build.Tasks.TargetFramework.Sdk/src/build/Microsoft.DotNet.Build.Tasks.TargetFramework.Sdk.props index a85fce1f30d..95d31e8b08d 100644 --- a/src/Microsoft.DotNet.Build.Tasks.TargetFramework.Sdk/src/build/Microsoft.DotNet.Build.Tasks.TargetFramework.Sdk.props +++ b/src/Microsoft.DotNet.Build.Tasks.TargetFramework.Sdk/src/build/Microsoft.DotNet.Build.Tasks.TargetFramework.Sdk.props @@ -11,7 +11,7 @@ ..\tools\netcoreapp3.1\Microsoft.DotNet.Build.Tasks.TargetFramework.Sdk.dll ..\tools\net472\Microsoft.DotNet.Build.Tasks.TargetFramework.Sdk.dll <_OriginalTargetFramework>$(TargetFramework) - (((netstandard|netcoreapp)[0-9\.]+)|(net[1-4][1-9\.]+))(-[^;]+) + ((netstandard|netcoreapp)[0-9\.]+)(-[^;]+) $(TargetFramework) From c02221833041509a7724c9b2d6123e9d06655ad9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C5=99emek=20Vysok=C3=BD?= Date: Fri, 10 Sep 2021 12:27:33 +0200 Subject: [PATCH 363/699] Make all $HELIX_ env vars available in Apple workloads (#7869) --- .../xharness-helix-job.apple.sh | 4 +-- .../xharness-runner/xharness-runner.apple.sh | 29 +++++-------------- 2 files changed, 9 insertions(+), 24 deletions(-) diff --git a/src/Microsoft.DotNet.Helix/Sdk/tools/xharness-runner/xharness-helix-job.apple.sh b/src/Microsoft.DotNet.Helix/Sdk/tools/xharness-runner/xharness-helix-job.apple.sh index 15e6af638be..31e8f5bcfab 100644 --- a/src/Microsoft.DotNet.Helix/Sdk/tools/xharness-runner/xharness-helix-job.apple.sh +++ b/src/Microsoft.DotNet.Helix/Sdk/tools/xharness-runner/xharness-helix-job.apple.sh @@ -28,13 +28,13 @@ set -x # It is important we call the script via `launchctl asuser` in order to be able to spawn # the simulator which needs to run in a user session with GUI rendering capabilities. # The problem with launchctl is that the spawned process won't share environment variables -# so we have to pass all of them as parameters are set them again. +# so we have to set them again. +export -p > envvars chmod +x xharness-runner.apple.sh helix_runner_uid=$(id -u) sudo launchctl asuser "$helix_runner_uid" sh ./xharness-runner.apple.sh \ $forwarded_args \ --app "$HELIX_WORKITEM_ROOT/$app" \ - --xharness-cli-path "$XHARNESS_CLI_PATH" \ --output-directory "$HELIX_WORKITEM_UPLOAD_ROOT" \ --diagnostics-path "$XHARNESS_DIAGNOSTICS_PATH" \ diff --git a/src/Microsoft.DotNet.Helix/Sdk/tools/xharness-runner/xharness-runner.apple.sh b/src/Microsoft.DotNet.Helix/Sdk/tools/xharness-runner/xharness-runner.apple.sh index 90d21b98cba..23a72643593 100644 --- a/src/Microsoft.DotNet.Helix/Sdk/tools/xharness-runner/xharness-runner.apple.sh +++ b/src/Microsoft.DotNet.Helix/Sdk/tools/xharness-runner/xharness-runner.apple.sh @@ -7,11 +7,9 @@ ### app='' -output_directory='' target='' timeout='' launch_timeout='' -xharness_cli_path='' xcode_version='' app_arguments='' expected_exit_code=0 @@ -25,10 +23,6 @@ while [[ $# -gt 0 ]]; do app="$2" shift ;; - --output-directory) - output_directory="$2" - shift - ;; --diagnostics-path) export XHARNESS_DIAGNOSTICS_PATH="$2" shift @@ -45,10 +39,6 @@ while [[ $# -gt 0 ]]; do launch_timeout="$2" shift ;; - --xharness-cli-path) - xharness_cli_path="$2" - shift - ;; --xcode-version) xcode_version="$2" shift @@ -85,20 +75,18 @@ if [ -z "$target" ]; then die "No target was provided"; fi -if [ -z "$output_directory" ]; then - die "No output directory provided"; -fi - -if [ -z "$xharness_cli_path" ]; then - die "XHarness path wasn't provided"; -fi - if [ -z "$xcode_version" ]; then xcode_path="$(dirname "$(dirname "$(xcode-select -p)")")" else xcode_path="/Applications/Xcode${xcode_version/./}.app" fi +# First we need to revive env variables since they were erased by launchctl +# This file already has the expressions in the `export name=value` format +. ./envvars + +output_directory=$HELIX_WORKITEM_UPLOAD_ROOT + # Signing if [ "$target" == 'ios-device' ] || [ "$target" == 'tvos-device' ]; then echo "Real device target detected, application will be signed" @@ -141,12 +129,9 @@ elif [[ "$target" =~ "simulator" ]]; then open -a "$simulator_app" fi -export XHARNESS_DISABLE_COLORED_OUTPUT=true -export XHARNESS_LOG_WITH_TIMESTAMPS=true - # The xharness alias function xharness() { - dotnet exec $xharness_cli_path "$@" + dotnet exec $XHARNESS_CLI_PATH "$@" } # Act out the actual commands From 396d91855f93b24ee62e315729fbadfd03e0aaf1 Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Fri, 10 Sep 2021 07:53:43 -0700 Subject: [PATCH 364/699] [main] Update dependencies from dotnet/arcade mono/linker (#7865) * Update dependencies from https://github.com/dotnet/arcade build 20210907.3 Microsoft.DotNet.Build.Tasks.Feed , Microsoft.DotNet.Arcade.Sdk , Microsoft.DotNet.SwaggerGenerator.MSBuild , Microsoft.DotNet.SignTool , Microsoft.DotNet.Helix.Sdk From Version 7.0.0-beta.21456.1 -> To Version 7.0.0-beta.21457.3 * Update dependencies from https://github.com/mono/linker build 20210909.1 Microsoft.NET.ILLink.Tasks From Version 6.0.100-preview.6.21452.4 -> To Version 6.0.100-1.21459.1 * Update dependencies from https://github.com/dotnet/arcade build 20210909.5 Microsoft.DotNet.Build.Tasks.Feed , Microsoft.DotNet.Arcade.Sdk , Microsoft.DotNet.SwaggerGenerator.MSBuild , Microsoft.DotNet.SignTool , Microsoft.DotNet.Helix.Sdk From Version 7.0.0-beta.21456.1 -> To Version 7.0.0-beta.21459.5 Co-authored-by: dotnet-maestro[bot] --- eng/Version.Details.xml | 24 ++++++++++++------------ eng/Versions.props | 8 ++++---- global.json | 4 ++-- 3 files changed, 18 insertions(+), 18 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index f5438681175..f35bc1f6c8c 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -11,25 +11,25 @@ - + https://github.com/dotnet/arcade - 7309c692126e24bc10702f39fe45b2a295b224d2 + fa4a48044d33222537e6dbd000f8a2adaa7a15c7 - + https://github.com/dotnet/arcade - 7309c692126e24bc10702f39fe45b2a295b224d2 + fa4a48044d33222537e6dbd000f8a2adaa7a15c7 - + https://github.com/dotnet/arcade - 7309c692126e24bc10702f39fe45b2a295b224d2 + fa4a48044d33222537e6dbd000f8a2adaa7a15c7 - + https://github.com/dotnet/arcade - 7309c692126e24bc10702f39fe45b2a295b224d2 + fa4a48044d33222537e6dbd000f8a2adaa7a15c7 - + https://github.com/dotnet/arcade - 7309c692126e24bc10702f39fe45b2a295b224d2 + fa4a48044d33222537e6dbd000f8a2adaa7a15c7 https://github.com/dotnet/arcade-services @@ -47,9 +47,9 @@ https://github.com/dotnet/roslyn 2bbf85baa30a90f9d491699734e814050356da32 - + https://github.com/mono/linker - 8a5c446a84922bddccfcfc6d3cb5c117dc3babd4 + c8499798a2a09639174e2f5c694d6652794cc73d https://github.com/dotnet/sourcelink diff --git a/eng/Versions.props b/eng/Versions.props index aeca7bcb41a..42b8206be00 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -36,7 +36,7 @@ 2.1.0 4.0.0-5.21453.15 16.7.1 - 6.0.100-preview.6.21452.4 + 6.0.100-1.21459.1 4.8.3 5.3.0.1 2.3.0 @@ -65,8 +65,8 @@ 2.4.1 2.0.3 2.4.1 - 7.0.0-beta.21456.1 - 7.0.0-beta.21456.1 + 7.0.0-beta.21459.5 + 7.0.0-beta.21459.5 1.22.0 1.1.2 2.0.0 @@ -77,7 +77,7 @@ 1.1.0-beta.20258.6 1.1.0-beta-21456-02 1.1.0-beta-21456-02 - 7.0.0-beta.21456.1 + 7.0.0-beta.21459.5 1.0.0-beta.21452.1 1.1.0-beta.21378.2 1.0.0-prerelease.21456.1 diff --git a/global.json b/global.json index c61ed429bc6..23dc7150027 100644 --- a/global.json +++ b/global.json @@ -3,7 +3,7 @@ "dotnet": "6.0.100-rc.1.21430.12" }, "msbuild-sdks": { - "Microsoft.DotNet.Arcade.Sdk": "7.0.0-beta.21456.1", - "Microsoft.DotNet.Helix.Sdk": "7.0.0-beta.21456.1" + "Microsoft.DotNet.Arcade.Sdk": "7.0.0-beta.21459.5", + "Microsoft.DotNet.Helix.Sdk": "7.0.0-beta.21459.5" } } From 6d0fdcda1f459f04664b736e878fffbf87f01c3b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C5=99emek=20Vysok=C3=BD?= Date: Fri, 10 Sep 2021 18:52:29 +0200 Subject: [PATCH 365/699] Make Android package name non-mandatory for XHarness workloads (#7881) --- .../Sdk/tools/xharness-runner/xharness-event-reporter.py | 2 ++ .../Sdk/tools/xharness-runner/xharness-helix-job.android.ps1 | 4 ++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/Microsoft.DotNet.Helix/Sdk/tools/xharness-runner/xharness-event-reporter.py b/src/Microsoft.DotNet.Helix/Sdk/tools/xharness-runner/xharness-event-reporter.py index dde82f0e391..92d161eaf3e 100644 --- a/src/Microsoft.DotNet.Helix/Sdk/tools/xharness-runner/xharness-event-reporter.py +++ b/src/Microsoft.DotNet.Helix/Sdk/tools/xharness-runner/xharness-event-reporter.py @@ -28,6 +28,8 @@ # The JSON should be an array of objects (one per each executed XHarness command) operations = json.load(open(diagnostics_file)) +print(f"[XHarness reporter] Reporting {len(operations)} events from diagnostics file `{diagnostics_file}`") + for operation in operations: custom_dimensions = dict() diff --git a/src/Microsoft.DotNet.Helix/Sdk/tools/xharness-runner/xharness-helix-job.android.ps1 b/src/Microsoft.DotNet.Helix/Sdk/tools/xharness-runner/xharness-helix-job.android.ps1 index f9e0066068b..92dd6bef839 100644 --- a/src/Microsoft.DotNet.Helix/Sdk/tools/xharness-runner/xharness-helix-job.android.ps1 +++ b/src/Microsoft.DotNet.Helix/Sdk/tools/xharness-runner/xharness-helix-job.android.ps1 @@ -12,8 +12,8 @@ param ( [string]$app, [Parameter(Mandatory)] [string]$timeout, - [Parameter(Mandatory)] - [string]$package_name, + [Parameter()] + [string]$package_name = $null, [Parameter()] [int]$expected_exit_code = 0, [Parameter()] From 22d90b34fe210ca9f85ea1896eda29f2de55f826 Mon Sep 17 00:00:00 2001 From: Jan Vorlicek Date: Fri, 10 Sep 2021 22:13:41 +0200 Subject: [PATCH 366/699] Fix lld support (#7883) I have found that when I've made a change to use the lld linker in July, I've missed to push part of the change that was supposed to go to Arcade. Without this change, the lld enabling flag is not used and we end up using the default linker. --- eng/common/cross/toolchain.cmake | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/eng/common/cross/toolchain.cmake b/eng/common/cross/toolchain.cmake index fc11001aa76..ec8971eb019 100644 --- a/eng/common/cross/toolchain.cmake +++ b/eng/common/cross/toolchain.cmake @@ -138,8 +138,8 @@ function(add_toolchain_linker_flag Flag) if (NOT Config STREQUAL "") set(CONFIG_SUFFIX "_${Config}") endif() - set("CMAKE_EXE_LINKER_FLAGS${CONFIG_SUFFIX}" "${CMAKE_EXE_LINKER_FLAGS${CONFIG_SUFFIX}} ${Flag}" PARENT_SCOPE) - set("CMAKE_SHARED_LINKER_FLAGS${CONFIG_SUFFIX}" "${CMAKE_SHARED_LINKER_FLAGS${CONFIG_SUFFIX}} ${Flag}" PARENT_SCOPE) + set("CMAKE_EXE_LINKER_FLAGS${CONFIG_SUFFIX}_INIT" "${CMAKE_EXE_LINKER_FLAGS${CONFIG_SUFFIX}_INIT} ${Flag}" PARENT_SCOPE) + set("CMAKE_SHARED_LINKER_FLAGS${CONFIG_SUFFIX}_INIT" "${CMAKE_SHARED_LINKER_FLAGS${CONFIG_SUFFIX}_INIT} ${Flag}" PARENT_SCOPE) endfunction() if(CMAKE_SYSTEM_NAME STREQUAL "Linux") From 68b7bb847bd39fd20dfc78d0231789267f491638 Mon Sep 17 00:00:00 2001 From: Viktor Hofer Date: Fri, 10 Sep 2021 22:57:37 +0200 Subject: [PATCH 367/699] Update Microsoft.DotNet.Build.Tasks.TargetFramework.Sdk.targets (#7878) * Don't strip .NETFramework tfms With https://github.com/dotnet/runtime/pull/58558, .NETFramework tfms which include a RID (i.e. net461-windows) aren't used and supported in dotnet/runtime anymore. Removing the support from the TargetFramework.Sdk as .NETFramework tfms with a RID aren't supported by NuGet anyways and throw. * Update Microsoft.DotNet.Build.Tasks.TargetFramework.Sdk.targets --- .../Microsoft.DotNet.Build.Tasks.TargetFramework.Sdk.targets | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Microsoft.DotNet.Build.Tasks.TargetFramework.Sdk/src/build/Microsoft.DotNet.Build.Tasks.TargetFramework.Sdk.targets b/src/Microsoft.DotNet.Build.Tasks.TargetFramework.Sdk/src/build/Microsoft.DotNet.Build.Tasks.TargetFramework.Sdk.targets index 97c20f3837b..00e27e09c67 100644 --- a/src/Microsoft.DotNet.Build.Tasks.TargetFramework.Sdk/src/build/Microsoft.DotNet.Build.Tasks.TargetFramework.Sdk.targets +++ b/src/Microsoft.DotNet.Build.Tasks.TargetFramework.Sdk/src/build/Microsoft.DotNet.Build.Tasks.TargetFramework.Sdk.targets @@ -12,7 +12,7 @@ @@ -83,7 +83,7 @@ + RuntimeGraph="$(RuntimeGraph)"> From 054309cb477a969df1197b9286a625827217af5f Mon Sep 17 00:00:00 2001 From: Matt Galbraith Date: Fri, 10 Sep 2021 15:38:32 -0700 Subject: [PATCH 368/699] Add ExponentialRetry to FindDotNetCliPackage task; since it's not optional, the productVersion.txt stuff needs to succeed. (#7882) --- .../Sdk/FindDotNetCliPackage.cs | 68 +++++++++++++++++-- 1 file changed, 63 insertions(+), 5 deletions(-) diff --git a/src/Microsoft.DotNet.Helix/Sdk/FindDotNetCliPackage.cs b/src/Microsoft.DotNet.Helix/Sdk/FindDotNetCliPackage.cs index 1e00efe249b..a7f8947e11e 100644 --- a/src/Microsoft.DotNet.Helix/Sdk/FindDotNetCliPackage.cs +++ b/src/Microsoft.DotNet.Helix/Sdk/FindDotNetCliPackage.cs @@ -2,6 +2,7 @@ using System.Net; using System.Net.Http; using System.Threading.Tasks; +using Microsoft.Arcade.Common; using Microsoft.Build.Framework; using NuGet.Versioning; @@ -9,6 +10,12 @@ namespace Microsoft.DotNet.Helix.Sdk { public class FindDotNetCliPackage : BaseTask { + // Use lots of retries since an Http Client failure here means failure to send to Helix + private ExponentialRetry _retry = new ExponentialRetry() + { + MaxAttempts = 10, + DelayBase = 3.0 + }; private static readonly HttpClient _client = new HttpClient(new HttpClientHandler { CheckCertificateRevocationList = true }); private const string DotNetCliAzureFeed = "https://dotnetcli.blob.core.windows.net/dotnet"; @@ -56,8 +63,7 @@ private async Task ExecuteAsync() try { - using var req = new HttpRequestMessage(HttpMethod.Head, downloadUrl); - using HttpResponseMessage res = await _client.SendAsync(req); + using HttpResponseMessage res = await HeadRequestWithRetry(downloadUrl); if (res.StatusCode == HttpStatusCode.NotFound) { @@ -128,10 +134,12 @@ private async Task GetEffectiveVersion() } private async Task GetMatchingProductVersionTxtContents(string baseUri, string customVersionTextFileName) { - using HttpResponseMessage specificResponse = await _client.GetAsync($"{baseUri}/{customVersionTextFileName}"); + Log.LogMessage(MessageImportance.Low, $"Checking for productVersion.txt files under {baseUri}"); + + using HttpResponseMessage specificResponse = await GetAsyncWithRetry($"{baseUri}/{customVersionTextFileName}"); if (specificResponse.StatusCode == HttpStatusCode.NotFound) { - using HttpResponseMessage genericResponse = await _client.GetAsync($"{baseUri}/productVersion.txt"); + using HttpResponseMessage genericResponse = await GetAsyncWithRetry($"{baseUri}/productVersion.txt"); if (genericResponse.StatusCode != HttpStatusCode.NotFound) { genericResponse.EnsureSuccessStatusCode(); @@ -150,6 +158,53 @@ private async Task GetMatchingProductVersionTxtContents(string baseUri, return Version; } + private async Task GetAsyncWithRetry(string uri) + { + HttpResponseMessage response = null; + await _retry.RunAsync(async attempt => + { + try + { + response = await _client.GetAsync(uri); + return true; + } + catch (Exception toLog) + { + Log.LogMessage(MessageImportance.Low, $"Hit exception in GetAsync(); will retry up to 10 times ({toLog.Message})"); + return false; + } + }); + if (response == null) // All retries failed + { + throw new Exception($"Failed to GET from {uri}, even after retrying"); + } + return response; + } + + private async Task HeadRequestWithRetry(string uri) + { + HttpResponseMessage response = null; + await _retry.RunAsync(async attempt => + { + try + { + using var req = new HttpRequestMessage(HttpMethod.Head, uri); + response = await _client.SendAsync(req); + return true; + } + catch (Exception toLog) + { + Log.LogMessage(MessageImportance.Low, $"Hit exception in SendAsync(); will retry up to 10 times ({toLog.Message})"); + return false; + } + }); + if (response == null) // All retries failed + { + throw new Exception($"Failed to make HEAD request to {uri}, even after retrying"); + } + return response; + } + private void NormalizeParameters() { if (string.Equals(Channel, "lts", StringComparison.OrdinalIgnoreCase)) @@ -201,7 +256,10 @@ private async Task ResolveVersionAsync() }; Log.LogMessage(MessageImportance.Low, $"Resolving latest version from url {latestVersionUrl}"); - string latestVersionContent = await _client.GetStringAsync(latestVersionUrl); + + using HttpResponseMessage versionResponse = await GetAsyncWithRetry(latestVersionUrl); + versionResponse.EnsureSuccessStatusCode(); + string latestVersionContent = await versionResponse.Content.ReadAsStringAsync(); string[] versionData = latestVersionContent.Split(Array.Empty(), StringSplitOptions.RemoveEmptyEntries); Version = versionData[1]; Log.LogMessage(MessageImportance.Low, $"Got latest dotnet cli version {Version}"); From 736670075a6c75bfc136596ff7c6db70b94a9b40 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jostein=20Kj=C3=B8nigsen?= Date: Sun, 12 Sep 2021 18:02:48 +0200 Subject: [PATCH 369/699] Revert changes breaking build on FreeBSD (#7885) * Add clang-versions used on modern FreeBSD versions. This helps .NET build on FreeBSD. * Update FreeBSD target Current release is 12, not 11. * Fix linking on FreeBSD. These changes have previously been introduced in `dotnet/runtime`, but been reverted through automated updates later on. This commit re-introduces them. --- eng/common/cross/toolchain.cmake | 5 ++++- eng/common/native/find-native-compiler.sh | 2 +- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/eng/common/cross/toolchain.cmake b/eng/common/cross/toolchain.cmake index ec8971eb019..6501c3a955f 100644 --- a/eng/common/cross/toolchain.cmake +++ b/eng/common/cross/toolchain.cmake @@ -44,7 +44,7 @@ elseif(TARGET_ARCH_NAME STREQUAL "x86") set(TOOLCHAIN "i686-linux-gnu") elseif (CMAKE_SYSTEM_NAME STREQUAL "FreeBSD") set(CMAKE_SYSTEM_PROCESSOR "x86_64") - set(triple "x86_64-unknown-freebsd11") + set(triple "x86_64-unknown-freebsd12") elseif (ILLUMOS) set(CMAKE_SYSTEM_PROCESSOR "x86_64") set(TOOLCHAIN "x86_64-illumos") @@ -91,6 +91,9 @@ elseif(CMAKE_SYSTEM_NAME STREQUAL "FreeBSD") set(CMAKE_CXX_COMPILER_TARGET ${triple}) set(CMAKE_ASM_COMPILER_TARGET ${triple}) set(CMAKE_SYSROOT "${CROSS_ROOTFS}") + set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fuse-ld=lld") + set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -fuse-ld=lld") + set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} -fuse-ld=lld") elseif(ILLUMOS) set(CMAKE_SYSROOT "${CROSS_ROOTFS}") diff --git a/eng/common/native/find-native-compiler.sh b/eng/common/native/find-native-compiler.sh index aed19d07d50..861d1931e55 100644 --- a/eng/common/native/find-native-compiler.sh +++ b/eng/common/native/find-native-compiler.sh @@ -55,7 +55,7 @@ if [ -z "$CLR_CC" ]; then # Set default versions if [ -z "$majorVersion" ]; then # note: gcc (all versions) and clang versions higher than 6 do not have minor version in file name, if it is zero. - if [ "$compiler" = "clang" ]; then versions=( 9 8 7 6.0 5.0 4.0 3.9 3.8 3.7 3.6 3.5 ) + if [ "$compiler" = "clang" ]; then versions=( 12 11 10 9 8 7 6.0 5.0 4.0 3.9 3.8 3.7 3.6 3.5 ) elif [ "$compiler" = "gcc" ]; then versions=( 9 8 7 6 5 4.9 ); fi for version in "${versions[@]}"; do From 5bd37767fc48e170cdd312ad317077f4ab93f663 Mon Sep 17 00:00:00 2001 From: Adeel Mujahid <3840695+am11@users.noreply.github.com> Date: Mon, 13 Sep 2021 16:07:02 +0300 Subject: [PATCH 370/699] Drop support for EOL alpine 3.9 (#7849) * Remove 3.9. * Set 3.13 as default. * Add 3.14. --- eng/common/cross/build-rootfs.sh | 40 ++++++++------------------------ 1 file changed, 10 insertions(+), 30 deletions(-) diff --git a/eng/common/cross/build-rootfs.sh b/eng/common/cross/build-rootfs.sh index 5c05b39f101..6fa2c8aa551 100755 --- a/eng/common/cross/build-rootfs.sh +++ b/eng/common/cross/build-rootfs.sh @@ -6,7 +6,7 @@ usage() { echo "Usage: $0 [BuildArch] [CodeName] [lldbx.y] [--skipunmount] --rootfsdir ]" echo "BuildArch can be: arm(default), armel, arm64, x86" - echo "CodeName - optional, Code name for Linux, can be: xenial(default), zesty, bionic, alpine, alpine3.9 or alpine3.13. If BuildArch is armel, LinuxCodeName is jessie(default) or tizen." + echo "CodeName - optional, Code name for Linux, can be: xenial(default), zesty, bionic, alpine, alpine3.13 or alpine3.14. If BuildArch is armel, LinuxCodeName is jessie(default) or tizen." echo " for FreeBSD can be: freebsd11, freebsd12, freebsd13" echo " for illumos can be: illumos." echo "lldbx.y - optional, LLDB version, can be: lldb3.9(default), lldb4.0, lldb5.0, lldb6.0 no-lldb. Ignored for alpine and FreeBSD" @@ -32,9 +32,9 @@ __UbuntuPackages="build-essential" __AlpinePackages="alpine-base" __AlpinePackages+=" build-base" __AlpinePackages+=" linux-headers" -__AlpinePackagesEdgeCommunity=" lldb-dev" -__AlpinePackagesEdgeMain+=" python3" -__AlpinePackagesEdgeMain+=" libedit" +__AlpinePackages+=" lldb-dev" +__AlpinePackages+=" python3" +__AlpinePackages+=" libedit" # symlinks fixer __UbuntuPackages+=" symlinks" @@ -185,23 +185,17 @@ while :; do __UbuntuRepo= __Tizen=tizen ;; - alpine|alpine3.9) + alpine|alpine3.13) __CodeName=alpine __UbuntuRepo= - __AlpineVersion=3.9 - __AlpinePackagesEdgeMain+=" llvm11-libs" - __AlpinePackagesEdgeMain+=" clang-libs" + __AlpineVersion=3.13 + __AlpinePackages+=" llvm10-libs" ;; - alpine3.13) + alpine3.14) __CodeName=alpine __UbuntuRepo= - __AlpineVersion=3.13 - # Alpine 3.13 has all the packages we need in the 3.13 repository - __AlpinePackages+=$__AlpinePackagesEdgeCommunity - __AlpinePackagesEdgeCommunity= - __AlpinePackages+=$__AlpinePackagesEdgeMain - __AlpinePackagesEdgeMain= - __AlpinePackages+=" llvm10-libs" + __AlpineVersion=3.14 + __AlpinePackages+=" llvm11-libs" ;; freebsd11) __FreeBSDBase="11.3-RELEASE" @@ -279,20 +273,6 @@ if [[ "$__CodeName" == "alpine" ]]; then -U --allow-untrusted --root $__RootfsDir --arch $__AlpineArch --initdb \ add $__AlpinePackages - if [[ -n "$__AlpinePackagesEdgeMain" ]]; then - $__ApkToolsDir/apk-tools-$__ApkToolsVersion/apk \ - -X http://dl-cdn.alpinelinux.org/alpine/edge/main \ - -U --allow-untrusted --root $__RootfsDir --arch $__AlpineArch --initdb \ - add $__AlpinePackagesEdgeMain - fi - - if [[ -n "$__AlpinePackagesEdgeCommunity" ]]; then - $__ApkToolsDir/apk-tools-$__ApkToolsVersion/apk \ - -X http://dl-cdn.alpinelinux.org/alpine/edge/community \ - -U --allow-untrusted --root $__RootfsDir --arch $__AlpineArch --initdb \ - add $__AlpinePackagesEdgeCommunity - fi - rm -r $__ApkToolsDir elif [[ "$__CodeName" == "freebsd" ]]; then mkdir -p $__RootfsDir/usr/local/etc From 70afc8b5c73a3a40ab2fbac61ac67c88f200226f Mon Sep 17 00:00:00 2001 From: Adeel Mujahid <3840695+am11@users.noreply.github.com> Date: Mon, 13 Sep 2021 17:18:57 +0300 Subject: [PATCH 371/699] Consolidate init-compiler with dotnet/runtime (#7886) --- ...nd-native-compiler.sh => init-compiler.sh} | 98 ++++++++++--------- .../build/Microsoft.DotNet.CMake.Sdk.targets | 2 +- 2 files changed, 51 insertions(+), 49 deletions(-) rename eng/common/native/{find-native-compiler.sh => init-compiler.sh} (52%) mode change 100644 => 100755 diff --git a/eng/common/native/find-native-compiler.sh b/eng/common/native/init-compiler.sh old mode 100644 new mode 100755 similarity index 52% rename from eng/common/native/find-native-compiler.sh rename to eng/common/native/init-compiler.sh index 861d1931e55..1daadf32a52 --- a/eng/common/native/find-native-compiler.sh +++ b/eng/common/native/init-compiler.sh @@ -1,39 +1,32 @@ #!/usr/bin/env bash # -# This file locates the native compiler with the given name and version and sets the environment variables to locate it. +# This file detects the C/C++ compiler and exports it to the CC/CXX environment variables # -source="${BASH_SOURCE[0]}" - -# resolve $SOURCE until the file is no longer a symlink -while [[ -h $source ]]; do - scriptroot="$( cd -P "$( dirname "$source" )" && pwd )" - source="$(readlink "$source")" - - # if $source was a relative symlink, we need to resolve it relative to the path where the - # symlink file was located - [[ $source != /* ]] && source="$scriptroot/$source" -done -scriptroot="$( cd -P "$( dirname "$source" )" && pwd )" - -if [ $# -lt 0 ] -then +if [[ "$#" -lt 2 ]]; then echo "Usage..." - echo "find-native-compiler.sh " + echo "init-compiler.sh " + echo "Specify the target architecture." echo "Specify the name of compiler (clang or gcc)." echo "Specify the major version of compiler." echo "Specify the minor version of compiler." exit 1 fi -. $scriptroot/../pipeline-logging-functions.sh +. "$( cd -P "$( dirname "$0" )" && pwd )"/../pipeline-logging-functions.sh -compiler="$1" +build_arch="$1" +compiler="$2" cxxCompiler="$compiler++" -majorVersion="$2" -minorVersion="$3" +majorVersion="$3" +minorVersion="$4" -if [ "$compiler" = "gcc" ]; then cxxCompiler="g++"; fi +# clear the existing CC and CXX from environment +CC= +CXX= +LDFLAGS= + +if [[ "$compiler" == "gcc" ]]; then cxxCompiler="g++"; fi check_version_exists() { desired_version=-1 @@ -50,38 +43,38 @@ check_version_exists() { echo "$desired_version" } -if [ -z "$CLR_CC" ]; then +if [[ -z "$CLR_CC" ]]; then # Set default versions - if [ -z "$majorVersion" ]; then + if [[ -z "$majorVersion" ]]; then # note: gcc (all versions) and clang versions higher than 6 do not have minor version in file name, if it is zero. - if [ "$compiler" = "clang" ]; then versions=( 12 11 10 9 8 7 6.0 5.0 4.0 3.9 3.8 3.7 3.6 3.5 ) - elif [ "$compiler" = "gcc" ]; then versions=( 9 8 7 6 5 4.9 ); fi + if [[ "$compiler" == "clang" ]]; then versions=( 12 11 10 9 8 7 6.0 5.0 4.0 3.9 3.8 3.7 3.6 3.5 ) + elif [[ "$compiler" == "gcc" ]]; then versions=( 11 10 9 8 7 6 5 4.9 ); fi for version in "${versions[@]}"; do parts=(${version//./ }) desired_version="$(check_version_exists "${parts[0]}" "${parts[1]}")" - if [ "$desired_version" != "-1" ]; then majorVersion="${parts[0]}"; break; fi + if [[ "$desired_version" != "-1" ]]; then majorVersion="${parts[0]}"; break; fi done - if [ -z "$majorVersion" ]; then + if [[ -z "$majorVersion" ]]; then if command -v "$compiler" > /dev/null; then - if [ "$(uname)" != "Darwin" ]; then + if [[ "$(uname)" != "Darwin" ]]; then Write-PipelineTelemetryError -category "Build" -type "warning" "Specific version of $compiler not found, falling back to use the one in PATH." fi - export CC="$(command -v "$compiler")" - export CXX="$(command -v "$cxxCompiler")" + CC="$(command -v "$compiler")" + CXX="$(command -v "$cxxCompiler")" else Write-PipelineTelemetryError -category "Build" "No usable version of $compiler found." exit 1 fi else - if [ "$compiler" = "clang" ] && [ "$majorVersion" -lt 5 ]; then - if [ "$build_arch" = "arm" ] || [ "$build_arch" = "armel" ]; then + if [[ "$compiler" == "clang" && "$majorVersion" -lt 5 ]]; then + if [[ "$build_arch" == "arm" || "$build_arch" == "armel" ]]; then if command -v "$compiler" > /dev/null; then Write-PipelineTelemetryError -category "Build" -type "warning" "Found clang version $majorVersion which is not supported on arm/armel architectures, falling back to use clang from PATH." - export CC="$(command -v "$compiler")" - export CXX="$(command -v "$cxxCompiler")" + CC="$(command -v "$compiler")" + CXX="$(command -v "$cxxCompiler")" else Write-PipelineTelemetryError -category "Build" "Found clang version $majorVersion which is not supported on arm/armel architectures, and there is no clang in PATH." exit 1 @@ -91,31 +84,40 @@ if [ -z "$CLR_CC" ]; then fi else desired_version="$(check_version_exists "$majorVersion" "$minorVersion")" - if [ "$desired_version" = "-1" ]; then + if [[ "$desired_version" == "-1" ]]; then Write-PipelineTelemetryError -category "Build" "Could not find specific version of $compiler: $majorVersion $minorVersion." exit 1 fi fi - if [ -z "$CC" ]; then - export CC="$(command -v "$compiler$desired_version")" - export CXX="$(command -v "$cxxCompiler$desired_version")" - if [ -z "$CXX" ]; then export CXX="$(command -v "$cxxCompiler")"; fi + if [[ -z "$CC" ]]; then + CC="$(command -v "$compiler$desired_version")" + CXX="$(command -v "$cxxCompiler$desired_version")" + if [[ -z "$CXX" ]]; then CXX="$(command -v "$cxxCompiler")"; fi fi else - if [ ! -f "$CLR_CC" ]; then + if [[ ! -f "$CLR_CC" ]]; then Write-PipelineTelemetryError -category "Build" "CLR_CC is set but path '$CLR_CC' does not exist" exit 1 fi - export CC="$CLR_CC" - export CXX="$CLR_CXX" + CC="$CLR_CC" + CXX="$CLR_CXX" fi -if [ -z "$CC" ]; then - Write-PipelineTelemetryError -category "Build" "Unable to find $compiler." +if [[ -z "$CC" ]]; then + Write-PipelineTelemetryError -category "Build" "Unable to find $compiler." exit 1 fi -export CCC_CC="$CC" -export CCC_CXX="$CXX" -export SCAN_BUILD_COMMAND="$(command -v "scan-build$desired_version")" +if [[ "$compiler" == "clang" ]]; then + if command -v "lld$desired_version" > /dev/null; then + # Only lld version >= 9 can be considered stable + if [[ "$majorVersion" -ge 9 ]]; then + LDFLAGS="-fuse-ld=lld" + fi + fi +fi + +SCAN_BUILD_COMMAND="$(command -v "scan-build$desired_version")" + +export CC CXX LDFLAGS SCAN_BUILD_COMMAND diff --git a/src/Microsoft.DotNet.CMake.Sdk/build/Microsoft.DotNet.CMake.Sdk.targets b/src/Microsoft.DotNet.CMake.Sdk/build/Microsoft.DotNet.CMake.Sdk.targets index 0fa9a659f9e..59125a981f0 100644 --- a/src/Microsoft.DotNet.CMake.Sdk/build/Microsoft.DotNet.CMake.Sdk.targets +++ b/src/Microsoft.DotNet.CMake.Sdk/build/Microsoft.DotNet.CMake.Sdk.targets @@ -122,7 +122,7 @@ - . $([MSBuild]::MakeRelative('$(MSBuildProjectDirectory)', '$(RepositoryEngineeringDir)common/native/find-native-compiler.sh')) $(CMakeCompilerToolchain) $(CMakeCompilerMajorVersion) $(CMakeCompilerMinorVersion) + . $([MSBuild]::MakeRelative('$(MSBuildProjectDirectory)', '$(RepositoryEngineeringDir)common/native/init-compiler.sh')) $(Platform) $(CMakeCompilerToolchain) $(CMakeCompilerMajorVersion) $(CMakeCompilerMinorVersion) From b2d004b05e9f1725e6a62359537dd7d0ceb7ce0e Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Mon, 13 Sep 2021 15:17:55 +0000 Subject: [PATCH 372/699] Update dependencies from https://github.com/dotnet/xharness build 20210910.2 (#7887) [main] Update dependencies from dotnet/xharness --- eng/Version.Details.xml | 4 ++-- eng/Versions.props | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index f35bc1f6c8c..7362e30160a 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -39,9 +39,9 @@ https://github.com/dotnet/arcade-services cac955fe259cb611f6a29d09209bd717deb69037 - + https://github.com/dotnet/xharness - c8c452d7746015847956618cf0c56f931ed8647a + fdcd4d95dcedd2cc88eaaf5674a9d8bb8aafb8a2 https://github.com/dotnet/roslyn diff --git a/eng/Versions.props b/eng/Versions.props index 42b8206be00..ce335ad6fb6 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -80,7 +80,7 @@ 7.0.0-beta.21459.5 1.0.0-beta.21452.1 1.1.0-beta.21378.2 - 1.0.0-prerelease.21456.1 + 1.0.0-prerelease.21460.2 1.1.156602 1.1.156602 6.0.100-preview.5.21254.11 From 4b7c80f398fd3dcea03fdc4e454789b61181d300 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C5=99emek=20Vysok=C3=BD?= Date: Mon, 13 Sep 2021 18:53:33 +0200 Subject: [PATCH 373/699] Update Readme with instructions how to develop Helix SDK (#7879) --- azure-pipelines.yml | 3 -- src/Microsoft.DotNet.Helix/Sdk/Readme.md | 45 +++++++++++++++++++ tests/UnitTests.XHarness.Android.Device.proj | 5 ++- .../UnitTests.XHarness.Android.Simulator.proj | 5 ++- tests/XHarness/XHarness.TestApks.proj | 2 + 5 files changed, 53 insertions(+), 7 deletions(-) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index be4aeeb3b0f..8f649aa6c82 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -157,7 +157,6 @@ stages: -projects $(Build.SourcesDirectory)\tests\UnitTests.XHarness.Android.Device.proj /bl:$(Build.SourcesDirectory)\artifacts\log\$(_BuildConfig)\Helix.XHarness.Android.Device.binlog /p:RestoreUsingNuGetTargets=false - /p:XHarnessTestARM64_V8A=true displayName: XHarness Android Helix Testing (Windows) env: SYSTEM_ACCESSTOKEN: $(System.AccessToken) @@ -225,8 +224,6 @@ stages: -projects $(Build.SourcesDirectory)/tests/UnitTests.XHarness.Android.Simulator.proj /bl:$(Build.SourcesDirectory)/artifacts/log/$(_BuildConfig)/Helix.XHarness.Android.Simulator.binlog /p:RestoreUsingNuGetTargets=false - /p:XHarnessTestX86=true - /p:XHarnessTestX86_64=true displayName: XHarness Android Helix Testing (Linux) env: SYSTEM_ACCESSTOKEN: $(System.AccessToken) diff --git a/src/Microsoft.DotNet.Helix/Sdk/Readme.md b/src/Microsoft.DotNet.Helix/Sdk/Readme.md index 5b8774440e4..dcc734ceb9c 100644 --- a/src/Microsoft.DotNet.Helix/Sdk/Readme.md +++ b/src/Microsoft.DotNet.Helix/Sdk/Readme.md @@ -25,6 +25,8 @@ Each of the following examples require dotnet-cli >= 2.1.300 and need the follow Versions of the package can be found by browsing the feed at https://dev.azure.com/dnceng/public/_packaging?_a=feed&feed=dotnet-eng +### Developing Helix SDK + The examples can all be run with `dotnet msbuild` and will require an environment variable or MSBuildProperty `HelixAccessToken` set if a queue with a value of IsInternalOnly=true (usually any not ending in '.Open') is selected for `HelixTargetQueues`. You will also need to set the following environment variables before building: ``` @@ -36,6 +38,49 @@ BUILD_REASON Also, make sure your helix project doesn't have `EnableAzurePipelinesReporter` set, or sets it to false, or building locally will fail with an error that looks like `SYSTEM_ACCESSTOKEN is not set`. +Furthermore, when you need to make changes to Helix SDK, there's a way to run it locally with ease to test your changes in a tighter dev loop than having to have to wait for the full PR build. + +The repository contains E2E tests that utilize the Helix SDK to send test Helix jobs. +In order to run them, one has to publish the SDK locally so that the unit tests can grab the re-built DLLs. + +#### Detailed steps: +1. Make your changes +2. Build the product + ```sh + # Linux/MacOS + ./build.sh + # Windows + .\Build.cmd + ``` +3. Publish Arcade SDK and Helix SDK + ```sh + dotnet publish -f netcoreapp3.1 src/Microsoft.DotNet.Arcade.Sdk/Microsoft.DotNet.Arcade.Sdk.csproj + dotnet publish -f netcoreapp3.1 src/Microsoft.DotNet.Helix/Sdk/Microsoft.DotNet.Helix.Sdk.csproj + ``` +4. Pick one of the test `.proj` files, set some env variables and build it + Bash + ```sh + export BUILD_REASON=pr + export BUILD_REPOSITORY_NAME=arcade + export BUILD_SOURCEBRANCH=master + export SYSTEM_TEAMPROJECT=dnceng + export SYSTEM_ACCESSTOKEN='' + + eng/common/build.sh -test -projects tests/XHarness.Apple.Device.Tests /v:n /bl:Arcade.binlog + ``` + + PowerShell + ```ps1 + $Env:BUILD_REASON = "pr" + $Env:BUILD_REPOSITORY_NAME = "arcade" + $Env:BUILD_SOURCEBRANCH = "master" + $Env:SYSTEM_TEAMPROJECT = "dnceng" + $Env:SYSTEM_ACCESSTOKEN = "" + + .\eng\common\build.ps1 -configuration Debug -restore -test -projects tests\XHarness.Apple.Device.Tests /p:RestoreUsingNugetTargets=false /bl:Arcade.binlog + ``` +5. An MSBuild log file called `Arcade.binlog` will be produced which you can inspect using the [MSBuild Structured Log Viewer](https://msbuildlog.com/). There you can see which props were set with which values, in what order the targets were executed under which conditions and so on. + ### Docker Support Helix machines now have (where available on the machine) the ability to run work items directly inside Docker containers. This allows work items to use operating systems that only work for Docker scenarios, as well as custom configurations of already-supported operating systems. #### Specifying a docker tag: diff --git a/tests/UnitTests.XHarness.Android.Device.proj b/tests/UnitTests.XHarness.Android.Device.proj index c3aeeb59dff..d0e6020a18b 100644 --- a/tests/UnitTests.XHarness.Android.Device.proj +++ b/tests/UnitTests.XHarness.Android.Device.proj @@ -1,9 +1,10 @@ - - + + XHarnessTestARM64_V8A=true + diff --git a/tests/UnitTests.XHarness.Android.Simulator.proj b/tests/UnitTests.XHarness.Android.Simulator.proj index 11dfbaba887..71451da61c9 100644 --- a/tests/UnitTests.XHarness.Android.Simulator.proj +++ b/tests/UnitTests.XHarness.Android.Simulator.proj @@ -7,9 +7,10 @@ It builds a mock project that does not build an APK directly but only downloads it from a storage account. --> - - + + XHarnessTestX86=true;XHarnessTestX86_64=true + diff --git a/tests/XHarness/XHarness.TestApks.proj b/tests/XHarness/XHarness.TestApks.proj index f44c1c26b3b..a9286f96f45 100644 --- a/tests/XHarness/XHarness.TestApks.proj +++ b/tests/XHarness/XHarness.TestApks.proj @@ -23,6 +23,8 @@ + + From 8685acb4af9ee5d6c5653d48fa3072ae7c45cdd5 Mon Sep 17 00:00:00 2001 From: Peter Collins Date: Tue, 14 Sep 2021 17:08:18 -0400 Subject: [PATCH 374/699] [workloads] Add ProjectUrl to msi packs (#7898) We ran into some publishing issues today due to a missing ProjectUrl: Policy violations: The package metadata is missing required ProjectUrl. Fix this by reading and including any existing ProjectUrl content from the .nupkg that the .msi was originally generated from. --- .../src/GenerateManifestMsi.cs | 5 +++++ .../src/GenerateMsiBase.cs | 5 +++++ .../src/NuGetPackage.cs | 6 ++++++ 3 files changed, 16 insertions(+) diff --git a/src/Microsoft.DotNet.Build.Tasks.Workloads/src/GenerateManifestMsi.cs b/src/Microsoft.DotNet.Build.Tasks.Workloads/src/GenerateManifestMsi.cs index d5178ef9bd5..88091936c61 100644 --- a/src/Microsoft.DotNet.Build.Tasks.Workloads/src/GenerateManifestMsi.cs +++ b/src/Microsoft.DotNet.Build.Tasks.Workloads/src/GenerateManifestMsi.cs @@ -376,6 +376,11 @@ private string GeneratePackageProject(string msiPath, string msiJsonPath, string writer.WriteElementString("Copyright", nupkg.Copyright); } + if (!string.IsNullOrWhiteSpace(nupkg.ProjectUrl)) + { + writer.WriteElementString("PackageProjectUrl", nupkg.ProjectUrl); + } + writer.WriteElementString("PackageLicenseExpression", "MIT"); writer.WriteEndElement(); diff --git a/src/Microsoft.DotNet.Build.Tasks.Workloads/src/GenerateMsiBase.cs b/src/Microsoft.DotNet.Build.Tasks.Workloads/src/GenerateMsiBase.cs index c9a4bf14510..05ed00167a2 100644 --- a/src/Microsoft.DotNet.Build.Tasks.Workloads/src/GenerateMsiBase.cs +++ b/src/Microsoft.DotNet.Build.Tasks.Workloads/src/GenerateMsiBase.cs @@ -369,6 +369,11 @@ private string GeneratePackageProject(string msiPath, string msiJsonPath, string writer.WriteElementString("Copyright", nupkg.Copyright); } + if (!string.IsNullOrWhiteSpace(nupkg.ProjectUrl)) + { + writer.WriteElementString("PackageProjectUrl", nupkg.ProjectUrl); + } + writer.WriteElementString("PackageLicenseExpression", "MIT"); writer.WriteEndElement(); diff --git a/src/Microsoft.DotNet.Build.Tasks.Workloads/src/NuGetPackage.cs b/src/Microsoft.DotNet.Build.Tasks.Workloads/src/NuGetPackage.cs index 8a7cacb015c..20f4c8ba06a 100644 --- a/src/Microsoft.DotNet.Build.Tasks.Workloads/src/NuGetPackage.cs +++ b/src/Microsoft.DotNet.Build.Tasks.Workloads/src/NuGetPackage.cs @@ -72,6 +72,11 @@ public string Title get; } + public string ProjectUrl + { + get; + } + /// /// The version of the NuGet package. /// @@ -96,6 +101,7 @@ public NugetPackage(string packagePath, TaskLoggingHelper log) Description = nuspecReader.GetDescription(); Copyright = nuspecReader.GetCopyright(); LicenseData = nuspecReader.GetLicenseMetadata(); + ProjectUrl = nuspecReader.GetProjectUrl(); } /// From d9ae62de3440d33a31d2821b2db72263adaa0384 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C5=99emek=20Vysok=C3=BD?= Date: Wed, 15 Sep 2021 11:01:32 +0200 Subject: [PATCH 375/699] Do not forward env variable `XHARNESS_DIAGNOSTICS_PATH` (#7894) --- .../Sdk/tools/xharness-runner/xharness-helix-job.apple.sh | 1 - .../Sdk/tools/xharness-runner/xharness-runner.apple.sh | 4 ---- 2 files changed, 5 deletions(-) diff --git a/src/Microsoft.DotNet.Helix/Sdk/tools/xharness-runner/xharness-helix-job.apple.sh b/src/Microsoft.DotNet.Helix/Sdk/tools/xharness-runner/xharness-helix-job.apple.sh index 31e8f5bcfab..9378733bed3 100644 --- a/src/Microsoft.DotNet.Helix/Sdk/tools/xharness-runner/xharness-helix-job.apple.sh +++ b/src/Microsoft.DotNet.Helix/Sdk/tools/xharness-runner/xharness-helix-job.apple.sh @@ -36,7 +36,6 @@ sudo launchctl asuser "$helix_runner_uid" sh ./xharness-runner.apple.sh \ $forwarded_args \ --app "$HELIX_WORKITEM_ROOT/$app" \ --output-directory "$HELIX_WORKITEM_UPLOAD_ROOT" \ - --diagnostics-path "$XHARNESS_DIAGNOSTICS_PATH" \ exit_code=$? diff --git a/src/Microsoft.DotNet.Helix/Sdk/tools/xharness-runner/xharness-runner.apple.sh b/src/Microsoft.DotNet.Helix/Sdk/tools/xharness-runner/xharness-runner.apple.sh index 23a72643593..47fb9126ee1 100644 --- a/src/Microsoft.DotNet.Helix/Sdk/tools/xharness-runner/xharness-runner.apple.sh +++ b/src/Microsoft.DotNet.Helix/Sdk/tools/xharness-runner/xharness-runner.apple.sh @@ -23,10 +23,6 @@ while [[ $# -gt 0 ]]; do app="$2" shift ;; - --diagnostics-path) - export XHARNESS_DIAGNOSTICS_PATH="$2" - shift - ;; --target) target="$2" shift From 0786cff7d96eb7ca9fd90ad5ceea477d1c967fbf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C5=99emek=20Vysok=C3=BD?= Date: Wed, 15 Sep 2021 13:12:58 +0200 Subject: [PATCH 376/699] Support Apple app bundle signing for already archived payloads (#7864) When user provides an already archived application (or more), we need to inject the provisioning profile in each of the app bundles inside of the archive. This was not supported. If there are no app bundles (might be built as part of the Helix work item), we only store the profile in the root of the payload. --- Helix.XHarness.Android.Device.Tests.binlog | Bin 0 -> 220899 bytes azure-pipelines.yml | 20 +-- .../Microsoft.Arcade.Common/FileSystem.cs | 2 +- .../Microsoft.Arcade.Common/IFileSystem.cs | 4 +- .../IZipArchiveManager.cs | 8 + .../ZipArchiveManager.cs | 3 + .../MockFileSystem.cs | 2 +- .../CreateXHarnessAppleWorkItemsTests.cs | 4 +- .../ProvisioningProfileProviderTests.cs | 140 ---------------- .../Sdk/CreateXHarnessAppleWorkItems.cs | 19 ++- .../Sdk/ProvisioningProfileProvider.cs | 156 +++++++++++------- src/Microsoft.DotNet.Helix/Sdk/Readme.md | 4 +- .../Sdk/XharnessTaskBase.cs | 57 +++---- .../xharness-runner/xharness-runner.apple.sh | 61 ++++--- ...proj => XHarness.Android.DeviceTests.proj} | 2 +- ...j => XHarness.Android.SimulatorTests.proj} | 2 +- ...e.proj => XHarness.Apple.DeviceTests.proj} | 10 +- ...roj => XHarness.Apple.SimulatorTests.proj} | 8 +- ...mmon.props => XHarness.Tests.Common.props} | 0 tests/XHarness/.gitattributes | 2 + .../XHarness.Apple.Device.Archived.proj | 31 ++++ ...rness.Apple.Simulator.CustomCommands.proj} | 0 ...proj => XHarness.Apple.Simulator.Run.proj} | 0 ...roj => XHarness.Apple.Simulator.Test.proj} | 0 tests/XHarness/XHarness.Device.AppleTest.proj | 31 ---- 25 files changed, 253 insertions(+), 313 deletions(-) create mode 100644 Helix.XHarness.Android.Device.Tests.binlog delete mode 100644 src/Microsoft.DotNet.Helix/Sdk.Tests/Microsoft.DotNet.Helix.Sdk.Tests/ProvisioningProfileProviderTests.cs rename tests/{UnitTests.XHarness.Android.Device.proj => XHarness.Android.DeviceTests.proj} (90%) rename tests/{UnitTests.XHarness.Android.Simulator.proj => XHarness.Android.SimulatorTests.proj} (93%) rename tests/{UnitTests.XHarness.iOS.Device.proj => XHarness.Apple.DeviceTests.proj} (59%) rename tests/{UnitTests.XHarness.iOS.Simulator.proj => XHarness.Apple.SimulatorTests.proj} (81%) rename tests/{UnitTests.XHarness.Common.props => XHarness.Tests.Common.props} (100%) create mode 100644 tests/XHarness/.gitattributes create mode 100644 tests/XHarness/XHarness.Apple.Device.Archived.proj rename tests/XHarness/{XHarness.Simulator.CustomCommands.proj => XHarness.Apple.Simulator.CustomCommands.proj} (100%) rename tests/XHarness/{XHarness.Simulator.AppleRun.proj => XHarness.Apple.Simulator.Run.proj} (100%) rename tests/XHarness/{XHarness.Simulator.AppleTest.proj => XHarness.Apple.Simulator.Test.proj} (100%) delete mode 100644 tests/XHarness/XHarness.Device.AppleTest.proj diff --git a/Helix.XHarness.Android.Device.Tests.binlog b/Helix.XHarness.Android.Device.Tests.binlog new file mode 100644 index 0000000000000000000000000000000000000000..aeb627f3a551d1a73f072d6adc51c595e8df81ea GIT binary patch literal 220899 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

vzkc-zA!i!G9Q`W*Gn`$oph{WuE3hL9 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≈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

RCMIEN3!lHsf;UXq zZdT*B`#k0XwMU=%?Mt}N)oCc@A_!{;8S1a8hMP$-ZoO-Ih)bbE7`Lc4skPDQ!X9L9 zZBVT`Hc3vU$A{a7*(UOIV|DPBST~MtmNq$~bI_zp*#s&2?tpb#8fhviSG$)#cb?sB zgTu!ve!JwC>z!k6$cjP&w_)1~t;B8pxy@4-{0!dsmMWJQ74)xFP6vr|>r`Yc(O0Q@ zk52NoOJXp2ORIf&$eA-vHM5`fW(gnM#u!QO->ggum-ucyoPJi-bl7W2XKm%ajX(v5 zXIvYh(zyR^Kbf1KGVPKGy6RVDvlwXQLh-#cJ0$(+3{?d7h3soBp5T2c$wwrYc-Zwc zcGYo_b2#6tV#v8MFstl>3_DXyjh|~Ds5BRNuz{LOzAo9vj<`T7vivL}Y?mSwd-@Uz zwpwp1!t+w4_R~$?S@gRM-7HDy`T+YDkQzM#_GE7UZ?-JIJG7qD4h`X@vjAT6v$s~I z=<*o<@6b|h3vuY8;|1J5`%T7_7~0S%Rl|Gepb)zRc67SA@>x)7XRL=r^&3p0gA^YhjrZqQwvH>*WPs4+*)9HnP2) zV#LUKkNQJ7CyJITtZ5xWk8iO%@++#Z={eK5pAg>2KM#KEeOG#Q{V|)H5d>4Ibqo9n zM9HLEFyO+xgTqCZ8!ooKBredv9AN-bb)&aT4$C4`|nv677*2ahHAZd0K*JX$rr4LIBNVPdRh zE7sFUv;|W|bV>>0IJ!l4=A2fa_>agtJ|gD68553m(+uw-F#x5jfb9 z+qe%>a?G`cjI~I&*6!{_4z$|d*Jp9_%cJ4~ z7hG(u=JR@^_Y`k-)JJ7>MzhYZKl*}h%i=(KWLJy6L3ANb_D6DL9ND2enyyZ_*cd7x zf;u83h8=q0<79_P?}Eoivs3uZ#^`5BIm#Y;7ljCioqHM`MM?2Tn z&U$Q(L;HOwcVwvaiKZOLr*MFiS6u({2II;0|IvoOsH4sCp8sbp8yga7y!}hl9o_$8S?FUO z*8{@+ibzr+ysDBbEUty#*umU#U zA3bdpbAhyR4k$KbtiYF}n!Z?eo5a_fCNlQ5uOOL1wyVX5>41*5?q>hcSmpsK`l%8x zy8MJ*#8UlN4Q=g4$xpOd>~860#As?!$NJJ`1|`Xp$Te`w&1NVU_v?`Iw{J;SA(Ja1 zO?~a;*MTp}qk_48%T+k-tvR@CzM*T957SCD%)yrs#pGHWw{0i8$AD0fCz9Cx*6< zTB+3aD%49q!v1>mlA`f+%+@7%0n5lRx*jtsdIqbHbO{9o$PjvjQo%XO=k@m4FM>q5 zMM2_7_tz-lbkTd&ad-=DUNv9Qr@)*;p{;ABoVhmesi4=?YI~izY}u(#xK=V+{D6`{ zB$xK0HM5Q5vl+ZRo6`G{_v)Q{OmH5qNq^|<>{lOYks$PdapGO)caDO;%Z%j_6>;hM z!(u+OM?)n|iYeY<+0mKlrujV^d&H)q<9;KCuHlp857K;sJ2pET2~z9~?$j}Kt88k~FIqv4pSE`I zW*{3^wlt3r^5h8?eJn8^v2)vaL!HEFcVBxT;&J_L6n73d)lf5RG#c9Gc!I9`Ece;+ z&A@4bvDSDz`?U$}F~Y49STElqgzO4j`z$ij>>l$>b;IHIt0Z3&D&%_D{hD5faOdtT zDcf%wXNZ^@=Ws61Ty#f6kb_e=ig^~D=*R$U+ zns5^BRX>%TYnoCi4%mNz8TqB0If{IsT&~>3LoM4|Vfw14^!AEz|J$x2#Tl})E&;>! z;zE*Catp-jGMy>8QrC)!X`33pPh_8$Rh;!Fz#J72FpLI-he}!-8fvwh%@d)}v zS<7NN!rr5cPyIm3@-VP?pc7Z9mna=40JuW?@0D>+)A=>ER512*aQ*(_7#f2RM1txY z76{aH4Fpm?#lHytyf7T^o*nsZXzoQF?>w`CCrX&(W4I?oh<~o!)gWNUp9`Q^J#}3Y z2?RPIJ-*a*LaYSm1wjIAZtQ9c`QEI`<>x?rk(~S`068cDxjOh1kmXCi3WziqIIe6A z0h^s68(bqXUqle-D-ke7ry!MG{%hn0+gs@W{SennI@vD)L)3+ZR(KbhbDi$vo!Xyb z!0|^wEdv9dBbn*xg=fGG#?$bO9Z&lL_dGh|`y z?xR{{T7WIxIK>Q0?z{#pYwrRvwzd6!k@bg?*ng3}zFxXJ0K^m%+SF|o&aEfO(eIy{ zx^F&@U!*{FGQxnT6yQhj)a$j>|KsERM?*X+ zu<%n(pO9Al$bo^lp+NgAevR|5@$gd!kJ@QF!-3^|h%od_c5D3;9Ts|HAF$heJ6RrUcq8lGN7+1QU zvnalY!ZYSXGlYe;643Ecv2z1|9{tt-2s~2G!2G%cZ~uD{Us30km;=W64lq2S zQ?LIP^v?tFPg(I*`=}rRGa2Y|+%Nuw1jGIbs}nz|B&mKBa*w==7$8You-V^dKxz-E z8Nz|5RNx12-ak-n%s&oOXT*Di8iR<#?>c;1i5|tCf1o-8M2WL56aDG)f6#oxhG!(~Na&VsYbmOR=99FZ8J27#=$d2o)rq15H4Pz(t6pBw;+k^>m5 zeNjS;XpI;2emok?cqo#W`wn0FkKeqAac+_PSVULJWp`*pHE1I&X) zzU%_PRB?{ZFP{QKS_yNWN%eRB`m%P84$cr!a|qZOYO0PiWl0YR*#0<{oB{b;aueSW z0GSMce6;vEA=~QT2>B?HQMNUP9G!4v{^3u~g3Vi^^R4PAFac8!q%%Lz#~1(AwEqh+ z{zEB?-+v=(1~^S>V2|R?DYzmH|4X?4j)f5lf(Tgv?XW@zf#OeLzux`7#15Q_HMg}g zg{XpE9Bf^GJQWK)g2n}iCN7W$+tLFb`P2wl`+wsIzUQ*a$D#30_}AUQ&dye5;4^h+ zJ814=I^bX3384M!+MEB*!<{m^vo!b9T+va{@*{T!DDMw+Fb?xCSL$cH)K`~2?h+8J zS&)t!d7Mzi1kAau)z4t=O-4?Cv@Uyy1ikqpHho?R%&`YMb4o4SST$e)lL|nGP8jSy z!2F^$>KRb%Lb~9O>a_;~-%_T!G&=PWc#Wjb1~fRwitSOuJ38=36F{DR$uGhn<|X`AH- zrYV#XdR3l_0DF#~zg(=2oZ8U^jI)sVF<-|I1CnktB51Fof8o54{EO@px<&X2X%oW! ziiY9P0H7Pyo{-ul*k9MS_Aem|s$1v@X;8raqTZp<7@(W9{a_!ou)nTl8#D~)j#)ow zB?Ihv_s@c64&6}bgsPcge_MMYXjIU>eNL!_1@_l<`hkW4-3;c0NZ4V2MQfP91b(PS zEk6(k>~Cn>0*wc{6~hS?^86NUIRh7Tx%?B#hfeZT1%?S File.Copy(sourceFileName, destFileName); + public void CopyFile(string sourceFileName, string destFileName, bool overwrite = false) => File.Copy(sourceFileName, destFileName, overwrite); public Stream GetFileStream(string path, FileMode mode, FileAccess access) => new FileStream(path, mode, access); diff --git a/src/Common/Microsoft.Arcade.Common/IFileSystem.cs b/src/Common/Microsoft.Arcade.Common/IFileSystem.cs index 2aed8429879..9ca0dfd2786 100644 --- a/src/Common/Microsoft.Arcade.Common/IFileSystem.cs +++ b/src/Common/Microsoft.Arcade.Common/IFileSystem.cs @@ -1,9 +1,9 @@ // Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. -#nullable enable using System.IO; +#nullable enable namespace Microsoft.Arcade.Common { public interface IFileSystem @@ -28,7 +28,7 @@ public interface IFileSystem void DeleteFile(string path); - void FileCopy(string sourceFileName, string destFileName); + void CopyFile(string sourceFileName, string destFileName, bool overwrite = false); Stream GetFileStream(string path, FileMode mode, FileAccess access); diff --git a/src/Common/Microsoft.Arcade.Common/IZipArchiveManager.cs b/src/Common/Microsoft.Arcade.Common/IZipArchiveManager.cs index 87a59d883d5..d1fecb1d6a0 100644 --- a/src/Common/Microsoft.Arcade.Common/IZipArchiveManager.cs +++ b/src/Common/Microsoft.Arcade.Common/IZipArchiveManager.cs @@ -2,12 +2,20 @@ // The .NET Foundation licenses this file to you under the MIT license. using System.IO; +using System.IO.Compression; using System.Threading.Tasks; namespace Microsoft.Arcade.Common { public interface IZipArchiveManager { + ///

+ /// Opens a given archive. + /// + /// Path to the zip archive + /// Access mode + ZipArchive OpenArchive(string archivePath, ZipArchiveMode mode); + /// /// Loads an embedded resource and adds it to a target archive. /// diff --git a/src/Common/Microsoft.Arcade.Common/ZipArchiveManager.cs b/src/Common/Microsoft.Arcade.Common/ZipArchiveManager.cs index b022fe7238f..dc1c04ea252 100644 --- a/src/Common/Microsoft.Arcade.Common/ZipArchiveManager.cs +++ b/src/Common/Microsoft.Arcade.Common/ZipArchiveManager.cs @@ -12,6 +12,9 @@ namespace Microsoft.Arcade.Common { public class ZipArchiveManager : IZipArchiveManager { + public ZipArchive OpenArchive(string archivePath, ZipArchiveMode mode) + => ZipFile.Open(archivePath, mode); + public async Task AddResourceFileToArchive(string archivePath, string resourceName, string targetFileName = null) { using Stream fileStream = GetResourceFileContent(resourceName); diff --git a/src/Common/Microsoft.Arcade.Test.Common/MockFileSystem.cs b/src/Common/Microsoft.Arcade.Test.Common/MockFileSystem.cs index ed126d9d21a..b122c2630ab 100644 --- a/src/Common/Microsoft.Arcade.Test.Common/MockFileSystem.cs +++ b/src/Common/Microsoft.Arcade.Test.Common/MockFileSystem.cs @@ -54,7 +54,7 @@ public void DeleteFile(string path) public void WriteToFile(string path, string content) => Files[path] = content; - public void FileCopy(string sourceFileName, string destFileName) => Files[destFileName] = Files[sourceFileName]; + public void CopyFile(string sourceFileName, string destFileName, bool overwrite = false) => Files[destFileName] = Files[sourceFileName]; public Stream GetFileStream(string path, FileMode mode, FileAccess access) => FileExists(path) ? new MemoryStream() : new MockFileStream(this, path); diff --git a/src/Microsoft.DotNet.Helix/Sdk.Tests/Microsoft.DotNet.Helix.Sdk.Tests/CreateXHarnessAppleWorkItemsTests.cs b/src/Microsoft.DotNet.Helix/Sdk.Tests/Microsoft.DotNet.Helix.Sdk.Tests/CreateXHarnessAppleWorkItemsTests.cs index 4652965fbaf..5ce4b415574 100644 --- a/src/Microsoft.DotNet.Helix/Sdk.Tests/Microsoft.DotNet.Helix.Sdk.Tests/CreateXHarnessAppleWorkItemsTests.cs +++ b/src/Microsoft.DotNet.Helix/Sdk.Tests/Microsoft.DotNet.Helix.Sdk.Tests/CreateXHarnessAppleWorkItemsTests.cs @@ -92,7 +92,7 @@ public void AppleXHarnessWorkItemIsCreated() command.Should().Contain("--launch-timeout \"00:02:33\""); _profileProvider - .Verify(x => x.AddProfilesToBundles(It.Is(bundles => bundles.Any(b => b.ItemSpec == "/apps/System.Foo.app"))), Times.Once); + .Verify(x => x.AddProfileToPayload(payloadArchive, "ios-device_13.5"), Times.Once); _zipArchiveManager .Verify(x => x.ArchiveDirectory("/apps/System.Foo.app", payloadArchive, true), Times.Once); _zipArchiveManager @@ -238,7 +238,7 @@ public void ZippedAppIsProvided() command.Should().Contain("--launch-timeout \"00:02:33\""); _profileProvider - .Verify(x => x.AddProfilesToBundles(It.Is(bundles => bundles.Any(b => b.ItemSpec == "/apps/System.Foo.zip"))), Times.Once); + .Verify(x => x.AddProfileToPayload(payloadArchive, "ios-device_13.5"), Times.Once); _zipArchiveManager .Verify(x => x.ArchiveDirectory("/apps/System.Foo.app", payloadArchive, true), Times.Never); _zipArchiveManager diff --git a/src/Microsoft.DotNet.Helix/Sdk.Tests/Microsoft.DotNet.Helix.Sdk.Tests/ProvisioningProfileProviderTests.cs b/src/Microsoft.DotNet.Helix/Sdk.Tests/Microsoft.DotNet.Helix.Sdk.Tests/ProvisioningProfileProviderTests.cs deleted file mode 100644 index f84e7a6f117..00000000000 --- a/src/Microsoft.DotNet.Helix/Sdk.Tests/Microsoft.DotNet.Helix.Sdk.Tests/ProvisioningProfileProviderTests.cs +++ /dev/null @@ -1,140 +0,0 @@ -// Licensed to the .NET Foundation under one or more agreements. -// The .NET Foundation licenses this file to you under the MIT license. - -using System; -using System.Net; -using System.Net.Http; -using FluentAssertions; -using Microsoft.Arcade.Common; -using Microsoft.Arcade.Test.Common; -using Microsoft.Build.Framework; -using Microsoft.Build.Utilities; -using Microsoft.DotNet.Arcade.Test.Common; -using Moq; -using Xunit; - -#nullable enable -namespace Microsoft.DotNet.Helix.Sdk.Tests -{ - public class ProvisioningProfileProviderTests - { - private readonly MockFileSystem _fileSystem; - private readonly Mock _helpersMock; - private readonly ProvisioningProfileProvider _profileProvider; - private int _downloadCount = 0; - - public ProvisioningProfileProviderTests() - { - _helpersMock = new Mock(); - _helpersMock - .Setup(x => x.DirectoryMutexExec(It.IsAny>(), It.IsAny())) - .Callback, string>((function, path) => { - ++_downloadCount; - function().GetAwaiter().GetResult(); - }); - - _fileSystem = new MockFileSystem(); - - var response1 = new HttpResponseMessage(HttpStatusCode.OK) - { - Content = new StringContent("iOS content"), - }; - - var response2 = new HttpResponseMessage(HttpStatusCode.OK) - { - Content = new StringContent("tvOS content"), - }; - - var httpClient = FakeHttpClient.WithResponses(response1, response2); - - _profileProvider = new ProvisioningProfileProvider( - new TaskLoggingHelper(new MockBuildEngine(), nameof(ProvisioningProfileProviderTests)), - _helpersMock.Object, - _fileSystem, - httpClient, - "https://netcorenativeassets.azure.com/profiles/{PLATFORM}.mobileprovision", - "/tmp"); - } - - [Fact] - public void NonDeviceTargetsAreIgnored() - { - _profileProvider.AddProfilesToBundles(new[] - { - CreateAppBundle("/apps/System.Foo.app", "ios-simulator-64_13.5"), - CreateAppBundle("/apps/System.Bar.app", "tvos-simulator-64"), - }); - - _downloadCount.Should().Be(0); - _fileSystem.Files.Should().BeEmpty(); - } - - [Fact] - public void MultipleiOSDeviceTargetsGetTheSameProfile() - { - _profileProvider.AddProfilesToBundles(new[] - { - CreateAppBundle("/apps/System.Device1.app", "ios-device"), - CreateAppBundle("/apps/System.Simulator.app", "tvos-simulator-64"), - CreateAppBundle("/apps/System.Device2.app", "ios-device"), - CreateAppBundle("/apps/System.Foo.app", "ios-simulator-64_13.5"), - }); - - _downloadCount.Should().Be(1); - - _fileSystem.Files.Keys.Should().BeEquivalentTo( - "/tmp/iOS.mobileprovision", - "/apps/System.Device1.app/embedded.mobileprovision", - "/apps/System.Device2.app/embedded.mobileprovision"); - - _fileSystem.Files["/apps/System.Device1.app/embedded.mobileprovision"].Should().Be("iOS content"); - _fileSystem.Files["/apps/System.Device2.app/embedded.mobileprovision"].Should().Be("iOS content"); - } - - [Fact] - public void MultiplePlatformsGetTheirProfile() - { - _profileProvider.AddProfilesToBundles(new[] - { - CreateAppBundle("/apps/System.Device1.iOS.app", "ios-device"), - CreateAppBundle("/apps/System.Simulator.app", "tvos-simulator-64"), - CreateAppBundle("/apps/System.Device2.iOS.app", "ios-device"), - CreateAppBundle("/apps/System.Device3.tvOS.app", "tvos-device"), - }); - - _downloadCount.Should().Be(2); - - _fileSystem.Files.Keys.Should().BeEquivalentTo( - "/tmp/iOS.mobileprovision", - "/tmp/tvOS.mobileprovision", - "/apps/System.Device1.iOS.app/embedded.mobileprovision", - "/apps/System.Device2.iOS.app/embedded.mobileprovision", - "/apps/System.Device3.tvOS.app/embedded.mobileprovision"); - - _fileSystem.Files["/apps/System.Device1.iOS.app/embedded.mobileprovision"].Should().Be("iOS content"); - _fileSystem.Files["/apps/System.Device2.iOS.app/embedded.mobileprovision"].Should().Be("iOS content"); - _fileSystem.Files["/apps/System.Device3.tvOS.app/embedded.mobileprovision"].Should().Be("tvOS content"); - } - - [Fact] - public void BundlesContainingProfileAreIgnored() - { - _fileSystem.WriteToFile("/apps/System.Device1.app/embedded.mobileprovision", "iOS content"); - _profileProvider.AddProfilesToBundles(new[] - { - CreateAppBundle("/apps/System.Device1.app", "ios-device"), - CreateAppBundle("/apps/System.Simulator.app", "tvos-simulator-64"), - }); - - _downloadCount.Should().Be(0); - } - - private static ITaskItem CreateAppBundle(string path, string targets) - { - var mockBundle = new Mock(); - mockBundle.SetupGet(x => x.ItemSpec).Returns(path); - mockBundle.Setup(x => x.GetMetadata(CreateXHarnessAppleWorkItems.MetadataNames.Target)).Returns(targets); - return mockBundle.Object; - } - } -} diff --git a/src/Microsoft.DotNet.Helix/Sdk/CreateXHarnessAppleWorkItems.cs b/src/Microsoft.DotNet.Helix/Sdk/CreateXHarnessAppleWorkItems.cs index b9667c4bdc2..3bed8a524c2 100644 --- a/src/Microsoft.DotNet.Helix/Sdk/CreateXHarnessAppleWorkItems.cs +++ b/src/Microsoft.DotNet.Helix/Sdk/CreateXHarnessAppleWorkItems.cs @@ -73,8 +73,7 @@ public bool ExecuteTask( IZipArchiveManager zipArchiveManager, IFileSystem fileSystem) { - provisioningProfileProvider.AddProfilesToBundles(AppBundles); - var tasks = AppBundles.Select(bundle => PrepareWorkItem(zipArchiveManager, fileSystem, bundle)); + var tasks = AppBundles.Select(bundle => PrepareWorkItem(zipArchiveManager, fileSystem, provisioningProfileProvider, bundle)); WorkItems = Task.WhenAll(tasks).GetAwaiter().GetResult().Where(wi => wi != null).ToArray(); @@ -89,6 +88,7 @@ public bool ExecuteTask( private async Task PrepareWorkItem( IZipArchiveManager zipArchiveManager, IFileSystem fileSystem, + IProvisioningProfileProvider provisioningProfileProvider, ITaskItem appBundleItem) { var (workItemName, appFolderPath) = GetNameAndPath(appBundleItem, MetadataNames.AppBundlePath, fileSystem); @@ -107,6 +107,17 @@ private async Task PrepareWorkItem( Log.LogError($"App bundle not found in {appFolderPath}"); return null; } + + // If we are re-using one .zip for multiple work items, we need to copy it to a new location + // because we will be changing the contents (we assume we don't mind otherwise) + if (isAlreadyArchived && appBundleItem.TryGetMetadata(MetadataNames.AppBundlePath, out string metadata) && !string.IsNullOrEmpty(metadata)) + { + string appFolderDirectory = fileSystem.GetDirectoryName(appFolderPath); + string fileName = $"xharness-payload-{workItemName.ToLowerInvariant()}.zip"; + string archiveCopyPath = fileSystem.PathCombine(appFolderDirectory, fileName); + fileSystem.CopyFile(appFolderPath, archiveCopyPath, overwrite: true); + appFolderPath = archiveCopyPath; + } var (testTimeout, workItemTimeout, expectedExitCode, customCommands) = ParseMetadata(appBundleItem); @@ -142,7 +153,7 @@ private async Task PrepareWorkItem( if (includesTestRunner && expectedExitCode != 0 && customCommands != null) { - Log.LogWarning("The ExpectedExitCode property is ignored in the `apple test` scenario"); + Log.LogWarning($"The {MetadataName.ExpectedExitCode} property is ignored in the `apple test` scenario"); } bool resetSimulator = false; @@ -172,6 +183,8 @@ private async Task PrepareWorkItem( customCommands, new[] { EntryPointScript, RunnerScript }); + provisioningProfileProvider.AddProfileToPayload(payloadArchivePath, target); + return CreateTaskItem(workItemName, payloadArchivePath, helixCommand, workItemTimeout); } diff --git a/src/Microsoft.DotNet.Helix/Sdk/ProvisioningProfileProvider.cs b/src/Microsoft.DotNet.Helix/Sdk/ProvisioningProfileProvider.cs index 0dcfdcdfbb7..d1313f0311c 100644 --- a/src/Microsoft.DotNet.Helix/Sdk/ProvisioningProfileProvider.cs +++ b/src/Microsoft.DotNet.Helix/Sdk/ProvisioningProfileProvider.cs @@ -4,9 +4,11 @@ using System; using System.Collections.Generic; using System.IO; +using System.IO.Compression; +using System.Linq; using System.Net.Http; +using System.Text.RegularExpressions; using Microsoft.Arcade.Common; -using Microsoft.Build.Framework; using Microsoft.Build.Utilities; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection.Extensions; @@ -22,11 +24,23 @@ public enum ApplePlatform public interface IProvisioningProfileProvider { - void AddProfilesToBundles(ITaskItem[] appBundles); + void AddProfileToPayload(string archivePath, string testTarget); } + /// + /// This class embeds Apple provisioning profiles into app bundles. + /// App bundles are directories with files that represent an iOS or tvOS application. + /// Provisioning profile is a file used for signing and differs per platform (iOS/tvOS). + /// This class makes sure each app bundle has one before it is sent to Helix. + /// It injects the profiles into all top-level app bundles in a given .zip archive. + /// public class ProvisioningProfileProvider : IProvisioningProfileProvider { + // The name of the profile that Apple expects + private const string ProfileFileName = "embedded.mobileprovision"; + + // Matches all paths to .app bundle directories in archive's root + private static readonly Regex s_topLevelAppPattern = new("^[^" + Regex.Escape(new string(Path.GetInvalidFileNameChars())) + "]+\\.app/.+"); private static readonly IReadOnlyDictionary s_targetNames = new Dictionary() { { ApplePlatform.iOS, "ios-device" }, @@ -36,14 +50,17 @@ public class ProvisioningProfileProvider : IProvisioningProfileProvider private readonly TaskLoggingHelper _log; private readonly IHelpers _helpers; private readonly IFileSystem _fileSystem; + private readonly IZipArchiveManager _zipArchiveManager; private readonly HttpClient _httpClient; private readonly string? _profileUrlTemplate; private readonly string? _tmpDir; + private readonly Dictionary _downloadedProfiles = new(); public ProvisioningProfileProvider( TaskLoggingHelper log, IHelpers helpers, IFileSystem fileSystem, + IZipArchiveManager zipArchiveManager, HttpClient httpClient, string? profileUrlTemplate, string? tmpDir) @@ -51,85 +68,110 @@ public ProvisioningProfileProvider( _log = log ?? throw new ArgumentNullException(nameof(log)); _helpers = helpers ?? throw new ArgumentNullException(nameof(helpers)); _fileSystem = fileSystem ?? throw new ArgumentNullException(nameof(fileSystem)); + _zipArchiveManager = zipArchiveManager ?? throw new ArgumentNullException(nameof(zipArchiveManager)); _httpClient = httpClient ?? throw new ArgumentNullException(nameof(httpClient)); _profileUrlTemplate = profileUrlTemplate; _tmpDir = tmpDir; } - public void AddProfilesToBundles(ITaskItem[] appBundles) + public void AddProfileToPayload(string archivePath, string testTarget) { - var profileLocations = new Dictionary(); - - foreach (var appBundle in appBundles) + foreach (var pair in s_targetNames) { - string appBundlePath; - if (appBundle.TryGetMetadata(CreateXHarnessAppleWorkItems.MetadataNames.AppBundlePath, out string pathMetadata) - && !string.IsNullOrEmpty(pathMetadata)) + ApplePlatform platform = pair.Key; + string targetName = pair.Value; + + // Only app bundles that target iOS/tvOS devices need a profile (simulators don't) + if (!testTarget.Contains(targetName)) { - appBundlePath = pathMetadata; + continue; } - else + + // This makes sure we download the profile the first time we see an app that needs it + if (!_downloadedProfiles.TryGetValue(platform, out string? profilePath)) { - appBundlePath = appBundle.ItemSpec; + if (string.IsNullOrEmpty(_tmpDir)) + { + _log.LogError($"{nameof(CreateXHarnessAppleWorkItems.TmpDir)} parameter not set but required for real device targets!"); + return; + } + + if (string.IsNullOrEmpty(_profileUrlTemplate)) + { + _log.LogError($"{nameof(CreateXHarnessAppleWorkItems.ProvisioningProfileUrl)} parameter not set but required for real device targets!"); + return; + } + + profilePath = DownloadProvisioningProfile(platform); + _downloadedProfiles.Add(platform, profilePath); } - if (!appBundle.TryGetMetadata(CreateXHarnessAppleWorkItems.MetadataNames.Target, out string bundleTargets)) + AddProfileToArchive(archivePath, profilePath); + } + } + + /// + /// Adds a provisioning profile to a given zip archive. + /// Either adds it to all .app folders inside or to the root of the archive if no app bundles found. + /// + private void AddProfileToArchive(string archivePath, string profilePath) + { + // App comes with a profile already + using ZipArchive zipArchive = _zipArchiveManager.OpenArchive(archivePath, ZipArchiveMode.Update); + + HashSet rootLevelAppBundles = new(); + HashSet appBundlesWithProfile = new(); + + foreach (ZipArchiveEntry entry in zipArchive.Entries) + { + if (!s_topLevelAppPattern.IsMatch(entry.FullName)) { - _log.LogError("'Targets' metadata must be specified - " + - "expecting list of target device/simulator platforms to execute tests on (e.g. ios-simulator-64)"); continue; } - if (appBundlePath.EndsWith(".zip")) + string appBundleName = entry.FullName.Split(new[] { '/' }, 2).First(); + + if (entry.FullName == appBundleName + "/" + ProfileFileName) { - // TODO: We need to be able to add provisioning profiles into a zipped payload too - continue; + appBundlesWithProfile.Add(appBundleName); + _log.LogMessage($"{appBundleName} already contains provisioning profile"); } - - foreach (var pair in s_targetNames) + else { - var platform = pair.Key; - var targetName = pair.Value; - - if (!bundleTargets.Contains(targetName)) - { - continue; - } + rootLevelAppBundles.Add(appBundleName); + } + } - // App comes with a profile already - var provisioningProfileDestPath = _fileSystem.PathCombine(appBundlePath, "embedded.mobileprovision"); - if (_fileSystem.FileExists(provisioningProfileDestPath)) - { - _log.LogMessage($"Bundle already contains a provisioning profile at `{provisioningProfileDestPath}`"); - continue; - } + rootLevelAppBundles = rootLevelAppBundles.Except(appBundlesWithProfile).ToHashSet(); - // This makes sure we download the profile the first time we see an app that needs it - if (!profileLocations.TryGetValue(platform, out string? profilePath)) - { - if (string.IsNullOrEmpty(_tmpDir)) - { - _log.LogError("TmpDir parameter not set but required for real device targets!"); - return; - } - - if (string.IsNullOrEmpty(_profileUrlTemplate)) - { - _log.LogError("ProvisioningProfileUrl parameter not set but required for real device targets!"); - return; - } - - profilePath = DownloadProvisioningProfile(platform); - profileLocations.Add(platform, profilePath); - } + // If no .app bundles, add it to the root + if (!rootLevelAppBundles.Any()) + { + _log.LogMessage($"No app bundles found in the archive. Adding provisioning profile to root"); - // Copy the profile into the folder - _log.LogMessage($"Adding provisioning profile `{profilePath}` into the app bundle at `{provisioningProfileDestPath}`"); - _fileSystem.FileCopy(profilePath, provisioningProfileDestPath); + // Check if archive comes with a profile already + if (!zipArchive.Entries.Any(e => e.FullName == ProfileFileName)) + { + zipArchive.CreateEntryFromFile(profilePath, ProfileFileName); } + + return; + } + + // Else inject profile to every app bundle in the root of the archive + foreach (string appBundle in rootLevelAppBundles) + { + var profileDestPath = appBundle + "/" + ProfileFileName; + _log.LogMessage($"Adding provisioning profile to {appBundle}"); + zipArchive.CreateEntryFromFile(profilePath, profileDestPath); } } + /// + /// Process-safe download of the profile (several clashing msbuild processes should download once). + /// + /// Which platform to download the profile for + /// Path where the profile was downloaded to private string DownloadProvisioningProfile(ApplePlatform platform) { var targetFile = _fileSystem.PathCombine(_tmpDir!, GetProvisioningProfileFileName(platform)); @@ -138,7 +180,7 @@ private string DownloadProvisioningProfile(ApplePlatform platform) { if (_fileSystem.FileExists(targetFile)) { - _log.LogMessage($"Provisioning profile is already downloaded"); + _log.LogMessage($"Using provisioning profile in {targetFile}"); return; } @@ -169,6 +211,7 @@ public static void TryAddProvisioningProfileProvider(this IServiceCollection col { collection.TryAddTransient(); collection.TryAddTransient(); + collection.TryAddTransient(); collection.TryAddSingleton(_ => new HttpClient(new HttpClientHandler { CheckCertificateRevocationList = true })); collection.TryAddSingleton(serviceProvider => { @@ -176,6 +219,7 @@ public static void TryAddProvisioningProfileProvider(this IServiceCollection col serviceProvider.GetRequiredService(), serviceProvider.GetRequiredService(), serviceProvider.GetRequiredService(), + serviceProvider.GetRequiredService(), serviceProvider.GetRequiredService(), provisioningProfileUrlTemplate, tmpDir); diff --git a/src/Microsoft.DotNet.Helix/Sdk/Readme.md b/src/Microsoft.DotNet.Helix/Sdk/Readme.md index dcc734ceb9c..57a690c29e3 100644 --- a/src/Microsoft.DotNet.Helix/Sdk/Readme.md +++ b/src/Microsoft.DotNet.Helix/Sdk/Readme.md @@ -66,7 +66,7 @@ In order to run them, one has to publish the SDK locally so that the unit tests export SYSTEM_TEAMPROJECT=dnceng export SYSTEM_ACCESSTOKEN='' - eng/common/build.sh -test -projects tests/XHarness.Apple.Device.Tests /v:n /bl:Arcade.binlog + eng/common/build.sh -test -projects tests/XHarness.Apple.DeviceTests.proj /v:n /bl:Arcade.binlog ``` PowerShell @@ -77,7 +77,7 @@ In order to run them, one has to publish the SDK locally so that the unit tests $Env:SYSTEM_TEAMPROJECT = "dnceng" $Env:SYSTEM_ACCESSTOKEN = "" - .\eng\common\build.ps1 -configuration Debug -restore -test -projects tests\XHarness.Apple.Device.Tests /p:RestoreUsingNugetTargets=false /bl:Arcade.binlog + .\eng\common\build.ps1 -configuration Debug -restore -test -projects tests\XHarness.Apple.DeviceTests.proj /p:RestoreUsingNugetTargets=false /bl:Arcade.binlog ``` 5. An MSBuild log file called `Arcade.binlog` will be produced which you can inspect using the [MSBuild Structured Log Viewer](https://msbuildlog.com/). There you can see which props were set with which values, in what order the targets were executed under which conditions and so on. diff --git a/src/Microsoft.DotNet.Helix/Sdk/XharnessTaskBase.cs b/src/Microsoft.DotNet.Helix/Sdk/XharnessTaskBase.cs index a1de1cc2428..079ccf16866 100644 --- a/src/Microsoft.DotNet.Helix/Sdk/XharnessTaskBase.cs +++ b/src/Microsoft.DotNet.Helix/Sdk/XharnessTaskBase.cs @@ -111,22 +111,6 @@ protected Build.Utilities.TaskItem CreateTaskItem(string workItemName, string pa }); } - /// - /// This method parses the name for the Helix work item and path of the app from the item's metadata. - /// The user can re-use the same .apk for 2 work items so the name of the work item will come from ItemSpec and path from metadata. - /// - protected (string WorkItemName, string AppPath) GetNameAndPath(ITaskItem item, string pathMetadataName, IFileSystem fileSystem) - { - if (item.TryGetMetadata(pathMetadataName, out string appPathMetadata) && !string.IsNullOrEmpty(appPathMetadata)) - { - return (item.ItemSpec, appPathMetadata); - } - else - { - return (fileSystem.GetFileNameWithoutExtension(item.ItemSpec), item.ItemSpec); - } - } - protected async Task CreatePayloadArchive( IZipArchiveManager zipArchiveManager, IFileSystem fileSystem, @@ -137,18 +121,19 @@ protected async Task CreatePayloadArchive( string injectedCommands, string[] payloadScripts) { - string appFolderDirectory = fileSystem.GetDirectoryName(pathToZip); - string fileName = $"xharness-payload-{workItemName.ToLowerInvariant()}.zip"; - string outputZipPath = fileSystem.PathCombine(appFolderDirectory, fileName); - - if (fileSystem.FileExists(outputZipPath)) - { - Log.LogMessage($"Zip archive '{outputZipPath}' already exists, overwriting.."); - fileSystem.DeleteFile(outputZipPath); - } - + string outputZipPath; if (!isAlreadyArchived) { + string appFolderDirectory = fileSystem.GetDirectoryName(pathToZip); + string fileName = $"xharness-payload-{workItemName.ToLowerInvariant()}.zip"; + outputZipPath = fileSystem.PathCombine(appFolderDirectory, fileName); + + if (fileSystem.FileExists(outputZipPath)) + { + Log.LogMessage($"Zip archive '{outputZipPath}' already exists, overwriting.."); + fileSystem.DeleteFile(outputZipPath); + } + if (fileSystem.GetAttributes(pathToZip).HasFlag(FileAttributes.Directory)) { zipArchiveManager.ArchiveDirectory(pathToZip, outputZipPath, true); @@ -160,8 +145,8 @@ protected async Task CreatePayloadArchive( } else { - Log.LogMessage($"App payload '{workItemName}` has already been zipped. Copying to '{outputZipPath}` instead"); - fileSystem.FileCopy(pathToZip, outputZipPath); + Log.LogMessage($"App payload '{workItemName}` has already been zipped"); + outputZipPath = pathToZip; } Log.LogMessage($"Adding the XHarness job scripts into the payload archive"); @@ -186,5 +171,21 @@ await zipArchiveManager.AddContentToArchive( return outputZipPath; } + + /// + /// This method parses the name for the Helix work item and path of the app from the item's metadata. + /// The user can re-use the same .apk for 2 work items so the name of the work item will come from ItemSpec and path from metadata. + /// + public static (string WorkItemName, string AppPath) GetNameAndPath(ITaskItem item, string pathMetadataName, IFileSystem fileSystem) + { + if (item.TryGetMetadata(pathMetadataName, out string appPathMetadata) && !string.IsNullOrEmpty(appPathMetadata)) + { + return (item.ItemSpec, appPathMetadata); + } + else + { + return (fileSystem.GetFileNameWithoutExtension(item.ItemSpec), item.ItemSpec); + } + } } } diff --git a/src/Microsoft.DotNet.Helix/Sdk/tools/xharness-runner/xharness-runner.apple.sh b/src/Microsoft.DotNet.Helix/Sdk/tools/xharness-runner/xharness-runner.apple.sh index 47fb9126ee1..4e4528e3cc2 100644 --- a/src/Microsoft.DotNet.Helix/Sdk/tools/xharness-runner/xharness-runner.apple.sh +++ b/src/Microsoft.DotNet.Helix/Sdk/tools/xharness-runner/xharness-runner.apple.sh @@ -63,31 +63,11 @@ function die () exit 1 } -if [ -z "$app" ]; then - die "App bundle path wasn't provided"; -fi - -if [ -z "$target" ]; then - die "No target was provided"; -fi - -if [ -z "$xcode_version" ]; then - xcode_path="$(dirname "$(dirname "$(xcode-select -p)")")" -else - xcode_path="/Applications/Xcode${xcode_version/./}.app" -fi - -# First we need to revive env variables since they were erased by launchctl -# This file already has the expressions in the `export name=value` format -. ./envvars - -output_directory=$HELIX_WORKITEM_UPLOAD_ROOT - -# Signing -if [ "$target" == 'ios-device' ] || [ "$target" == 'tvos-device' ]; then - echo "Real device target detected, application will be signed" +function sign () +{ + echo "Signing $1" - provisioning_profile="$app/embedded.mobileprovision" + provisioning_profile="$1/embedded.mobileprovision" if [ ! -f "$provisioning_profile" ]; then echo "No embedded provisioning profile found at $provisioning_profile! Failed to sign the app!" exit 21 @@ -118,7 +98,36 @@ if [ "$target" == 'ios-device' ] || [ "$target" == 'tvos-device' ]; then /usr/libexec/PlistBuddy -x -c 'Print :Entitlements' provision.plist > entitlements.plist # Sign the app - /usr/bin/codesign -v --force --sign "Apple Development" --keychain "$keychain_name" --entitlements entitlements.plist "$app" + /usr/bin/codesign -v --force --sign "Apple Development" --keychain "$keychain_name" --entitlements entitlements.plist "$1" +} + +if [ -z "$app" ]; then + die "App bundle path wasn't provided"; +fi + +if [ -z "$target" ]; then + die "No target was provided"; +fi + +if [ -z "$xcode_version" ]; then + xcode_path="$(dirname "$(dirname "$(xcode-select -p)")")" +else + xcode_path="/Applications/Xcode${xcode_version/./}.app" +fi + +# First we need to revive env variables since they were erased by launchctl +# This file already has the expressions in the `export name=value` format +. ./envvars + +output_directory=$HELIX_WORKITEM_UPLOAD_ROOT + +# Signing +if [ "$target" == 'ios-device' ] || [ "$target" == 'tvos-device' ]; then + if [ -d "$app" ]; then + sign "$app" + else + echo 'Device target detected but app not found, skipping signing..' + fi elif [[ "$target" =~ "simulator" ]]; then # Start the simulator if it is not running already simulator_app="$xcode_path/Contents/Developer/Applications/Simulator.app" @@ -127,7 +136,7 @@ fi # The xharness alias function xharness() { - dotnet exec $XHARNESS_CLI_PATH "$@" + dotnet exec "$XHARNESS_CLI_PATH" "$@" } # Act out the actual commands diff --git a/tests/UnitTests.XHarness.Android.Device.proj b/tests/XHarness.Android.DeviceTests.proj similarity index 90% rename from tests/UnitTests.XHarness.Android.Device.proj rename to tests/XHarness.Android.DeviceTests.proj index d0e6020a18b..839df67cc7d 100644 --- a/tests/UnitTests.XHarness.Android.Device.proj +++ b/tests/XHarness.Android.DeviceTests.proj @@ -1,5 +1,5 @@ - + diff --git a/tests/UnitTests.XHarness.Android.Simulator.proj b/tests/XHarness.Android.SimulatorTests.proj similarity index 93% rename from tests/UnitTests.XHarness.Android.Simulator.proj rename to tests/XHarness.Android.SimulatorTests.proj index 71451da61c9..9f4e26099e2 100644 --- a/tests/UnitTests.XHarness.Android.Simulator.proj +++ b/tests/XHarness.Android.SimulatorTests.proj @@ -1,5 +1,5 @@ - + - - + + diff --git a/tests/UnitTests.XHarness.iOS.Simulator.proj b/tests/XHarness.Apple.SimulatorTests.proj similarity index 81% rename from tests/UnitTests.XHarness.iOS.Simulator.proj rename to tests/XHarness.Apple.SimulatorTests.proj index e483cb6384a..5e9a98ac97d 100644 --- a/tests/UnitTests.XHarness.iOS.Simulator.proj +++ b/tests/XHarness.Apple.SimulatorTests.proj @@ -1,5 +1,5 @@ - + - - - + + + diff --git a/tests/UnitTests.XHarness.Common.props b/tests/XHarness.Tests.Common.props similarity index 100% rename from tests/UnitTests.XHarness.Common.props rename to tests/XHarness.Tests.Common.props diff --git a/tests/XHarness/.gitattributes b/tests/XHarness/.gitattributes new file mode 100644 index 00000000000..a584c86a720 --- /dev/null +++ b/tests/XHarness/.gitattributes @@ -0,0 +1,2 @@ +# We need to force LF on Windows because the XML contains bash commands which will be executed on a MacOS machine +XHarness.Apple.*.proj text eol=lf \ No newline at end of file diff --git a/tests/XHarness/XHarness.Apple.Device.Archived.proj b/tests/XHarness/XHarness.Apple.Device.Archived.proj new file mode 100644 index 00000000000..7d592369a40 --- /dev/null +++ b/tests/XHarness/XHarness.Apple.Device.Archived.proj @@ -0,0 +1,31 @@ + + + + + + System.Buffers.Tests.app + https://netcorenativeassets.blob.core.windows.net/resource-packages/external/ios/test-app/tvos-device/zipped-apps.zip + $(ArtifactsTmpDir)XHarness.Apple.Device.Archived + + + + + + + + + + + + + tvos-device + 00:18:00 + + sign $(XHarnessTestAppName) + xharness apple test -a $(XHarnessTestAppName) -o $output_directory -t $target -v --timeout 00:08:50 + + + + + + diff --git a/tests/XHarness/XHarness.Simulator.CustomCommands.proj b/tests/XHarness/XHarness.Apple.Simulator.CustomCommands.proj similarity index 100% rename from tests/XHarness/XHarness.Simulator.CustomCommands.proj rename to tests/XHarness/XHarness.Apple.Simulator.CustomCommands.proj diff --git a/tests/XHarness/XHarness.Simulator.AppleRun.proj b/tests/XHarness/XHarness.Apple.Simulator.Run.proj similarity index 100% rename from tests/XHarness/XHarness.Simulator.AppleRun.proj rename to tests/XHarness/XHarness.Apple.Simulator.Run.proj diff --git a/tests/XHarness/XHarness.Simulator.AppleTest.proj b/tests/XHarness/XHarness.Apple.Simulator.Test.proj similarity index 100% rename from tests/XHarness/XHarness.Simulator.AppleTest.proj rename to tests/XHarness/XHarness.Apple.Simulator.Test.proj diff --git a/tests/XHarness/XHarness.Device.AppleTest.proj b/tests/XHarness/XHarness.Device.AppleTest.proj deleted file mode 100644 index dc3c9a83c61..00000000000 --- a/tests/XHarness/XHarness.Device.AppleTest.proj +++ /dev/null @@ -1,31 +0,0 @@ - - - - - - System.Buffers.Tests.app - https://netcorenativeassets.blob.core.windows.net/resource-packages/external/ios/test-app/ios-device/$(XHarnessRunAppBundleName).zip - - - - - - - - - - - - - - - - ios-device - 00:12:00 - 00:10:00 - 00:07:00 - - - - - From 92957be2e5b9fd119d5818c4363e5d7bad35fcd1 Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Wed, 15 Sep 2021 12:36:26 +0000 Subject: [PATCH 377/699] [main] Update dependencies from dotnet/arcade dotnet/sourcelink (#7895) [main] Update dependencies from dotnet/arcade dotnet/sourcelink --- eng/Version.Details.xml | 28 ++++++++++++++-------------- eng/Versions.props | 10 +++++----- global.json | 4 ++-- 3 files changed, 21 insertions(+), 21 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index 7362e30160a..5f16a9d389c 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -11,25 +11,25 @@ - + https://github.com/dotnet/arcade - fa4a48044d33222537e6dbd000f8a2adaa7a15c7 + 4b7c80f398fd3dcea03fdc4e454789b61181d300 - + https://github.com/dotnet/arcade - fa4a48044d33222537e6dbd000f8a2adaa7a15c7 + 4b7c80f398fd3dcea03fdc4e454789b61181d300 - + https://github.com/dotnet/arcade - fa4a48044d33222537e6dbd000f8a2adaa7a15c7 + 4b7c80f398fd3dcea03fdc4e454789b61181d300 - + https://github.com/dotnet/arcade - fa4a48044d33222537e6dbd000f8a2adaa7a15c7 + 4b7c80f398fd3dcea03fdc4e454789b61181d300 - + https://github.com/dotnet/arcade - fa4a48044d33222537e6dbd000f8a2adaa7a15c7 + 4b7c80f398fd3dcea03fdc4e454789b61181d300 https://github.com/dotnet/arcade-services @@ -51,14 +51,14 @@ https://github.com/mono/linker c8499798a2a09639174e2f5c694d6652794cc73d - + https://github.com/dotnet/sourcelink - 389b28318be327cc8c48259f8134b784e52799f8 + 0dbfbe2a408cce8438298ded794166353c860bcb - + https://github.com/dotnet/sourcelink - 389b28318be327cc8c48259f8134b784e52799f8 + 0dbfbe2a408cce8438298ded794166353c860bcb https://github.com/dotnet/symreader-converter diff --git a/eng/Versions.props b/eng/Versions.props index ce335ad6fb6..a1b2fd18c0f 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -65,8 +65,8 @@ 2.4.1 2.0.3 2.4.1 - 7.0.0-beta.21459.5 - 7.0.0-beta.21459.5 + 7.0.0-beta.21463.4 + 7.0.0-beta.21463.4 1.22.0 1.1.2 2.0.0 @@ -75,9 +75,9 @@ 2.0.4 1.1.0-beta2-19575-01 1.1.0-beta.20258.6 - 1.1.0-beta-21456-02 - 1.1.0-beta-21456-02 - 7.0.0-beta.21459.5 + 1.1.0-beta-21463-02 + 1.1.0-beta-21463-02 + 7.0.0-beta.21463.4 1.0.0-beta.21452.1 1.1.0-beta.21378.2 1.0.0-prerelease.21460.2 diff --git a/global.json b/global.json index 23dc7150027..5053d3bcc1b 100644 --- a/global.json +++ b/global.json @@ -3,7 +3,7 @@ "dotnet": "6.0.100-rc.1.21430.12" }, "msbuild-sdks": { - "Microsoft.DotNet.Arcade.Sdk": "7.0.0-beta.21459.5", - "Microsoft.DotNet.Helix.Sdk": "7.0.0-beta.21459.5" + "Microsoft.DotNet.Arcade.Sdk": "7.0.0-beta.21463.4", + "Microsoft.DotNet.Helix.Sdk": "7.0.0-beta.21463.4" } } From 734d875ba2abfb5c8f5f52368e7d4711ee366e31 Mon Sep 17 00:00:00 2001 From: Sarah Oslund Date: Thu, 16 Sep 2021 15:49:38 -0700 Subject: [PATCH 378/699] Adding x64 emulation support for pkg installers (#7893) * Adding x64 emulation support for pkg installers * PR feedback * PR feedback --- .../src/GenerateMacOSDistributionFile.cs | 40 ++++++++++++++++++- 1 file changed, 39 insertions(+), 1 deletion(-) diff --git a/src/Microsoft.DotNet.Build.Tasks.Installers/src/GenerateMacOSDistributionFile.cs b/src/Microsoft.DotNet.Build.Tasks.Installers/src/GenerateMacOSDistributionFile.cs index 4a2242b80bd..4d988fd2d75 100644 --- a/src/Microsoft.DotNet.Build.Tasks.Installers/src/GenerateMacOSDistributionFile.cs +++ b/src/Microsoft.DotNet.Build.Tasks.Installers/src/GenerateMacOSDistributionFile.cs @@ -30,6 +30,8 @@ public class GenerateMacOSDistributionFile : BuildTask [Required] public string DestinationFile { get; set; } + public string Alternativex64InstallPath { get; set; } + public override bool Execute() { try @@ -38,7 +40,16 @@ public override bool Execute() var titleElement = new XElement("title", $"{ProductBrandName} ({TargetArchitecture})"); - var choiceLineElements = BundledPackages.Select(component => new XElement("line", new XAttribute("choice", component.GetMetadata("FileNameWithExtension")))); + var archScriptContent = @""; + var scriptElement = new XElement("script", new XText(archScriptContent)); var choiceElements = BundledPackages .Select(component => new XElement("choice", @@ -48,6 +59,23 @@ public override bool Execute() new XAttribute("description", component.GetMetadata("Description")), new XElement("pkg-ref", new XAttribute("id", component.GetMetadata("FileNameWithExtension"))))); + if (TargetArchitecture == "x64") + { + Alternativex64InstallPath ??= "/usr/local/share/dotnet/x64"; + + choiceElements = + choiceElements.Select(c => new XElement(c) + .WithAttribute("selected", "IsX64Machine()")) + .Concat( + choiceElements.Select(c => new XElement(c) + .WithAttribute("id", c.Attribute("id").Value + ".alternate") + .WithAttribute("selected", "!IsX64Machine()") + .WithAttribute("customLocation", Alternativex64InstallPath))); + } + + var choiceLineElements = choiceElements + .Select(c => new XElement("line", new XAttribute("choice", c.Attribute("id").Value))); + var pkgRefElements = BundledPackages .Select(component => new XElement("pkg-ref", new XAttribute("id", component.GetMetadata("FileNameWithExtension")), @@ -78,6 +106,7 @@ public override bool Execute() document.Root.Add(new XElement("choices-outline", choiceLineElements)); document.Root.Add(choiceElements); document.Root.Add(pkgRefElements); + document.Root.Add(scriptElement); using XmlWriter writer = XmlWriter.Create(File.OpenWrite(DestinationFile)); document.WriteTo(writer); } @@ -89,4 +118,13 @@ public override bool Execute() return true; } } + + static class XElementExtensions + { + public static XElement WithAttribute(this XElement element, XName attribute, object value) + { + element.SetAttributeValue(attribute, value); + return element; + } + } } From c1268c5f18ca713a1b43f77f267b95a5365d6bf3 Mon Sep 17 00:00:00 2001 From: Juan Hoyos <19413848+hoyosjs@users.noreply.github.com> Date: Thu, 16 Sep 2021 17:29:11 -0700 Subject: [PATCH 379/699] Update SymUploader to 2.0.0-preview.1.21466.7 (#7904) --- eng/Version.Details.xml | 8 ++++---- eng/Versions.props | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index 5f16a9d389c..68245705f1d 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -1,13 +1,13 @@ - + https://dev.azure.com/dnceng/internal/_git/dotnet-symuploader - 5528b1c7c946f0923e8becab4d12bcb76c985b91 + 68d4f809708e1ccf7102ca25a608c6bf8df44ab9 - + https://dev.azure.com/dnceng/internal/_git/dotnet-symuploader - 5528b1c7c946f0923e8becab4d12bcb76c985b91 + 68d4f809708e1ccf7102ca25a608c6bf8df44ab9 diff --git a/eng/Versions.props b/eng/Versions.props index a1b2fd18c0f..ed7dd90f03b 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -81,8 +81,8 @@ 1.0.0-beta.21452.1 1.1.0-beta.21378.2 1.0.0-prerelease.21460.2 - 1.1.156602 - 1.1.156602 + 2.0.0-preview.1.21466.7 + 2.0.0-preview.1.21466.7 6.0.100-preview.5.21254.11 1.0.0-preview1.1.21116.1 From 139794062d986f8984bf06f0cd564ac4dbbebada Mon Sep 17 00:00:00 2001 From: Sarah Oslund Date: Fri, 17 Sep 2021 16:07:36 -0700 Subject: [PATCH 380/699] Update mac x64 installer script arch detection (#7913) * Update mac x64 installer script arch detection * Add comments to x64 machine detection script --- .../src/GenerateMacOSDistributionFile.cs | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/src/Microsoft.DotNet.Build.Tasks.Installers/src/GenerateMacOSDistributionFile.cs b/src/Microsoft.DotNet.Build.Tasks.Installers/src/GenerateMacOSDistributionFile.cs index 4d988fd2d75..d471bee08dd 100644 --- a/src/Microsoft.DotNet.Build.Tasks.Installers/src/GenerateMacOSDistributionFile.cs +++ b/src/Microsoft.DotNet.Build.Tasks.Installers/src/GenerateMacOSDistributionFile.cs @@ -42,11 +42,19 @@ public override bool Execute() var archScriptContent = @""; var scriptElement = new XElement("script", new XText(archScriptContent)); From ec4c0771cc9f6003d59004c2bf0a971c2826c670 Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Mon, 20 Sep 2021 14:12:06 +0000 Subject: [PATCH 381/699] [main] Update dependencies from dotnet/xharness dotnet/xliff-tasks dotnet/arcade dotnet/linker (#7907) [main] Update dependencies from dotnet/xharness dotnet/xliff-tasks dotnet/arcade dotnet/linker --- eng/Version.Details.xml | 34 +++++++++++++++++----------------- eng/Versions.props | 12 ++++++------ global.json | 4 ++-- 3 files changed, 25 insertions(+), 25 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index 68245705f1d..ba26df4cbc4 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -11,25 +11,25 @@ - + https://github.com/dotnet/arcade - 4b7c80f398fd3dcea03fdc4e454789b61181d300 + 734d875ba2abfb5c8f5f52368e7d4711ee366e31 - + https://github.com/dotnet/arcade - 4b7c80f398fd3dcea03fdc4e454789b61181d300 + 734d875ba2abfb5c8f5f52368e7d4711ee366e31 - + https://github.com/dotnet/arcade - 4b7c80f398fd3dcea03fdc4e454789b61181d300 + 734d875ba2abfb5c8f5f52368e7d4711ee366e31 - + https://github.com/dotnet/arcade - 4b7c80f398fd3dcea03fdc4e454789b61181d300 + 734d875ba2abfb5c8f5f52368e7d4711ee366e31 - + https://github.com/dotnet/arcade - 4b7c80f398fd3dcea03fdc4e454789b61181d300 + 734d875ba2abfb5c8f5f52368e7d4711ee366e31 https://github.com/dotnet/arcade-services @@ -39,17 +39,17 @@ https://github.com/dotnet/arcade-services cac955fe259cb611f6a29d09209bd717deb69037 - + https://github.com/dotnet/xharness - fdcd4d95dcedd2cc88eaaf5674a9d8bb8aafb8a2 + e045ce36ce5d46bbd44097592bcf1b69c5ca75a2 https://github.com/dotnet/roslyn 2bbf85baa30a90f9d491699734e814050356da32 - - https://github.com/mono/linker - c8499798a2a09639174e2f5c694d6652794cc73d + + https://github.com/dotnet/linker + 60e655fc7089f6123e61fede21bf99bd1d819713 https://github.com/dotnet/sourcelink @@ -68,9 +68,9 @@ https://github.com/dotnet/symreader-converter c5ba7c88f92e2dde156c324a8c8edc04d9fa4fe0 - + https://github.com/dotnet/xliff-tasks - b8baaa09bffb260ba0a9725d56e9d7d83db9d17e + f7165ff3841f2c5b1b77355a6d2edb2d2f52a2d3 diff --git a/eng/Versions.props b/eng/Versions.props index ed7dd90f03b..6225e849ec3 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -36,7 +36,7 @@ 2.1.0 4.0.0-5.21453.15 16.7.1 - 6.0.100-1.21459.1 + 6.0.100-1.21467.2 4.8.3 5.3.0.1 2.3.0 @@ -65,8 +65,8 @@ 2.4.1 2.0.3 2.4.1 - 7.0.0-beta.21463.4 - 7.0.0-beta.21463.4 + 7.0.0-beta.21466.4 + 7.0.0-beta.21466.4 1.22.0 1.1.2 2.0.0 @@ -77,10 +77,10 @@ 1.1.0-beta.20258.6 1.1.0-beta-21463-02 1.1.0-beta-21463-02 - 7.0.0-beta.21463.4 - 1.0.0-beta.21452.1 + 7.0.0-beta.21466.4 + 1.0.0-beta.21470.1 1.1.0-beta.21378.2 - 1.0.0-prerelease.21460.2 + 1.0.0-prerelease.21465.1 2.0.0-preview.1.21466.7 2.0.0-preview.1.21466.7 6.0.100-preview.5.21254.11 diff --git a/global.json b/global.json index 5053d3bcc1b..f653b2ed182 100644 --- a/global.json +++ b/global.json @@ -3,7 +3,7 @@ "dotnet": "6.0.100-rc.1.21430.12" }, "msbuild-sdks": { - "Microsoft.DotNet.Arcade.Sdk": "7.0.0-beta.21463.4", - "Microsoft.DotNet.Helix.Sdk": "7.0.0-beta.21463.4" + "Microsoft.DotNet.Arcade.Sdk": "7.0.0-beta.21466.4", + "Microsoft.DotNet.Helix.Sdk": "7.0.0-beta.21466.4" } } From ae267721979e2aefb26f0681dae2b0f53442dcc9 Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Mon, 20 Sep 2021 14:49:23 +0000 Subject: [PATCH 382/699] [main] Update dependencies from dotnet/roslyn (#7888) [main] Update dependencies from dotnet/roslyn --- eng/Version.Details.xml | 4 ++-- eng/Versions.props | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index ba26df4cbc4..4b9d453ebcc 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -43,9 +43,9 @@ https://github.com/dotnet/xharness e045ce36ce5d46bbd44097592bcf1b69c5ca75a2 - + https://github.com/dotnet/roslyn - 2bbf85baa30a90f9d491699734e814050356da32 + c1d8c6f043bc80425c6828455eb57f8a404759c6 https://github.com/dotnet/linker diff --git a/eng/Versions.props b/eng/Versions.props index 6225e849ec3..e49d0b3c6a9 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -34,7 +34,7 @@ 2.0.0 2.1.1 2.1.0 - 4.0.0-5.21453.15 + 4.0.0-5.21469.2 16.7.1 6.0.100-1.21467.2 4.8.3 From 5df4f9071a6fe97a403bd7cb21b52586e834e830 Mon Sep 17 00:00:00 2001 From: Matt Galbraith Date: Mon, 20 Sep 2021 10:11:01 -0700 Subject: [PATCH 383/699] https://github.com/dotnet/core-eng/issues/13691 - refactor variable setting so we can also do it in MSBuild-Core() (#7916) --- eng/common/tools.ps1 | 26 ++++++++++++++++++-------- 1 file changed, 18 insertions(+), 8 deletions(-) diff --git a/eng/common/tools.ps1 b/eng/common/tools.ps1 index 02347914f5d..44484289943 100644 --- a/eng/common/tools.ps1 +++ b/eng/common/tools.ps1 @@ -709,14 +709,7 @@ function MSBuild() { Write-PipelineSetVariable -Name 'NUGET_PLUGIN_REQUEST_TIMEOUT_IN_SECONDS' -Value '20' } - if ($ci) { - $env:NUGET_ENABLE_EXPERIMENTAL_HTTP_RETRY = 'true' - $env:NUGET_EXPERIMENTAL_MAX_NETWORK_TRY_COUNT = 6 - $env:NUGET_EXPERIMENTAL_NETWORK_RETRY_DELAY_MILLISECONDS = 1000 - Write-PipelineSetVariable -Name 'NUGET_ENABLE_EXPERIMENTAL_HTTP_RETRY' -Value 'true' - Write-PipelineSetVariable -Name 'NUGET_EXPERIMENTAL_MAX_NETWORK_TRY_COUNT' -Value '6' - Write-PipelineSetVariable -Name 'NUGET_EXPERIMENTAL_NETWORK_RETRY_DELAY_MILLISECONDS' -Value '1000' - } + Enable-Nuget-EnhancedRetry $toolsetBuildProject = InitializeToolset $basePath = Split-Path -parent $toolsetBuildProject @@ -764,6 +757,8 @@ function MSBuild-Core() { } } + Enable-Nuget-EnhancedRetry + $buildTool = InitializeBuildTool $cmdArgs = "$($buildTool.Command) /m /nologo /clp:Summary /v:$verbosity /nr:$nodeReuse /p:ContinuousIntegrationBuild=$ci" @@ -904,3 +899,18 @@ function Try-LogClientIpAddress() Write-Host "Unable to get this machine's effective IP address for logging: $_" } } + +# +# If $ci flag is set, turn on (and log that we did) special environment variables for improved Nuget client retry logic. +# +function Enable-Nuget-EnhancedRetry() { + if ($ci) { + Write-Host "Setting NUGET enhanced retry environment variables" + $env:NUGET_ENABLE_EXPERIMENTAL_HTTP_RETRY = 'true' + $env:NUGET_EXPERIMENTAL_MAX_NETWORK_TRY_COUNT = 6 + $env:NUGET_EXPERIMENTAL_NETWORK_RETRY_DELAY_MILLISECONDS = 1000 + Write-PipelineSetVariable -Name 'NUGET_ENABLE_EXPERIMENTAL_HTTP_RETRY' -Value 'true' + Write-PipelineSetVariable -Name 'NUGET_EXPERIMENTAL_MAX_NETWORK_TRY_COUNT' -Value '6' + Write-PipelineSetVariable -Name 'NUGET_EXPERIMENTAL_NETWORK_RETRY_DELAY_MILLISECONDS' -Value '1000' + } +} From f959b455e6feceeaee50f95e07dac7b8e470bc2e Mon Sep 17 00:00:00 2001 From: Sarah Oslund Date: Mon, 20 Sep 2021 10:26:21 -0700 Subject: [PATCH 384/699] Fix typo in mac installer generation script (#7917) --- .../src/GenerateMacOSDistributionFile.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Microsoft.DotNet.Build.Tasks.Installers/src/GenerateMacOSDistributionFile.cs b/src/Microsoft.DotNet.Build.Tasks.Installers/src/GenerateMacOSDistributionFile.cs index d471bee08dd..a720fcbefe2 100644 --- a/src/Microsoft.DotNet.Build.Tasks.Installers/src/GenerateMacOSDistributionFile.cs +++ b/src/Microsoft.DotNet.Build.Tasks.Installers/src/GenerateMacOSDistributionFile.cs @@ -42,7 +42,7 @@ public override bool Execute() var archScriptContent = @" Date: Tue, 21 Sep 2021 12:50:20 +0200 Subject: [PATCH 385/699] Stop using `--signal-app-end` in XHarness Apple device workloads (#7915) --- src/Microsoft.DotNet.Helix/Sdk/CreateXHarnessAppleWorkItems.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/src/Microsoft.DotNet.Helix/Sdk/CreateXHarnessAppleWorkItems.cs b/src/Microsoft.DotNet.Helix/Sdk/CreateXHarnessAppleWorkItems.cs index 3bed8a524c2..74f3844d572 100644 --- a/src/Microsoft.DotNet.Helix/Sdk/CreateXHarnessAppleWorkItems.cs +++ b/src/Microsoft.DotNet.Helix/Sdk/CreateXHarnessAppleWorkItems.cs @@ -208,7 +208,6 @@ private string GetDefaultCommand(string target, bool includesTestRunner, bool re ? $"--launch-timeout \"$launch_timeout\" " : $"--expected-exit-code $expected_exit_code ") + (resetSimulator ? $"--reset-simulator " : string.Empty) + - (target.Contains("device") ? $"--signal-app-end " : string.Empty) + // iOS/tvOS 14+ workaround (!string.IsNullOrEmpty(AppArguments) ? "-- " + AppArguments : string.Empty); private string GetHelixCommand( From 88279c97091c80b6fb132acc26680608a82df637 Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Tue, 21 Sep 2021 14:25:23 +0000 Subject: [PATCH 386/699] [main] Update dependencies from dotnet/arcade dotnet/sourcelink (#7920) [main] Update dependencies from dotnet/arcade dotnet/sourcelink --- eng/Version.Details.xml | 28 ++++++++++++++-------------- eng/Versions.props | 10 +++++----- global.json | 4 ++-- 3 files changed, 21 insertions(+), 21 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index 4b9d453ebcc..39ec67e4601 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -11,25 +11,25 @@ - + https://github.com/dotnet/arcade - 734d875ba2abfb5c8f5f52368e7d4711ee366e31 + f959b455e6feceeaee50f95e07dac7b8e470bc2e - + https://github.com/dotnet/arcade - 734d875ba2abfb5c8f5f52368e7d4711ee366e31 + f959b455e6feceeaee50f95e07dac7b8e470bc2e - + https://github.com/dotnet/arcade - 734d875ba2abfb5c8f5f52368e7d4711ee366e31 + f959b455e6feceeaee50f95e07dac7b8e470bc2e - + https://github.com/dotnet/arcade - 734d875ba2abfb5c8f5f52368e7d4711ee366e31 + f959b455e6feceeaee50f95e07dac7b8e470bc2e - + https://github.com/dotnet/arcade - 734d875ba2abfb5c8f5f52368e7d4711ee366e31 + f959b455e6feceeaee50f95e07dac7b8e470bc2e https://github.com/dotnet/arcade-services @@ -51,14 +51,14 @@ https://github.com/dotnet/linker 60e655fc7089f6123e61fede21bf99bd1d819713 - + https://github.com/dotnet/sourcelink - 0dbfbe2a408cce8438298ded794166353c860bcb + fd48bde3c9769842b41fe696f15a16b1008bae18 - + https://github.com/dotnet/sourcelink - 0dbfbe2a408cce8438298ded794166353c860bcb + fd48bde3c9769842b41fe696f15a16b1008bae18 https://github.com/dotnet/symreader-converter diff --git a/eng/Versions.props b/eng/Versions.props index e49d0b3c6a9..dcca6743147 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -65,8 +65,8 @@ 2.4.1 2.0.3 2.4.1 - 7.0.0-beta.21466.4 - 7.0.0-beta.21466.4 + 7.0.0-beta.21470.4 + 7.0.0-beta.21470.4 1.22.0 1.1.2 2.0.0 @@ -75,9 +75,9 @@ 2.0.4 1.1.0-beta2-19575-01 1.1.0-beta.20258.6 - 1.1.0-beta-21463-02 - 1.1.0-beta-21463-02 - 7.0.0-beta.21466.4 + 1.1.0-beta-21470-02 + 1.1.0-beta-21470-02 + 7.0.0-beta.21470.4 1.0.0-beta.21470.1 1.1.0-beta.21378.2 1.0.0-prerelease.21465.1 diff --git a/global.json b/global.json index f653b2ed182..077d9364c82 100644 --- a/global.json +++ b/global.json @@ -3,7 +3,7 @@ "dotnet": "6.0.100-rc.1.21430.12" }, "msbuild-sdks": { - "Microsoft.DotNet.Arcade.Sdk": "7.0.0-beta.21466.4", - "Microsoft.DotNet.Helix.Sdk": "7.0.0-beta.21466.4" + "Microsoft.DotNet.Arcade.Sdk": "7.0.0-beta.21470.4", + "Microsoft.DotNet.Helix.Sdk": "7.0.0-beta.21470.4" } } From 42b72b125d07dbc8fb3145fc10a8f332961bc0ba Mon Sep 17 00:00:00 2001 From: Sarah Oslund Date: Tue, 21 Sep 2021 08:51:46 -0700 Subject: [PATCH 387/699] Add check for translations in mac pkg installers (#7919) --- .../src/GenerateMacOSDistributionFile.cs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/Microsoft.DotNet.Build.Tasks.Installers/src/GenerateMacOSDistributionFile.cs b/src/Microsoft.DotNet.Build.Tasks.Installers/src/GenerateMacOSDistributionFile.cs index a720fcbefe2..fd36cd6251c 100644 --- a/src/Microsoft.DotNet.Build.Tasks.Installers/src/GenerateMacOSDistributionFile.cs +++ b/src/Microsoft.DotNet.Build.Tasks.Installers/src/GenerateMacOSDistributionFile.cs @@ -45,14 +45,18 @@ function IsX64Machine() { var machine = system.sysctl(""hw.machine""); var cputype = system.sysctl(""hw.cputype""); var cpu64 = system.sysctl(""hw.cpu64bit_capable""); + var translated = system.sysctl(""sysctl.proc_translated""); system.log(""Machine type: "" + machine); system.log(""Cpu type: "" + cputype); system.log(""64-bit: "" + cpu64); - + system.log(""Translated: "" + translated); + // From machine.h // CPU_TYPE_X86_64 = CPU_TYPE_X86 | CPU_ARCH_ABI64 = 0x010000007 = 16777223 // CPU_TYPE_X86 = 7 var result = machine == ""amd64"" || machine == ""x86_64"" || cputype == ""16777223"" || (cputype == ""7"" && cpu64 == ""1""); + // We may be running under translation (Rosetta) that makes it seem like system is x64, if so assume machine is not actually x64 + result = result && (translated != ""1""); system.log(""IsX64Machine: "" + result); return result; } From 44d5fbedc1864e7db8f2664d97c042a96b15db12 Mon Sep 17 00:00:00 2001 From: Katya Sokolova Date: Tue, 21 Sep 2021 21:28:07 +0200 Subject: [PATCH 388/699] Copy emulator log in case of 85 error (#7922) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * copy emulator log in case of 85 error * Apply suggestions from code review Co-authored-by: Přemek Vysoký Co-authored-by: Přemek Vysoký --- .../Sdk/tools/xharness-runner/xharness-helix-job.android.sh | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/Microsoft.DotNet.Helix/Sdk/tools/xharness-runner/xharness-helix-job.android.sh b/src/Microsoft.DotNet.Helix/Sdk/tools/xharness-runner/xharness-helix-job.android.sh index 036b4c8deb9..81962d5356a 100644 --- a/src/Microsoft.DotNet.Helix/Sdk/tools/xharness-runner/xharness-helix-job.android.sh +++ b/src/Microsoft.DotNet.Helix/Sdk/tools/xharness-runner/xharness-helix-job.android.sh @@ -86,6 +86,8 @@ case "$exit_code" in # The only solution is to reboot the machine, so we request a work item retry + agent reboot when this happens echo 'Encountered ADB_DEVICE_ENUMERATION_FAILURE. This is typically not a failure of the work item. We will run it again and reboot this computer to help its devices' echo 'If this occurs repeatedly, please check for architectural mismatch, e.g. sending arm64_v8a APKs to an x86_64 / x86 only queue.' + # Copy emulator log + cp /tmp/*-logcat.log "$output_directory" retry=true reboot=true ;; From 9a1aa97dfe4c5879f37da6066bae70e64dd85c1d Mon Sep 17 00:00:00 2001 From: Jon Fortescue Date: Tue, 21 Sep 2021 14:33:22 -0700 Subject: [PATCH 389/699] Add conditional to OneLocBuild example template (#7903) Just to make sure people do it right --- Documentation/OneLocBuild.md | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/Documentation/OneLocBuild.md b/Documentation/OneLocBuild.md index 5ad1b1f506c..c26afd4bc10 100644 --- a/Documentation/OneLocBuild.md +++ b/Documentation/OneLocBuild.md @@ -145,10 +145,11 @@ The most basic structure for calling the OneLocBuild template is: ```yaml jobs: -- template: /eng/common/templates/job/onelocbuild.yml - parameters: - LclSource: lclFilesfromPackage - LclPackageId: 'LCL-PACKAGE-ID' +- ${{ if and(ne(variables['System.TeamProject'], 'public'), notin(variables['Build.Reason'], 'PullRequest'), eq(variables['Build.SourceBranch'], 'refs/heads/main')) }}: + - template: /eng/common/templates/job/onelocbuild.yml + parameters: + LclSource: lclFilesfromPackage + LclPackageId: 'LCL-PACKAGE-ID' ``` The parameters that can be passed to the template are as follows: From ec51c9f82cce16c6b5b494cce9eccfb74f558c30 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C5=99emek=20Vysok=C3=BD?= Date: Wed, 22 Sep 2021 11:26:38 +0200 Subject: [PATCH 390/699] Remove .binlog file and gitignore binlogs (#7933) --- .gitignore | 2 +- Helix.XHarness.Android.Device.Tests.binlog | Bin 220899 -> 0 bytes 2 files changed, 1 insertion(+), 1 deletion(-) delete mode 100644 Helix.XHarness.Android.Device.Tests.binlog diff --git a/.gitignore b/.gitignore index aae2dbd6cf1..9c26a6609e3 100644 --- a/.gitignore +++ b/.gitignore @@ -27,7 +27,7 @@ x86/ !eng/common/cross/x86/ msbuild.log msbuild.err msbuild.wrn -msbuild.binlog +*.binlog # Visual Studio 2015 .vs/ diff --git a/Helix.XHarness.Android.Device.Tests.binlog b/Helix.XHarness.Android.Device.Tests.binlog deleted file mode 100644 index aeb627f3a551d1a73f072d6adc51c595e8df81ea..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 220899 zcmV(?K-a$?iwFP!000003haG%d=y8ruqJFGCqWYo3&xgYqeZJMIL;Q50NF~`ieOu3 z-AX%xHLG3S?uy`he&>X9#yKaPbHreb6Am~VoU?I`=YVtgs(ZS7dNzy}knHb|cfXT` zrmL!}tE#K3t803OWMyTc{bmQlb&AMcVxG!yAQ}ku(PHtKr#%=BMHZt$K+7Lp3FH=Q(SbJ|ArJWd zk3aqxO8x^sssA%@+xmT`&RFrPQh63(b+#ii=0S_8lSywmTSJUikYHplUTUUdIRLy8@ibfVk{aw}mxF0zx8+^4@ zjSXmcVNvl4Z$UwUI~V_}q#_Ruq-|~0HFJ5E`JExqci6CLov-g zy?aJgBpeThdm=rt+HhQhamIs@FpobL_)Dv(z~ZS8aZ@|d&>0o(2S(bk$AEVw=#fOJOW0AC7?g4*1AKHmGIx#EFwDnsV*nsK{Irc z@JPoLpWvw=kZuBDiOqr@2&B-|q(wU;(Jp_uLrZM(1s8`+pgrxOU~Gx;2;`Xg3^j>i zehhR?6x-sDF4p3)S)D>Zpe7A8ku1wNrq`OLH@!2a;}CHKGy2GW0Imbr_IGy|dAzOl zoJ4gb-T)*j2?^|bU|60&C^QB95t(+)HI+V?+H!XkWwR$ujlSBJ#^wXt8Y=5+kX`Q| zjnJEYjq{tUYGyZAHdM_+_AY-cu0_#+s`~1h=C
#uns+nP1fvfTts>B3)gPF!d$a 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

vzkc-zA!i!G9Q`W*Gn`$oph{WuE3hL9 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≈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

RCMIEN3!lHsf;UXq zZdT*B`#k0XwMU=%?Mt}N)oCc@A_!{;8S1a8hMP$-ZoO-Ih)bbE7`Lc4skPDQ!X9L9 zZBVT`Hc3vU$A{a7*(UOIV|DPBST~MtmNq$~bI_zp*#s&2?tpb#8fhviSG$)#cb?sB zgTu!ve!JwC>z!k6$cjP&w_)1~t;B8pxy@4-{0!dsmMWJQ74)xFP6vr|>r`Yc(O0Q@ zk52NoOJXp2ORIf&$eA-vHM5`fW(gnM#u!QO->ggum-ucyoPJi-bl7W2XKm%ajX(v5 zXIvYh(zyR^Kbf1KGVPKGy6RVDvlwXQLh-#cJ0$(+3{?d7h3soBp5T2c$wwrYc-Zwc zcGYo_b2#6tV#v8MFstl>3_DXyjh|~Ds5BRNuz{LOzAo9vj<`T7vivL}Y?mSwd-@Uz zwpwp1!t+w4_R~$?S@gRM-7HDy`T+YDkQzM#_GE7UZ?-JIJG7qD4h`X@vjAT6v$s~I z=<*o<@6b|h3vuY8;|1J5`%T7_7~0S%Rl|Gepb)zRc67SA@>x)7XRL=r^&3p0gA^YhjrZqQwvH>*WPs4+*)9HnP2) zV#LUKkNQJ7CyJITtZ5xWk8iO%@++#Z={eK5pAg>2KM#KEeOG#Q{V|)H5d>4Ibqo9n zM9HLEFyO+xgTqCZ8!ooKBredv9AN-bb)&aT4$C4`|nv677*2ahHAZd0K*JX$rr4LIBNVPdRh zE7sFUv;|W|bV>>0IJ!l4=A2fa_>agtJ|gD68553m(+uw-F#x5jfb9 z+qe%>a?G`cjI~I&*6!{_4z$|d*Jp9_%cJ4~ z7hG(u=JR@^_Y`k-)JJ7>MzhYZKl*}h%i=(KWLJy6L3ANb_D6DL9ND2enyyZ_*cd7x zf;u83h8=q0<79_P?}Eoivs3uZ#^`5BIm#Y;7ljCioqHM`MM?2Tn z&U$Q(L;HOwcVwvaiKZOLr*MFiS6u({2II;0|IvoOsH4sCp8sbp8yga7y!}hl9o_$8S?FUO z*8{@+ibzr+ysDBbEUty#*umU#U zA3bdpbAhyR4k$KbtiYF}n!Z?eo5a_fCNlQ5uOOL1wyVX5>41*5?q>hcSmpsK`l%8x zy8MJ*#8UlN4Q=g4$xpOd>~860#As?!$NJJ`1|`Xp$Te`w&1NVU_v?`Iw{J;SA(Ja1 zO?~a;*MTp}qk_48%T+k-tvR@CzM*T957SCD%)yrs#pGHWw{0i8$AD0fCz9Cx*6< zTB+3aD%49q!v1>mlA`f+%+@7%0n5lRx*jtsdIqbHbO{9o$PjvjQo%XO=k@m4FM>q5 zMM2_7_tz-lbkTd&ad-=DUNv9Qr@)*;p{;ABoVhmesi4=?YI~izY}u(#xK=V+{D6`{ zB$xK0HM5Q5vl+ZRo6`G{_v)Q{OmH5qNq^|<>{lOYks$PdapGO)caDO;%Z%j_6>;hM z!(u+OM?)n|iYeY<+0mKlrujV^d&H)q<9;KCuHlp857K;sJ2pET2~z9~?$j}Kt88k~FIqv4pSE`I zW*{3^wlt3r^5h8?eJn8^v2)vaL!HEFcVBxT;&J_L6n73d)lf5RG#c9Gc!I9`Ece;+ z&A@4bvDSDz`?U$}F~Y49STElqgzO4j`z$ij>>l$>b;IHIt0Z3&D&%_D{hD5faOdtT zDcf%wXNZ^@=Ws61Ty#f6kb_e=ig^~D=*R$U+ zns5^BRX>%TYnoCi4%mNz8TqB0If{IsT&~>3LoM4|Vfw14^!AEz|J$x2#Tl})E&;>! z;zE*Catp-jGMy>8QrC)!X`33pPh_8$Rh;!Fz#J72FpLI-he}!-8fvwh%@d)}v zS<7NN!rr5cPyIm3@-VP?pc7Z9mna=40JuW?@0D>+)A=>ER512*aQ*(_7#f2RM1txY z76{aH4Fpm?#lHytyf7T^o*nsZXzoQF?>w`CCrX&(W4I?oh<~o!)gWNUp9`Q^J#}3Y z2?RPIJ-*a*LaYSm1wjIAZtQ9c`QEI`<>x?rk(~S`068cDxjOh1kmXCi3WziqIIe6A z0h^s68(bqXUqle-D-ke7ry!MG{%hn0+gs@W{SennI@vD)L)3+ZR(KbhbDi$vo!Xyb z!0|^wEdv9dBbn*xg=fGG#?$bO9Z&lL_dGh|`y z?xR{{T7WIxIK>Q0?z{#pYwrRvwzd6!k@bg?*ng3}zFxXJ0K^m%+SF|o&aEfO(eIy{ zx^F&@U!*{FGQxnT6yQhj)a$j>|KsERM?*X+ zu<%n(pO9Al$bo^lp+NgAevR|5@$gd!kJ@QF!-3^|h%od_c5D3;9Ts|HAF$heJ6RrUcq8lGN7+1QU zvnalY!ZYSXGlYe;643Ecv2z1|9{tt-2s~2G!2G%cZ~uD{Us30km;=W64lq2S zQ?LIP^v?tFPg(I*`=}rRGa2Y|+%Nuw1jGIbs}nz|B&mKBa*w==7$8You-V^dKxz-E z8Nz|5RNx12-ak-n%s&oOXT*Di8iR<#?>c;1i5|tCf1o-8M2WL56aDG)f6#oxhG!(~Na&VsYbmOR=99FZ8J27#=$d2o)rq15H4Pz(t6pBw;+k^>m5 zeNjS;XpI;2emok?cqo#W`wn0FkKeqAac+_PSVULJWp`*pHE1I&X) zzU%_PRB?{ZFP{QKS_yNWN%eRB`m%P84$cr!a|qZOYO0PiWl0YR*#0<{oB{b;aueSW z0GSMce6;vEA=~QT2>B?HQMNUP9G!4v{^3u~g3Vi^^R4PAFac8!q%%Lz#~1(AwEqh+ z{zEB?-+v=(1~^S>V2|R?DYzmH|4X?4j)f5lf(Tgv?XW@zf#OeLzux`7#15Q_HMg}g zg{XpE9Bf^GJQWK)g2n}iCN7W$+tLFb`P2wl`+wsIzUQ*a$D#30_}AUQ&dye5;4^h+ zJ814=I^bX3384M!+MEB*!<{m^vo!b9T+va{@*{T!DDMw+Fb?xCSL$cH)K`~2?h+8J zS&)t!d7Mzi1kAau)z4t=O-4?Cv@Uyy1ikqpHho?R%&`YMb4o4SST$e)lL|nGP8jSy z!2F^$>KRb%Lb~9O>a_;~-%_T!G&=PWc#Wjb1~fRwitSOuJ38=36F{DR$uGhn<|X`AH- zrYV#XdR3l_0DF#~zg(=2oZ8U^jI)sVF<-|I1CnktB51Fof8o54{EO@px<&X2X%oW! ziiY9P0H7Pyo{-ul*k9MS_Aem|s$1v@X;8raqTZp<7@(W9{a_!ou)nTl8#D~)j#)ow zB?Ihv_s@c64&6}bgsPcge_MMYXjIU>eNL!_1@_l<`hkW4-3;c0NZ4V2MQfP91b(PS zEk6(k>~Cn>0*wc{6~hS?^86NUIRh7Tx%?B#hfeZT1%?S Date: Wed, 22 Sep 2021 13:34:46 +0000 Subject: [PATCH 391/699] Update dependencies from https://github.com/dotnet/xliff-tasks build 20210921.1 (#7935) [main] Update dependencies from dotnet/xliff-tasks --- eng/Version.Details.xml | 4 ++-- eng/Versions.props | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index 39ec67e4601..cf3d73de8ab 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -68,9 +68,9 @@ https://github.com/dotnet/symreader-converter c5ba7c88f92e2dde156c324a8c8edc04d9fa4fe0 - + https://github.com/dotnet/xliff-tasks - f7165ff3841f2c5b1b77355a6d2edb2d2f52a2d3 + f8634d0b717926af79d5039d0b8f6fce82e1134d diff --git a/eng/Versions.props b/eng/Versions.props index dcca6743147..33a175e3916 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -78,7 +78,7 @@ 1.1.0-beta-21470-02 1.1.0-beta-21470-02 7.0.0-beta.21470.4 - 1.0.0-beta.21470.1 + 1.0.0-beta.21471.1 1.1.0-beta.21378.2 1.0.0-prerelease.21465.1 2.0.0-preview.1.21466.7 From 8b2142306838fb8e155e12c1d8a9f59c9c4cd73f Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Wed, 22 Sep 2021 14:46:05 +0000 Subject: [PATCH 392/699] Update dependencies from https://github.com/dotnet/arcade build 20210921.3 (#7937) [main] Update dependencies from dotnet/arcade --- eng/Version.Details.xml | 20 ++++++++++---------- eng/Versions.props | 6 +++--- global.json | 4 ++-- 3 files changed, 15 insertions(+), 15 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index cf3d73de8ab..30d98b5e2b5 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -11,25 +11,25 @@ - + https://github.com/dotnet/arcade - f959b455e6feceeaee50f95e07dac7b8e470bc2e + 42b72b125d07dbc8fb3145fc10a8f332961bc0ba - + https://github.com/dotnet/arcade - f959b455e6feceeaee50f95e07dac7b8e470bc2e + 42b72b125d07dbc8fb3145fc10a8f332961bc0ba - + https://github.com/dotnet/arcade - f959b455e6feceeaee50f95e07dac7b8e470bc2e + 42b72b125d07dbc8fb3145fc10a8f332961bc0ba - + https://github.com/dotnet/arcade - f959b455e6feceeaee50f95e07dac7b8e470bc2e + 42b72b125d07dbc8fb3145fc10a8f332961bc0ba - + https://github.com/dotnet/arcade - f959b455e6feceeaee50f95e07dac7b8e470bc2e + 42b72b125d07dbc8fb3145fc10a8f332961bc0ba https://github.com/dotnet/arcade-services diff --git a/eng/Versions.props b/eng/Versions.props index 33a175e3916..1999f9f0eec 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -65,8 +65,8 @@ 2.4.1 2.0.3 2.4.1 - 7.0.0-beta.21470.4 - 7.0.0-beta.21470.4 + 7.0.0-beta.21471.3 + 7.0.0-beta.21471.3 1.22.0 1.1.2 2.0.0 @@ -77,7 +77,7 @@ 1.1.0-beta.20258.6 1.1.0-beta-21470-02 1.1.0-beta-21470-02 - 7.0.0-beta.21470.4 + 7.0.0-beta.21471.3 1.0.0-beta.21471.1 1.1.0-beta.21378.2 1.0.0-prerelease.21465.1 diff --git a/global.json b/global.json index 077d9364c82..0c6b0b12c60 100644 --- a/global.json +++ b/global.json @@ -3,7 +3,7 @@ "dotnet": "6.0.100-rc.1.21430.12" }, "msbuild-sdks": { - "Microsoft.DotNet.Arcade.Sdk": "7.0.0-beta.21470.4", - "Microsoft.DotNet.Helix.Sdk": "7.0.0-beta.21470.4" + "Microsoft.DotNet.Arcade.Sdk": "7.0.0-beta.21471.3", + "Microsoft.DotNet.Helix.Sdk": "7.0.0-beta.21471.3" } } From e036bd9465b017d8b0c2d82a45120b58dbf23c5f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C5=99emek=20Vysok=C3=BD?= Date: Wed, 22 Sep 2021 17:27:09 +0200 Subject: [PATCH 393/699] Make XHarness logs readable recursively (#7934) Files are created with bad permissions thanks to the launchctl workaround. Some of the logs produced by the Mono VM team are in folders so we need to chmod them recursively. --- .../Sdk/tools/xharness-runner/xharness-runner.apple.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Microsoft.DotNet.Helix/Sdk/tools/xharness-runner/xharness-runner.apple.sh b/src/Microsoft.DotNet.Helix/Sdk/tools/xharness-runner/xharness-runner.apple.sh index 4e4528e3cc2..86897e2e97a 100644 --- a/src/Microsoft.DotNet.Helix/Sdk/tools/xharness-runner/xharness-runner.apple.sh +++ b/src/Microsoft.DotNet.Helix/Sdk/tools/xharness-runner/xharness-runner.apple.sh @@ -174,8 +174,8 @@ if [ $exit_code -eq 81 ] && [[ "$target" =~ "device" ]]; then touch './.reboot' fi -# The simulator logs comming from the sudo-spawned Simulator.app are not readable by the helix uploader -chmod 0644 "$output_directory"/*.log +# The simulator logs comming from the sudo-spawned Simulator.app are not readable/deletable by the helix uploader +chmod -R 0766 "$output_directory" # Remove empty files find "$output_directory" -name "*.log" -maxdepth 1 -size 0 -print -delete From c7546c02b92d9d5cbad2345e15a5962253bf6560 Mon Sep 17 00:00:00 2001 From: Matt Mitchell Date: Thu, 23 Sep 2021 12:13:07 -0700 Subject: [PATCH 394/699] Update Wix tools acquisition (#7947) Update the wix tooling acquisition so that it pulls in the new version that is required for .NET 6. --- .../build/wix/wix.targets | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Microsoft.DotNet.Build.Tasks.Installers/build/wix/wix.targets b/src/Microsoft.DotNet.Build.Tasks.Installers/build/wix/wix.targets index 86ee8067fe3..2156679165f 100644 --- a/src/Microsoft.DotNet.Build.Tasks.Installers/build/wix/wix.targets +++ b/src/Microsoft.DotNet.Build.Tasks.Installers/build/wix/wix.targets @@ -25,7 +25,7 @@ - 3.14.0.4118 + 1.0.0-v3.14.0.4118 $(BaseIntermediateOutputPath)WixTools.$(WixVersion)/ $(WixToolsDir) @@ -36,10 +36,10 @@ $(InstallerTargetArchitecture) $(MSBuildThisFileDirectory)..\acquisition\acquire-wix\acquire-wix.proj - wix.$(WixVersion).zip - https://dotnetcli.azureedge.net/build/wix/$(WixDownloadFilename) + Microsoft.Signed.Wix-$(WixVersion).zip + https://netcorenativeassets.blob.core.windows.net/resource-packages/external/windows/wix/$(WixDownloadFilename) $(WixToolsDir)$(WixDownloadFilename) - $(WixToolsDir)WixDownload.$(WixVersion).sentinel + $(WixToolsDir)$(WixDownloadFilename).sentinel From ab4eae7acd9f862aef6bcad8d11b1fea99a0bb9e Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Thu, 23 Sep 2021 21:31:51 +0000 Subject: [PATCH 395/699] [main] Update dependencies from dotnet/xliff-tasks dotnet/arcade dotnet/linker (#7942) [main] Update dependencies from dotnet/xliff-tasks dotnet/arcade dotnet/linker --- eng/Version.Details.xml | 28 ++++++++++++++-------------- eng/Versions.props | 10 +++++----- global.json | 4 ++-- 3 files changed, 21 insertions(+), 21 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index 30d98b5e2b5..bea6b7fb24d 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -11,25 +11,25 @@ - + https://github.com/dotnet/arcade - 42b72b125d07dbc8fb3145fc10a8f332961bc0ba + 8b2142306838fb8e155e12c1d8a9f59c9c4cd73f - + https://github.com/dotnet/arcade - 42b72b125d07dbc8fb3145fc10a8f332961bc0ba + 8b2142306838fb8e155e12c1d8a9f59c9c4cd73f - + https://github.com/dotnet/arcade - 42b72b125d07dbc8fb3145fc10a8f332961bc0ba + 8b2142306838fb8e155e12c1d8a9f59c9c4cd73f - + https://github.com/dotnet/arcade - 42b72b125d07dbc8fb3145fc10a8f332961bc0ba + 8b2142306838fb8e155e12c1d8a9f59c9c4cd73f - + https://github.com/dotnet/arcade - 42b72b125d07dbc8fb3145fc10a8f332961bc0ba + 8b2142306838fb8e155e12c1d8a9f59c9c4cd73f https://github.com/dotnet/arcade-services @@ -47,9 +47,9 @@ https://github.com/dotnet/roslyn c1d8c6f043bc80425c6828455eb57f8a404759c6 - + https://github.com/dotnet/linker - 60e655fc7089f6123e61fede21bf99bd1d819713 + d51cc207fac85547787bbba83f54f69d8e72e9f5 https://github.com/dotnet/sourcelink @@ -68,9 +68,9 @@ https://github.com/dotnet/symreader-converter c5ba7c88f92e2dde156c324a8c8edc04d9fa4fe0 - + https://github.com/dotnet/xliff-tasks - f8634d0b717926af79d5039d0b8f6fce82e1134d + d3413141e57befa40137d48b33e62098e8c84b15 diff --git a/eng/Versions.props b/eng/Versions.props index 1999f9f0eec..947b6faf155 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -36,7 +36,7 @@ 2.1.0 4.0.0-5.21469.2 16.7.1 - 6.0.100-1.21467.2 + 6.0.100-1.21473.1 4.8.3 5.3.0.1 2.3.0 @@ -65,8 +65,8 @@ 2.4.1 2.0.3 2.4.1 - 7.0.0-beta.21471.3 - 7.0.0-beta.21471.3 + 7.0.0-beta.21472.4 + 7.0.0-beta.21472.4 1.22.0 1.1.2 2.0.0 @@ -77,8 +77,8 @@ 1.1.0-beta.20258.6 1.1.0-beta-21470-02 1.1.0-beta-21470-02 - 7.0.0-beta.21471.3 - 1.0.0-beta.21471.1 + 7.0.0-beta.21472.4 + 1.0.0-beta.21472.1 1.1.0-beta.21378.2 1.0.0-prerelease.21465.1 2.0.0-preview.1.21466.7 diff --git a/global.json b/global.json index 0c6b0b12c60..ae8a05511a9 100644 --- a/global.json +++ b/global.json @@ -3,7 +3,7 @@ "dotnet": "6.0.100-rc.1.21430.12" }, "msbuild-sdks": { - "Microsoft.DotNet.Arcade.Sdk": "7.0.0-beta.21471.3", - "Microsoft.DotNet.Helix.Sdk": "7.0.0-beta.21471.3" + "Microsoft.DotNet.Arcade.Sdk": "7.0.0-beta.21472.4", + "Microsoft.DotNet.Helix.Sdk": "7.0.0-beta.21472.4" } } From fcd1fdbf0802f009ddad771a36885525d07a8e5b Mon Sep 17 00:00:00 2001 From: Epsitha Ananth <47157394+epananth@users.noreply.github.com> Date: Thu, 23 Sep 2021 16:44:18 -0700 Subject: [PATCH 396/699] Exclude symbols from publishing to symbol server (#7722) * Update doc * review comment --- Documentation/CorePackages/Publishing.md | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/Documentation/CorePackages/Publishing.md b/Documentation/CorePackages/Publishing.md index f93df9216d5..d41c112c225 100644 --- a/Documentation/CorePackages/Publishing.md +++ b/Documentation/CorePackages/Publishing.md @@ -575,3 +575,16 @@ The aka.ms links are generated using the `BuildQuality` parameter that is passed ### What build qualities are supported? The build qualities that are supported are daily, signed, validated, preview, and ga. All official daily builds that publish using V3 should use the `daily` build quality. Signed and validated builds are generated by the staging process of the release process. Preview and GA links are generated at release time, on release day. All builds that have preview in the release version will be of the `preview` quality. All other builds will be marked as `GA`. GA builds do not append a build quality to the links. + +### Can we exclude symbols from publishing to symbols server? +Yes. + +Create a file eng/SymbolPublishingExclusionsFile.txt in your repo, add the file name that has to be excluded from symbol publishing in SymbolPublishingExclusionsFile.txt. + +Eg: + tools/x86_arm/mscordaccore.dll + tools/x86_arm/mscordbi.dll + tools/x64_arm64/mscordaccore.dll + tools/x64_arm64/mscordbi.dll + +During publishing, arcade will pick up SymbolPublishingExclusionsFile.txt and exclude the symbols mentioned in it. From 8f58bb36250772fc0a4a0305daf307292a75a735 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C5=99emek=20Vysok=C3=BD?= Date: Fri, 24 Sep 2021 12:24:06 +0200 Subject: [PATCH 397/699] Time-constrain user commands in XHarness workloads (#7936) We have to make sure that user commands are time-constrained so that we have buffer to call clean-up and send the telemetry at the end of the job. We do this by bumping the original work item timeout and setting a timeout for the injected user commands. --- .../ZipArchiveManager.cs | 2 +- .../CreateXHarnessAndroidWorkItemsTests.cs | 4 +- .../CreateXHarnessAppleWorkItemsTests.cs | 4 +- .../Sdk/CreateXHarnessAndroidWorkItems.cs | 26 ++++++++++++- .../Sdk/CreateXHarnessAppleWorkItems.cs | 9 +++-- .../Sdk/Microsoft.DotNet.Helix.Sdk.csproj | 3 ++ .../Sdk/XharnessTaskBase.cs | 6 ++- .../xharness-helix-job.android.header.ps1 | 39 +++++++++++++++++++ .../xharness-helix-job.android.ps1 | 37 +++++++++++------- .../xharness-helix-job.android.sh | 9 ++++- .../xharness-runner/xharness-runner.apple.sh | 11 ++++-- 11 files changed, 121 insertions(+), 29 deletions(-) create mode 100644 src/Microsoft.DotNet.Helix/Sdk/tools/xharness-runner/xharness-helix-job.android.header.ps1 diff --git a/src/Common/Microsoft.Arcade.Common/ZipArchiveManager.cs b/src/Common/Microsoft.Arcade.Common/ZipArchiveManager.cs index dc1c04ea252..02fbdc0e8ab 100644 --- a/src/Common/Microsoft.Arcade.Common/ZipArchiveManager.cs +++ b/src/Common/Microsoft.Arcade.Common/ZipArchiveManager.cs @@ -57,7 +57,7 @@ public async Task AddContentToArchive(string archivePath, string targetFilename, await content.CopyToAsync(targetStream); } - private static Stream GetResourceFileContent(string resourceFileName) + public static Stream GetResourceFileContent(string resourceFileName) { Assembly assembly = typeof(TAssembly).Assembly; return assembly.GetManifestResourceStream($"{assembly.GetName().Name}.{resourceFileName}"); diff --git a/src/Microsoft.DotNet.Helix/Sdk.Tests/Microsoft.DotNet.Helix.Sdk.Tests/CreateXHarnessAndroidWorkItemsTests.cs b/src/Microsoft.DotNet.Helix/Sdk.Tests/Microsoft.DotNet.Helix.Sdk.Tests/CreateXHarnessAndroidWorkItemsTests.cs index 450f915700b..95309c9fe40 100644 --- a/src/Microsoft.DotNet.Helix/Sdk.Tests/Microsoft.DotNet.Helix.Sdk.Tests/CreateXHarnessAndroidWorkItemsTests.cs +++ b/src/Microsoft.DotNet.Helix/Sdk.Tests/Microsoft.DotNet.Helix.Sdk.Tests/CreateXHarnessAndroidWorkItemsTests.cs @@ -76,7 +76,7 @@ public void AndroidXHarnessWorkItemIsCreated() var workItem = _task.WorkItems.First(); workItem.GetMetadata("Identity").Should().Be("System.Foo"); - workItem.GetMetadata("Timeout").Should().Be("00:15:42"); + workItem.GetMetadata("Timeout").Should().Be("00:16:02"); var payloadArchive = workItem.GetMetadata("PayloadArchive"); payloadArchive.Should().NotBeNullOrEmpty(); @@ -178,7 +178,7 @@ public void ZippedApkIsProvided() var workItem = _task.WorkItems.First(); workItem.GetMetadata("Identity").Should().Be("System.Foo"); - workItem.GetMetadata("Timeout").Should().Be("00:15:42"); + workItem.GetMetadata("Timeout").Should().Be("00:16:02"); var payloadArchive = workItem.GetMetadata("PayloadArchive"); payloadArchive.Should().NotBeNullOrEmpty(); diff --git a/src/Microsoft.DotNet.Helix/Sdk.Tests/Microsoft.DotNet.Helix.Sdk.Tests/CreateXHarnessAppleWorkItemsTests.cs b/src/Microsoft.DotNet.Helix/Sdk.Tests/Microsoft.DotNet.Helix.Sdk.Tests/CreateXHarnessAppleWorkItemsTests.cs index 5ce4b415574..5ff6f153d38 100644 --- a/src/Microsoft.DotNet.Helix/Sdk.Tests/Microsoft.DotNet.Helix.Sdk.Tests/CreateXHarnessAppleWorkItemsTests.cs +++ b/src/Microsoft.DotNet.Helix/Sdk.Tests/Microsoft.DotNet.Helix.Sdk.Tests/CreateXHarnessAppleWorkItemsTests.cs @@ -79,7 +79,7 @@ public void AppleXHarnessWorkItemIsCreated() var workItem = _task.WorkItems.First(); workItem.GetMetadata("Identity").Should().Be("System.Foo"); - workItem.GetMetadata("Timeout").Should().Be("00:15:42"); + workItem.GetMetadata("Timeout").Should().Be("00:16:02"); var payloadArchive = workItem.GetMetadata("PayloadArchive"); payloadArchive.Should().NotBeNullOrEmpty(); @@ -225,7 +225,7 @@ public void ZippedAppIsProvided() var workItem = _task.WorkItems.First(); workItem.GetMetadata("Identity").Should().Be("System.Foo"); - workItem.GetMetadata("Timeout").Should().Be("00:15:42"); + workItem.GetMetadata("Timeout").Should().Be("00:16:02"); var payloadArchive = workItem.GetMetadata("PayloadArchive"); payloadArchive.Should().NotBeNullOrEmpty(); diff --git a/src/Microsoft.DotNet.Helix/Sdk/CreateXHarnessAndroidWorkItems.cs b/src/Microsoft.DotNet.Helix/Sdk/CreateXHarnessAndroidWorkItems.cs index 7752e58eb6a..88a3049415c 100644 --- a/src/Microsoft.DotNet.Helix/Sdk/CreateXHarnessAndroidWorkItems.cs +++ b/src/Microsoft.DotNet.Helix/Sdk/CreateXHarnessAndroidWorkItems.cs @@ -25,6 +25,7 @@ public static class MetadataNames private const string PosixAndroidWrapperScript = "xharness-helix-job.android.sh"; private const string NonPosixAndroidWrapperScript = "xharness-helix-job.android.ps1"; + private const string NonPosixAndroidHeaderScript = "xharness-helix-job.android.header.ps1"; ///

/// Boolean true if this is a posix shell, false if not. @@ -105,7 +106,13 @@ private async Task PrepareWorkItem(IZipArchiveManager zipArchiveManag apkName = apkName.Replace(".zip", ".apk"); } - string command = GetHelixCommand(appPackage, apkName, androidPackageName, testTimeout, expectedExitCode); + string command = GetHelixCommand(appPackage, apkName, androidPackageName, workItemTimeout, testTimeout, expectedExitCode); + + if (!IsPosixShell) + { + // For windows, we need to add a .ps1 header to turn the script into a cmdlet + customCommands = GetPowerShellHeader() + customCommands; + } string workItemZip = await CreatePayloadArchive( zipArchiveManager, @@ -150,7 +157,13 @@ private string GetDefaultCommand(ITaskItem appPackage, int expectedExitCode) $"{ devOutArg } { instrumentationArg } { exitCodeArg } { extraArguments } { passthroughArgs }"; } - private string GetHelixCommand(ITaskItem appPackage, string apkName, string androidPackageName, TimeSpan xHarnessTimeout, int expectedExitCode) + private string GetHelixCommand( + ITaskItem appPackage, + string apkName, + string androidPackageName, + TimeSpan workItemTimeout, + TimeSpan xHarnessTimeout, + int expectedExitCode) { appPackage.TryGetMetadata(MetadataNames.AndroidInstrumentationName, out string androidInstrumentationName); appPackage.TryGetMetadata(MetadataNames.DeviceOutputPath, out string deviceOutputPath); @@ -163,6 +176,7 @@ private string GetHelixCommand(ITaskItem appPackage, string apkName, string andr string dash = IsPosixShell ? "--" : "-"; string xharnessRunCommand = $"{xharnessHelixWrapperScript} " + $"{dash}app \"{apkName}\" " + + $"{dash}command_timeout {(int)workItemTimeout.TotalSeconds} " + $"{dash}timeout \"{xHarnessTimeout}\" " + $"{dash}package_name \"{androidPackageName}\" " + (expectedExitCode != 0 ? $" {dash}expected_exit_code \"{expectedExitCode}\" " : string.Empty) + @@ -173,5 +187,13 @@ private string GetHelixCommand(ITaskItem appPackage, string apkName, string andr return xharnessRunCommand; } + + private static string GetPowerShellHeader() + { + using Stream stream = ZipArchiveManager.GetResourceFileContent( + ScriptNamespace + NonPosixAndroidHeaderScript); + using StreamReader reader = new(stream); + return reader.ReadToEnd(); + } } } diff --git a/src/Microsoft.DotNet.Helix/Sdk/CreateXHarnessAppleWorkItems.cs b/src/Microsoft.DotNet.Helix/Sdk/CreateXHarnessAppleWorkItems.cs index 74f3844d572..e324eea4bec 100644 --- a/src/Microsoft.DotNet.Helix/Sdk/CreateXHarnessAppleWorkItems.cs +++ b/src/Microsoft.DotNet.Helix/Sdk/CreateXHarnessAppleWorkItems.cs @@ -1,6 +1,7 @@ using System; using System.IO; using System.Linq; +using System.Threading; using System.Threading.Tasks; using Microsoft.Arcade.Common; using Microsoft.Build.Framework; @@ -168,11 +169,11 @@ private async Task PrepareWorkItem( if (customCommands == null) { // When no user commands are specified, we add the default `apple test ...` command - customCommands = GetDefaultCommand(target, includesTestRunner, resetSimulator); + customCommands = GetDefaultCommand(includesTestRunner, resetSimulator); } string appName = isAlreadyArchived ? $"{fileSystem.GetFileNameWithoutExtension(appFolderPath)}.app" : fileSystem.GetFileName(appFolderPath); - string helixCommand = GetHelixCommand(appName, target, testTimeout, launchTimeout, includesTestRunner, expectedExitCode, resetSimulator); + string helixCommand = GetHelixCommand(appName, target, workItemTimeout, testTimeout, launchTimeout, includesTestRunner, expectedExitCode, resetSimulator); string payloadArchivePath = await CreatePayloadArchive( zipArchiveManager, fileSystem, @@ -196,7 +197,7 @@ private bool ValidateAppBundlePath( return isAlreadyArchived ? fileSystem.FileExists(appBundlePath) : fileSystem.DirectoryExists(appBundlePath); } - private string GetDefaultCommand(string target, bool includesTestRunner, bool resetSimulator) => + private string GetDefaultCommand(bool includesTestRunner, bool resetSimulator) => $"xharness apple {(includesTestRunner ? "test" : "run")} " + "--app \"$app\" " + "--output-directory \"$output_directory\" " + @@ -213,6 +214,7 @@ private string GetDefaultCommand(string target, bool includesTestRunner, bool re private string GetHelixCommand( string appName, string target, + TimeSpan workItemTimeout, TimeSpan testTimeout, TimeSpan launchTimeout, bool includesTestRunner, @@ -222,6 +224,7 @@ private string GetHelixCommand( $"chmod +x {EntryPointScript} && ./{EntryPointScript} " + $"--app \"{appName}\" " + $"--target \"{target}\" " + + $"--command-timeout {(int)workItemTimeout.TotalSeconds} " + $"--timeout \"{testTimeout}\" " + $"--launch-timeout \"{launchTimeout}\" " + (includesTestRunner ? "--includes-test-runner " : string.Empty) + diff --git a/src/Microsoft.DotNet.Helix/Sdk/Microsoft.DotNet.Helix.Sdk.csproj b/src/Microsoft.DotNet.Helix/Sdk/Microsoft.DotNet.Helix.Sdk.csproj index bdd3f36214f..00d025178e6 100644 --- a/src/Microsoft.DotNet.Helix/Sdk/Microsoft.DotNet.Helix.Sdk.csproj +++ b/src/Microsoft.DotNet.Helix/Sdk/Microsoft.DotNet.Helix.Sdk.csproj @@ -35,6 +35,9 @@ Never + + Never + Never diff --git a/src/Microsoft.DotNet.Helix/Sdk/XharnessTaskBase.cs b/src/Microsoft.DotNet.Helix/Sdk/XharnessTaskBase.cs index 079ccf16866..63546bc06cf 100644 --- a/src/Microsoft.DotNet.Helix/Sdk/XharnessTaskBase.cs +++ b/src/Microsoft.DotNet.Helix/Sdk/XharnessTaskBase.cs @@ -14,6 +14,7 @@ public abstract class XHarnessTaskBase : MSBuildTaskBase { private static readonly TimeSpan s_defaultWorkItemTimeout = TimeSpan.FromMinutes(20); private static readonly TimeSpan s_defaultTestTimeout = TimeSpan.FromMinutes(12); + protected static readonly TimeSpan s_telemetryBuffer = TimeSpan.FromSeconds(20); // extra time to send the XHarness telemetry public class MetadataName { @@ -23,7 +24,7 @@ public class MetadataName public const string CustomCommands = "CustomCommands"; } - private const string ScriptNamespace = "tools.xharness_runner."; + protected const string ScriptNamespace = "tools.xharness_runner."; private const string CustomCommandsScript = "command"; private const string DiagnosticsScript = "xharness-event-reporter.py"; @@ -102,6 +103,9 @@ protected Build.Utilities.TaskItem CreateTaskItem(string workItemName, string pa { Log.LogMessage($"Creating work item with properties Identity: {workItemName}, Payload: {payloadArchivePath}, Command: {command}"); + // Leave some time at the end of the work item to send the telemetry (in case it times out) + timeout += s_telemetryBuffer; + return new(workItemName, new Dictionary() { { "Identity", workItemName }, diff --git a/src/Microsoft.DotNet.Helix/Sdk/tools/xharness-runner/xharness-helix-job.android.header.ps1 b/src/Microsoft.DotNet.Helix/Sdk/tools/xharness-runner/xharness-helix-job.android.header.ps1 new file mode 100644 index 00000000000..a8033609966 --- /dev/null +++ b/src/Microsoft.DotNet.Helix/Sdk/tools/xharness-runner/xharness-helix-job.android.header.ps1 @@ -0,0 +1,39 @@ +<# +This script is used as a payload of Helix jobs that execute Android workloads through XHarness on Windows systems. +This file is a header of script that gets populated with user's custom commands. + +This script is separate as it is executed with a timeout in its own process. +#> + +param ( + [Parameter(Mandatory)] + [string]$output_directory, + [Parameter(Mandatory)] + [string]$app, + [Parameter(Mandatory)] + [string]$timeout, + [Parameter()] + [string]$package_name = $null, + [Parameter()] + [int]$expected_exit_code = 0, + [Parameter()] + [string]$device_output_path = $null, + [Parameter()] + [string]$instrumentation = $null +) + +$ErrorActionPreference="Continue" + +# The xharness alias +function xharness() { + dotnet exec $Env:XHARNESS_CLI_PATH @args +} + +# User can call this when they detect a problem they think is caused by the infrastructure +function report_infrastructure_failure($message) { + Write-Output "Infrastructural problem reported by the user, requesting retry+reboot: $message" + + & "$Env:HELIX_PYTHONPATH" -c "from helix.workitemutil import request_infra_retry; request_infra_retry('Retrying because we could not enumerate all Android devices')" + & "$Env:HELIX_PYTHONPATH" -c "from helix.workitemutil import request_reboot; request_reboot('Rebooting to allow Android emulator or device to restart')" +} + diff --git a/src/Microsoft.DotNet.Helix/Sdk/tools/xharness-runner/xharness-helix-job.android.ps1 b/src/Microsoft.DotNet.Helix/Sdk/tools/xharness-runner/xharness-helix-job.android.ps1 index 92dd6bef839..8c0a4e21a9b 100644 --- a/src/Microsoft.DotNet.Helix/Sdk/tools/xharness-runner/xharness-helix-job.android.ps1 +++ b/src/Microsoft.DotNet.Helix/Sdk/tools/xharness-runner/xharness-helix-job.android.ps1 @@ -12,6 +12,8 @@ param ( [string]$app, [Parameter(Mandatory)] [string]$timeout, + [Parameter(Mandatory)] + [int]$command_timeout, # in seconds [Parameter()] [string]$package_name = $null, [Parameter()] @@ -22,24 +24,33 @@ param ( [string]$instrumentation = $null ) -$ErrorActionPreference="Stop" - -[Diagnostics.CodeAnalysis.SuppressMessageAttribute("PSUseDeclaredVarsMoreThanAssignments", "")] # Variable used in sourced script -$output_directory=$Env:HELIX_WORKITEM_UPLOAD_ROOT - -# The xharness alias -function xharness() { - dotnet exec $Env:XHARNESS_CLI_PATH @args -} - $ErrorActionPreference="Continue" # Act out the actual commands -. "$PSScriptRoot\command.ps1" +# We have to time constrain them to create buffer for the end of this script +$psinfo = [System.Diagnostics.ProcessStartInfo]::new() +$psinfo.FileName = "powershell" +$psinfo.Arguments = " -ExecutionPolicy ByPass -NoProfile -File `"$PSScriptRoot\command.ps1`" -output_directory `"$Env:HELIX_WORKITEM_UPLOAD_ROOT`" -app `"$app`" -timeout `"$timeout`" -package_name `"$package_name`" -expected_exit_code `"$expected_exit_code`" -device_output_path `"$device_output_path`" -instrumentation `"$instrumentation`"" +$psinfo.RedirectStandardError = $false +$psinfo.RedirectStandardOutput = $false +$psinfo.UseShellExecute = $false -$ErrorActionPreference="Continue" +$process = [System.Diagnostics.Process]::new() +$process.StartInfo = $psinfo +$process.Start() -$exit_code=$LASTEXITCODE +Wait-Process -InputObject $process -TimeOut $command_timeout -ErrorVariable ev -ErrorAction SilentlyContinue + +if ($ev) { + $exit_code = -3 + Stop-Process -InputObject $process -Force + $process.WaitForExit() + [Console]::Out.Flush() + Write-Output "User command timed out after $command_timeout seconds!" +} else { + $exit_code = $process.ExitCode + Write-Output "User command ended with $exit_code" +} $retry=$false $reboot=$false diff --git a/src/Microsoft.DotNet.Helix/Sdk/tools/xharness-runner/xharness-helix-job.android.sh b/src/Microsoft.DotNet.Helix/Sdk/tools/xharness-runner/xharness-helix-job.android.sh index 81962d5356a..ce025ebc736 100644 --- a/src/Microsoft.DotNet.Helix/Sdk/tools/xharness-runner/xharness-helix-job.android.sh +++ b/src/Microsoft.DotNet.Helix/Sdk/tools/xharness-runner/xharness-helix-job.android.sh @@ -12,6 +12,7 @@ echo "XHarness Helix Job Wrapper calling '$@'" set -x app='' +command_timeout=20 timeout='' package_name='' expected_exit_code=0 @@ -26,6 +27,10 @@ while [[ $# -gt 0 ]]; do app="$2" shift ;; + --command_timeout) + command_timeout="$2" + shift + ;; --timeout) timeout="$2" shift @@ -67,8 +72,8 @@ function xharness() { dotnet exec $XHARNESS_CLI_PATH "$@" } -# Act out the actual commands -source command.sh +# Act out the actual commands (and time constrain them to create buffer for the end of this script) +source command.sh & PID=$! ; (sleep $command_timeout && kill $PID 2> /dev/null & ) ; wait $PID exit_code=$? diff --git a/src/Microsoft.DotNet.Helix/Sdk/tools/xharness-runner/xharness-runner.apple.sh b/src/Microsoft.DotNet.Helix/Sdk/tools/xharness-runner/xharness-runner.apple.sh index 86897e2e97a..6edac5fe051 100644 --- a/src/Microsoft.DotNet.Helix/Sdk/tools/xharness-runner/xharness-runner.apple.sh +++ b/src/Microsoft.DotNet.Helix/Sdk/tools/xharness-runner/xharness-runner.apple.sh @@ -10,6 +10,7 @@ app='' target='' timeout='' launch_timeout='' +command_timeout=20 xcode_version='' app_arguments='' expected_exit_code=0 @@ -31,6 +32,10 @@ while [[ $# -gt 0 ]]; do timeout="$2" shift ;; + --command-timeout) + command_timeout="$2" + shift + ;; --launch-timeout) launch_timeout="$2" shift @@ -139,8 +144,8 @@ function xharness() { dotnet exec "$XHARNESS_CLI_PATH" "$@" } -# Act out the actual commands -source command.sh +# Act out the actual commands (and time constrain them to create buffer for the end of this script) +source command.sh & PID=$! ; (sleep $command_timeout && kill $PID 2> /dev/null & ) ; wait $PID exit_code=$? # Exit code values - https://github.com/dotnet/xharness/blob/main/src/Microsoft.DotNet.XHarness.Common/CLI/ExitCode.cs @@ -183,7 +188,7 @@ find "$output_directory" -name "*.log" -maxdepth 1 -size 0 -print -delete # Rename test result XML so that AzDO reporter recognizes it test_results=$(ls "$output_directory"/xunit-*.xml) if [ -f "$test_results" ]; then - echo "Found test results in $output_directory/$test_results. Renaming to testResults.xml to prepare for Helix upload" + echo "Found test results in $test_results. Renaming to testResults.xml to prepare for Helix upload" # Prepare test results for Helix to pick up mv "$test_results" "$output_directory/testResults.xml" From 3ea0d860c6973f2cbadc9e895c7ec2cbdaec4ad5 Mon Sep 17 00:00:00 2001 From: Eric StJohn Date: Fri, 24 Sep 2021 06:57:20 -0700 Subject: [PATCH 398/699] Don't escape script content (#7955) --- .../src/GenerateMacOSDistributionFile.cs | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/src/Microsoft.DotNet.Build.Tasks.Installers/src/GenerateMacOSDistributionFile.cs b/src/Microsoft.DotNet.Build.Tasks.Installers/src/GenerateMacOSDistributionFile.cs index fd36cd6251c..15d92ce899a 100644 --- a/src/Microsoft.DotNet.Build.Tasks.Installers/src/GenerateMacOSDistributionFile.cs +++ b/src/Microsoft.DotNet.Build.Tasks.Installers/src/GenerateMacOSDistributionFile.cs @@ -40,8 +40,7 @@ public override bool Execute() var titleElement = new XElement("title", $"{ProductBrandName} ({TargetArchitecture})"); - var archScriptContent = @""; - var scriptElement = new XElement("script", new XText(archScriptContent)); +}"; + var scriptElement = new XElement("script", new XCData(archScriptContent)); var choiceElements = BundledPackages .Select(component => new XElement("choice", From e43b85e9b4e9ca62b89e407acdf0e56a2cbfd81a Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Fri, 24 Sep 2021 15:50:45 +0000 Subject: [PATCH 399/699] [main] Update dependencies from dotnet/xliff-tasks dotnet/arcade dotnet/sourcelink (#7957) [main] Update dependencies from dotnet/xliff-tasks dotnet/arcade dotnet/sourcelink --- eng/Version.Details.xml | 32 ++++++++++++++++---------------- eng/Versions.props | 12 ++++++------ global.json | 4 ++-- 3 files changed, 24 insertions(+), 24 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index bea6b7fb24d..6f4ba200553 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -11,25 +11,25 @@ - + https://github.com/dotnet/arcade - 8b2142306838fb8e155e12c1d8a9f59c9c4cd73f + c7546c02b92d9d5cbad2345e15a5962253bf6560 - + https://github.com/dotnet/arcade - 8b2142306838fb8e155e12c1d8a9f59c9c4cd73f + c7546c02b92d9d5cbad2345e15a5962253bf6560 - + https://github.com/dotnet/arcade - 8b2142306838fb8e155e12c1d8a9f59c9c4cd73f + c7546c02b92d9d5cbad2345e15a5962253bf6560 - + https://github.com/dotnet/arcade - 8b2142306838fb8e155e12c1d8a9f59c9c4cd73f + c7546c02b92d9d5cbad2345e15a5962253bf6560 - + https://github.com/dotnet/arcade - 8b2142306838fb8e155e12c1d8a9f59c9c4cd73f + c7546c02b92d9d5cbad2345e15a5962253bf6560 https://github.com/dotnet/arcade-services @@ -51,14 +51,14 @@ https://github.com/dotnet/linker d51cc207fac85547787bbba83f54f69d8e72e9f5 - + https://github.com/dotnet/sourcelink - fd48bde3c9769842b41fe696f15a16b1008bae18 + 76dead04f4f2774e23e70b093a4fd618fc01b7ff - + https://github.com/dotnet/sourcelink - fd48bde3c9769842b41fe696f15a16b1008bae18 + 76dead04f4f2774e23e70b093a4fd618fc01b7ff https://github.com/dotnet/symreader-converter @@ -68,9 +68,9 @@ https://github.com/dotnet/symreader-converter c5ba7c88f92e2dde156c324a8c8edc04d9fa4fe0 - + https://github.com/dotnet/xliff-tasks - d3413141e57befa40137d48b33e62098e8c84b15 + dcaca495a46b8837c4478221a2e0ac430082ece3 diff --git a/eng/Versions.props b/eng/Versions.props index 947b6faf155..e6fde2f3281 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -65,8 +65,8 @@ 2.4.1 2.0.3 2.4.1 - 7.0.0-beta.21472.4 - 7.0.0-beta.21472.4 + 7.0.0-beta.21473.1 + 7.0.0-beta.21473.1 1.22.0 1.1.2 2.0.0 @@ -75,10 +75,10 @@ 2.0.4 1.1.0-beta2-19575-01 1.1.0-beta.20258.6 - 1.1.0-beta-21470-02 - 1.1.0-beta-21470-02 - 7.0.0-beta.21472.4 - 1.0.0-beta.21472.1 + 1.1.0-beta-21473-03 + 1.1.0-beta-21473-03 + 7.0.0-beta.21473.1 + 1.0.0-beta.21473.1 1.1.0-beta.21378.2 1.0.0-prerelease.21465.1 2.0.0-preview.1.21466.7 diff --git a/global.json b/global.json index ae8a05511a9..23ed7a33bb1 100644 --- a/global.json +++ b/global.json @@ -3,7 +3,7 @@ "dotnet": "6.0.100-rc.1.21430.12" }, "msbuild-sdks": { - "Microsoft.DotNet.Arcade.Sdk": "7.0.0-beta.21472.4", - "Microsoft.DotNet.Helix.Sdk": "7.0.0-beta.21472.4" + "Microsoft.DotNet.Arcade.Sdk": "7.0.0-beta.21473.1", + "Microsoft.DotNet.Helix.Sdk": "7.0.0-beta.21473.1" } } From 34142128b2804318c0bb65203da4945fdcbeae81 Mon Sep 17 00:00:00 2001 From: Michelle McDaniel Date: Fri, 24 Sep 2021 11:43:16 -0700 Subject: [PATCH 400/699] Update the version of Microsoft.Data.OData (#7953) * Update the version of Microsoft.Data.OData * Fix the syntax * Update Microsoft.Data.Services.Client as well --- eng/Versions.props | 2 ++ .../Microsoft.DotNet.Build.Tasks.Feed.Tests.csproj | 1 + .../Microsoft.DotNet.Build.Tasks.Feed.csproj | 2 ++ .../Microsoft.DotNet.GitSync.CommitManager.csproj | 1 + src/Microsoft.DotNet.GitSync/Microsoft.DotNet.GitSync.csproj | 2 ++ .../JobSender/Microsoft.DotNet.Helix.JobSender.csproj | 1 + .../Sdk/Microsoft.DotNet.Helix.Sdk.csproj | 1 + 7 files changed, 10 insertions(+) diff --git a/eng/Versions.props b/eng/Versions.props index e6fde2f3281..7c386a26037 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -19,6 +19,8 @@ 3.0.0 1.3.1 0.1.0 + 5.8.4 + 5.8.4 15.7.179 15.7.179 15.7.179 diff --git a/src/Microsoft.DotNet.Build.Tasks.Feed.Tests/Microsoft.DotNet.Build.Tasks.Feed.Tests.csproj b/src/Microsoft.DotNet.Build.Tasks.Feed.Tests/Microsoft.DotNet.Build.Tasks.Feed.Tests.csproj index 062e998cfe1..36d4aa93871 100644 --- a/src/Microsoft.DotNet.Build.Tasks.Feed.Tests/Microsoft.DotNet.Build.Tasks.Feed.Tests.csproj +++ b/src/Microsoft.DotNet.Build.Tasks.Feed.Tests/Microsoft.DotNet.Build.Tasks.Feed.Tests.csproj @@ -11,6 +11,7 @@ + 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 5d85ef6bc24..b440b7a4865 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 @@ -17,6 +17,8 @@ + + diff --git a/src/Microsoft.DotNet.GitSync.CommitManager/Microsoft.DotNet.GitSync.CommitManager.csproj b/src/Microsoft.DotNet.GitSync.CommitManager/Microsoft.DotNet.GitSync.CommitManager.csproj index 1af776d0448..744fa0c8752 100644 --- a/src/Microsoft.DotNet.GitSync.CommitManager/Microsoft.DotNet.GitSync.CommitManager.csproj +++ b/src/Microsoft.DotNet.GitSync.CommitManager/Microsoft.DotNet.GitSync.CommitManager.csproj @@ -12,6 +12,7 @@ + diff --git a/src/Microsoft.DotNet.GitSync/Microsoft.DotNet.GitSync.csproj b/src/Microsoft.DotNet.GitSync/Microsoft.DotNet.GitSync.csproj index d471bfc554d..b060021b7d8 100644 --- a/src/Microsoft.DotNet.GitSync/Microsoft.DotNet.GitSync.csproj +++ b/src/Microsoft.DotNet.GitSync/Microsoft.DotNet.GitSync.csproj @@ -14,6 +14,8 @@ + + diff --git a/src/Microsoft.DotNet.Helix/JobSender/Microsoft.DotNet.Helix.JobSender.csproj b/src/Microsoft.DotNet.Helix/JobSender/Microsoft.DotNet.Helix.JobSender.csproj index 15e40f99a0b..1c57d6d76a7 100644 --- a/src/Microsoft.DotNet.Helix/JobSender/Microsoft.DotNet.Helix.JobSender.csproj +++ b/src/Microsoft.DotNet.Helix/JobSender/Microsoft.DotNet.Helix.JobSender.csproj @@ -9,6 +9,7 @@ + diff --git a/src/Microsoft.DotNet.Helix/Sdk/Microsoft.DotNet.Helix.Sdk.csproj b/src/Microsoft.DotNet.Helix/Sdk/Microsoft.DotNet.Helix.Sdk.csproj index 00d025178e6..e689a1f9cc1 100644 --- a/src/Microsoft.DotNet.Helix/Sdk/Microsoft.DotNet.Helix.Sdk.csproj +++ b/src/Microsoft.DotNet.Helix/Sdk/Microsoft.DotNet.Helix.Sdk.csproj @@ -11,6 +11,7 @@ + From 9ab314e39dc623d53c3c7a63a6f63772b01ff6b3 Mon Sep 17 00:00:00 2001 From: Michael Stuckey Date: Sat, 25 Sep 2021 13:45:40 -0700 Subject: [PATCH 401/699] Rename test nupkg assets (#7959) Avoids conflict with packages in nuget.org --- .../Microsoft.DotNet.NuGetRepack.Tests.csproj | 72 +++++++++--------- .../Resources/A.1.0.0-beta-12345-01.nupkg | Bin 1762 -> 0 bytes .../tests/Resources/A.1.0.0-beta-final.nupkg | Bin 1757 -> 0 bytes .../tests/Resources/A.1.0.0.nupkg | Bin 1742 -> 0 bytes .../Resources/B.1.0.0-beta-12345-01.nupkg | Bin 1742 -> 0 bytes .../tests/Resources/B.1.0.0-beta-final.nupkg | Bin 1734 -> 0 bytes .../tests/Resources/B.1.0.0.nupkg | Bin 1719 -> 0 bytes .../Resources/C.1.0.0-beta-12345-01.nupkg | Bin 1668 -> 0 bytes .../tests/Resources/C.1.0.0-beta-final.nupkg | Bin 1663 -> 0 bytes .../tests/Resources/C.1.0.0.nupkg | Bin 1648 -> 0 bytes .../tests/Resources/D.1.0.0-beta-final.nupkg | Bin 1772 -> 0 bytes .../tests/Resources/D.1.0.0.nupkg | Bin 1752 -> 0 bytes .../Resources/E.1.0.0-beta.12345.1.nupkg | Bin 1667 -> 0 bytes .../tests/Resources/E.1.0.0-beta.final.nupkg | Bin 1676 -> 0 bytes .../tests/Resources/E.1.0.0.nupkg | Bin 1648 -> 0 bytes .../Resources/F.1.0.0-beta.12345.1.nupkg | Bin 1670 -> 0 bytes .../tests/Resources/F.1.0.0-beta.final.nupkg | Bin 1669 -> 0 bytes .../tests/Resources/F.1.0.0.nupkg | Bin 1642 -> 0 bytes .../TestPackageA.1.0.0-beta-12345-01.nupkg | Bin 0 -> 1870 bytes .../TestPackageA.1.0.0-beta-final.nupkg | Bin 0 -> 1863 bytes .../tests/Resources/TestPackageA.1.0.0.nupkg | Bin 0 -> 1847 bytes .../{A.nuspec => TestPackageA.nuspec} | 0 .../TestPackageB.1.0.0-beta-12345-01.nupkg | Bin 0 -> 1846 bytes .../TestPackageB.1.0.0-beta-final.nupkg | Bin 0 -> 1837 bytes .../tests/Resources/TestPackageB.1.0.0.nupkg | Bin 0 -> 1821 bytes .../{B.nuspec => TestPackageB.nuspec} | 2 +- .../TestPackageC.1.0.0-beta-12345-01.nupkg | Bin 0 -> 1778 bytes .../TestPackageC.1.0.0-beta-final.nupkg | Bin 0 -> 1771 bytes .../tests/Resources/TestPackageC.1.0.0.nupkg | Bin 0 -> 1758 bytes .../{C.nuspec => TestPackageC.nuspec} | 4 +- ...=> TestPackageD.1.0.0-beta-12345-01.nupkg} | Bin 2386 -> 2216 bytes .../TestPackageD.1.0.0-beta-final.nupkg | Bin 0 -> 1822 bytes .../tests/Resources/TestPackageD.1.0.0.nupkg | Bin 0 -> 1802 bytes .../{D.nuspec => TestPackageD.nuspec} | 2 +- .../TestPackageE.1.0.0-beta.12345.1.nupkg | Bin 0 -> 1779 bytes .../TestPackageE.1.0.0-beta.final.nupkg | Bin 0 -> 1784 bytes .../tests/Resources/TestPackageE.1.0.0.nupkg | Bin 0 -> 1759 bytes .../{E.nuspec => TestPackageE.nuspec} | 4 +- .../TestPackageF.1.0.0-beta.12345.1.nupkg | Bin 0 -> 1780 bytes .../TestPackageF.1.0.0-beta.final.nupkg | Bin 0 -> 1778 bytes .../tests/Resources/TestPackageF.1.0.0.nupkg | Bin 0 -> 1750 bytes .../{F.nuspec => TestPackageF.nuspec} | 2 +- .../tests/TestHelpers/TestResources.cs | 72 +++++++++--------- .../tests/VersionUpdaterTests.cs | 62 +++++++-------- 44 files changed, 110 insertions(+), 110 deletions(-) delete mode 100644 src/Microsoft.DotNet.NuGetRepack/tests/Resources/A.1.0.0-beta-12345-01.nupkg delete mode 100644 src/Microsoft.DotNet.NuGetRepack/tests/Resources/A.1.0.0-beta-final.nupkg delete mode 100644 src/Microsoft.DotNet.NuGetRepack/tests/Resources/A.1.0.0.nupkg delete mode 100644 src/Microsoft.DotNet.NuGetRepack/tests/Resources/B.1.0.0-beta-12345-01.nupkg delete mode 100644 src/Microsoft.DotNet.NuGetRepack/tests/Resources/B.1.0.0-beta-final.nupkg delete mode 100644 src/Microsoft.DotNet.NuGetRepack/tests/Resources/B.1.0.0.nupkg delete mode 100644 src/Microsoft.DotNet.NuGetRepack/tests/Resources/C.1.0.0-beta-12345-01.nupkg delete mode 100644 src/Microsoft.DotNet.NuGetRepack/tests/Resources/C.1.0.0-beta-final.nupkg delete mode 100644 src/Microsoft.DotNet.NuGetRepack/tests/Resources/C.1.0.0.nupkg delete mode 100644 src/Microsoft.DotNet.NuGetRepack/tests/Resources/D.1.0.0-beta-final.nupkg delete mode 100644 src/Microsoft.DotNet.NuGetRepack/tests/Resources/D.1.0.0.nupkg delete mode 100644 src/Microsoft.DotNet.NuGetRepack/tests/Resources/E.1.0.0-beta.12345.1.nupkg delete mode 100644 src/Microsoft.DotNet.NuGetRepack/tests/Resources/E.1.0.0-beta.final.nupkg delete mode 100644 src/Microsoft.DotNet.NuGetRepack/tests/Resources/E.1.0.0.nupkg delete mode 100644 src/Microsoft.DotNet.NuGetRepack/tests/Resources/F.1.0.0-beta.12345.1.nupkg delete mode 100644 src/Microsoft.DotNet.NuGetRepack/tests/Resources/F.1.0.0-beta.final.nupkg delete mode 100644 src/Microsoft.DotNet.NuGetRepack/tests/Resources/F.1.0.0.nupkg create mode 100644 src/Microsoft.DotNet.NuGetRepack/tests/Resources/TestPackageA.1.0.0-beta-12345-01.nupkg create mode 100644 src/Microsoft.DotNet.NuGetRepack/tests/Resources/TestPackageA.1.0.0-beta-final.nupkg create mode 100644 src/Microsoft.DotNet.NuGetRepack/tests/Resources/TestPackageA.1.0.0.nupkg rename src/Microsoft.DotNet.NuGetRepack/tests/Resources/{A.nuspec => TestPackageA.nuspec} (100%) create mode 100644 src/Microsoft.DotNet.NuGetRepack/tests/Resources/TestPackageB.1.0.0-beta-12345-01.nupkg create mode 100644 src/Microsoft.DotNet.NuGetRepack/tests/Resources/TestPackageB.1.0.0-beta-final.nupkg create mode 100644 src/Microsoft.DotNet.NuGetRepack/tests/Resources/TestPackageB.1.0.0.nupkg rename src/Microsoft.DotNet.NuGetRepack/tests/Resources/{B.nuspec => TestPackageB.nuspec} (97%) create mode 100644 src/Microsoft.DotNet.NuGetRepack/tests/Resources/TestPackageC.1.0.0-beta-12345-01.nupkg create mode 100644 src/Microsoft.DotNet.NuGetRepack/tests/Resources/TestPackageC.1.0.0-beta-final.nupkg create mode 100644 src/Microsoft.DotNet.NuGetRepack/tests/Resources/TestPackageC.1.0.0.nupkg rename src/Microsoft.DotNet.NuGetRepack/tests/Resources/{C.nuspec => TestPackageC.nuspec} (75%) rename src/Microsoft.DotNet.NuGetRepack/tests/Resources/{D.1.0.0-beta-12345-01.nupkg => TestPackageD.1.0.0-beta-12345-01.nupkg} (52%) create mode 100644 src/Microsoft.DotNet.NuGetRepack/tests/Resources/TestPackageD.1.0.0-beta-final.nupkg create mode 100644 src/Microsoft.DotNet.NuGetRepack/tests/Resources/TestPackageD.1.0.0.nupkg rename src/Microsoft.DotNet.NuGetRepack/tests/Resources/{D.nuspec => TestPackageD.nuspec} (94%) create mode 100644 src/Microsoft.DotNet.NuGetRepack/tests/Resources/TestPackageE.1.0.0-beta.12345.1.nupkg create mode 100644 src/Microsoft.DotNet.NuGetRepack/tests/Resources/TestPackageE.1.0.0-beta.final.nupkg create mode 100644 src/Microsoft.DotNet.NuGetRepack/tests/Resources/TestPackageE.1.0.0.nupkg rename src/Microsoft.DotNet.NuGetRepack/tests/Resources/{E.nuspec => TestPackageE.nuspec} (81%) create mode 100644 src/Microsoft.DotNet.NuGetRepack/tests/Resources/TestPackageF.1.0.0-beta.12345.1.nupkg create mode 100644 src/Microsoft.DotNet.NuGetRepack/tests/Resources/TestPackageF.1.0.0-beta.final.nupkg create mode 100644 src/Microsoft.DotNet.NuGetRepack/tests/Resources/TestPackageF.1.0.0.nupkg rename src/Microsoft.DotNet.NuGetRepack/tests/Resources/{F.nuspec => TestPackageF.nuspec} (94%) diff --git a/src/Microsoft.DotNet.NuGetRepack/tests/Microsoft.DotNet.NuGetRepack.Tests.csproj b/src/Microsoft.DotNet.NuGetRepack/tests/Microsoft.DotNet.NuGetRepack.Tests.csproj index 8cf795a5854..ad1d93e7128 100644 --- a/src/Microsoft.DotNet.NuGetRepack/tests/Microsoft.DotNet.NuGetRepack.Tests.csproj +++ b/src/Microsoft.DotNet.NuGetRepack/tests/Microsoft.DotNet.NuGetRepack.Tests.csproj @@ -17,59 +17,59 @@ - - A.1.0.0-beta-12345-01.nupkg + + TestPackageA.1.0.0-beta-12345-01.nupkg - - B.1.0.0-beta-12345-01.nupkg + + TestPackageB.1.0.0-beta-12345-01.nupkg - - C.1.0.0-beta-12345-01.nupkg + + TestPackageC.1.0.0-beta-12345-01.nupkg - - D.1.0.0-beta-12345-01.nupkg + + TestPackageD.1.0.0-beta-12345-01.nupkg - - E.1.0.0-beta.12345.1.nupkg + + TestPackageE.1.0.0-beta.12345.1.nupkg - - F.1.0.0-beta.12345.1.nupkg + + TestPackageF.1.0.0-beta.12345.1.nupkg - - A.1.0.0-beta-final.nupkg + + TestPackageA.1.0.0-beta-final.nupkg - - B.1.0.0-beta-final.nupkg + + TestPackageB.1.0.0-beta-final.nupkg - - C.1.0.0-beta-final.nupkg + + TestPackageC.1.0.0-beta-final.nupkg - - D.1.0.0-beta-final.nupkg + + TestPackageD.1.0.0-beta-final.nupkg - - E.1.0.0-beta.final.nupkg + + TestPackageE.1.0.0-beta.final.nupkg - - F.1.0.0-beta.final.nupkg + + TestPackageF.1.0.0-beta.final.nupkg - - A.1.0.0.nupkg + + TestPackageA.1.0.0.nupkg - - B.1.0.0.nupkg + + TestPackageB.1.0.0.nupkg - - C.1.0.0.nupkg + + TestPackageC.1.0.0.nupkg - - D.1.0.0.nupkg + + TestPackageD.1.0.0.nupkg - - E.1.0.0.nupkg + + TestPackageE.1.0.0.nupkg - - F.1.0.0.nupkg + + TestPackageF.1.0.0.nupkg Signed.1.2.3.nupkg diff --git a/src/Microsoft.DotNet.NuGetRepack/tests/Resources/A.1.0.0-beta-12345-01.nupkg b/src/Microsoft.DotNet.NuGetRepack/tests/Resources/A.1.0.0-beta-12345-01.nupkg deleted file mode 100644 index a2e3ef151bf5942471259f16686c675b82307c8b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1762 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 DYEQbw diff --git a/src/Microsoft.DotNet.NuGetRepack/tests/Resources/B.1.0.0-beta-12345-01.nupkg b/src/Microsoft.DotNet.NuGetRepack/tests/Resources/B.1.0.0-beta-12345-01.nupkg deleted file mode 100644 index e21edfc8917f320171d3840d1345abd9da876f2d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1742 zcmWIWW@Zs#U|`^2VDqf@*1W@&$-&6L@E(Y{fuiw6sX4{^dLVM@#PeB9h63&HTlYDi zxa+&^*bLouPWgMg^e4>qxfbxbUB&D7H{L5vL0oSOXZ+kZQ-1T!y}yNbCg|z4P5dUi zoQ2ut@gbW_#ap>u%WofVKP%_IYun7Cl9dzKT8%CxuYEalBa{1=T_uKz8M4xwuWy}N zndW(T_PmLqd&}157wZp|#Rh+y^U?IPl|}c`prQ+v z$E*N_yC%u4HrtiOX82g?soV2c8}7{c z<|}?ioc)LO;jq1?7o;almTEC{;??G!=DqTbRBJ%2);)(^X(HY+tG3Qzk%KpGUt6@%`He%RH2b_G;sxE!lU6Nxl9XAVURJi}+x6q>bMw1-t6EQa ztQC@J7j#>&Lo8^mP|WSrg4X9Re@f~~)~9JZ@U8P{x_)ii^%jYJZA~*bOxSbDO+WWU zsbk%Sb<8teK2C8lUX&Hg#J}Aw;X03ER6}Z0Rxvp5=Cq*O9cFv zP2a50rJ30!cRFkLwW*%(XDMoA2FWeFFH*v2_xQEwo-3Q0e2N0t@+{gf868!O-PFtI z^>0n}K8C~Ek+<#!oO84O<2q$Q%kD_d-Yo0ieM>wFwnaSnrl+<$cY<7n9ml-wyZgWW zFx>TG`4eZ&@3Q=h4R1}B`>pv?&}+Y!U5u*ynn|T+Z7Tj3TG%d}TB=*xp)S&|_tL)0 zJ-l?qj_TR${1Yc#i(m5Zz0)sV)KK5OKyJ@TU}#SQhP*J4j&{z^D@n~Oi4UnPNG*=l ztH{lnJK><$5d(p?_f78wil&-fZSL5zyZx&94RMaknbJAx&S|^WN}jG= zx?3K8JGz@2)#r+@CmK`&eO<-Gzz_)Zc|l@wc4B&}esOA1S!Qx-v3_o9Nn%Q3Nuqvo zeo?A!K~a7|YEelhP{PzOEhX77CD|;=!qOxq#l*tWG%Y#Jz|71d%{Dz*7qL2<=4!Sw$8lOq3byz;-K6DQK74cu5ML7nw8}K_+;C^YM(1^sawsn z@0t65PK&uyw}tmN_lw@msZ&0wBqdC}eC*xn70a#m_2sRW4{t5vIRC=R!RSHci%oS) zLnZeLmuf5Sl9PT{pua`vf&=%oJsy=>i#k;gT>HO0F+}at;n|&1ZH@dlPn?~sBAWkt zx%gMUwLQIGRn|5IU%&Fu{pM$bRlHtrH%xuv-tM=m`Oe|#!Fo{&D^)!|PStt0EF;k4 zbi~4|UWy(?5o>#$p2zyO?pQHTlQ(YRON}?{cS(1iJ~h+GO6SNGwht_^B5u!0nzUjX z)IaL+h%f(~v$1FL7J>9a75)MlnXGuxq^dqAW!trfpEj-BXB{^CpZSHJzm|8)4sK4E zd;Z4yeGBClZn+?QD(%?3-?7P8lx4QRW7u})QtaGV{o<9IYZz~SN;`EvuJ>x*hn&r+ zmh(T)Pn>A8^Wp5@y44Ohog|(e5UYvos88dR_o(^rcvU^Xn~_O`0e4XhjBF%;R4}7! zL@$yMx(tB{2Ub9#>q5^`2wls8NexQ|LpK0DWg-k%$V`KD8sN>!2C{+$2=#&f>SP7+ E0LxUv5dZ)H diff --git a/src/Microsoft.DotNet.NuGetRepack/tests/Resources/B.1.0.0-beta-final.nupkg b/src/Microsoft.DotNet.NuGetRepack/tests/Resources/B.1.0.0-beta-final.nupkg deleted file mode 100644 index 637db00b52c8114523e79597e7576c3ed9a2cdd7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1734 zcmWIWW@Zs#VBp|jVDqf@*1W@&$-&6L@E(Y{85kJii&Arn_4PpH)QRV_m<$El-?#2_ zK5^G~+p!tC>zwlUcIi);>vJvObGwSy?{BId_n|pr??@Z9sYn%8@ zb~y{P%i}{fmx{M?yO!TR-hNijf7iB|MI|dIu(cXpN?!YN=0+y>FS|+%6EkF`H(%d6 zwKC1~@a%aLZ431x_my5qQ+;yIn@^szK4NdPjQ5tU%`es;DvJ&NHs_=1XDf^Dr9nj( zDvwzOeY@0J?8z}@&#Z~>s@E<#AbMSD$%Df#oWEaxs&`G2TWz*0i_P${(o?tRuQuG7 z^UYWMj5zxb>%(DtO)p4Km@L&|=)|kdJ!ZSSgm^wyV69wV^(dQ!^Syzf>%xI zoejJ9=h`y{pafWug^Z3LFt8+9fMEy>Fekmd(&B>DQGcy#a{GJlTx#jQIk08$ZoQf%aQJ$Fk?^!h*KfTz z)D|=SNqed237xLzD!Wux8H#==$Yv=!DzHd3LTyIs?-NIZmTaH0V|{!+PK&f}Nswlq z@@MAvD#o_!n>OuUc8BNghv_REIKM}$ZdrHta=D6Y)8?l_<>H37*EaDy_^Dy@K5YJ* zpPIWQraehk{k~UHEqIH#EuZ%%cnpYAZQdy8% z9IIE6n=^O9L9Zjg;D6urUZ7~I+12KbExX&Vn%@xTxST1SqwbuxYfb+C&C&i%TylrM zpZ)K6>u=@EyPVxieCF1#k$yix;d|$?bL*`_^y~KT-k;q+zvq#U+RHynPOVqu@Y&(A z(pXtivM6%Vt<61+$~8v>4+meiVL!3NBkE=8;oGx{-%9fp&b_*KK5y>Frp*=QH=bm# z|2(nMPvB~WMd1InA+@1dyZ2ZcsZL`T-otI57BNlkN4??+R&71EZnZzguB#0W>96GJ z+NHbY;kTo^xlw)oDe`$xG0@j>ObiTxK%W;RCTAz6r|K7{7L{ctrxxqyrj{h8B$g!V zC+8QX>J}8`7o--IWCA5j4bxJR4O5cMk}NDuQc_GTEKSpr(+teaEYi$VO-wBG3W{@6 zk_&Q!yz_1w2<+urxYgBbqV5vDr3{+4^rEC0leXNv^yGx1&cs6nAxG0+FLHk+>czb- zN#y3l&vq4`PuTCTJN^6mx>S3{=CA9#isq^E%=va~m-AGfD@(SYtkvD>Ug2_|c~a|v zMaNpVUJU)@bY*?(3-+9y$D0kJ9JpmIxRjpn^hncVEPEJxu;t8|>j~-CEc$A6)b9CC zd-|yI^IOmT4$FgHGife=xM-GWViR+JV62N&|J+3emS4Q&uQHzVTl%75O5l{1Tl{Kiu-!y&!br``M4mLbZaYcx!}}e_r&az4TarV{ZAHC+2^g zbGp;ZYkp@Qw_E&5fz5K0YP{#icrnY+pWi%R?GNx~WD;S(T?7N883`a2$mkl;iz0+B zLtv7D6-?;5&@&T4*HU02!;-bo4M0zm2m|Ib(;$Tgc(byBtY85`eW1S@SwTDibRx#K diff --git a/src/Microsoft.DotNet.NuGetRepack/tests/Resources/B.1.0.0.nupkg b/src/Microsoft.DotNet.NuGetRepack/tests/Resources/B.1.0.0.nupkg deleted file mode 100644 index cbfb9f546b22100fed33a12a68f2b8302fc8e862..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1719 zcmWIWW@Zs#VBp|jVDqf@*1W@&$-&6L@E(Y{85kJii&Arn_4PpH)QRV_m<$El-?#2_ zK5^G~+p!tC>zwlUcIi);>vJvObGwSy?{BId_n|pr??@Z9sYn%8@ zb~y{P%i}{fmx{M?yO!TR-hNijf7iB|MI|dIu(cXpN?!YN=0+y>FS|+%6EkF`H(%d6 zwKC1~@a%aLZ431x_my5qQ+;yIn@^szK4NdPjQ5tU%`es;DvJ&NHs_=1XDf^Dr9nj( zDvwzOeY@0J?8z}@&#Z~>s@E<#AbMSD$%Df#oWEaxs&`G2TWz*0i_P${(o?tRuQuG7 z^UYWMj5zxb>%(DtO)p4Km@L&|=)|kdJ!ZSSgm^wyV69wV^(dQ!^Syzf>%xI zoejJ9=h`y{pafV{q5M8qU|{jF0K*U%U`~2@rNsrQ$y0+J{SF%l>{0&6etNmmREx~k zmI;%&s(4Rz3O`D?Is4e6jm~czDy7-y9T6{RZl1Ji$&;kavh=dD>));)SC4&rO1G-@ zmdDy88CFHN1v|uoa+B`d`146>{iM&vQHKA{m^H}6&Xf?p7G~Ze5$AByC%`K%dvURJ zLF^>?b*ml361S*46b(@xXpP=x)^VqrdRw4Rz`*-ip?w{ZD$VctvpCzZ(D{}bka9L@rEGbzOx#-sB zo<`-GBZ7y6FWa!6SmF`&vh?unS;cRq`3mP=-8-K*_hZxMit-yzve$o}Sm`HlwZbCs z|Jsn+(5&5iER9sBu?z3vwoi+gCikOW@dT^3o?ExtA7j_m28Z-l@^tOe-SY6;(cRpr zJ{RLz#*+*5bubeHLm<%S1&PVoiRr2O#i>PQnaQce`njnki7AOCiTcU;MX9<4MfnA( zMJ1U)2~)$glw`w{WV0j-OOuoo6AMezwB$4cGc$`c^HdWP3%!Ek+?3>k+)0jkw+#eb z*E?n8P7X@p?)24k=u+#x=GGvQyPe0fh{Jn{flTPfo4Za-ENZ>bv|7To{K=p1?8ftJ z{(n}>kH6jamyPGzZljYGvkVGuNx%Ml(w( zuH{}br)_g~QA;47P2a0ULDe~;ts9+}e{p>K@XAU7-3dlrQ!H}L-Y>g4$xCYQC5|qe zFzMA7+2bdRh+h>>RLIyOd-Tex-GO`8%;CsR;@GyWA^pK3h4YQ!hWYcnK7QBYFOadB z72x@?GACq#Z_UIE)AHk4x9u6u-st~4Tem`Pwute!rTHt|HDtfEteUy;_`jVSe@V-f z|6^EpX7h8a{c&Qao*ZTR^t9?$-`_3gekg8u+b8;`>;93Bie1lcueUDiU)5@HqEYup zP*;80#N@j9_KSZp1b8zti7?qAFtNZ&B6MBo*$AO)4lsFP i$yDeDpr=NJ0n?aikTwInS=m5VumGVx&|gKYARYj$^1Lhn diff --git a/src/Microsoft.DotNet.NuGetRepack/tests/Resources/C.1.0.0-beta-12345-01.nupkg b/src/Microsoft.DotNet.NuGetRepack/tests/Resources/C.1.0.0-beta-12345-01.nupkg deleted file mode 100644 index 120efff7730782c8d1e7926e3efea6556b4e284e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1668 zcmWIWW@Zs#U|`^2VDqf@4t;-$nUj%$;XM#@14ZMDQge#+^+4p*iKnv;8wj|5Z~fPN z!ERd4>S?i$QZ9yWSF|^nc5GY57l$CH-`_>IG`0j~O#i$i{axy|-{sXx;youT%rEVF zG-W|>ob>jdFLR#z`hVYjy!|bs|AffXWq zY~rTrr{)GbxSm`s_j2L;C0Aq}tbMi$ z*X`fEKf8Z^&m$kTmw%R=TCd3Av%_Vjv9hFOQRJdqn|m6SYmNvW4!&%|eqxD7)XUPt zw`UcbCIy=6=z;Id#e>m868Jmyf+W zy<)l5zP`NG^5LyT9OqwHIT$^Ne6gu+X{h90;ZkkIU2@Xz3iP)KU2x!@w#TDVYf-1_ zfouP_Cx)nfIy}2ms;!a#=83bDRYdb&FBkvHx3;JEtIFD@;Okc&y5Ib4u!`5~?S`pO z+}r(DHQzZrJybXDNt0GggZf839`WU$b2j!&-Xf4*sKQ?$Ba;;`npD;2 zq-?wP@YAN1|4P@G{mow>`MY@6+otq`R`WOR-nUS0;g$=+r_zqi`yHEnMOkM1JBDp% zF2&A`)h}MTxrXuPr?gY&<9e^=eaP9IYB~S&{KSbiJ0H&ety}GI(@Eml0kN9Mj`}oC zd5@a^j#t$KycwB97;qP$z{o}dNX03-M)Yz7q00!EaA2hhx-RrAh0qlXOlnv%7`g%I dDHCBpI5Q2>X@EB?8^{V4Ak+u?%bpd)0{~*Zq`?3H diff --git a/src/Microsoft.DotNet.NuGetRepack/tests/Resources/C.1.0.0-beta-final.nupkg b/src/Microsoft.DotNet.NuGetRepack/tests/Resources/C.1.0.0-beta-final.nupkg deleted file mode 100644 index e5a0ea88689dd914603121a6307281fad4c667fe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1663 zcmWIWW@Zs#VBp|jVDqf@4t;-$nUj%$;XM#@GcYj37p3MD>+6BYsS{6U9X1ef{oeYo z`GVcFoYm7}AEjIj-L7bFFzwj3j4uvBPQSm4ZfR@@%9#FnNBXOT#%Yv8tCYE#DHgy^2c_K^r&)2500gg zjNuiGj|7Cur7x-}`XyFMv(Gys&XL2ld+H9CSs#xWZ?nH|f27Kq?+vSR7g??I z8~E!*8RwqN-fFS?-RAr=v!=y=-fw(I|F~VE_p?Uh8Nbudw>CEHW$i8!m=cc~R=XF- z?Kueyqe;N95(d)I&iQ#Isd**wA(aKG#j$!7xjAzu9P~P3Akg-{>AgVFRI{ti9b0y{ zUp2oW&T%vQq-0U#qFbAL8kK8~2p$f;Y{PzHiAU7S z(!;lB6~C3{E1Y|E?|k0ek4>8^%5OZ$UjKPwrJumn3X8!1YeQ;7vv%*XG*X?$F1&}^ zJ}qLJ+>d(26Rg^LZry5sj9ph79MWIO)3r-?%foL+cXOlqTp%dRq!{SyI3@;$K%mbH z5|gtN(^K_}Q;W(nlT(ZJb5lzaQxZ!O^^^09QgsW8@(WUnN-}{GhDk|jDJJGAmX;=_ zCW)yA7RE{DCgx^ICPtPPhAEaNdIiO~Dai%7LEd?{4FvXbE!^trHBom7-%%>uNS$$67}Lx&nN8n*PZ@-eO;dzp`7M3XFePxwk;=_m=7)P{WqyfL*7y{Wzs60z#yKd)_dE}?qw%c?g%k78*+z+!9^joiQ%%8XPw}e{mn&7n}{{<>rF2A_g64kXmc{Nk+ zqsK1dpFf7=x9dA_fBXBX#yiesf6+m?wrOlFrw%%-xW!s6^KI?b_=j6QyBCB`d_Vh9 zS*TX<6mN~N^3RLjw3i<1Z_F)U^Thm*b53`9dCl+4<93T*DX>{?QjPcg7%yfS`tzIT ztNj7qj7%a7xXVspG$R3|k`!GddJ%%qWduwzumS~L7kXww=mI4&ELjWP0Q5A8Fd%}N X1}QYao0Sb@1q%@B1N~*i3gQ6(H|Ck< diff --git a/src/Microsoft.DotNet.NuGetRepack/tests/Resources/C.1.0.0.nupkg b/src/Microsoft.DotNet.NuGetRepack/tests/Resources/C.1.0.0.nupkg deleted file mode 100644 index deb0a83f31648f01851ade5679feaf7aa4f92ae9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1648 zcmWIWW@Zs#VBp|jVDqf@4t;-$nUj%$;XM#@GcYj37p3MD>+6BYsS{6U9X1ef{oeYo z`GVcFoYm7}AEjIj-L7bFFzwj3j4uvBPQSm4ZfR@@%9#FnNBXOq_5bmpwe<_ zO@sCxhQbb+_hw16TP#|i=E_tE#Vbq^(OR-sMXK6H?)>xL?NRUB=TA>|o5Q zo)521pO_S&y>wZakb8=9@hWO{YhHB!Ux35g9;jEXOxJNhA zYSwnW)%k~R`rSLR|Bd{zX#XQ$Y`qva2L=9DUz#v+{;JB!|CmsNX!ioSJtu)dGYJ?( z!azFOIX|x?HLoN-q_QBjI99JBH)rmIgI-4r1lry=y%#8&YIe1`W6SRLtL8VvIWA{P z=cqfU?OKz+e{-~d6PMiK?`Quz-uhcP^Dbxi5}&#CYoy;#Q25???A&^*5dFISyZ2}J z&+mEUqxSO8l2hvyIed1wtTa}Zlq`x|bZc`@qjJp=!Nb9qZP-sN@rZg^dieIN;$d&ozI*5v1xNf`Hd&p>pxGd^b@#RVG;O$ZAfis*6ux)Myk`;h4*mVr$tPY`%$lW zf>m43ty}GnvFmDsL;5Rux_0SqdHC(#q$p!j4n2CWQ5a{!Q#N_P6^i=)g z)S|M?jO( ziMd&liIJs+VTz@RUO{ngN^(K&B*(nlz)ZQ`DI<4sPzraauckw@TK6@#28rD5JeEZq z-b)N*LOxHJ(60YS>{(NUQo?r9-vs!-q?Y6&cJlA#`ovfH;P;g87^|#bZ z!M6MT^0Zgl9#a0rH$jI*%vNtrkKSbQMR}?&*OL$1zH7b6B$aV6P(bp$i_u1w8*Trk z+)|a|o9C`bl=v~B|4!(vv`5#U{hnOc7o3+X>Zo$uW;9p{nD~(=Emdyc5eJ7EmQuFVcnU{&#m^yiJf|Kl;BYJ-fZ$x~zXytHp^%-5)_+^=T86>*m`p{>2dB&B!FefV;2+MlcdU zDmu|MqLT}Hsf0xLn#b)jb?gsxCv^1_m-&<#LOjR*t$nQ4$V1H4(;Kvu8-p+3-G I+N>ZR0D*g#0ssI2 diff --git a/src/Microsoft.DotNet.NuGetRepack/tests/Resources/D.1.0.0-beta-final.nupkg b/src/Microsoft.DotNet.NuGetRepack/tests/Resources/D.1.0.0-beta-final.nupkg deleted file mode 100644 index a6abf5ad54fb0b14f8c9650a53d2042e3753541c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1772 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 diff --git a/src/Microsoft.DotNet.NuGetRepack/tests/Resources/E.1.0.0-beta.final.nupkg b/src/Microsoft.DotNet.NuGetRepack/tests/Resources/E.1.0.0-beta.final.nupkg deleted file mode 100644 index 236d751762eb13e693e039a5057730d127b188fb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1676 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 diff --git a/src/Microsoft.DotNet.NuGetRepack/tests/Resources/F.1.0.0.nupkg b/src/Microsoft.DotNet.NuGetRepack/tests/Resources/F.1.0.0.nupkg deleted file mode 100644 index 067a66287967948e83dbb0b006a6263c74d2949e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1642 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 NgiXL;*v1Ot0RV=z2a^B* literal 0 HcmV?d00001 diff --git a/src/Microsoft.DotNet.NuGetRepack/tests/Resources/TestPackageA.1.0.0-beta-final.nupkg b/src/Microsoft.DotNet.NuGetRepack/tests/Resources/TestPackageA.1.0.0-beta-final.nupkg new file mode 100644 index 0000000000000000000000000000000000000000..264246e25d8dfd2207dbf2f60874dc93793a2b6f GIT binary patch literal 1863 zcmWIWW@Zs#U|`^2Fb=l}W+~0g5MX3r_yxq=K+*W3)SO~{JrFr{;@Paj1_CYbTlY0z zu$?A)x-8~Vi(Iv~qW*?yVSO22nwPYEd#mk{A?>x$l5h9tw>-P=?YpgPne20H_ry=D zma)wJa%xBAlI3f}wRhdMv0GDK(GpX3>0paX*U6<5<%;;g;0@XA8rv(+r!Nczk|!bPIG_ zr!~K{emdPc(MGznzFH#xwqHpw|E9}M{=6Ty&1;be;a)W}B)BzYD$n&kr}ERO{i|2X zNf{RGD2drTTRhK>F#sNLQE?W*g8zPnWdH-MgqeXs7#MINsl_D$iOJcC>8Xx-d8Ne# zsmV)&4|*{h3hd?n=X}ERpjz~5jY)Tdy61&(eOu7cZZb31xqPze$y>j2<^HJDAKY?x z>FuUX4+`(?sjU1wsiwYe<3FSG7pxaej~fI*rmKHp_CA@IzARLH;c#U$#k$yvV%r_Tq~b6*>9>`!=6_%>UdC%j@%$9?Gt4z*IthF+oIK3`yjrY53R>Iw!Pxpd%3;!{GmMM(e|=ra=@$|DW9rHc&WrCDaa}M{S(8xw zN@{LYu-J)WYu5VgNxGHVFJ7>`_1^nW_sf+TcFMLwrZ0QemFJ5dO+FD-q`iB|ZKKAA`-Lj< z^5AgVFRI{ti9b0y{Up2oW&T%vQq-0U#qFbAL8kK8~2p$f;Y{PzHiAU7S(!;lB6~C3{E1Y|E?|k0ek4>8^%5OZ$ zUjKPwrJumn3X8!1YeQ;7vv%*XG*X?$F1&}^J}qLJ+>d(26Rg^LZry5sj9ph79MWIO z)3r-?%foL+cXOlq{EBPA&k~@o%5BQsq)PEc5IjPRGuqKwx6uk-RfT9aG!Zn>w!hb zTDM*d{p50Ged`PMoSny;4Wb;lWi7arp6~QX(_<`q=zFl`%$es2>DMg!YIM}@`A&QK z==rnT<$qb`dadPNGN-LOE3Ac+&&I7(Fw>^2>(G-6+O;9<7S>Z2F$cL#6ncL4QeB+x z%B2^xdl#HY-n&t%_5-hHp{cDg4@>X1yeYKx; z?jASDOrD#y^hf&%dr=h2^(eof{6R+y3L zutJ8XWmW8k_Qd;9e?|SQ>si7@f9})F3twvFy0ayz)Lj3R+*;#0o}Asus{0?lPl~qL z{rI-O^*6~-cEb}Bb$@zw{oizA<*DobLHij3ycwD78E_TYD!^z40R=FLQhakk1sNG6 z7?$%It<2qcozafFZ54>VWchFzh(yMkPaYyf&XM;LGhSQt}1)dzU9vVp8%0m3F=Fsx?< F@c<$4?*#w= literal 0 HcmV?d00001 diff --git a/src/Microsoft.DotNet.NuGetRepack/tests/Resources/TestPackageA.1.0.0.nupkg b/src/Microsoft.DotNet.NuGetRepack/tests/Resources/TestPackageA.1.0.0.nupkg new file mode 100644 index 0000000000000000000000000000000000000000..8a18159ef6692e89eeff1e4c49e1c07ead391942 GIT binary patch literal 1847 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 IT3JCn0Q)-EjsO4v literal 0 HcmV?d00001 diff --git a/src/Microsoft.DotNet.NuGetRepack/tests/Resources/B.nuspec b/src/Microsoft.DotNet.NuGetRepack/tests/Resources/TestPackageB.nuspec similarity index 97% rename from src/Microsoft.DotNet.NuGetRepack/tests/Resources/B.nuspec rename to src/Microsoft.DotNet.NuGetRepack/tests/Resources/TestPackageB.nuspec index 4a4623ef80f..c539d9a04b6 100644 --- a/src/Microsoft.DotNet.NuGetRepack/tests/Resources/B.nuspec +++ b/src/Microsoft.DotNet.NuGetRepack/tests/Resources/TestPackageB.nuspec @@ -1,7 +1,7 @@ - B + TestPackageB 1.0.0-beta-12345-01 Microsoft B diff --git a/src/Microsoft.DotNet.NuGetRepack/tests/Resources/TestPackageC.1.0.0-beta-12345-01.nupkg b/src/Microsoft.DotNet.NuGetRepack/tests/Resources/TestPackageC.1.0.0-beta-12345-01.nupkg new file mode 100644 index 0000000000000000000000000000000000000000..542115db3411051dc34c32d733a4ffd2677f14f8 GIT binary patch literal 1778 zcmWIWW@Zs#U|`^2I1+6Ud`pIq|bw`{LIHpyy1Ysk-rbv|kGx=(_R zwXz1B-=L6f@jl|uxdp9WCq$>eiD&+|AZqa<|GINiKYf#pxFec!R&x58CS&7eJ}2cK zHB~Oji9fac^waiJbAudQPcD{wx$gavE3yvOK3fHHGdJ)5^&{LW&9J$R$LD9qYJqO6 zwC0zmpDwpbw2^MzpB-WAyICxVzj=pn!=8L~%@p&_v=`a79a<`@Lw}sO;dL_gKF7U` zh0=v5ccg{u-`T?$01vl4z;H9%_A(9>Zoh$87#MCLsl_D$iOJcC>8Z|od8Ne#smY~* zhJHs31l~;i(friz=99k30!1}UQ4=&?2()fA7w_)Q&0+7`9{53JUxTxdYWspaGe5qm z`1bnot1^(UKeD0&tNYu!5XLXV*- zXM?C>{?;#MH>{pr+Gdb3nR!iD5${npA90yee*{E)(^@u&Ee=rXny+~_>SHy}$GjUw zXB8NgP1_!8M#rW2zf25UcP)MP8V$*wCrd+CxPKM2^xOU&iQ#Isd**wA(aKG z#j$!7xjAzu9P|Q)U)%ep_X0&z&8{|gY}ws@)%=Dy$K_1v9ChckU2F39Z;tkF;*vZ3 z{p^3oTYoEO-sS9G;xo5?jr98o3g0`Aom+1eqF=Xv_x|ku`8|(()L#Bsa%#OIhtCd| zmBz}Fl0}h=Zf)*qRIWK9csTg74f}~D9#Jn#58s|u{8pN;aPHN;^LcYWHf^pbzwsn{ z{pX35egao3ECTH55FDV&5cMoAfG>yx{_B3^mP>z14AG%1PUOjM!z_d^I^Aa+o0fvC{cLsz$|AI(Z~e|)m-U$xH_x74lX z+4s!-Kc~gqsoTQ)oBKuY=F};lRFV>=UOx8j^or$H`}*=$%ZIlXah!i)G14MskTP`n% zaXMn*RWC)4qKLJU1Dg0ZhGE@+`=e$OfP%c7y>%%rr>)0p6@^AS+maun8Cp IQLG>y04oyC00000 literal 0 HcmV?d00001 diff --git a/src/Microsoft.DotNet.NuGetRepack/tests/Resources/TestPackageC.1.0.0-beta-final.nupkg b/src/Microsoft.DotNet.NuGetRepack/tests/Resources/TestPackageC.1.0.0-beta-final.nupkg new file mode 100644 index 0000000000000000000000000000000000000000..4eeb80d214b49a78ca8de6e6c056a0aa6dea5275 GIT binary patch literal 1771 zcmWIWW@Zs#U|`^2xE5^@d`pIq|bw`{LIHpyy1Ysk-rbv|kGx=(_R zwXz1B-=L6f@jl|uxdp9WCq$>eiD&+|AZqa<|GINiKYf#pxFec!R&x58CS&7eJ}2cK zHB~Oji9fac^waiJbAudQPcD{wx$gavE3yvOK3fHHGdJ)5^&{LW&9J$R$LD9qYJqO6 zwC0zmpDwpbw2^MzpB-WAyICxVzj=pn!=8L~%@p&_v=`a79a<`@Lw}sO;dL_gKF7U` zh0=v5ccg{u-`T?$01vlIz;N@eDC*(^h8a5(1A{Oy+(J@|O9B#;vlG)(o%Qlciwjbd zO9Ku4ju;5MnfRmm>8zAu1(g<=`3+(!TvjfLZ_XZ7+SvQ{z(+H#c}K(xJQh7sirs1a zc<#qH@4xfkes{aAW&!`LS(EZUH3^wq(#kDUeVa5j_M)!6ZKB@^^Nr4vo~TXP(swbI znI$q=+v#4`%iIm2XO`wBURcIk5SOF3UxMoFcjdH3X0TpOUurhj7~u ziye0iJq~#EKCC!3P5fqd)r`3s_&8lWdh6E#`DF$?ZW%#0{F~dG-!Zv(*wb1n~&#}p$?4iNO!NI`hS?#@hf!v;xz+jsM3_?)wMLXx` zm89mC#D`QCq!!2ORpjQ(op8_#7<_H-o8Ai)O*OmP+_7bM`&IKB;vAPVrE}Ds({`=N z-@iH9zllrk@b|O-9dG@uoOzeCdx_87`Zdz;Cn$XHJa%rqRfvAw{@wet`{(yO@=<&F zXUVDciX1*WTvi$@OG*|+F1oe3r%}1)h~VMi%QoyMmUu+HEIoXCR`FYDzQVaz_s-|d z{n)g*qWs2_?Dd}~R{9BCt*{9Ezc!>cG;8-BOC!~3?81Av?b9Nr$^EETJi)51=hm(E z$JlkX!6E&XJYBnVw>Du&jo_AOp1ZNjsqr~K%mbHAc;o5IJKxOGdZi=&6u?1=A|bm6m=#ZDhN56{(6!7 zD^V}*bx9&OCw{i8_^$CV5aqxvYr&=Te5Xg69%I?V*n=%+&RkDOzh==_ zqoa1uciPiOm7m{w?sr%o^qNU?`NKuCL=&5s`vYTLr26MBGO+yOC4ZIioZr$H4O0S_ z9I4#AWq!DKR_2!|WsOe}`D@(dYn+2(e9!YRJ1%~!xh>4z=fzi-W4lc^vfPe1!2K{w zLBI9-#{79pe@m$4t_fZ%@?W5`mT{`q4_e!IQ{_qV^FYP{oI z_7@$LYn#T_a_XSNid(GJGT+u-jeof1vwK14#P_owm4#{rPx00WEC0OcO?&CF{>I$$ zHBZd{IOlYym)HExJZ`u6l>(dPCe?V)kMUxbp+CQQzS2D1b?n zB9;p($jBhUkW_rjy=dcg#;9p`!1Vu>9&R8$vf-E|53=DFz+{D`9748a$KgU}kfB_s z%fR$x{Z0p%B_bdn;K-j)rvs^SV7kSUTS2ZwHUK@DBMc~Hra__)@MdKLS-}E?O~7CX HW(Dy8J66kI literal 0 HcmV?d00001 diff --git a/src/Microsoft.DotNet.NuGetRepack/tests/Resources/TestPackageC.1.0.0.nupkg b/src/Microsoft.DotNet.NuGetRepack/tests/Resources/TestPackageC.1.0.0.nupkg new file mode 100644 index 0000000000000000000000000000000000000000..70f339197a23a632394dae756bbd2f83ac5a6c67 GIT binary patch literal 1758 zcmWIWW@Zs#U|`^2D37)Xz9#){DL*3v!!ID_28zZPrREgt>w(Cr6HogcHV|GE)VPVs(vV&c+t9~&HS5Jz%!hbW5wZ4Dpr&R(%I?oHw-&q}*AOB|J97DCocRgNr z1vmLs=H4;76g)57_HJHY{xxeGCq3(z2~J9`PcC`zTeeppn`E`1HRNZ*I-fLo-6uiE zT3G|mZ&1j#cpvfS+=5oG6Qa}K#54a}5Vd%bf8DvMpT5aP+!0MVD>?m4ld9PARGI9$SF7TKnw-<6-NJV~ldKlM-d_1(@*h@X{j{(f!7o;M zm6m>g|Ghur{cPFa2RyFr?poh9$++Z}^y_V+`In#lnYI4u%T5lj{VR1h>6C|jv|3ug z?6B*YTj0eAS=*n!T3hlHE~K&V&Q&TS z9+-EfFW`V--LL!!C0i6r7Z!bRwbW*^ntVO0@I_Teonf}tK8gQ*=fx{u9=A*W`}vfl z&$18aw>FDKiyFlF{DXxX2L}V2XSMh41#){%0>f((G~A+{^Ycnl^Gf1FDhpDJWA!R> zbLLJs=yk+EpzVFrdx4^=d#w(M@dYJNkU<8r2Sj=FQ&t~L4lH%I$7amgM2e)hlP zt-qBs?{ao8@tIq{M*95(h3}om&aJl!(XZRTdw+KS{GLZXYA^pRIkjGq!)J%fN@Hb7 z$)dI}QD%TtlJRE%4hW*46kEoZWhi}g+ek;vaIQQz_`MkLwn>JUJ-*}R}{`162 zKY^iQhSY{;?cQT)q&kgVcn`OITEsNDAN7hSShe-sy4C&|yRJ4kq`#7YKP}7{!?y2QFEUAG91IkYJnv$(k>y6)e<`PTS_}qLx5Do4!|zf~s>wTQ@o{|Kj-e;gyvFx)Y4LrdZ^fy;93Bie1lcueUDiU)5@H zqEYupP*;80#N@j9_KSZp1b8zt*)!lOM^%9F3jzvY5~Wn-f(kM+NHBP&8{I41c%AWp zxfz&FKHYx{#78z9v#>!n+ya=OuoOMWmRxh@y#_LL`vyTU-E{ZtC72~5ARpk!nNX(# psRCe%#gb1!u0%EfJ%J+($YQ2Jau4ukWdm8k0)$P#U~ppv@c>%gz;*xt literal 0 HcmV?d00001 diff --git a/src/Microsoft.DotNet.NuGetRepack/tests/Resources/C.nuspec b/src/Microsoft.DotNet.NuGetRepack/tests/Resources/TestPackageC.nuspec similarity index 75% rename from src/Microsoft.DotNet.NuGetRepack/tests/Resources/C.nuspec rename to src/Microsoft.DotNet.NuGetRepack/tests/Resources/TestPackageC.nuspec index f0af0e95a34..f103ca36638 100644 --- a/src/Microsoft.DotNet.NuGetRepack/tests/Resources/C.nuspec +++ b/src/Microsoft.DotNet.NuGetRepack/tests/Resources/TestPackageC.nuspec @@ -1,12 +1,12 @@ - C + TestPackageC 1.0.0-beta-12345-01 Microsoft C - + diff --git a/src/Microsoft.DotNet.NuGetRepack/tests/Resources/D.1.0.0-beta-12345-01.nupkg b/src/Microsoft.DotNet.NuGetRepack/tests/Resources/TestPackageD.1.0.0-beta-12345-01.nupkg similarity index 52% rename from src/Microsoft.DotNet.NuGetRepack/tests/Resources/D.1.0.0-beta-12345-01.nupkg rename to src/Microsoft.DotNet.NuGetRepack/tests/Resources/TestPackageD.1.0.0-beta-12345-01.nupkg index 733f0104b882a0b097ee67c830ba106256476781..d9da05951bb6daed1c8ba0a6bb25c941a2a4fc6b 100644 GIT binary patch delta 851 zcmca4v_h~xz?+#xgn@y9gF!ULBKW6uj1Dg&1H(rk<_3z!7p3MD>+6BYsS|zu4jTxx zt{1AjeJb^Tr1rF^t?=3!FSQ%$fiFZ1t?`&!@lr zcTsM&@v)RW(jLLaK?^6xNt*LNneug&`tQ5n8r)CRrz-2JEm`FeBXwd@@s5QiCs}ou z++r_DT~xbeg12P4l!M)Yo|3aS+K#>FDLT96*zyMZj%z1gOuoKz+P%1hqu~cldp7k& z6}TmzS|X)*ZU(#4@t}M4F?-kE)nuKrWLGe=WkH*;llryVLfTWN@=UMM zb+%hMuiLM1-^E9^@_Vc9yyHcLn*cD}n(wwS`~im7C1AJ-1L=^|;*x;GDhMS)pgT<*el$MwPos%Y|OA>9hM8n|7<* zpla=H=h#BNJxte^H_Vcqyim1A;9_E!Tk6+tu5E61$*24uPh)3nov~zPw@zrp)++60 z?YQ{+ch;q8=_LrIuYXniI(brmu{@)&sr8@fhl>v%(5X7of6whsRIlE{z1Ji*6-hny zlNI9n;XnU5ubOP`3FnocdW3gaFj+PGMayiTxB32&S#5dd(z{|Fwr-vk8vbOe(2V2< z{^uO#{#n)VGU?Oic;-zk_4W+7Qkn`d%s@Z^OroSaE~p?Qg9O9XcFn$`jn^4dW3<8a zM6plZAbx;1BNNPU%;ZULVh7olu)ExyAX9f)@PlcVcu7bzz?+$civa{mnpJ#cRGlt9V`N|eVQvN)hWMh?oML@F5IH%Y)r}`8H7Bto zGe565BeP)gPF9P0pbT7~Sjo-?S%E@GWkIT~QbtKhft9{~adJj#Zep=sZf0^(esO+U ziC%Jku6{vca&}^RW?s6!k%6IszJa-ZZem_$T555Ll0rygQF>~Lt&+ZrUS4T&L29y+ zf@g}YQjm#3YEo*Vxv7zbxwMIiaS~8mAB)YC53m~YAiHn!1STnNBx5HxG6e=g%``Sh zHAzabFflbxF)=YqGX)!|kL;UbJ5W%GFfcK2fP>1Z-q!6iFxZX*gNg$fR4_*Z!%3#T zG{D!NSy5o`>>u(R>C+oS_1l&jevPPa{Mcadc2XH*1e%8tK8NA(^aJym+i z9+7wT6;*UXid(|__w)87?BS-bQ)-pZ@s(_jyFCAuJj-jz{R;h44j8fhJ2SB$Xlc&X#Z~M`DQR;a z(=wKNT?SkU3!L7N2&7~d;LXUS%YZAGk@PTVGcmve9ij_i-P5ufx5>}g#h4SA874O{ Z1x*g*&|2LpClv{0l zEMSdBjMam{h!Dp~*>B-6gl!OHvor zZkgaMnJ(pEcc7=_?2Wc#?|F*Ot~s{6!M@|#i5HWv@0@loF5zhSLDQa1eNhE&$)}b` zDW03b?sPopUVY5owRbgHr!3hO%xqcEChVkst@e1O^;EOJ-R<>D7l|2boN!p$zk_Sz zie$4H`()}?2_M@$@yG7Ayje-Y1#7Qd`OL<;g~?hsV2hN*gOK)=sXWtbbe-*1&g=Fo z+;{Pjt^D4qJMVY{;Gt#<47G?iO(#I1_85qTfuR+O|_m`AhdaI z&l+Q`9WP!TnesZ}N*a5Fcq(TqldB|_-zhwC zz{U5W%eiA+SH1IMt{yuz?eLK^PB)hyYt?x7+(1SxBWwqM_wpvj$R7>)dpUO)bLAe1 zUV1@2Q?x5;o1o>K$It6}16dzm7SMWM5TeJ`ANHJET4wpYMe~om=z6y;de@&PD^s$= zVkV}0C2VV~w_`3T3F5oF`-na?^f)*eN}5%CE_3#T<^e-4jER9EkU@r_01|Tg#i>PQ znaQce`njnki7AOCiTcU;MX9<4MfnA(MJ1U)2{S|Eq~yd@qm+~+3lqas(?ny_RP!{` zR8!-$M1#cCB)x*-+?3=3g+&q!8Vf*)924XQ-S&HIAn;dI`+VqvL%dCT;YXFc)rrrQV9W7$xnGwx~rF7^zL1tk+64@lrs;nXJL@70gp@Xw#8GT z{^q*)Ya8ud>#2C-7?T{QI%_4*9>2=ZO7$LTpN>^MUGk&?cR6wOlNQ0EvzlBJ1BlMa^|_C(N#vwS8W|PRZSG<>y@8pRk|P`oq-s zb9c{jOZk3nwt>sGdmC8ie?C1$SbyD*U%%V_I$U+yv?2Lq~?{xhg24%7RTyUa91FK? zme|24-Vw9CH$zst%>D4qhys;$4ry$hoQ&MlzWu-d{`C9x`ETFt(0k_)nf!=v-D@@( z!)1z}t{hBDE@j`nueM4sD16Nt*)wTH@Ap3P$-ZF4Sr~Y1%JqcQGn1z`oKIA$zihHy zPFQ+lXxT2t+TRYzH^hqjk8j$SV64lPS8q5kLY8HsYSM;9znS^(Yg|=dsCRO+`*V$| zP@V^W`Z?}}aQtsjG1+wg(xTT5pZ0gnFbbX2JxljexMzJ`)_=wTZ$>7223+N^3N+m+ zKxw2>nTr7;$jBhUP|IX zkfE1fP6E?xS$8(TEYSt|0Bf#>Ivh-u0P{K3^Ek+l$kwB#EoAF+Ss1XTv;c2bHjpwF NAZ!8#LmMlI2LRs*$npRH literal 0 HcmV?d00001 diff --git a/src/Microsoft.DotNet.NuGetRepack/tests/Resources/TestPackageD.1.0.0.nupkg b/src/Microsoft.DotNet.NuGetRepack/tests/Resources/TestPackageD.1.0.0.nupkg new file mode 100644 index 0000000000000000000000000000000000000000..3d1cc80b76e5777cc6fa05958f2b36d4be5fadb5 GIT binary patch literal 1802 zcmWIWW@Zs#U|`^2_#AB!{L?x{hnJCo;Uf@p14ZMDQge#+^+4p*iN1b^4Fp=(3sv5~ zk@-f=$#-|+VZP9v2ad?8i+%0S+1|8y;{%TvMsBSIP97WP%>RD2de-&l)8GEPD7V`9 zSjrx0k6`1Vg_GkX&H0~9`MOH|_uX#|?k7@}b=8)v@`#Z-F{yaRLX(rMx=U`cm!vML z-7>*jGF{5S?m$n;*&A)g-t!clU2|-CgMG)f6E7xT-#P7GT*A@tgQh*3`l1Tll20v> zQam?<-RXGHz51BFYwv2ZPFb=mnAx(RP1s5OTJ7;l>#1gcyW8uRE)p}=IN`9ge+Spb z70G5Z_Q}+(5=sMf2oY(DF zxbNa4Tlu|Jci!;^z(egFFw~e@*Gy&shS&`t76yh|NNRCOKw@%sVtT5JUS4T&L27bo z;9gMZ-J4j!e%koQBtH(zl>w67M-H?}=={DEVY2O`Wx%}NM)yae1s;pGc*yRb|NGtL zyXUWOkCESHTYcQ)+U~CDiyrXI{dR0u?9ty>V(xz^t*umSzO+88UFWuJ=pJ9qJ4_Su zHU_I$tzN8tUu9t}`(ktT1FJN=HMk3GS+6{DXnSsOET!F3a_SZNQ#WS);?%V5i+-n? zk~C>qQRzE1E>7V&p;wn*b6+L@j7>-_tLz7V`|`HN$S)oFdwX|mm6Clp_nO3{BB|GI zZ#h-xTz+2Jyks$NrpDB6`GZFVFU+h7>wbJK_}k>j;E!+94o`QtnVzKDrTy)Y5+n2W^#A)iC<-o7tcu6*Vdfs{(ftt`GJgP{mo6!C7IVZZ>)<=(_MRP z`At{VQiqBo7Z@hBo|ts}_{@u`-@LAzX~~Exv3U?Bp?koQcitk63dK#1-VLRH)-OzF zds@AvdDUyHd$M15dCn7mRQd12lK6#T$*+|)*C)Q0lG(Ui*?;Y?BWswhbtT0w46Isw zZNq94QPT-VT~luOn&q`!+~g%?dzqt)DXe(4;gJnWntT`L9&)&nA?>v?^tx?z#~YDr zO9bAWVtU8Q-f)LKZt0#%y`%e=-#M_2J0nT;==rNFJw9)lm|{BpcGksvjJ-GJ|2?Pn zXNv#l#Y%H8PZr#rCA*blY5TN*or2Xl@pGrm#?ra0*&oETV}mG1B{1Oa2Anah<47; zD@n~Oi4UnPNG*=ltH{m47hiKHIQkti;Bf^OKHaxO#5fji+bpqzQM@B&dvAuUcA5L( zn-K*n>m1V9I5`=)r+xc>|NZIr>+|2f+oAW)Au{<9-@4aqGKR|(KV3PPmR!oddtYsp zU{Ls)HL_>Yir(*imMAf7Xi+(fn-`BXRzEJPvX7}eBRiQi&{`7O)3*q?RpklJ= z{-s5)8$Rvtnqd?=se6|0rEt&sx~%_<0p5&E_6)enToq_yRe;h+B`_BQM39j|f}!WA zQby6n>x>7aG{7{A#KBY$AK7rsq6yh>Ghj?$DX5Sw$?RiI1{s>H#092npKOSSS)vQ_ x0oJSxbvT&H24-%mXKaukk*!BfTgcW&vM^vvX#w7>Y#?PUK-dHfh9XuF4*>1b#BKlp literal 0 HcmV?d00001 diff --git a/src/Microsoft.DotNet.NuGetRepack/tests/Resources/D.nuspec b/src/Microsoft.DotNet.NuGetRepack/tests/Resources/TestPackageD.nuspec similarity index 94% rename from src/Microsoft.DotNet.NuGetRepack/tests/Resources/D.nuspec rename to src/Microsoft.DotNet.NuGetRepack/tests/Resources/TestPackageD.nuspec index 74e7d79486e..d2ae177685e 100644 --- a/src/Microsoft.DotNet.NuGetRepack/tests/Resources/D.nuspec +++ b/src/Microsoft.DotNet.NuGetRepack/tests/Resources/TestPackageD.nuspec @@ -1,7 +1,7 @@ - D + TestPackageD 1.0.0-beta-12345-01 Microsoft Microsoft diff --git a/src/Microsoft.DotNet.NuGetRepack/tests/Resources/TestPackageE.1.0.0-beta.12345.1.nupkg b/src/Microsoft.DotNet.NuGetRepack/tests/Resources/TestPackageE.1.0.0-beta.12345.1.nupkg new file mode 100644 index 0000000000000000000000000000000000000000..bb87ec205e1a22a5758fa6d43f381901b0092e5d GIT binary patch literal 1779 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 V(hu-vWdm8k0)$P#U`SvE@c^>k%N_s# literal 0 HcmV?d00001 diff --git a/src/Microsoft.DotNet.NuGetRepack/tests/Resources/TestPackageE.1.0.0.nupkg b/src/Microsoft.DotNet.NuGetRepack/tests/Resources/TestPackageE.1.0.0.nupkg new file mode 100644 index 0000000000000000000000000000000000000000..d22ced5cf6412c96c2ac9e637559b83c544c10f3 GIT binary patch literal 1759 zcmWIWW@Zs#U|`^2m=I$T{IA2Xo1c+^;TI5d14ZMDQge#+^+4p*iD&%|8wj+#_t?|? zwEFQ9Q_rqR-;Oj&ulmH4T|GDAiv6a$T=(R>*EVn|9xU8qeg9lW``_8NlZ=n0?2*n4 zzB*;W2) zdVGfIMEHz}YhUk5{b=1Rrln{eW3-q3kKP_ftxDjA)8X57y0>)SvjiRbH|ufy+ZjiBxQq;5Dz9_W zc{hW1+4?E--?ekS=<-%uSro&4gAIOW_@tYw49&X*haO3vhn#=(Vvu8jo3=FrB)Z&tW#N_P6^i)^9ywc)= z)a25@-F`<51l~;i!G78_rC33wMP|On0;bL;zQBlY_l`bFl3veze0$&r&p%A(yiY2| zroKH>QC9Z-`)~I(-_Q2dCaAoQJsR$MQqt;eZ|Uu>?U}`OXRm+y;=;1@{uQyvY1XSM z<_7IxRESMpydq;w-@HF+qPNTqGBz{EOj+%%vHrkTkpS^(Bb(WVYEnL@RxJ6Yb^Y3j z^d(t;_xyrlRpZ_2-{=@A;BE zf8)Q(r#x!GKc3%m>|V(@xXpP=x)^VqrdRw4Rz`*-ip?w{ZD$VctvpCzZ(D{}bk za9L@rEGbzOx#-sBo<`-GBZ7y6FWa!6SmF`&vh?unS;cRq`3mP=-8-K*_hZxMit-yz zve$o}Sm`HlwZbCs|Jsn+(5&5iER9sBu?z3vwoi+gCikOW@dT^3o?ExtA7j_m28Z-l z@^tOe-SY6;(cRq8Bm?z%-nz11xj~W9;no&qS}xp6dX!ZAW}n@i zxpm1TxAi7XO8r-FWqmn#UFB%xR}Tpesa$u%t*^>L&TG3LnkCV+R`&s?h4zWy2cc(X zFAw^&_mr&+TfbUJP>r0lXohUOO4Qlw&RbvBGn~C~{_(|1|K6+R1vh@#?l3w(@715INR7$j+$W}Azg+fadg(F##@uad9*F<(?&(;5y{33~ z>ixj20_-<8v+6JTkuGNW?E6pSRr~?oj7;_nxC&AgVElrB0+>W8R=J>pj0_SC4vNMS z#T&0PUN~n0rd^|MiGldYhGUjC$c9@06BL%R2icPKQmjHCLtA~h!1N9CN51F1q_ip7#oL9RqL06l>t49I4tL2?i9W@Q6e!2*O$z+iA^1@QoJcENZ6 literal 0 HcmV?d00001 diff --git a/src/Microsoft.DotNet.NuGetRepack/tests/Resources/E.nuspec b/src/Microsoft.DotNet.NuGetRepack/tests/Resources/TestPackageE.nuspec similarity index 81% rename from src/Microsoft.DotNet.NuGetRepack/tests/Resources/E.nuspec rename to src/Microsoft.DotNet.NuGetRepack/tests/Resources/TestPackageE.nuspec index a5de09b9f5f..5c4c9eebd18 100644 --- a/src/Microsoft.DotNet.NuGetRepack/tests/Resources/E.nuspec +++ b/src/Microsoft.DotNet.NuGetRepack/tests/Resources/TestPackageE.nuspec @@ -1,14 +1,14 @@ - E + TestPackageE 1.0.0-beta.12345.1+abcdef Microsoft Microsoft false E - + diff --git a/src/Microsoft.DotNet.NuGetRepack/tests/Resources/TestPackageF.1.0.0-beta.12345.1.nupkg b/src/Microsoft.DotNet.NuGetRepack/tests/Resources/TestPackageF.1.0.0-beta.12345.1.nupkg new file mode 100644 index 0000000000000000000000000000000000000000..9c0ae331719259b4f8862ee54acf0318f94120fe GIT binary patch literal 1780 zcmWIWW@Zs#U|`^2_!DCh{387FOMXTMhF?I;4HS(pO3f+O*8`DLC*Jj9HWX-m&w5|+ z$-dc3I(J9E+*aOH9`ucM(wh|X8-FG&alL=fp*zau!fwg5bLP(tZvUNay~ub;PP4p0 zwuak-(iv;!v)5>)U48ub-M_r*hQ&Ii>iTABA+C1(6`HDcLX*BS`8`u}`B0kVRJ7@e z*;y5@zgp=E*GP%PPYIg1oxj|`zhPQWcbM_9nJ+Akcl^0}eE%guc2~bm9*dltLVZH# zcD4R_`YCv>;@q`u_f1>2x)m=AVgIXQ)|JN-8dbVQ%xjCAiQ#U~`s76yh}NNRCOKw@%sVtT5ZUS4T&L27bo zprhYm1A#rtAKOoahvZKR;#52?y6VVE51Ahg+4)l4$IP}dKh2e?5Q;yb*f~q->yFJp zU~M0NKc_Z_|EBe?1#4G&I2KP@I58}9^Lh{Q*GFX|Kfl&~)>0!{eMabROP7h^uIdH_ z=^WPuYp2~~i+0z_zsgl`-T&jzHtPWZ$T7OVre!Ffz zkC4GOw_=;h#Xpm#vt}cB>%G_Lh$V*cHi9#Q&_C%$;!1>xh9s+xw>X0!35Jt~PgU+1-BC{DwHk$eCMUjhcZSHAQt~nxjIQX&+`-vqUQ7=mm-=0HDZLTQ4 z@g#fw=ZTem0#_?60{^cKsSVBAy~ol>bsD?y9&Y=zh-q>^>J?A0YU{amtNk%{U2Skk zeJ}8`7o--IWCA4&&C-&M4U>}0Q!P?VERzf@(+rZ5lgtf(j3g7YG!wmo;@p(v zg4{`t{*MiSIoIP4yY};IezVLrsB#K%eA}?aY0<5xuWn6FGTpfNW6Op5{drg1Qn#9C z-!u3BoHplvy{YMMmM_O{DtT4N7;ZR~nOyFACD3$l@4M5lSI1bkgqP?lNPf^MiQIo> zRfk>2t)&9F?WW~BgrhiDEM)YKQ?U`ectR-Q@&DTf8p=PPp7r=zd;WLHgS5gq9pA5> zp8c!A&9C>X%G##j>o*><-~4Q_ir4GuhKWzu+rw7vy>sxQrZDe>E0dO3sLkG%yhUS4 zs?PPSl>#c3I^k{$Kd)O96BBZN3fuY%TSUHv+wmVsed;4AE0(0iT+yV*#awLVD5-bg z@k=wFB-Q2Qs`Awgb z4$1AFWz}-X$z9_$XZ71{TLbq$*icx#!F5*7>MvyzJ?Ewsdx)1O*L*u3@wV#xHR)*| zCI1V4JMq|hU)`+@=~H-H62Ik~+Z^-9*!ze5qu=aW|Cs{38JX-EaFwnqz_kLkSmc5Ku_!l14@`_kn{t*S=m5VumE8bFc@N3 GK|BC1LC_EY literal 0 HcmV?d00001 diff --git a/src/Microsoft.DotNet.NuGetRepack/tests/Resources/TestPackageF.1.0.0-beta.final.nupkg b/src/Microsoft.DotNet.NuGetRepack/tests/Resources/TestPackageF.1.0.0-beta.final.nupkg new file mode 100644 index 0000000000000000000000000000000000000000..cad51365635a3f205e29876ba3215718022efb9c GIT binary patch literal 1778 zcmWIWW@Zs#U|`^25Q()2ei458B|jqr!!ID_28zZPrREgt>w(Cr6YqL48w#|(XT7iZ zWZox7u7ZYysp5BkPB=}n6HjXx8XxZc0#&>iJ+VYg)3IrHZRxBt$zUSzx^r&-=0 zTf^-^>5Mh=*=w}Yu0H3 zng+94a&Eld^!ZZtrvy#h&R=fe-!QGGJIwgl%oi5NJN{ffzWVyt>&oK^jVj$D=C#Gm#BjIg@$6&sv{G9h@Y^nB z+OaF;&ZODm@9Y=?;Nd0!47Zx}r*A>w_6&%Hf#DXCT3iy4n4F!Mp6aHTS6W<R!JZoFYwT~x{Yly^rTQ&yeI;Z2c&9b%J>v{v5Nx_<3M`jRgu zK9vF!S~r@uO}3QQ7vKG7!u4w_pLxCAaxm%uhtHl@mkzp5>JL_9Tx=rv@9sm(3);); zj$A+Ib|Ptm3!Qe1&tb?w!w@`>|1ONhF!FnWzf2S zr~=W&FZyPDKRDaGrn++K_Vc-i=P@*YUFTyoPmO2Jw`03%XMPDezkc#T;QevB0)K&w&8z^=kN7E3MnBGv#DA>yy*7GvmLVwtC!t zz$`lKgZ4koX~!;0@B6tcwR}ZXha+FkL2k`|CzX!7-T&|Pl|8_lk;$F`SJ|opjB5~3 z0Fx*sEf-XfkwJoC>zg;Li#J|pjE{K_rXO9>T?OJJ8;)53AscQ1Ok7xsBV)U48ub-M_r*hQ&Ii>iTABA+C1(6`HDcLX*BS`8`u}`B0kVRJ7@e z*;y5@zgp=E*GP%PPYIg1oxj|`zhPQWcbM_9nJ+Akcl^0}eE%guc2~bm9*dltLVZH# zcD4R_`YCv>;@q`u_f1>2x)m=AVgIXQ)|JN-8dbVQ%xjCAiQ#U~F zz_VUQ3F+lFm3wzRm9DH*Y`UbM)vt3~)^v}z<{icf z?>2;od<}E=-{(8^o2}2iISj9>N_oHX?r3Cs^~$5|xxq1)eox7%SM*Qakows(W!^Gf zekLPB?_$fDyF<4&NQ#B>uKYalNphw_!m_Tz`>k!vd(L?F|FF8zVZHjI;Jxf#Ma|`b z+g>?nJh0z;Mp{KS*CTmlObw%dU&Fa4o1^Azo3~m1%&fNe+oJc?9I2{dox<^BvSCoS zG}ny(%Js1D;^1I-JBi(Q_X4>+CxPKK2^wC}&iQ#Isd**wA(aKG#j$!7xjAzu90Y|| z+xw>X0!35Jt~PgU+1-BC{DwHk$eCMUjhcZSHAQ zt~nxjIQX&+`-vqUQ7=mm-=0HDZLTQ4@g#fw=ZTem0#_?60{^cK zsSVBAy~ol>bsD?y9&Y=zh-q>^>J?A0YU{amtNk%{U2Skke1&~ytUz}Q0mYJMdte=}&l9-ZMlBl1YUzDm_P?TSgT2zt= zlrS_)OExx4N-|HiNHMWYGO$cDNJ>sJHvlq{Ow7_u^a_e|Q<4jECpqTbHV|-K@05`{ zIVeSYrL(3(w_5i#w+4ya?L3x69NtR|WL!Vq+;n1MQR{`K)e^4dPyT#oH=bWpUpv`c zKlkuF#^$faDCV z2d}Ffjr{5%!6B9FZn*VTS;%>9_d~NJn%3$*;Iz;_5&R(Z%QtgWBK)(&$XxX0=EjV-`vcqzvM@{ znB}wYKaE%M2Y53w*)!lOKUIM73jzvY5~Vcdf(kM+NHA2^PRlIbc%5;>i5Xz}+~(F) z5Fgoa%t8j)a0_69!cycQTe7?JdN|0?v+Q@lv^wwdP?#kmARpk!nNX(#sSIF>#gb1! hu0%EfJ%J+(NMfczau4ukWdm8k0)$P#V6bBa@c>&Kz#RYp literal 0 HcmV?d00001 diff --git a/src/Microsoft.DotNet.NuGetRepack/tests/Resources/F.nuspec b/src/Microsoft.DotNet.NuGetRepack/tests/Resources/TestPackageF.nuspec similarity index 94% rename from src/Microsoft.DotNet.NuGetRepack/tests/Resources/F.nuspec rename to src/Microsoft.DotNet.NuGetRepack/tests/Resources/TestPackageF.nuspec index 3c7f4db748e..a624831c797 100644 --- a/src/Microsoft.DotNet.NuGetRepack/tests/Resources/F.nuspec +++ b/src/Microsoft.DotNet.NuGetRepack/tests/Resources/TestPackageF.nuspec @@ -1,7 +1,7 @@ - F + TestPackageF 1.0.0-beta.12345.1+abcdef Microsoft Microsoft diff --git a/src/Microsoft.DotNet.NuGetRepack/tests/TestHelpers/TestResources.cs b/src/Microsoft.DotNet.NuGetRepack/tests/TestHelpers/TestResources.cs index bcc990b8220..82ef8e8fe9d 100644 --- a/src/Microsoft.DotNet.NuGetRepack/tests/TestHelpers/TestResources.cs +++ b/src/Microsoft.DotNet.NuGetRepack/tests/TestHelpers/TestResources.cs @@ -8,28 +8,28 @@ public static class ReleasePackages public const string Version = "1.0.0"; private static byte[] s_A; - public static byte[] A => ResourceLoader.GetOrCreateResource(ref s_A, NameA); - public const string NameA = nameof(A) + "." + Version + ".nupkg"; + public static byte[] TestPackageA => ResourceLoader.GetOrCreateResource(ref s_A, NameA); + public const string NameA = nameof(TestPackageA) + "." + Version + ".nupkg"; private static byte[] s_B; - public static byte[] B => ResourceLoader.GetOrCreateResource(ref s_B, NameB); - public const string NameB = nameof(B) + "." + Version + ".nupkg"; + public static byte[] TestPackageB => ResourceLoader.GetOrCreateResource(ref s_B, NameB); + public const string NameB = nameof(TestPackageB) + "." + Version + ".nupkg"; private static byte[] s_C; - public static byte[] C => ResourceLoader.GetOrCreateResource(ref s_C, NameC); - public const string NameC = nameof(C) + "." + Version + ".nupkg"; + public static byte[] TestPackageC => ResourceLoader.GetOrCreateResource(ref s_C, NameC); + public const string NameC = nameof(TestPackageC) + "." + Version + ".nupkg"; private static byte[] s_D; - public static byte[] D => ResourceLoader.GetOrCreateResource(ref s_D, NameD); - public const string NameD = nameof(D) + "." + Version + ".nupkg"; + public static byte[] TestPackageD => ResourceLoader.GetOrCreateResource(ref s_D, NameD); + public const string NameD = nameof(TestPackageD) + "." + Version + ".nupkg"; private static byte[] s_E; - public static byte[] E => ResourceLoader.GetOrCreateResource(ref s_E, NameE); - public const string NameE = nameof(E) + "." + Version + ".nupkg"; + public static byte[] TestPackageE => ResourceLoader.GetOrCreateResource(ref s_E, NameE); + public const string NameE = nameof(TestPackageE) + "." + Version + ".nupkg"; private static byte[] s_F; - public static byte[] F => ResourceLoader.GetOrCreateResource(ref s_F, NameF); - public const string NameF = nameof(F) + "." + Version + ".nupkg"; + public static byte[] TestPackageF => ResourceLoader.GetOrCreateResource(ref s_F, NameF); + public const string NameF = nameof(TestPackageF) + "." + Version + ".nupkg"; } public static class PreReleasePackages @@ -38,28 +38,28 @@ public static class PreReleasePackages public const string SemVer2 = "1.0.0-beta.final"; private static byte[] s_A; - public static byte[] A => ResourceLoader.GetOrCreateResource(ref s_A, NameA); - public const string NameA = nameof(A) + "." + SemVer1 + ".nupkg"; + public static byte[] TestPackageA => ResourceLoader.GetOrCreateResource(ref s_A, NameA); + public const string NameA = nameof(TestPackageA) + "." + SemVer1 + ".nupkg"; private static byte[] s_B; - public static byte[] B => ResourceLoader.GetOrCreateResource(ref s_B, NameB); - public const string NameB = nameof(B) + "." + SemVer1 + ".nupkg"; + public static byte[] TestPackageB => ResourceLoader.GetOrCreateResource(ref s_B, NameB); + public const string NameB = nameof(TestPackageB) + "." + SemVer1 + ".nupkg"; private static byte[] s_C; - public static byte[] C => ResourceLoader.GetOrCreateResource(ref s_C, NameC); - public const string NameC = nameof(C) + "." + SemVer1 + ".nupkg"; + public static byte[] TestPackageC => ResourceLoader.GetOrCreateResource(ref s_C, NameC); + public const string NameC = nameof(TestPackageC) + "." + SemVer1 + ".nupkg"; private static byte[] s_D; - public static byte[] D => ResourceLoader.GetOrCreateResource(ref s_D, NameD); - public const string NameD = nameof(D) + "." + SemVer1 + ".nupkg"; + public static byte[] TestPackageD => ResourceLoader.GetOrCreateResource(ref s_D, NameD); + public const string NameD = nameof(TestPackageD) + "." + SemVer1 + ".nupkg"; private static byte[] s_E; - public static byte[] E => ResourceLoader.GetOrCreateResource(ref s_E, NameE); - public const string NameE = nameof(E) + "." + SemVer2 + ".nupkg"; + public static byte[] TestPackageE => ResourceLoader.GetOrCreateResource(ref s_E, NameE); + public const string NameE = nameof(TestPackageE) + "." + SemVer2 + ".nupkg"; private static byte[] s_F; - public static byte[] F => ResourceLoader.GetOrCreateResource(ref s_F, NameF); - public const string NameF = nameof(F) + "." + SemVer2 + ".nupkg"; + public static byte[] TestPackageF => ResourceLoader.GetOrCreateResource(ref s_F, NameF); + public const string NameF = nameof(TestPackageF) + "." + SemVer2 + ".nupkg"; } public static class DailyBuildPackages @@ -68,28 +68,28 @@ public static class DailyBuildPackages public const string SemVer2 = "1.0.0-beta.12345.1"; private static byte[] s_A; - public static byte[] A => ResourceLoader.GetOrCreateResource(ref s_A, NameA); - public const string NameA = nameof(A) + "." + SemVer1 + ".nupkg"; + public static byte[] TestPackageA => ResourceLoader.GetOrCreateResource(ref s_A, NameA); + public const string NameA = nameof(TestPackageA) + "." + SemVer1 + ".nupkg"; private static byte[] s_B; - public static byte[] B => ResourceLoader.GetOrCreateResource(ref s_B, NameB); - public const string NameB = nameof(B) + "." + SemVer1 + ".nupkg"; + public static byte[] TestPackageB => ResourceLoader.GetOrCreateResource(ref s_B, NameB); + public const string NameB = nameof(TestPackageB) + "." + SemVer1 + ".nupkg"; private static byte[] s_C; - public static byte[] C => ResourceLoader.GetOrCreateResource(ref s_C, NameC); - public const string NameC = nameof(C) + "." + SemVer1 + ".nupkg"; + public static byte[] TestPackageC => ResourceLoader.GetOrCreateResource(ref s_C, NameC); + public const string NameC = nameof(TestPackageC) + "." + SemVer1 + ".nupkg"; private static byte[] s_D; - public static byte[] D => ResourceLoader.GetOrCreateResource(ref s_D, NameD); - public const string NameD = nameof(D) + "." + SemVer1 + ".nupkg"; + public static byte[] TestPackageD => ResourceLoader.GetOrCreateResource(ref s_D, NameD); + public const string NameD = nameof(TestPackageD) + "." + SemVer1 + ".nupkg"; private static byte[] s_E; - public static byte[] E => ResourceLoader.GetOrCreateResource(ref s_E, NameE); - public const string NameE = nameof(E) + "." + SemVer2 + ".nupkg"; + public static byte[] TestPackageE => ResourceLoader.GetOrCreateResource(ref s_E, NameE); + public const string NameE = nameof(TestPackageE) + "." + SemVer2 + ".nupkg"; private static byte[] s_F; - public static byte[] F => ResourceLoader.GetOrCreateResource(ref s_F, NameF); - public const string NameF = nameof(F) + "." + SemVer2 + ".nupkg"; + public static byte[] TestPackageF => ResourceLoader.GetOrCreateResource(ref s_F, NameF); + public const string NameF = nameof(TestPackageF) + "." + SemVer2 + ".nupkg"; } public static class MiscPackages diff --git a/src/Microsoft.DotNet.NuGetRepack/tests/VersionUpdaterTests.cs b/src/Microsoft.DotNet.NuGetRepack/tests/VersionUpdaterTests.cs index 3a2a3667e77..900c55775a1 100644 --- a/src/Microsoft.DotNet.NuGetRepack/tests/VersionUpdaterTests.cs +++ b/src/Microsoft.DotNet.NuGetRepack/tests/VersionUpdaterTests.cs @@ -60,10 +60,10 @@ public void TestPackagesSemVer1() Directory.CreateDirectory(dir); string a_daily, b_daily, c_daily, d_daily; - File.WriteAllBytes(a_daily = Path.Combine(dir, TestResources.DailyBuildPackages.NameA), TestResources.DailyBuildPackages.A); - File.WriteAllBytes(b_daily = Path.Combine(dir, TestResources.DailyBuildPackages.NameB), TestResources.DailyBuildPackages.B); - File.WriteAllBytes(c_daily = Path.Combine(dir, TestResources.DailyBuildPackages.NameC), TestResources.DailyBuildPackages.C); - File.WriteAllBytes(d_daily = Path.Combine(dir, TestResources.DailyBuildPackages.NameD), TestResources.DailyBuildPackages.D); + File.WriteAllBytes(a_daily = Path.Combine(dir, TestResources.DailyBuildPackages.NameA), TestResources.DailyBuildPackages.TestPackageA); + File.WriteAllBytes(b_daily = Path.Combine(dir, TestResources.DailyBuildPackages.NameB), TestResources.DailyBuildPackages.TestPackageB); + File.WriteAllBytes(c_daily = Path.Combine(dir, TestResources.DailyBuildPackages.NameC), TestResources.DailyBuildPackages.TestPackageC); + File.WriteAllBytes(d_daily = Path.Combine(dir, TestResources.DailyBuildPackages.NameD), TestResources.DailyBuildPackages.TestPackageD); var a_pre = Path.Combine(dir, TestResources.PreReleasePackages.NameA); var b_pre = Path.Combine(dir, TestResources.PreReleasePackages.NameB); @@ -78,15 +78,15 @@ public void TestPackagesSemVer1() NuGetVersionUpdater.Run(new[] { a_daily, b_daily, c_daily, d_daily }, dir, VersionTranslation.Release, exactVersions: false); NuGetVersionUpdater.Run(new[] { a_daily, b_daily, c_daily, d_daily }, dir, VersionTranslation.PreRelease, exactVersions: false); - AssertPackagesEqual(TestResources.ReleasePackages.A, File.ReadAllBytes(a_rel)); - AssertPackagesEqual(TestResources.ReleasePackages.B, File.ReadAllBytes(b_rel)); - AssertPackagesEqual(TestResources.ReleasePackages.C, File.ReadAllBytes(c_rel)); - AssertPackagesEqual(TestResources.ReleasePackages.D, File.ReadAllBytes(d_rel)); + AssertPackagesEqual(TestResources.ReleasePackages.TestPackageA, File.ReadAllBytes(a_rel)); + AssertPackagesEqual(TestResources.ReleasePackages.TestPackageB, File.ReadAllBytes(b_rel)); + AssertPackagesEqual(TestResources.ReleasePackages.TestPackageC, File.ReadAllBytes(c_rel)); + AssertPackagesEqual(TestResources.ReleasePackages.TestPackageD, File.ReadAllBytes(d_rel)); - AssertPackagesEqual(TestResources.PreReleasePackages.A, File.ReadAllBytes(a_pre)); - AssertPackagesEqual(TestResources.PreReleasePackages.B, File.ReadAllBytes(b_pre)); - AssertPackagesEqual(TestResources.PreReleasePackages.C, File.ReadAllBytes(c_pre)); - AssertPackagesEqual(TestResources.PreReleasePackages.D, File.ReadAllBytes(d_pre)); + AssertPackagesEqual(TestResources.PreReleasePackages.TestPackageA, File.ReadAllBytes(a_pre)); + AssertPackagesEqual(TestResources.PreReleasePackages.TestPackageB, File.ReadAllBytes(b_pre)); + AssertPackagesEqual(TestResources.PreReleasePackages.TestPackageC, File.ReadAllBytes(c_pre)); + AssertPackagesEqual(TestResources.PreReleasePackages.TestPackageD, File.ReadAllBytes(d_pre)); Directory.Delete(dir, recursive: true); } @@ -98,8 +98,8 @@ public void TestPackagesSemVer2() Directory.CreateDirectory(dir); string e_daily, f_daily; - File.WriteAllBytes(e_daily = Path.Combine(dir, TestResources.DailyBuildPackages.NameE), TestResources.DailyBuildPackages.E); - File.WriteAllBytes(f_daily = Path.Combine(dir, TestResources.DailyBuildPackages.NameF), TestResources.DailyBuildPackages.F); + File.WriteAllBytes(e_daily = Path.Combine(dir, TestResources.DailyBuildPackages.NameE), TestResources.DailyBuildPackages.TestPackageE); + File.WriteAllBytes(f_daily = Path.Combine(dir, TestResources.DailyBuildPackages.NameF), TestResources.DailyBuildPackages.TestPackageF); var e_pre = Path.Combine(dir, TestResources.PreReleasePackages.NameE); var f_pre = Path.Combine(dir, TestResources.PreReleasePackages.NameF); @@ -110,11 +110,11 @@ public void TestPackagesSemVer2() NuGetVersionUpdater.Run(new[] { e_daily, f_daily }, dir, VersionTranslation.Release, exactVersions: true); NuGetVersionUpdater.Run(new[] { e_daily, f_daily }, dir, VersionTranslation.PreRelease, exactVersions: true); - AssertPackagesEqual(TestResources.ReleasePackages.E, File.ReadAllBytes(e_rel)); - AssertPackagesEqual(TestResources.ReleasePackages.F, File.ReadAllBytes(f_rel)); + AssertPackagesEqual(TestResources.ReleasePackages.TestPackageE, File.ReadAllBytes(e_rel)); + AssertPackagesEqual(TestResources.ReleasePackages.TestPackageF, File.ReadAllBytes(f_rel)); - AssertPackagesEqual(TestResources.PreReleasePackages.E, File.ReadAllBytes(e_pre)); - AssertPackagesEqual(TestResources.PreReleasePackages.F, File.ReadAllBytes(f_pre)); + AssertPackagesEqual(TestResources.PreReleasePackages.TestPackageE, File.ReadAllBytes(e_pre)); + AssertPackagesEqual(TestResources.PreReleasePackages.TestPackageF, File.ReadAllBytes(f_pre)); Directory.Delete(dir, recursive: true); } @@ -126,33 +126,33 @@ public void TestValidation() Directory.CreateDirectory(dir); string a_daily, b_daily, c_daily; - File.WriteAllBytes(a_daily = Path.Combine(dir, TestResources.DailyBuildPackages.NameA), TestResources.DailyBuildPackages.A); - File.WriteAllBytes(b_daily = Path.Combine(dir, TestResources.DailyBuildPackages.NameB), TestResources.DailyBuildPackages.B); - File.WriteAllBytes(c_daily = Path.Combine(dir, TestResources.DailyBuildPackages.NameC), TestResources.DailyBuildPackages.C); + File.WriteAllBytes(a_daily = Path.Combine(dir, TestResources.DailyBuildPackages.NameA), TestResources.DailyBuildPackages.TestPackageA); + File.WriteAllBytes(b_daily = Path.Combine(dir, TestResources.DailyBuildPackages.NameB), TestResources.DailyBuildPackages.TestPackageB); + File.WriteAllBytes(c_daily = Path.Combine(dir, TestResources.DailyBuildPackages.NameC), TestResources.DailyBuildPackages.TestPackageC); var e1 = Assert.Throws(() => NuGetVersionUpdater.Run(new[] { c_daily }, outDirectoryOpt: null, VersionTranslation.Release, exactVersions: false)); - AssertEx.AreEqual("Package 'C' depends on a pre-release package 'B, [1.0.0-beta-12345-01]'", e1.Message); + AssertEx.AreEqual("Package 'TestPackageC' depends on a pre-release package 'TestPackageB, [1.0.0-beta-12345-01]'", e1.Message); var e2 = Assert.Throws(() => NuGetVersionUpdater.Run(new[] { a_daily }, outDirectoryOpt: null, VersionTranslation.Release, exactVersions: false)); AssertEx.Equal(new[] { - "System.InvalidOperationException: Package 'A' depends on a pre-release package 'B, 1.0.0-beta-12345-01'", - "System.InvalidOperationException: Package 'A' depends on a pre-release package 'C, (, 1.0.0-beta-12345-01]'", - "System.InvalidOperationException: Package 'A' depends on a pre-release package 'C, 1.0.0-beta-12345-01'" + "System.InvalidOperationException: Package 'TestPackageA' depends on a pre-release package 'TestPackageB, 1.0.0-beta-12345-01'", + "System.InvalidOperationException: Package 'TestPackageA' depends on a pre-release package 'TestPackageC, (, 1.0.0-beta-12345-01]'", + "System.InvalidOperationException: Package 'TestPackageA' depends on a pre-release package 'TestPackageC, 1.0.0-beta-12345-01'" }, e2.InnerExceptions.Select(i => i.ToString())); var e3 = Assert.Throws(() => NuGetVersionUpdater.Run(new[] { a_daily, b_daily }, outDirectoryOpt: null, VersionTranslation.Release, exactVersions: false)); AssertEx.Equal(new[] { - "System.InvalidOperationException: Package 'A' depends on a pre-release package 'C, (, 1.0.0-beta-12345-01]'", - "System.InvalidOperationException: Package 'A' depends on a pre-release package 'C, 1.0.0-beta-12345-01'" + "System.InvalidOperationException: Package 'TestPackageA' depends on a pre-release package 'TestPackageC, (, 1.0.0-beta-12345-01]'", + "System.InvalidOperationException: Package 'TestPackageA' depends on a pre-release package 'TestPackageC, 1.0.0-beta-12345-01'" }, e3.InnerExceptions.Select(i => i.ToString())); var e4 = Assert.Throws(() => NuGetVersionUpdater.Run(new[] { a_daily, c_daily }, outDirectoryOpt: null, VersionTranslation.Release, exactVersions: false)); AssertEx.Equal(new[] { - "System.InvalidOperationException: Package 'A' depends on a pre-release package 'B, 1.0.0-beta-12345-01'", - "System.InvalidOperationException: Package 'C' depends on a pre-release package 'B, [1.0.0-beta-12345-01]'" + "System.InvalidOperationException: Package 'TestPackageA' depends on a pre-release package 'TestPackageB, 1.0.0-beta-12345-01'", + "System.InvalidOperationException: Package 'TestPackageC' depends on a pre-release package 'TestPackageB, [1.0.0-beta-12345-01]'" }, e4.InnerExceptions.Select(i => i.ToString())); Directory.Delete(dir, recursive: true); @@ -168,12 +168,12 @@ public void TestDotnetToolValidation() string dotnet_tool; File.WriteAllBytes(dotnet_tool = Path.Combine(dir, TestResources.MiscPackages.NameDotnetTool), TestResources.MiscPackages.DotnetTool); string normal_package_b_daily; - File.WriteAllBytes(normal_package_b_daily = Path.Combine(dir, TestResources.DailyBuildPackages.NameB), TestResources.DailyBuildPackages.B); + File.WriteAllBytes(normal_package_b_daily = Path.Combine(dir, TestResources.DailyBuildPackages.NameB), TestResources.DailyBuildPackages.TestPackageB); NuGetVersionUpdater.Run(new[] { dotnet_tool, normal_package_b_daily }, outDirectoryOpt: outputDir, VersionTranslation.Release, exactVersions: false); // Only contain normal package. dotnet tool package is skipped - Assert.Single(Directory.EnumerateFiles(outputDir), fullPath => Path.GetFileNameWithoutExtension(fullPath) == "B.1.0.0"); + Assert.Single(Directory.EnumerateFiles(outputDir), fullPath => Path.GetFileNameWithoutExtension(fullPath) == "TestPackageB.1.0.0"); Directory.Delete(dir, recursive: true); Directory.Delete(outputDir, recursive: true); From 3359a41775dba538e6449b9f01f5748803db9e28 Mon Sep 17 00:00:00 2001 From: Steve Pfister Date: Mon, 27 Sep 2021 03:46:36 -0400 Subject: [PATCH 402/699] Fix RuntimeInformation.FrameworkDescription in DiscovererHelpers (#7965) Co-authored-by: Steve Pfister --- src/Microsoft.DotNet.XUnitExtensions/src/DiscovererHelpers.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Microsoft.DotNet.XUnitExtensions/src/DiscovererHelpers.cs b/src/Microsoft.DotNet.XUnitExtensions/src/DiscovererHelpers.cs index b1762309589..78d7f258eb4 100644 --- a/src/Microsoft.DotNet.XUnitExtensions/src/DiscovererHelpers.cs +++ b/src/Microsoft.DotNet.XUnitExtensions/src/DiscovererHelpers.cs @@ -14,7 +14,7 @@ internal static class DiscovererHelpers { private static readonly Lazy s_isMonoRuntime = new Lazy(() => Type.GetType("Mono.RuntimeStructs") != null); public static bool IsMonoRuntime => s_isMonoRuntime.Value; - public static bool IsRunningOnNetCoreApp { get; } = (Environment.Version.Major >= 5 || RuntimeInformation.FrameworkDescription.StartsWith(".NET Core", StringComparison.OrdinalIgnoreCase)); + public static bool IsRunningOnNetCoreApp { get; } = (Environment.Version.Major >= 5 || RuntimeInformation.FrameworkDescription.StartsWith(".NET", StringComparison.OrdinalIgnoreCase)); public static bool IsRunningOnNetFramework { get; } = RuntimeInformation.FrameworkDescription.StartsWith(".NET Framework", StringComparison.OrdinalIgnoreCase); public static bool TestPlatformApplies(TestPlatforms platforms) => From c508ed23f86c702a8ca596d29665dec45ec99d3b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C5=99emek=20Vysok=C3=BD?= Date: Mon, 27 Sep 2021 13:45:42 +0200 Subject: [PATCH 403/699] Request retry+reboot when Apple app installation hangs (#7966) --- .../Sdk/CreateXHarnessAppleWorkItems.cs | 2 +- .../Sdk/tools/xharness-runner/xharness-runner.apple.sh | 8 ++++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/src/Microsoft.DotNet.Helix/Sdk/CreateXHarnessAppleWorkItems.cs b/src/Microsoft.DotNet.Helix/Sdk/CreateXHarnessAppleWorkItems.cs index e324eea4bec..fe8c942a338 100644 --- a/src/Microsoft.DotNet.Helix/Sdk/CreateXHarnessAppleWorkItems.cs +++ b/src/Microsoft.DotNet.Helix/Sdk/CreateXHarnessAppleWorkItems.cs @@ -30,7 +30,7 @@ public static class MetadataNames private const string EntryPointScript = "xharness-helix-job.apple.sh"; private const string RunnerScript = "xharness-runner.apple.sh"; - private static readonly TimeSpan s_defaultLaunchTimeout = TimeSpan.FromMinutes(10); + private static readonly TimeSpan s_defaultLaunchTimeout = TimeSpan.FromMinutes(5); /// /// An array of one or more paths to iOS/tvOS app bundles (folders ending with ".app" usually) diff --git a/src/Microsoft.DotNet.Helix/Sdk/tools/xharness-runner/xharness-runner.apple.sh b/src/Microsoft.DotNet.Helix/Sdk/tools/xharness-runner/xharness-runner.apple.sh index 6edac5fe051..69d5adc7c55 100644 --- a/src/Microsoft.DotNet.Helix/Sdk/tools/xharness-runner/xharness-runner.apple.sh +++ b/src/Microsoft.DotNet.Helix/Sdk/tools/xharness-runner/xharness-runner.apple.sh @@ -179,6 +179,14 @@ if [ $exit_code -eq 81 ] && [[ "$target" =~ "device" ]]; then touch './.reboot' fi +# Simulators are known to slow down which results in installation taking several minutes +# Retry+reboot usually resolves this +# 86 - app installation timeout +if [ $exit_code -eq 86 ]; then + touch './.retry' + touch './.reboot' +fi + # The simulator logs comming from the sudo-spawned Simulator.app are not readable/deletable by the helix uploader chmod -R 0766 "$output_directory" From 60ba918d1b49f36ee1f4dac95730cfc4abe7f9c0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C5=99emek=20Vysok=C3=BD?= Date: Mon, 27 Sep 2021 15:12:04 +0200 Subject: [PATCH 404/699] Enable requesting infra retry + reboot during XHarness workloads (#7967) --- .../xharness-helix-job.apple.sh | 4 +-- .../xharness-runner/xharness-runner.apple.sh | 30 +++++++++++-------- 2 files changed, 19 insertions(+), 15 deletions(-) diff --git a/src/Microsoft.DotNet.Helix/Sdk/tools/xharness-runner/xharness-helix-job.apple.sh b/src/Microsoft.DotNet.Helix/Sdk/tools/xharness-runner/xharness-helix-job.apple.sh index 9378733bed3..c87d0375930 100644 --- a/src/Microsoft.DotNet.Helix/Sdk/tools/xharness-runner/xharness-helix-job.apple.sh +++ b/src/Microsoft.DotNet.Helix/Sdk/tools/xharness-runner/xharness-helix-job.apple.sh @@ -45,11 +45,11 @@ exit_code=$? # Since we run the payload script using launchctl, env vars such as PYTHON_PATH are not set there and we have to do this part here # We signal this by creating files if [ -f './.retry' ]; then - "$HELIX_PYTHONPATH" -c "from helix.workitemutil import request_infra_retry; request_infra_retry('Retrying because XHarness ended with $exit_code')" + "$HELIX_PYTHONPATH" -c "from helix.workitemutil import request_infra_retry; request_infra_retry('Retrying work item because XHarness workload requested it')" fi if [ -f './.reboot' ]; then - "$HELIX_PYTHONPATH" -c "from helix.workitemutil import request_reboot; request_reboot('Rebooting because XHarness ended with $exit_code')" + "$HELIX_PYTHONPATH" -c "from helix.workitemutil import request_reboot; request_reboot('Rebooting because XHarness workload requested it)" fi exit $exit_code diff --git a/src/Microsoft.DotNet.Helix/Sdk/tools/xharness-runner/xharness-runner.apple.sh b/src/Microsoft.DotNet.Helix/Sdk/tools/xharness-runner/xharness-runner.apple.sh index 69d5adc7c55..0f9188a88ab 100644 --- a/src/Microsoft.DotNet.Helix/Sdk/tools/xharness-runner/xharness-runner.apple.sh +++ b/src/Microsoft.DotNet.Helix/Sdk/tools/xharness-runner/xharness-runner.apple.sh @@ -144,6 +144,13 @@ function xharness() { dotnet exec "$XHARNESS_CLI_PATH" "$@" } +function report_infrastructure_failure() { + echo "Infrastructural problem reported by the user, requesting retry+reboot: $1" + + touch './.retry' + touch './.reboot' +} + # Act out the actual commands (and time constrain them to create buffer for the end of this script) source command.sh & PID=$! ; (sleep $command_timeout && kill $PID 2> /dev/null & ) ; wait $PID exit_code=$? @@ -156,35 +163,32 @@ if [ $exit_code -eq 80 ] && [[ "$target" =~ "simulator" ]]; then sudo pkill -9 -f "$simulator_app" fi -# If we fail to find a simulator and we are not targeting a specific version (e.g. `ios-simulator_13.5`), it is probably an issue because Xcode should always have at least one runtime version inside -# 81 - simulator/device not found -if [ $exit_code -eq 81 ] && [[ "$target" =~ "simulator" ]] && [[ ! "$target" =~ "_" ]]; then - touch './.retry' - touch './.reboot' -fi - # If we have a launch failure AND we are on simulators, we need to signal that we want a reboot+retry # The script that is running this one will notice and request Helix to do it # 83 - app launch failure if [ $exit_code -eq 83 ] && [[ "$target" =~ "simulator" ]]; then - touch './.retry' - touch './.reboot' + report_infrastructure_failure "Failed to launch the application on a simulator" +fi + +# If we fail to find a simulator and we are not targeting a specific version (e.g. `ios-simulator_13.5`), +# it is probably an issue because Xcode should always have at least one runtime version inside +# 81 - simulator/device not found +if [ $exit_code -eq 81 ] && [[ "$target" =~ "simulator" ]] && [[ ! "$target" =~ "_" ]]; then + report_infrastructure_failure "No simulator runtime found" fi # If we fail to find a real device, it is unexpected as device queues should have one # It can often be fixed with a reboot # 81 - device not found if [ $exit_code -eq 81 ] && [[ "$target" =~ "device" ]]; then - touch './.retry' - touch './.reboot' + report_infrastructure_failure "Requested tethered Apple device not found" fi # Simulators are known to slow down which results in installation taking several minutes # Retry+reboot usually resolves this # 86 - app installation timeout if [ $exit_code -eq 86 ]; then - touch './.retry' - touch './.reboot' + report_infrastructure_failure "Installation timed out" fi # The simulator logs comming from the sudo-spawned Simulator.app are not readable/deletable by the helix uploader From 6ec46745c79f67b66294206e12db5590d235e811 Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Mon, 27 Sep 2021 13:15:44 +0000 Subject: [PATCH 405/699] [main] Update dependencies from dotnet/xliff-tasks dotnet/arcade dotnet/sourcelink dotnet/xharness (#7963) [main] Update dependencies from dotnet/xliff-tasks dotnet/arcade dotnet/sourcelink dotnet/xharness --- eng/Version.Details.xml | 32 ++++++++++++++++---------------- eng/Versions.props | 14 +++++++------- global.json | 4 ++-- 3 files changed, 25 insertions(+), 25 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index 6f4ba200553..f95d863616c 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -11,25 +11,25 @@ - + https://github.com/dotnet/arcade - c7546c02b92d9d5cbad2345e15a5962253bf6560 + 3ea0d860c6973f2cbadc9e895c7ec2cbdaec4ad5 - + https://github.com/dotnet/arcade - c7546c02b92d9d5cbad2345e15a5962253bf6560 + 3ea0d860c6973f2cbadc9e895c7ec2cbdaec4ad5 - + https://github.com/dotnet/arcade - c7546c02b92d9d5cbad2345e15a5962253bf6560 + 3ea0d860c6973f2cbadc9e895c7ec2cbdaec4ad5 - + https://github.com/dotnet/arcade - c7546c02b92d9d5cbad2345e15a5962253bf6560 + 3ea0d860c6973f2cbadc9e895c7ec2cbdaec4ad5 - + https://github.com/dotnet/arcade - c7546c02b92d9d5cbad2345e15a5962253bf6560 + 3ea0d860c6973f2cbadc9e895c7ec2cbdaec4ad5 https://github.com/dotnet/arcade-services @@ -39,9 +39,9 @@ https://github.com/dotnet/arcade-services cac955fe259cb611f6a29d09209bd717deb69037 - + https://github.com/dotnet/xharness - e045ce36ce5d46bbd44097592bcf1b69c5ca75a2 + bd48cb5e8e59710bb8a22e0e875cefde8b6f832f https://github.com/dotnet/roslyn @@ -51,12 +51,12 @@ https://github.com/dotnet/linker d51cc207fac85547787bbba83f54f69d8e72e9f5 - + https://github.com/dotnet/sourcelink 76dead04f4f2774e23e70b093a4fd618fc01b7ff - + https://github.com/dotnet/sourcelink 76dead04f4f2774e23e70b093a4fd618fc01b7ff @@ -68,9 +68,9 @@ https://github.com/dotnet/symreader-converter c5ba7c88f92e2dde156c324a8c8edc04d9fa4fe0 - + https://github.com/dotnet/xliff-tasks - dcaca495a46b8837c4478221a2e0ac430082ece3 + 3fd0189eea3161e77698e98830a525059f2641b6 diff --git a/eng/Versions.props b/eng/Versions.props index 7c386a26037..2c4d8f9af7d 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -67,8 +67,8 @@ 2.4.1 2.0.3 2.4.1 - 7.0.0-beta.21473.1 - 7.0.0-beta.21473.1 + 7.0.0-beta.21474.2 + 7.0.0-beta.21474.2 1.22.0 1.1.2 2.0.0 @@ -77,12 +77,12 @@ 2.0.4 1.1.0-beta2-19575-01 1.1.0-beta.20258.6 - 1.1.0-beta-21473-03 - 1.1.0-beta-21473-03 - 7.0.0-beta.21473.1 - 1.0.0-beta.21473.1 + 1.1.0-beta-21475-01 + 1.1.0-beta-21475-01 + 7.0.0-beta.21474.2 + 1.0.0-beta.21475.1 1.1.0-beta.21378.2 - 1.0.0-prerelease.21465.1 + 1.0.0-prerelease.21472.2 2.0.0-preview.1.21466.7 2.0.0-preview.1.21466.7 6.0.100-preview.5.21254.11 diff --git a/global.json b/global.json index 23ed7a33bb1..5f60495bf2c 100644 --- a/global.json +++ b/global.json @@ -3,7 +3,7 @@ "dotnet": "6.0.100-rc.1.21430.12" }, "msbuild-sdks": { - "Microsoft.DotNet.Arcade.Sdk": "7.0.0-beta.21473.1", - "Microsoft.DotNet.Helix.Sdk": "7.0.0-beta.21473.1" + "Microsoft.DotNet.Arcade.Sdk": "7.0.0-beta.21474.2", + "Microsoft.DotNet.Helix.Sdk": "7.0.0-beta.21474.2" } } From 5260476420b2caa485c2d8af0b73486c89db7464 Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Mon, 27 Sep 2021 13:58:28 +0000 Subject: [PATCH 406/699] Update dependencies from https://github.com/dotnet/roslyn build 20210926.2 (#7968) [main] Update dependencies from dotnet/roslyn --- eng/Version.Details.xml | 4 ++-- eng/Versions.props | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index f95d863616c..1eab8b1ceef 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -43,9 +43,9 @@ https://github.com/dotnet/xharness bd48cb5e8e59710bb8a22e0e875cefde8b6f832f - + https://github.com/dotnet/roslyn - c1d8c6f043bc80425c6828455eb57f8a404759c6 + 171c2f20ea4d586cf4f101f30ee41f625e01455e https://github.com/dotnet/linker diff --git a/eng/Versions.props b/eng/Versions.props index 2c4d8f9af7d..ae384348458 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -36,7 +36,7 @@ 2.0.0 2.1.1 2.1.0 - 4.0.0-5.21469.2 + 4.0.0-5.21476.2 16.7.1 6.0.100-1.21473.1 4.8.3 From 7363d2e91072fb04f1b1bb41a68902508724ba2e Mon Sep 17 00:00:00 2001 From: Kunal Pathak Date: Mon, 27 Sep 2021 12:26:58 -0700 Subject: [PATCH 407/699] Fix HelixResultsDestinationDir (#7961) --- .../tools/download-results/DownloadFromResultsContainer.targets | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Microsoft.DotNet.Helix/Sdk/tools/download-results/DownloadFromResultsContainer.targets b/src/Microsoft.DotNet.Helix/Sdk/tools/download-results/DownloadFromResultsContainer.targets index a3b6f158fa8..ac8ad014f04 100644 --- a/src/Microsoft.DotNet.Helix/Sdk/tools/download-results/DownloadFromResultsContainer.targets +++ b/src/Microsoft.DotNet.Helix/Sdk/tools/download-results/DownloadFromResultsContainer.targets @@ -13,7 +13,7 @@ - $([MSBuild]::NormalizeDirectory('$(BUILD_SOURCESDIRECTORY)', 'artifacts', helixresults')) + $([MSBuild]::NormalizeDirectory($(BUILD_SOURCESDIRECTORY), 'artifacts', helixresults')) <_shouldDownloadResults>false <_shouldDownloadResults Condition="'@(_workItemsWithDownloadMetadata)' != '' AND '$(HelixResultsDestinationDir)' != ''">true From 30d5be4613a1b969bb5bdf5a5dd8fe023b2f1eda Mon Sep 17 00:00:00 2001 From: Juan Hoyos <19413848+hoyosjs@users.noreply.github.com> Date: Mon, 27 Sep 2021 16:48:22 -0700 Subject: [PATCH 408/699] Update symboluploader to work around tracing NullRefs (#7964) --- eng/Version.Details.xml | 8 ++++---- eng/Versions.props | 6 +++--- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index 1eab8b1ceef..4483770c876 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -1,13 +1,13 @@ - + https://dev.azure.com/dnceng/internal/_git/dotnet-symuploader - 68d4f809708e1ccf7102ca25a608c6bf8df44ab9 + 384e981c1e7a692616101bc12d06597295da5465 - + https://dev.azure.com/dnceng/internal/_git/dotnet-symuploader - 68d4f809708e1ccf7102ca25a608c6bf8df44ab9 + 384e981c1e7a692616101bc12d06597295da5465 diff --git a/eng/Versions.props b/eng/Versions.props index ae384348458..96993c2d6ae 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -82,9 +82,9 @@ 7.0.0-beta.21474.2 1.0.0-beta.21475.1 1.1.0-beta.21378.2 - 1.0.0-prerelease.21472.2 - 2.0.0-preview.1.21466.7 - 2.0.0-preview.1.21466.7 + 1.0.0-prerelease.21472.2 + 2.0.0-preview.1.21474.2 + 2.0.0-preview.1.21474.2 6.0.100-preview.5.21254.11 1.0.0-preview1.1.21116.1 From 7300da908a6debd84755b6f28ac2ff86c8851be8 Mon Sep 17 00:00:00 2001 From: Alitzel Mendez <6895254+AlitzelMendez@users.noreply.github.com> Date: Mon, 27 Sep 2021 17:03:37 -0700 Subject: [PATCH 409/699] Test retry documentation (#7962) * test retry documentation * Update Documentation/Projects/Build Analysis/Test Retry Documentation.md Co-authored-by: Michael Stuckey * Update Documentation/Projects/Build Analysis/Test Retry Documentation.md Co-authored-by: Missy Messa <47990216+missymessa@users.noreply.github.com> * Update Documentation/Projects/Build Analysis/Test Retry Documentation.md Co-authored-by: Missy Messa <47990216+missymessa@users.noreply.github.com> * Feedback Co-authored-by: Michael Stuckey Co-authored-by: Missy Messa <47990216+missymessa@users.noreply.github.com> --- .../Build Analysis/Resources/ArtifactsTab.png | Bin 0 -> 383873 bytes .../Resources/AzureDevOpsArtifactsTab.PNG | Bin 0 -> 213810 bytes .../Resources/AzureDevOpsPassedOnRerun.PNG | Bin 0 -> 117980 bytes .../Test Retry Documentation.md | 44 ++++++++++++++++++ 4 files changed, 44 insertions(+) create mode 100644 Documentation/Projects/Build Analysis/Resources/ArtifactsTab.png create mode 100644 Documentation/Projects/Build Analysis/Resources/AzureDevOpsArtifactsTab.PNG create mode 100644 Documentation/Projects/Build Analysis/Resources/AzureDevOpsPassedOnRerun.PNG create mode 100644 Documentation/Projects/Build Analysis/Test Retry Documentation.md diff --git a/Documentation/Projects/Build Analysis/Resources/ArtifactsTab.png b/Documentation/Projects/Build Analysis/Resources/ArtifactsTab.png new file mode 100644 index 0000000000000000000000000000000000000000..f063f9dafd715257ef9eb35ec78aa78c70849b06 GIT binary patch literal 383873 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�s!=J}xB%%DSQ#O(^? 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
    ?Pi2U-nT7tSI@v<0DXK4t)_QeH0gcH%XTQ!Ad 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
  1. cv0S*PkvYkPfHucd{Sm+-Rl;pA zlFi`y_(0t2gEQ=eH&0@S~+arh>s4Q=aN*7-3Jh5pi6rIF}>n+G`qDKVi zYGTP-jzx1db?5^oK!-q>~b>?_AjOCA2f-5HZZtwfG*_m|!7eX;VtseWdN zVbJI!IC(nwHTDX{v#N0#o$JCeCh88L#(t?c?R|8k`bo)>Eo+R97)Hd&Njrp9oaf4q zNL}q>I4?(V))&hi#gN9l=-=gZ7+*sNsDG|CP8sz~9b(*B5o8G8PG7u^W^C-}dJ~qI zc2#$|XH<`2p=>h6y--(DinGnpr@w`r zvCf1bs>2z(etF!3!YI*-&3kYN+*RIMgK@k)u}L-0ZzCNX_Xj{0+cg;8ZT9HG>@CyL zGBfyp1FP1oL~}!#6u2r`#UbZS$_PNOvgTh(8s_{_s?1DF z4f}(?$hpm6%0Y%d&Y@d~z^56uF%l>+BwnrYB2ZsAz;sX?jt6xJ7udh#*e>@*&KY}7 z+V!?D9XY=P4H*#cD_E=L*wh>1mG7XS_7nZ7-iJ9IK`^Iw8>k)YmJv^>wvMP#y0bF< zVzW#lg1P%N-ZM9(3b3^|qngS$m}^Yr-R^#*~4z7uqLt=$Hb_IfC)~xcztT&AN(dnuyesq{s ze0cUcddwMm6V7As4}huT zmR#R^+O7STFvss5s>q|B`nj?rTDDVH1(pdyM^8uO?OfuPmk>jpj*-vQ;Xxi5W`HJ= zCbx3j1L`>WwzKByS{B1Bfi~h^7_=S4$ak3? z8{|gdS&LY(80s6xzq46`)vZhEdbQVKs{zos>hcS&gFQKjLvV6$l_ZERWhr_XU}Hx!vv-a!AHff3Wvv0 zQ<8W~XJo%Iml8hB81(Bmf=UTh&t;>up;vpi|NY!7tM7&F;5MyrV;aSY-nAs2)=k)~ zPVq!4u){hk9lIj6^w}{k;9VDwL`{9lJ%OJC9$9=$0u%OU5xvhC7X}f*8WjX5APq+6 zJ(0OROx!1onvoW%8(g->sD`HA<8Ove9zd}F8I75R?FYYYU)?@WyL5AAW=st0ylP6a{L9X4?>EQb@rWdFr(6t-J#>Ik&?VQ1u$58Q z-K6k~T1*fXJgdR!2O{i#pn#!tW9~fSGj$L{dRy~)xI&0@@L%9WRdkwf^h2%Gz`3;h zkv(598Z&;xGQ9$#D^g-YuBV*n8$XVz{rX-HlW*l_ulkbFfKiJp ze^8&>XK$daAC};{F2!C0&?I3vM59kWL?F?TXmxo{>fxMoB#LNToGH5 z2!hvf8(Jorwue+WKF#p@Zr$r5|9gcxGpCOuB|g# z#l+Qk_`RaV>kWa?ptF)VmC;~(vLd|IlY}RUVmdt{7+tda*p;o|B0s(jeBeMy0>Nu5 zls^A|7<;GqxB~V2yK!SRwr$&L)Fh1>+qN~aZMU)AaAK>mZA@(Z=bZC<@88?`%+2gQ zd+%qjXRYr-5PlwyQCnJXb50#L<1vd6sM&JbD;zAYY4iRG>Hcd1ErFIvXrRHbbWar0 zT|d5rlE4^tLK(=cJO`eO7pVi*jO2bmaO>)q%czq;sI{v4lS9Wi{zY@?2cV0{K2-+d zHP%M{2y3(N9V0EspKBsKePKkNkdn#cTd|5 zAi#?0i>E_FfPHbh_%P*Tr?X~}L`#>jO@maRX$BShb#uH^1XhDCFu{dO4oLkg#DZQ` z7PuZhnXw)&79d2?vV{;cgb|V+XlGAnB&i(zf}$7fz9T~tPK7gl(Kvf9EA18 ziahXtWHRdwYm?t;lw{IaFwAKy6T2?kqHm-P%}5%j4lbP6g8W*B@CcTl7#yXZkD{QZWDt{5d=SJ z%x#ZL3KXoN4vE}%Ddis2^K;9?pK|@lzTZSBQmVIs*W#TQy??k;{&b_Tl&W7D<3s(5 zZ}8c|R8yl811`%jM!`K!3pm-N1{-^I`cd9$!cGXD$N{b*_^B0u4+sJkM!=%mNHkWO zv$Zg2+XSpR7S{X@SXUYd8-s-kX7xCWS9cEV#6b0T8t4g$y<`m|$w+D1dv#^T9#HcJ zDdA1YR2au zI^jJ*0dUkQgQGA~8u%ZV;Eut6^d#uNtL<(KQ8+AdOZq-cX}*3}y>Ms(6nVma_)4I) z?N6k7XvSx|V>NLgbF|ahIN5Q0_P6Mh*VJmn{UgUGflHbo+} z$G_I3!jr1ZKyTC5*sa?;^@e&$2y~-?Si?k9A3%kw=H-%?W`ou2U-}!|4fDI?o|RUx zdf36?d)eY**n4+7JpMlu$mwket?rotL2Uot*}7o%%S+0l%x(>GeKlV%_C}zIx}=^ioB% z#^OG+ul*@UmJey^k@tk(-N;0s_aKkVz?@MHdfudwBc!F6Lxr`aaKdr085M@qI6?oa zMVQmpIvI8#bpKRLdjFV>t|Oa(VcS7U*#bQqykT2e!g5>>n0=xUYH)6Iyp6!~ql?ZE ztJGNtMs`h5QpY8jQdlU4d-bn9u+NF0LME%@ud@n;R~&1M_oXY`5yz+qhhLD+K_oNm zD32#LL%+C4Ih>3$M|>hfnQs*#kWTor{9_l5m{dOqOcJZ%2ToE$$WI)0MY0$w!_`CAOI=||F1!*B6tNG^3Yu6=bV>jdKD3Ei{R z$@l}BHzThA2EMmsRM1u2Lw_OypIZwZVxBc^yFbuqFz-6hyW5c212(WIcytjeI?Ox> zVop8<`d)|@(@6j0;OXxHltu-@*t7KbK0AZ|=3l&S52XslLudZFSP%-)KlI-0k~m0x z0^paW*gS>T!%R3%w_|gvXUzsz671qO96ONOycB~L=%v+oau(s*T#mmm>vo3d$iZLH zLfZzD8Up$OUI(W0Z)1V>a2sFs%nsW?!5=|7emLWma&R>cT!xOn;O%Gx>L`xuYY4`e zXvk%wYEA%`L=nF%L~rl-Q|yfT*VV}EoYunT-pzjdi;3^VQF4B4?*zj`t&Pim(m)kN z7j9iUQ-rB(wv}M~YvwWO`V28Nran%BSdf+UpRkkOwtpw?fRi3`dxJDHfmsm16&yO= zI8}=5-QHqG#BNDYDGeiL@_0(uZzoIUJhx>u5xnQOX~(l6V90RCZo7=`5=z7mr7*^`o%6LVJ8Bd7-?&_)x%)8W8 z0MCvi2~UAP6P|%O8D1w&I|12ko{8vi7`yPPRj<_+HDUWVOxEz$=@q>;nnnj0GyB2A zZsS8)WrBUK64xPK^wDk{x3#@BR`9|coi$AcFWjHD(3(W%D(wK0`z0SYO<6ArCXt)M zZ-givqz^$>h&SGNJhP+BF(k>J>pdG6;pKhjBP0Dvr9_B)rE}Q9jGF?S{E_1*gIWo?n^EMIq^GfevlH!b#lZIqCT0uLxrE#Bp1R+ z&kZq6@fMRFKCov^vnT)!d!B=`WXNuJYj1@XU}j+}P|J7}N@gcpn+ZoPQ4l0q z3^IG}fo2$KS^;P;P^G+x#(%&CW`BUkgmy9lHpU(RKA(aX^XA{HLE{!5W6zE#xO(S#e)rn-` zJjmuEjr@_|Tivt7aO=v-#bl$SGPD^)o;XT_P}5AhB0-V$*$S50F#YX48~8WTSbs9E z5^0LzchZb)8Rpt<*GCpEgoy~BMSn#aeC$zBcv2r z|44h^tw{(V!H?n$B>Pa5Y$w1~kp;9q0yo@oMdrjxa=(_LjEGFH0qK&qkr z|1usQ68|x+VT5Lc4qjRPoq966Lf;b2WgQ65zyaIHSEeXtdA21cXokN@#{UBqU#(l_ zXv!F(ti6o4br;gC9=+pjbtl3b_@`oN_q;%6a=gcNQoWeGkx30`0f<%i74A?GB|b3T zXSnR0Ss++FdmM%u5cq%Enus3F#6n1l3LA(Iv9tS=*dHX&ZwIYe_Ft>RHqjOIdu-7@ z?aK=_n9uIX6T|4>vAKyr*>hE+CK1g>oB6&o!DB$3ufxRRx&VR*xUi#m`1t_`dzTH8Oc@P**K?Ik zRu<1oH0D5%7D$4?v>qF|k5bs+aM(&bP=nFlv>@dlE9pL?+H8!9jU{AWo;sZkqhtZq zzR9T;Bch3-)y?&r&eM|aR8Ipsy?qn4ho%qio@{Dhz^h8`0Pn+t)ju-t4fAAXPf=zb z+UI?8T!AjVo^vr?dZsDk%;gt}Qj_w%s6EMVu^c=5LIzKaMH`MnHv!Z;{UlJ4>|}gS z0mLC%Egs$I9}f>?t3hQ}82Zf2#V>>+5MZ#jYB>9eX^OU;R7}1Xf|eey&n7@F_S;X3 zg4fuD(b`rPtb2-ObswF&-LOw$)GAG;Wg&6t*+(k|yl=jAs|k;OFD)@yM2uQqE7eo; zo*=_qxiIW>Dx(w88vV7+GO7s(@`*9 zFRzGl7*03hK{Eq}*XmUOEHxZ^5N(zs<*ViA2auClKnSg}xR8yBOpd`eILsA)XLIN< zebtE1vssT|Uv}~d(Ne0EC`~|R69DPdTl^-*GDy1eqpq#?e})P0rz{lHWY8e-h}L}d z1%&@5U60U~(k|_;((wcn`OJo&<@f{PfrP6)b3}7Y(omOY5Wv)!$6dvD9weD)qV6&s7R_Pm zE4$_!2i^R`jH4tB3U2spw)}T%{8t0g7uh&+gi~d96OqWQI)h;*8h4MV-e@nXZ}>-B z^cztUer8RzqN+X1QQ03fjBiGf?#6bgNzM6SD3>$a7URU@u*kQ0LPcYe-flEr7aO;| z2?P#roVlGwTLj@|w|A4<=d zncU4lGdp>5iz$cekE48wv!j)SgD&!>+XHa35yJ$hXajV?wqZVKwtJVSs+IAn4R!Zq z&VOPg2bRgdDsTt=oVk85dz;m6D1+0;Ql$!+TK~Se)rV)%%`yhk=6YLH6`u*QoF0d83JqGPBgJ#8H-;C}@i68NIm3{=!~Z4FKELJZL7Jx; zqU495BeodcT{>YuQ{5KJk#?(1HQjL;xJq;KL4oGfNBsLQ3 zZ#Q>6F&WeVDd8r>>(p1(Vs-Fs!wDgE+YB#in{(P3OIK=`bCy{QPMC3H{1W(}##`?Q z*`G`{PyNdt#ojcigAj)Z+ zZjCRX>whGma99K%9?E;iSjdKMF-mTKVR&lgFIE zsArW;QZ8(Bfi$H?WAah+D=5$JlMi`Ki&1~XE||8%&Wf-oG}h`4q71lcYNkpq6dH`) zFJ|r_ncL#m>LT52C|nQbG83xhFbmIS+>N@i3AkNb3uxBrGFkkJhbY%hhX{hMS{|F- zu&YE2hmGp>+7RHTl96igZHE7N(z}v6xYBED1F3TXwg#K}qYpKQvl;%O9}s z(4SRN5_{_Y^wa|Ui{*d+(W@=$j;pu7E)kaf$D+k%nu;vo@btS#5RO`l72y4N)+q*s zSi+1<>A<{Pqoz#R8!#6aoX&+~~I7|t@c+s>$Tx{qW4&WVRC%O6X*B6Jr{Qg9$E&@xdV#Ce}a zaoz(bx0nTN4kSi(4QIq16z*7k6th#234LhI|FFB~O1EYcBehxme*}6uWxDL>?J3U8@2PQuyEPO}$Mw`V6Vj`{riq-E5;`?Yn`z*aqn5jo zI&?WmVyMZR_*81rRN`X!==4~sBToIce_Edy!qknV^(nK$rQD8*@$c(tq1M*sAoa25qHRE;PY~J zkp6zEs4p*SVcl_+)uZ_^VJ^MdL?zA2rn4V5x&sPu)d!QLfgsr`PSO zA92vT%sdA@C(|vCpW^WuY`|l>58rP+z+~By=VgiIR)TlMyNvD;*$s}L!U)Zs$E1af zb$5~Owc5P=9oK4qbKvcVs|rtsMZ|^hZ|34qzo&nZda4dH(vm{&4H5k|9Zp^_Ej_1d z8R?cdg=du$AdNtlA8TYIhn?P64=cQDSYC*)9dzfJUIQ(ewG#}Z`vjvOzR8a?XKISn z6ICq5PZqF@T`0O#0Sz?wxy; z!FkuhqvST0-p*v%T7ASen&WQDxNoJ%BRp4VO8{mL^Pgywq)MSvk;kd*!t|8|2kZh$ ztgOC!iuLH?vU!5RH;8|+y`j@GXRc|zgig`34ZhnBLONymIa~Z#Rck-AdUEEBU{zy_F^OIbHbZe(z4dl0vR^|3v2MHDw%~ znypsT2s3vu#d=+Mc0Fk&;Gd9Ph95XCHyFa_a*%oGBCK>2V^&qiBC zb?ymJmPm5?__A z8fM5Z*J0;th{sPj=m}plt_NiX07i(1;q%|$4`2Sbo%w{fgjVS1fUj@d2^~d<@~`P1 z*S;(3nhg_38}?2X2OlzJM5Qd&h9Hm3YnN$x&m9;LsP=c-^^z*j6trF1U6uH)%YOqh zTVY_`Trk@Z$vAnv&1oeRQFFabUi{&6ySD`vd79hSUUrr_M+77;33x>7F^F*8>sHx# z{J$9KQ>_GrAwDOxs1JA5|Ch8Z*b#w`4g62i@xQ0-KT}hG5A^@PPpHD7^$}E+soeGZ z8-q$a-??=D?@F+l8LFWPPdQPYdkR3rhmeO5WM-H^b=YoE8VXsib@Vpm5e~#~!9i7E z=1uy@D-HYfxB^sIS^5i#XQE5HbSaJC%5y0fxiSd~W!*Z1gCM^sqZ|op(?z7(fM`{w&O_^a3sA-6GLz=HX|-^;UX)j=@@qGE|Jo+9qN5 zjpf(3LC*uLJz3kDYGEM{ld70BY|F>GPqB1DOvV;jAa1;%^ z`9#b-D}B%9~{@JyKEvjcUC6MGbNgt3nlfc{l(hT zgYI?X<3<%H9)PdXo&^8?*|HaW(-yyU9-&(_e5HyJrPONZ&_p{AZ_-B0WiV4Hg-GBI z#<*w|U66m&K3jc$xsV`ORAK|OL(9Le$rAn<%lc6s25%;hry{=0 zXV-0sPVsA^ZWlzbs>YA}NwOWhQ-Rg-f~V3|g${%8?;$i7hof-sy8sH@Q)$76|9F&F zNbE@Z^x51^kmG)yVbezq?!@=BYDbUo3gYxp@M`QoSS~w>vVC*{zd5bi)8TM{6nXxh$#_+~a zPs+_Va4?Ebz?iW#5aY&>b0zaF=*OHlVFb9dNM$tycTb97$=<5heA7@xZIDb$AFS)O z8cJ{=K5W62?UH)V-57LW$?M?FlIBAMuzvPQDOk2<*pY|EM56HMCSu=NDr#rc;QG~7 zNVLcWRY-%ICwis)>Yz7!GU5lrnABq|71kI?&)cE>d}%liNj$)EkYP?${g zeP}h(BD^P}{;8aoepGBl!_!eN{6yqs{foMKI9fVX5*qyxDe_SkZH;`m8>lat4;g7a zgGiHk_ScB^TF>V9v@nT`7d_jWTh`_7`V7vM#CZD%_iG8rmi&r$rDnJuoE=88T?H#P zls^GJX;o!9UNiBuBikxr$g&N?`WR$_}N1UM7&D9fL&pv%r=d-ubP>|&UU;A$k zUd{?ZdSQAPUu++>dx5RO>j*h8G;RGIxQ#B3{qCx#;CO z?3>b2=Ba=|2-oSIGX~_KLs@6mKN0Sg4aeetFbUQfKjTvPkBD`c3mi-{?Va86 zcMgd0zNdSe;@HvH=E-zLYS?x@{D#j!Y<=W&w2w#BDxEzVm}W8=4WQO-ow6U zENRzrDvEbh!o5MQ{MbEzCA>jzzB+-Z`x~nJKIAyGHAT`b%V_14L!*Z{aZj4+$F z_{{}@`rLi59dsT5OFqwPqQcy=_9%@+V`Mf_Ce|N7oIb(ZF&$$B7B%a010TvbiXM6R zQ>HEYB5s?MK5xS;VN3TYfBUG5-TS)_IHxyC-_?@tq%I+A`43;@-Wvizokl=_I`+9R z$rG?IZXE2{T&(jDvf`R3HUW{Ig>L|2DgT5k6?;tXx!Ou5)5e{BBp86dH@=2H(;@IubOKf0t2!%(p0&`-yCWr zvPe>g`@RA0_0r)|xBD_7klzx};ynbaNZbK)?m{qfdo%1q}87og2*YzVX&_~x@KnV=5 z>Uu>1XPMp7a7r#scQgKH3ke}1HQn(rY00Pib{5FiID&~B#!Tq@>L*gwDdws( zrQx1?`yNyEca(VQ9$C}g_AM$`iz_y|mBfqDT@_=@p4gAlEUFb>l0VxrvahrUL-GWk zOhGZKSsvf#sPeDSfxvZhcM58K)BT~9MDKa)itXqV?&Enb8Kw1A(}CZQl$@tWK>T`Q zX7I)Jt3c*a#B|=kb}$G|zY-%Gau8Rr4j_o+Y*1%p-~bPrpD~$H+LBVKT{FL{W~SJH z^Hvbr>3d;=owsGAn3P4dAILtCMPbG*npo}=?X(o2fVD-%-u)nBpyo+QNc8uf;3H#+ zpM(AOp*sXpXIhqAL|@_o6ExV1hQsfw-Kw5JOGe&ufoVO!<^K?VnxuPLb0QD?I(9v!wso+ z3A1c+=dYWgiA?eh6kNi=ZMbxph^tGBWCm9|RCU|U3E`N*Vxm*oWcjZgY87;ytAO-v z?1mNAeAS|ER2blD&(GiWgaYP|g}aRk-335H9$Ze_@&jo`_E4#&+_ zwvhWatj4emmDX;&$*j!TfPf3l=k0s3NWiKY?iLV$+ zokwh0{AFi$=_TSan6|h+!FUFZ#;00PQ5NZmdwj%$inQbICmelYc7(G;8gNrJ4Td|0 z1WFAM!CT0#y}pZKO#PFVef-?^;(TRCN`AJ>P9pPi9ggWi|MJu|7(31fVkNMvh;77$ z#{Q)|auG`4^-HXUrd}=A<%;QSdFu;BH6e$o9zso}z_8jgpv3*L2m9u1U4{)xBn1Ac zrA^tD%daX^tjdmaV^_6rt8A^sgb+OFxaZ^;OTYHeLfvm>$W*#(*mms)Eu8kf7n?WP zSIc~OP`zE{1#eZ%gq>xw8vViC5gzM)L#j{h1OsA;{~ z=n|G;h@%WyAA<^`zEkdeFZlv#U?p#K^eEi3{S_ECIF|wPB>3H-fn*#|vzqtrmr8{C z_E6=qvk1%4-V{COciU67?3No8!V-ytba}brWFCf>J18KdKx13&WrN6_=M>(QjH&sk zJrm=m;YRtdrL|yCkf7$N74v>6U+HKT+N?1u{xTFp`=In5<;bD5vPazsL*oX!|)boZ%J0Y+|H*Jc#V zdAg$1uae5G@nHXKLZ@EaGOb9`a?|z&*!c_ky=O9P!5>)i`Rw0&r;R9)d^X5}I^h11 zainpkU!9;~VpG;N@t0Nkphz+&UFpKZ9E)i9P}ZQO>FO z&aczq-{bzOyZD(xZ%F856c@k_FNiVd@)GG}K$Vuv_?z=PDJ8&R^hm>)`KD~#Wk63% z2Cl|!2r(`D0im>QGsnG40`$c0y9=Qw;Q9Ij{SD-vYzkn;2f*ilC3KC0(v+Nyr3=Uc zANj2Ra=CD)a%x)wZ<9S%c2k%hIGCMTkgGucj8f?^koVd<)mt|kvAE$`-GjIEesLf8 z&@Cz*<__DmjLlg#7#@DG#aT3{jB(oBU>pv*qv+imxQEi10ND=)F%WMd5u33s*JYZF zNxu})remT<m@_e1HciF7Lx5_%{&@6zZA9rSEQ!WwpD#`R(wgzayLi)Z z+}I15x?ME>IkG@h-C?i3M)!d7jBrV$7wFG0wHJ|xjoC$9SrJ-zdZnJ>Kb21X1x1aL zo6`$w0}dHDAOmmm-W&PS4?EZ8mXXPil$#Ylyl&VZ84vw6W67AYZgVr_&&97Iv!1~W z_n)YZ?-0pJfo^AkzVf)s8!N#o?;Qp18|`<)cC){qZEg7($Xu_J-xrl~&R^M_TXLh6 zbb^K2!}hP|Cj%*~%h(dVJ3x8c~T)+Qt5SE{umVfee=RR`zo-95>sWJf|dnZp}svKjBO;XKr`6_^O&k(3-Y$K%oZl9RE( zZO)l1@7ht3PriGg-d@)#DJJ93Ij ziklp`BFz1n5$gVjLj2ZH=60bFXBE)hE7DHfIOo9+22`haqseNrs{Or)$4DOwUdjN` z9~IbdXh6~%)YTeH-}C(`!#RRt&j+KyZ`eD|&Di2MfwVyfLb{)GOmNL0<^HMFP!77c zYemsE6dC3kWsHnb(%9GR@aD%p#Xj^deX;Ny1bIaI#p}opz$)HnYikoIci6Ji?aw7?~j2N(Hb@I$P28N>P2ou?MEMuQB4c)IHF*pKQb)U?beCKU~(`z(i_w0rrzN_%# z&pRe$aCX-O@G$LJb=Nt``r(fMzA7iMa;II>xslujN;G?Nm|H9qN^w(!vEp8}m?4nr z`wBRS{v||evr<;$K2Ch~fT{f)X^@4qkMREYs86nfzbM}4VW5UeqVhFvp|GDvpOajC7-Oq58SGW# zy`_Rz!|&N*X&R6KFY^nERX+TlPU9tsDyVA7f&^@K4FzaM(Px|mJoSH>^Be`Fa^07G zWG!I}7gjkmf_xVS0$ zBa2CY*vEOYT`aC2qZQe@Cb(KtweQsp3Ace^Dp2C}U_%P_Z6S}}sK?I~^001qUjfg{ za*0BtV;-3?*l{c9EP5FSf!?xvMC^08Mez49523^N`1(N#e&UDMXfQhBa@w6D(LI#= zy|~YOu#k@Z=ATUL*6DXs7>F}ME7903Gt-xAHVdHmg1M9EX3_ThJY@j*&TlrnVTXXA zYOx{B?>OYakL~>eYDVa$lS|?sK&W?+=+vmsWG!upi8{dqcTFFEhCAg<)ehUPx}7s9 z&VObmHvNS~5Y9L6C)&a!QEtLaFO_>Lh$NsUDyFGxu`5LIi$jJ^LycR4ZL8%TW!QJ5~CNwHwe>O{93{YLc zx-%H&Z&@t1Wqw$=BLvCa^hce}nkFK*n)H13vE8$;dD7N4_LRPhK4E=);LR;^7kC72 z(0n~1yd%Khz13)(wKNNKqeKf37HmXAqz^0nSErtV9v>K~jGfyTbyGfDqax(0gB}zD zhq^lx^v>&b4Qn6jzAsrA^0DjNbGO z3Js_m7+ITBa+5>|TAo9|O94-}J11pWXxs4fLg=}9S-w>%9b>2Yla%H6p6?8qc+Z{GsXg2GAZ`u5!p@`j%LdDbQy6P&2}Tv zoIs#3+?6*wK}|QdGy^nq>(GxI@fcq|B(n-+na^bFhJjvEsUB&uQ3qGq`@h7^d|x)? zk0sPJ?RdEp#U!YNUcwol1C9I3@euM*)n+`PpkR`rj!MQo8;gjAc)asB`3FU4keA!% zqGn5Z!zy-fyGOn6Jo7^OjCoLAM@l~7fA7>`A>ty5EQN@Pr)SE)UGeh4PK=TXAz#ZSwONZ8Dl}HH&nF3L&p2Ipk>ov zEvet0CUEB6+>i$l}rsCGKr4Rp2+EHa4{rj&~4qJwSw(t_VcSZ!fEhx9{k)txu;_u zjK2r-i6RkBt4?+la(JT_K_%1*f*{mwTV4^(_?E4ImwCxQY!Kk|@5R#F5&`$9cy4mG zr?yScdH>Wlb77H;3Ec4x2C$nA)k$r0O@LW^*lvduE6a3rknS@Pd3uzcv%rXC{;lz2 zC7KCzZ_ZEAaQxKjjDT^Sp?9jLVifj&aZTGL4lM)D8$krOcUs~)LWS)ZJXD+}M)vR* zE?KO>D)IXsUt>xfSW*)IRs?4?+A0jJ6^cPA!83)zA@r0}{^U&xRz^2CNg2NRo3?%Ek({MwcRZvSy8o5~oe`QmYQR^4=1ms~LKNKCOu7t_Iey1(sT zbUOidQWEQ4s(>r0FpI6?;iVI*H{JeVJ>kYEZL{AbDcAI)I=?}3-S=^rt!1wVr8&He zcjhkrO>$y|EN&w?Yk-5t-LKUr+;-LZ0A+)8mAXWAKN4{+A8AJUQo6f8u(lmL=@X~~ zN^vE%-g45@&Gvv-_+>08{>Fe(zii2_Xm}OdueGH`+!w@JttToUa74myQxTy}M7i`K zn5dwH^LwuC0X`h2HRLl1OzQei*9wb4!XZ=Ue0vj=D-bt-=a13A$Z)latATBsev*~2 z=LuXQI&V~`D6_}H{A%lghwQ?8>YCYUg%VJyNc_=j$TqP0LRz7gvha?QL$1*P^V-Sd zT7=Y)AKZ_vnn14*KkK7=y(PsiQ1Dj09m0uFf$F-QSN3Qm)Loj-BKodxp2R!4zE7=j z{vki)z=dU+Yo?wr@kWuuZE`6JU%qTkP(zuNd5oDj6d(;0->LKnhMoXkJCz5|Pcv8w z%n1k(K(qO{OU9Fkl;oFLsT;t3wHBI{ynA;!qZ9)k2NW&h&v3+;mbBtUtLyB>@>9GV z%oO@EV@l`!p%vz6*>pB`P=?R%DlHBu>h_gcMn#}kXoMB{TF}!eubS&s0Iyhr=VX)< z!=sPsKk3u?P!gONzAop0Exi?Bh~y{Y#%kWN_1Ku^fpq*C9TO9SzBy7b{FH3J{?p90 z*Sf&rO-p(pXi7L(gSsUm*nQ+ERZ^`0kjA9=nUUpBWw z;Fls_tm)P~0=c2QI;8Ybq=_DVf!^sIE!R5&N~IHGau$ffcsHE(n(x4e1x_E|6?eF} z%SI;mhD%UO1E$AU_lp5m?w9tnHiw*Fwf$W^B;CF}3{l)$<-(@Vr5iWeec-HGi``n- z<5qwH*AyUb{jZBeDWd=3s}}1fz+Q@Le>@Y$$ckfcjl>@a{!Too=L6E$A8}u44Xt=l_d(dMakGC?Pr&K$O;Hz7 zF%J!iS=aoEucR3)?@@L?OUA1TF=hBrI08MkAwn9%I)!ZkMCjd(kc(;>w)kXZGBO+= z=G#Y|ro%7xt`$VF8Ms*65F_nKlpH*xm|eM%rY0@=eoJN3_^_#B{^MapUH6vnUBsA| z0Q(S!{=!*=U)X9hj>Q`tSna93N5(LEvN*#TY5Z${e7TF+Ww?6yWiD% zvq^vq{MNk2k2vVX>|A7=lC#+&w6#C&=<-w0r<=&{DR)eL8KDo@6RyoV~xn+ zvl_dwzhGBU^%9D^K!nigIbSd+4L9Ff)qk+o;ls^V7XEERn}TSCT%-H^F7Vl~CrJXs zgilY~#bs#p$1}Lx#L?~{0&Z*<8WmCFAa&;60&~da+qF)7vgw5=36Z|dxagg%sECUb zDNnnj-ZUqCRxu{qu)^_mBA^|a@s!a~mpx4e*6%C}ky|BUl)&|mmz;PFJ@$lvwD`87 zYy$0ilL^b(!CAZaydK$U@9WC2{CoIUt=u;Z{g;VAC7E>yF^*b1?f4{wRdp_-#2?y> z10>jtWi*BUP*CkeSg0=NUrQ%jD=Q1Wj(X)-u`{`mNbK5_R2{BSs;yAXmzzq16bnE4 zk=K}@+WlpT4!KOwW3?8>bB8Gm?S%goit1ywpF64Xi#&D2*?m?5!ptU)J6BtSq!`x| z?Ar{nc}7rlH_Enc7Mfl54jtj04}N(w;m>i*= zU#wfTJ2`y7w`>Fs3-Yq_(-}bs3FTn$&ON7cua{s%oF4bUTibud>KQNW*H(R-yKk{jY?z-iVn!Y#506m5iJ908POF0KOvTBNhohxTO z281JlV92i|=%#P_X5mQWb9Nwc0z%kr)QENzG<+@}cSS|t+Z6i{=@|}hHaDDgbD6<~ zo+F#6$|rK8*N`mrJCFWQ+U|y%9<(Y;?8dfU&?*}eq$9HD1lLK}PG)h50T}K^Qs^*= zg?%Ay6p@1i)ur;b0;IE8Zi{sn#>#&F#h_1R2yJj%D;Udw;-xwqgEv9=x@(7T<;n)5^H7i&!eyj%45 zkw=<%jB) zfdpZaQ`*-QcEg!U*MTnK^$D2OSOq99%t9wsH;|lNjlaSwbd2e`nNOV2@4eO{El)*I z%}frVdg4098rR7|F1qBx#Z-2po%nJXeu!xy{~nBfBqZc;D{`IQ>)ZZ-+}rxEdUU>Vq}&lV^=fJcc;FYG7Onf!}gT_onl>1;72tWh=M~00iRw z$n{18b)1u(M8xV0c-K~XbH4qOo{E`2;3No(E81LHl8I?CT&AV?^+8_Vv9z#C`Vs-v zt`3W2LrG!7Rs7<=lQ@F5W|Re2ie#zSAncd{HSB8v)5(wV$y*oizFt~^u7{db5Xo3X z5+B%1nP~HKJj%@!%tp>}Trp1E zJ!rjZ=#^IXs0&p z+ic(jJV7jyo&j^={t-L2vQ8su2SZrD!Go+AO}!kw$IB#OyGF(luwXkSEDjj9k$}BI z0@lkyaY^30T#~Bw!9VqA%GndAbqvnwrqP zqKWoqL`CYg*B}cfY;j-_eRk6CjyhpJWWosc&8*)mSaiz!;KF&^iQPRUeEc!virOa3 z3Hn?J$HxPDWc$E~HDbAq z-HP>t=_5Z>P`{@YlMc}SLu?}cm>P$BCud`Bxm4)4>?n366LKa=z!EJ(!Odme(fhY= z@mYm6n0-VJNb3KMKksb8s!5H|tXyGKE!76&kLbj!`N=~iU}I1@Pg`Wj))rH?wngP% z^5f42=2GKL$Rny7~Xj+4PJcZO}xQ+h`M->*N{3*X1t%FAqH)XioYH{g$TB73$}Mt zP(W-K%)x5LQK#yR-6jt%PnFSZm;tR~r`avo(3Vd9BLh}5!t?qQCoCLXdVQlHGXsY& zel}qAQ8&(Br!ys4ihD|&1OdBd!k`x7{S}FIl=0>pvij41y!MKW%)c;jTWu3N`>KKI zWezZ}FtBbvJLC!9ISW<~XI-ipu=rfiu);yd>|K7tU@pPsH-wW;A(Dp$uAH;lLP~$WqHVq?~|>r_Uw^3Y&V87|pZb@9QD@RYAQ< zM)dnuL7QS0cvr>RaCV{|18c~ry387X(}Tk%4C8?NQY|A6-t)GL>!Ay$Cz7y;wf4;G zlVN6@zv9LN25`ENS+_)yAOWMyw+-m~iy-_GUQO%OU!c9cnVR}6Wk8WtcJER_y%kFa zQlHfQa}4yG4zuAP<+y#vBX-F4^(T=qVFIR>8EwR<{0g$M%nY9^=)c2-W7kRCB@aY( z60FffJ1(qY@L8QUaxfVNWbn=kt9>G=pesFtt{P(55lbWiD7UOKPsO{|p_XpynEz_gi=Od<2YsA~6EiGXVnDf&{E(eJi%p zvBllxfP7Ss>aQvoF(xD!4uK)Uj`eMI$n-w_5c3bMf0{QGy!EbvF7utVS2tV+Gv?9$ z^Rn(Q_|ga)EZxG2os=smP@#U6OGb<@PaQIkx5lvlg>G7L%8V(!C8R2Az~2cygo+}` zoxr|Wh5a?;EASoT2^+8%NfR&|!bcm>hW79d>-GwdmtK%L z#_2Kkm2xnn-#qG4%>F1Jzyrzj%y2y=*vF)9`j6Hl$93Z%soTzaZg7>O9?O3(o5Tbwt@|J2&=NF{Pmn zX_;^1@xdEfC5R*mn9v7xFiDSA>~AmA{!>$i7pae|zZx-|9q4{S!%$KL%*eVgXZw?U zw43gTKRYSbsvXoL`{y$9*0ZYe2YGTKQgQ_Bh8fGcvQNHd#GH$6p%x$PxHwut^|CTv z?q)`$x}qT|*l}qtZH+eFc_HHhVN%gf92y`YeI*68V>byQ)T~@^nAs;jl~ARa0j>Ag z6E?jh2v}zlutufL*u=5U9(uFQgax%ZPO;vz8DL4Qnc;*9^Q+0o_=XOjm81Qyvf<7h zH*_3ZlUw$8|I}Q}ub2vbmLA6T1g8<>kn{{#!cfJxh2!?>zIY+5D_T!K8}b00B=_20 zoETjO-(-9Z-&O5`r2&IOa;?LFhy-jbY8GsW7hm`a#Y-`UZa*JAkH%+jvD?shXo{Q* z6MhVTZ+Skn>i8pG9C{kpVqbhVQ;tKJm8BMj2m)pa@oO5A#8XGWPMtc1a^=e5<(FTM zC0+g_efsoh*RCB5hQ!tjJOTpW0UL8N?n!R~NGSoc9O;Es-Csl5Nr$m6{2@%zecZcu zFW`89`wtYDY_4FZ`H$coSi5lG=`q5I9YQr?&^T&9srCxK8({VBTyw*OjtrzT4YY`d zY_Sk8HXG?^ooDHk`_L(K02RSfmCiOCW*_s)nFIm5WJ31=3R2fI;s}F+hYU*ZGZ4QQ za6E|dKw+e+=EYz$Ndh*EL3)v4lur?kOTqim{mcGvKH*KdT{4~2M+>lP1PrDP{(Vkq#lwa{vOTxM$J`F z?iboun1XjQ7_sDn+qbKekUKE~Mz~2B^lb4+EA~%dFv{Rf^pS$KEZD&@F2RS9J_44C zBw@^fz|0ar00C<^Gm&LSC*la$1yM6Wz}k_3^|N^2t&D}YE{houc79v}mPf|NBw%7+ zpx6*fOc5N@BX?5;IeS~w9n$Vm_i=sQYsU|1A4Wz-e%(9xdo*qS`XUCK`GoFClG8Cj zIw_W-I`F_xz~~DSC149kzy`Dbto0EvF#|T81gvI4zQBf4Bz?UTAz&>?z_zhcad&wM zSPenIMkh_c7digK%RFHuO~5#Au%8=PC$(!H>Y4?g&ITFgQ!|g${!YUN%VWo^OD^RbatnoKJ5Pu{}z{Ev6PES=Z zv4sI$w|GQY5DdK;YiVP}-VqOU-N}4w%8v81^yvGXjBZQZI4%?;J8@%94d zJZ7>68-M@;_R>q=phRiL(WQo<&ARwoZl~lsVE0#&fOYy2FANC}Az%l61Z=uSz#b7# z9RV|&&Dg(xKgyRck2Go0sKiSg88c=?=gysR>Cz>RS4nrA6yXuJp-%|`yCfLg`N{Zu z=+DU1^9a@_`Iag1C><#T{%LdX4;O5=O<47tgt`ojCURg_uh=Y@)I&k5wq_h)Ka5_l z$FSKZ)ZXciy+0TX46fKPaU6r>A0LH3s{0jv0U1WX-qFX_>upoBd6OxPUoGDl#QgRAd>e9nq>%_RIZ#)2_{ z%cT4XDT;&oD?&p1>2NExA&~MVi279qbm}SNhw=Vvekk#rEz$*M(zoMykSf!+~?-B>ddl829;+ zM8TVH8&Uc*33WO$KY{O|1h0=``6zXZhB9iBn3{@(UC18(%qzD+t72R3d zBX!ojw*w&)nQ%)k+?*<*ST6(GZAzdeg;J6vU?k%tDLrx;F_|_ZNT~mc7v5b1tJ20s z(H1X;DmmzH8%|76(3t&q@MbsrGhueZ!htvA*9uB@x2bWJdW-rGJ(t6b74%JQ>X|X* zOac!X1d^|hJQMHUD@Jr{F5zq1`eBa!!4K74kPcIyz0BxSQ^JRJ_2`z& zCLB*}31SF>{7TF&L@aECR6mSF?{!za5A$43$Vc0uPxpezUF|RQpL_-vW8c+CP-6+h zzXUON8)V4V12gxGLYo>tqHyhwXu3LDXfzgH0`>-e?b-&vu8a$u;$+q1NV9Lzx!CWh zveBaMWa)(rk8T|XeOd_}wIzs;jHil#1#U0DZrwVxY10O!N|i!|3Kh_=Uq6J0hx@Ju zr+q9uVFGqhJc`oo#EDt;@YeT@(0_nv}A zE1U=qnM!n1X8D>^B><|sdtwC41BdLyl}!v_7z|xkXN!0^tk_PX)FP)IWd}O2hJ-3! zKr7NYoj7@sfw8FkLnqG7l90K)f+`cNxa|nGEzdm%Ce@PgTWbSq?DPi;kFW{HIV1YC zl<;mo16Evfg$xXC=pMRoje(@MR67oi(4*By3?fH3us29SY_Aw^T5nWr`bW*9j6Zk-rUFD#&P=!+^R| zT!?+e(GRwz6ypY~LNF-3#lI;_92g)RFkpC?4(-OduuWyA;<^Q^O3LU^z=#2-mxTma(b`L7c&H_Uh0Cw?K(WS{80(H-PBbo2!S%SmX(F=ur` zn^B1hBr^kcxC4FHw+gC`bc+3<0>J#DOqkU|Mvjm4n19->jvH=^3wIbN1k)9!y==mq zRuaBTuV8+-?}32Wo;T8fieJgdTiuMAL4AS#;G_W!GH`rsW5X`BZ2Iv14utP_;w)`I zt*a+-0@j_jRN@=u0uZwBJCW7>GgBq?Pe=6l&O0db(qR^WF&b{Ol{#&fW^kXcWFZS19Z~cp|5vTKd|kS#zQK&^e{UjfSUi2JByh z|2tqcQ%b;|QwiA6AOcnv1FLxnSftudZsXqGp=gliIpnJ~8iNj5;dZc-t6QB#;^M^} zB$5Yl^{NQL&5$oI!0_k8P^!u>^b`9|CkCq>awLP`ISlj#F`k1ZjwyE3J`uooP!*=ZMugA9gZd_-c9uhsX$$~9y zm>0>$U)$~KuD7B~-QHuw%qkK}k2Pc2dG(}kiH8F>HyJRrG|5p3J;v;Hs84YiBSG+( z$mJI7n8@Iq=hWazkN~j>N2;U=*ur=O%(n%zO29-7NS+QG&_7H<@uo(MCCQA1Y{iyg zGEzM+A$u1SmWVCY{W=pKSFt1dv>sIkn6UPkD8~i&4FkG;CL!-{dNkW?gTeqn4bmRk zaeI}5cVCxLzK0zr)H(|!LBQVd5iq|G5Qv04r36d_gl-$I zoiL#HEGsVh-cu2qqlk5@MSf6_y`;taZ5tcqsGvi!clGGAU;W;9FvL?(m4L}4V6LEG z_wG6)TIALt%{wHt45-AzNf-Nqg>4qS(txcyZ0a{s*xJ}S)qwR2EVxY(%<4dFM+DRK z6-(4+xUf&{x88alVNl<-Ap?_THr!T6a6m_rzP~s7$Q7q|%V#^u4ujpj{S|a$+Pdp) z5U-k;cbYMzkq%+yD3fnHN|)Y^^Akyu(vc7p_6BbTHHxw0;w2OM_6^vEewl)_uhRBE zl~H)41>`YaQhLXVJq$*KEms-k!~vBZ2-z&yT3JE!ObW^^qOR3#-ko^JplC4(Nap8b z@HxwzOo!lo-zo+06R_L~5ipUzc;`n!twIuBt!cy_>RxmwiVq9P)bTM!>{w@o_c56j zyJnMA%rN5?>tgchK5Cl*1H|mqSl@DK2Yn8M(IQ!O_~aML&Oj%|_k=<`xY^A<|4AhU zRc3pGB`@r_y4rw&FG?uZoxx^=(6ul5c}p13c{lwd>m~Y-$K$~5+a?Sc zV8)p<-u6!kt}iiSd@mW5X>->E2@&ls{FMKoUag`GVGD#c%7H!oCA?EcL9<2P83u9P zvcrfjon*Y(#Dw$y5Affm@0cSaT~8xg`!*#C%G;N}o%Z2>C>M%Y0`^!RVkYz?uq$MI z^|p*Zsr%DBC6?ylx*4-N$ap@D0gEsDcfS;sv|{}_6ZTNIVxfzu8_X8$9WA5O3o<${ zb_cJ(NDdwwuF$WQ3DaZh3a2`AD|~6F9xRk8ZpmT*R08Jx4%kOOKJJH@Lm&v)76tDm zNWchoe9?+Jx0(c#@p0HK%^4{tTz31JObv!MGNNrCEpgirWHPL|3LQ3KP9}u z@%MP_`(oljq7_GJ(=H2LDqHmKAS?`jlkRv=i9H!$ezQ1sV7_zye`Q2Emj<##eplmj6w~KSQzqs8YP^8ezO>4{!GT} z?32N>Ii=6^t1)b`ZI_vrpKJnUHXogFuDt`l{R3@ zbs?1#_YN4)BTR>Ub&MDmv^PEjDvt8UNzev;BO@OJzI1+_@kp1Jdi;U`_*NGp{j+&= zW~S3dOsXv*M=A*!#m9JgPr5f`eD;wZL$)}@!)h@M_+UrmB0Yu{lTdJq1$)$~7!t5k z4B#nK)23F$eTv5eS2WvVCdu&I5~;^V>TS;jk*rD`{ey3K8%GnFnou(Txuy>A)p zvTcMu)4iob!6p_=r`}@&$a^-N7vFLtsS@pyyNnrA$Z*sTF_V~ueu!Com(G0Mgz05u z{K53;sSi=lcS#zveXn518W+xT#P*6V3K8#_Dd*%0ejUM zF!9|g86`<3GQUMz{YZRF*c)uL8g0V?z0e%fnT?oOECzXBBI(%!+=xfO7<7@0s~_Xs zN{9yWXwCPsVBgu}~WTMV+2bLdlVpm5Ua%Pk9s`!BRhqC%{Xdc)r>({5j__B9#9B~Z_^zZXF!v@I;5ry?~8V1n}3^IkFFcsxG4gCEBn?` z1+P&TP1-5wJ&gUDZT`WB)LR-IzRX6VH`9fqBq!d|1o+!2wy}`+WeIPklUX+zIrA%+ zama{{AL~#*JIOJFfk*uibLsD?uPi3@p-FJCNq<1baeTQR?S9wcQ|kU5p;ziYBWkwtvED7LDL^}c#HKAAMSpaw*TEPdi0pU36J5G&N(D*y{pV#SIMZE+3lsMi=DA!(5;vA|G7$DpY+J87u!}zPO^zF3si`aW#lXDNvt82B zW~%qMV{^QnU%a?I*MNr2c|VEewMUuR3xM0ezBWgX<|QP&%y#{dWxxHRi~^-hSagX& zbZmDKI<{aZ`)uv(B$=X5i?nIz*9saiai?2s#QA6e9><$g^pC0NlV5m+eOG*lJwOK; zScdqRcy0bshuf0Ya%E%ZY z0|`tj+I!LdUOV!3IVT>RWjs()hwn4f*9v{n2WI$yHc?WKQZucHdO$)JWE%7nCi>pF zdbG&Lae#jLeYSgA63P#%acn>7#C^5RMN676Gm{Rb*)CN#*?hh#?nBH&H*<^@r+fsg zE9I^ItBe6t^r-WNg72AcI{Lm0ALx*SL~!zMhj*E>0LQs$of&Jq!t!bBVvKnAOa81y zy^y5cjeDY#AUx4W5H&3?GB=utCaaQObp0TF4rUb#L-Bq~Ffo*@d2YdUW-OX~o&{gN z{1)T4jI_NBNcVaeek)lU1J>Tc{&JISAuUaDAw{z8p2i`IwIevCS^m;Jt`fG?-*$=Ds9K(Uw_ZLY3jxWQ$RTHp`f!o8N zLH8C;%%6ZUEn1*WyS8ZCt~FXT8;rqYw&Oepf3E|#!KyopLxcKb>8eB67c>Pj4@30kP zhB8m)+o!h`{rg+7;B@e|*#`TG6eO1!Je%#l~y_aKW(Gh6R+dJM-#C8GHAz zVDe@MP6P!{Zn$sRF=@OV$8LmlRfh}rB5WA9%>gC}hQ*1?r)?O&)8Tva$9v7<9ReG+ zFi5^Eg2#BEqn~fX;_g=TQ1#_KdiJnl*l0Vh#A|f1#lH>9DgOYb>(keQ9!xu8EC)AXLLXt^60_#+jztcKMxGTO&iwC zqCP3VDmT+E+35<|DT(>&?3hZuck67ygt-o!QiXBi&ORHq%_cdHry3XRB-lH9vW}vj zJcJzMW+b!`f*ZEWcAVX5!`9m&p9T;xIT3NnhKXX}Q%|_zV&iQdOuh9H^|YW5fA;Kc z$GMwxHht>VWofGH!hY zEa&Xl${?W^ZM(0~cUKE0EpWu&5I_Y38`fnY)Aj0Z!LkDk_$Zqp+=`jhZ%^v0FY6-u z$*hA;LB zZ1bjNSv}Z?#{zI9ohXcj3lr8_unAA~J!PGD)}`*ui_} zE_WtulcLTpCvLCz>7H`-5xS?}n9Be*ZWWyiwu^S`n#1d?hhO*OW;t-ymm(On*CX^l zzO;RNTF`r}4FkeSo_s0d!D+{W>GU&fm)=5-J~kYcoros!xH!>&zOn!goEis!F(^- zv2Q-h8R+ffA}_z6Qu{pZaKsqzcJV>DW5lRmzTt2`QHiU>4G_&Xq*i0$`jqe2gXI_SqTgx~10#g0RX&G4~L>|A5RoMoZQ^&b~3 zhdz7eWcuLK@jY7{oVd$AA$&ofKHjl@`a)-**GU9U+@O7KV_%E!`vdTRb)s#k zj~)x`*cN0*%)rU~Hd`@ixX;&$w3Mm)ChA4~^i4wGd4t%f%8DVh?Vhx=o@1;S8Snd? z^chQS*tLxPAok&&&-XJ%xWs|it8*^_>-43JRuzp{f5VPN>>DFF=JjM>9Wa>objcMm z<}xlgX!Eu)W$xRHX-8Tyc&qqIVG3Z5VocKwxxa0LdR@1xeI&8knjf6QndSYk;=l!* zj2Aqa;JAMbn+EsBfL5*WSKGGgW^yf?x4`&i+i@;XB_1Q34~}8;xS<%*p&i;YeiUhA z4{>jsztD8(5|YhZA+Ixpfbj+%9>%g6+c19CS#_qEBZGcic#~A@4!J!I~supJKJJ--_~f}vL)KI>5XBiCHE}XyY#^oqCqOQ1c#dkzq zb>q@S7fu~>;V^^3Yu5str`3vmlV#+4Q^AbAZgqh!Lil;+De@8d z@(_7mJme5Bdq5e-ggj???E=f^?;?HRwKL~c>SnI z=TA?W#P6psx)B+wGyZ*E^Y9pw?uGDLbcU2IyfK8~yM_|h`}6O{kV1(wgB zr&upl56m-yd7r0Drvl^=c^^OJR<8xNp~(LN^&OX%hbV{nojgNXE_u`V(?&Ai(+qU| z=~R8PT||A9jdl_l6l1D>8;CA*8Mc=;+I#n%W39yisyvg`^ynOF9zD2 zkcTp!r98rR!-f6>baaB(&e2ZPe0?%p6z#;k)n$?9xJ@`Z%y+7vsE88f`O=DZNl-`B zq3ADazP{rU?On9@8U8%SGR~;=6mt6SOYHEqi?H8Fua1OI@t^mnQQMcY2)j?*Z!oRT zZq8EV{O$icdc{&dmTw*KQBb$$9Q%V2rp_mjtc zHkxh4)-IBl3xpL6j}})F7rGu`ZskN*Y^X{C3pDJv(3*@XMQ=vxE0C1axyl*xP0UFS*8{JC7f+3bn8!- z{Nc5elfLmLK^^$c3BMu6sZcu;KjZa@N7g~$;j>-gvsrG0&})ME@mxrs2psDZmcb`4 zkNCbnAf33EG6+BI?>~NB2s;w??jP$!UlzXhH2Zs?4^-2#{UX@M;>O(o8HAq@K9PD8 zd8_jC{>#2`LX|=I38ocebOh^lp8EIuD!=bP#WsK7d$(8+FtH0_gHqmEYypG8gNwXZ zlo3f?hR6B}%Ff?K%%GO-tDlfTj8&pPpP_BvzMa^nWC8|w?r*{1Yz5Jv#&Ap`gGn%H z0w)7cC7OLKl27rtNGRu&$EgV*=w=IU9hin*xznQllxDZ=xi2h%}8G2RyevZN{vDyjIbGL$U{bhg;P&3Eit5+Myl)-XZ$3IQAV9 zvjC1*0ybcc6O;BjW3MN4uXbpMc4)`{_ajUkj8}#Z7f-1e`1=T$*oJL4}BbNDqCi3`&BENQV)E)KEe%0Y?QyN|XRn0;mW` z7m$RSj8sDvA~h5P0i*;ZbV50I6z0?S{nk3a&X2R!$6AcZ6U}qqyIlL)*S?<#zYf>o z+Apww&z?P8x_?}{xn~bIe9xYr75DxMuINN*i-A9W^0=vUVNXGu&?I>CZ@crb^LzFb zVK_JL`~u$ZbNj=@W6vHwarW;|x;IaK*|TRmL-*48TfUYvn*p)rUMZi07v>f=7B;%q zHrq_wP3@vl`+5cnpRhK6{r8v8r+?%AnJJiZ;Qhaky6=5{?zg>XetZ7wukYRD{w+3t zkn8zmWXz|1<^1+fF8v$z=wj#r&3g|N)`Z73((L9eN^`vp=caB!CO=G8`FA^c`7q`R zhDx1`R2AX~X(ywFJ@vr)zWX`w?;73j-tO7+=idk6|N7y|&!KLIf4IPZ?jiPv3xD4e z!~Oe*E59C~o%-Rzxj*+pe)|5(y`L^Z_kDk1&jJ4bTMFAMy4aK4Z;DAjSZfa&Tz@I; zyYVJY81jSF7WLR4n9sO2MOQ*>S8ilFTmA4kw_%O$VcYX}f_=`3TwECb;j`x?UU6wC@tcLslQ9!`SW5kSx8KgF8wDtc6TdLxiYB}0rA(Lk(qbuZ4T1)rzATmFpYH`P z?){t*<%YUy&MFZO*^?(#;caAC`=%|dX?gU+4a_er7}Rg*(EO-f^dsTQ7#siB2-f)< z-Ua@sAdRw8DOHuYp34lcnAZb%DK+A4yy*8|yoaO7vX<;HJj`$5u(-rpny-$?QbcOY z@W}>WmKXJubGd6I!tpRDZ>MSR(@i)=?(oD|Q;6-uV22=mc zU+z84Qa1C)Vbm-up<%O1t)Qy1N$($S#{IfF6id)DON=K>vc{;#_cpzJ_t>eYyOtbX z7*{yS8)gpmgKw-7CU232=jm3@kUtpV)1SRg(6vw9ioZ_7pliQ-X7Zl#$q#pG#%nKL z@D8r*4yvXtbEs2DC19J%z^t1}MQEe3IpVg9(M*2@Flu35<)^l;jy2ZRmc%K4FB^?@ zl~(LIl8A8MmTcXFuIz-$3MPwsl-e_N^cZ3~^AuINA$r4Ae8+*lR)!SWXtV8r3j7v< z!s?$l-|TfH;w8K@sOqABELX~l3|8b8Z>>z*3}!YFsiN9h?r8&lQZ@k<-i=eMsJ>;b z8+=^1-}1uYm8*|@ix(b!_9s**uMwxaKtyC9HWyFEEcjkRiA=8~7m_3gE%!<^AHmQ# zhqX>9i?h16TwY3*4?{>MRwcnrZH7`tR~qLi6W*dVWQBrAjvl^(j$8hNuKvFfuN(WU zk8r$9_b_7mPES_^ZC}vvn^=oldG?x=+PN98LcAM;7O@C4C7{pnB9aT{3+MvD;{~gp zgwh{ewMhYSp}%b(ApU%PGpTGclBpE6EQ=d>yBq@6E#>V=JeXoeXe@9%)m^&umoaXJ z8n?CKSiuPKH}6}zpy6vtbNyIDW^@#J8;Qs3b^CbFzP@Z%8MM4qraTzGwLxv#WW28} zr57oS1`wAw2i1#9xq`O|Qn_Mx4P|iV$9Y_2F4<42u5C5+YuU>69}6lzNhOX#j`>i# zeb_-$9fCbJQ2p$~d_~RrBzaD~sV753ujlP?xFxHE$;kd$~bdLqCe`W=0w;MuRUjSW}Z#(&QvDY!|@i zlj&WDwaP2h_WrO&*6MO9^%f#e%WC3p7utSrs(V59g*3#)>r1l*pUsz-Ry{E{dbb{8 zvxVmo?)T|-SXOgQalz-S#5v!ori9znxeedNv8JG?7k5P965g(nBq_ZoIByFj$3T^G z5?xDW&?2E*rJ889@UXQWQ;3P4voc?$X3N%N)jOBs$U&vl1vgYDauYRINb zq@7O|>l8tyE;TzMcZHxS!ocUt#$A4JR5KK7rE$WW{%&Lr^Jvb(yj(No_r5;EYP646 z3}S?$oih~Q8#geQm1WeE=5a}5Rj)YM%OdmOb#G3wcJ&i@BSJ>-N;hJAW|_WKVBvph zW3{cOfAc25l_!?kehCR0bHYBsl5knGXURcE&N-G;s;I1GkL_%Dv?tTiph|ao-(JK;x@>nCHDdOUhchO>vaT9@Kj4$=20lCi_v@LKw{A1u0+7v&}|w>h#p z)X(Ue^p4}t_2`R}dHH6O6H=L4UPN2|nBRW8wpBQHv>8T?ZiPTy(9hihH17>;rF-lr zWVMBhZsUs?o3Itnh%RP0rZULeww94k$DURfJu{FRh7E`LsKEcFH-_Cu&>r%1wlWu1 z@7zo}QARWZ8M=4`zBQP+ju#EayHnp*PE(c9B$Qb#`Y7Z^{G=pK+WFegEulz`TYcsI z5g_+;2)DDancl9l`&^`m8@I+xul?MB4kk8Rxt8`A^r0tuCgytTMmF$M)5T($Kd=Dk zze|t7Z^J5A)#pd8kHo_bq~T#LGgi<(jY&BrWZ!ZpTHf#9-6nkS*+-D=iZ}Q(7-53! zw1^U3jo5PB>ap3gg2?Cz%SUZSKDNB)D5Znl6OC^J&;zCe+Rr#*NEXM_&Vs#q+7{Uk zpNaTY%6~s3ZO~${+wYQ|)IjRm^txh`g?8?MGULTMx|%fo$ahgtr*5*9H3t4-7KAXi zvf#p8C_XuIUm>Ym=%DRHj%Jo@&~K@mNTpR6!&r1!N>3|a|CkKvN;526-^xc{WBud$ z=Ya}MZ^rE70-xNK?JdsvKkp#7{HM&pij0^7o6~V|PRvb<`I#XJ+aD;@qD}RFh)2{< zV+Ehf3i#I<`q0FIo}T?q9-8%$Ac&*nObR@&A_^8=Vd3?dV-Oeb%RRFeMd)eHj`H-w zjd7t^*d2t0NGlQ}n)YmXIim@gZ{4hA_|28wBlXp%;UR%;PLyTEz>PUj$TC%id@wY` z$bCA#U}W=@xA+Qrx_+={wzAlxOP%W{TO*Wa_Xv5euB4LU^n62rF<#LR$t~9lE5uq|J z{+Xy0Ph>@||K=?#$ec^$oR`_~3=W{rqW|n;VW+upS(UoTE|%&Z8p5$()e6Ir)+bWQ z)Qz8;eGKzS8-By4^Z)!j*QR3J4WKxad0b2tqP0#<%Zm!A#KA)kr|gdjlV|ZP9)NPdEhc#<^eGut4ET_r+FX z9wj$*FPVa*(xK$G`!KwoTBX-#r_107#l>^cUGpI>R32xjiI1uD*4$cb7i0eOQ1qdH zRtH`@PwQ=WW2(>3%#Pbn7xc!$a;YL1xNHFo7EYqZx~RXcA$K<}XZWIY$fFJrTwY3q zBCfIsB_b%{Bcf;9@#kfI8a-Xsh)|upvC-FnL?#Daa&CXn*jB>`aYN})>Y8plHe!9> zAOhy%QgYF;jTn*@Z$vI(?EGwWT3|M7{iR4jmV=LL%k1diVc6{T=~54ez8~1ny)C;! z8vQ}L3&!r*5dSe;M-}63*`%HNnU3z}=9292IBI*ij#WY3Z3jJQ{+sq+c&e|b{OMyK zg7y2X9hOrd3ama~c4OD`9a?ucs3QrwPICUNe6bV(AsZ%WVsSE2^UnzRdEt zxHoc`v%`ZTm>~QccE)7RsOdB8plhX-BLTf|Pm0IE!sgUx^b} z6LqXgLmPP)n34<2A9waNMJu@@4Q`o4h7WIVE;l)4c<9)snfCg^0eL=bN!*?-=(RMa zbgf-bA`Y~>75fkRj5S`bY@m?le>eZ|=7)^`eY>>Bjd|a-Akt3Vr>`tG9OtYqyEc?Kle}RGxPLk0oo4`LbA}CbO|iy-b4k66R131ZVZqauN(+<7 z)tTZ#pR`LRUSH{>LZ2*;G#2e$T_IOVbe!(Yj%zMUfzA2L+LrA7uaU-^Nqyl-4hz zu4eU!K?>H6kf;o*)F7G{&wc`x@PFy%$Pb+74b+SOWN!LYS~q$$+srRAy*P|a6nn4s zZP_+0YkrK?Jp28|_N*(=PHp~f^0rqrR#@tXPc{?XVuD^tTW*|-6F&K$pZuRt@c*5B z;^0=7^^BX}7V`td-1`d#)qPOBXa2h3^6C%n;O~8iRXojkkjLLD&4g=#u9k zDG8fFH!Eb~HndJDt=93Yt-j({qrc*pN4V+X&WVL`2@BPRaZ76Ie~ZBn&zS8^S8K_N zu^U+JHQD<+BI7;f*k7L5I@0JjbmCp~y)Y7HVOWk+Ng6K%V5teASU*L-3ra~EMN_X# zPphuh@s^ayZ));LgmJ@94MSl3qP3x1;k4S&_|zQ@?DMs?3EK?XEBhVXd5*UI36ThT z=T?dYhFn9oRy5g0U(b?qt|t+~p^&QyqvEWcIkdJSQag zDWW8l{URV*LMl4<3bxTOovawImrkyRCFXHpFNS4e#lsL!>7VG!Vq}JcqH3T$iuy)O zPL&H1#uas_He^Rp6$<>eBZpmul_A9`79sGGoNfwBc8-=v&VupPkR26G5|#T_{pQ@W zl_g-eUy?_2JLvO+>ExPNP;?Qt#R%~vy^G|FFqOF~ki`obw@AW<>}##F&`?jFq6Q`kEik-9*glK=8puo&~xdf~9^q z2;-B0aTn-dFABaSiW39*z`g!aP>n%OepqbX#M*`wb$B@eY?qG z#zsjA=qsFeRWAWxMGy=KPR+~MdI#)-o3IZ0^BIpJjifwyvPOYC5;cdFp!~^v2+bCN zaqAL$(#h}SJnctg$%+YjKa&sDhT3AqDdAWU7P>+DF3mM$T@yuB$GS(I3v3x4{GcUW zPwj4c59_t`eP?`+y?oaRT+2&xr~|f(?J_~_3C*){SFk2flSdLIZpD`s6YV1<^qauW z`eMmoE&7Ri86EWZw2L144kU95wmNwR$6 zX}v_flVrstAyt&`fz}%GBA(Xwikyvw)PKHl(t7dp(~JquZ?{;#xph2gSDpV;R4MF< zZLyntl!O6L4YV9(DH5DXSupMq954Z!yt}?+?jIgH+&Yb-5Otrsjo;Jgy|)5PfK86yf$|EbYa<-2uY#4UYqT zd52-%B+V|Fq?Q`;)zcsyOtz~Nqb1BWU11`z@ZH%Z{aG{9|YT z7pnKAvA+Vd^<5y?7hi^|eoiQMz#avu+GyKBcORoj=xb>Gnr0j&!I6cPSP@IggCz;Y z{Ssr-cxt#YvQ5Gu^SrGZTD}^&{x;i0(T`bHlrh2mPvn~X6S>ciHC=drx73aKdX{=~ zu!ej=+OI{f9sor@{dxae@~D{}@Mf~I--SE<2sH<09e<2K;LQWVG5l)KP_E-Qqa>tg z2pdJ!mm=&aj_9EGcJv|0o{R)UfIqcNF5Tve06bMg8Lk_fqWCZj@r=BGD)$nksP(&@ZGu3 z?{ntDPD6q05l-nbk<(xeRZoxX4*nJ|n1BQ`g!T!+ZnLwColTki@Ns}#ypZNhn1~Uu z3ABjymMmrh1)C0k0nAbx)}0PQKCI#Wp*T0x$47_c{1GCsXz3JSmYA$lon@$*gpRmj zeGx$gJH3c~qxx{%&3`On8yGkxyCu(OY3_;M@C?{K0GSwEUFhAK&X`Y(K{C{3_Nl2Pd$z456_^5ukE^ouL z)Sam5_p+2m(-_hTGgCQ%bJ{ezRl`YAwg{DzC7{nIGVCf69+KhYFZ*4^slLv4X`Ib= z3`3CF)@;bt>8T~ZWCCX{Ya!)R6isl-s%40N#7ii$ST0GAh`CD4dWYZvRnH!^AvqeO zlwM5L*A0RPrzv^(>m|8e)k`|PgGjwTA+OJI@rwEq(?YP>nKsfEl%}m2YRN{)cd?|{ z_~i1E8}t3+8vLz`iitU)F(7%PXoyj}a!_mbv4b7cnhDG7Ks2*0WRjw65-CA(z@EHv ztCoC0Q8iOF$(bG3F}!e9RWs~R>Xycx8cDf;@kr?;oQC^_$?~7SX4IdqS6|iy9fxNw zi{G26w3m+yF8B{08PO0Rd*yIKv1cA)9~8H{bJ%Lzfr6utPf!L65d?Kg7$o&^`Le_C zOo~JpAbJkx676xyiTt1vL<+>gVuaN1dPWKwXgSDpi9@2b0eT4wXPqLz_=8a+u?d<^ zSNLG?M8%@Tfp0|k1D5Z`9TFGBpn9JeOF2nzEb7&6seFDc$>#k_Q>e+v=UW${CK&OE zUxf|!K`_W9s2?bkZp9A$2=N_M1ptI)S5bx*+eJc_k0d~MF4aN*?A(t41;xEa(&U!v z7TvwCofiUsq*`*fAy${yx(V@5qAeagx;*VB-vvL|x6*+)v+WGq9ejV_w7r2SXau+? zQbV?ROhbT}ShHLeQb|+pUg4C6V zD4qeNPKpf_`oAno-4q0?5y^)Kg2@iWJ{T#Z2Y~X!^x%Vmbp?&LF{D^wf~@9p{itdV>R&SE7#YIf76Nk>`S7 z(;)gu{2mi6fa^IJ?DE6_l_xLB=JRs-kB)Mz&5xxOE!}~tYVi$Ko#;jeD^yerwTqY+ zIIScXp~sfQS>MdMXVKO64*jX2jF(M=@KN;krzng2%sv09GNA1&hvyC+7h|_?FyYj|v3VNmUf1#NoQaw4GMuh-;JZ%_odyt1CWq?H#9E4|rKEnNGjv5m6<+xE}dV94HX|46z zeCIXUhEUrGoAcm<-VgjwL$Q-@$xp#AO`IapcnhpO%Ag@CV%`C&3JPWBJ9^!|((CeE zXDCllO|Qb`yqaEt^~3pKZ3)Vy|Eyo&eFwtvUMRLlWAm=&lNoV>ZlK^vvB}?n!0L6sL@j&!J$2Dr> zCID|MI}x-vfbU&qHW$r56`y}!Xc>9T(pM~KsaCczPZ1}S`gIF5z+oDr!`(qW00oIo zk$}AVN+rCQuRzj)0zQ##Aknzt=TU5r8eeqSr7!ntAxSg-cP{5a-(!?qPqBW(RjGAX znM6qp5A#X2$(nrw#XTRkg$*+$AL}h0fs3S^xr7Cj#{Pp`oEx(@G@SkBFuS}eCbdA| zsn-*gRTm!nI#ZT=@r<$Fs*N1ua|pKs>Nf7uW-AvoNM24FtPf*y0lr=!`vJ$+OBOOq zR#sJmi>PM;A_9u64m)rFq=idR_F?;wSc$r~l31JmkCN_FRpkJvJa&)qJg=;kOllDw zeur*ZvvWoZ!ig;Nfg2T>eVx8yoHD%R2Xpw%zb2%phh;UclQxr-))37qHm!!EHZ%)u z45O5^={>W)baK9n99NoFzL_;&)7G>P?!^ey5?O0nT_1k0DBPHBRCkgTq);)GKeRlK zH}+up#g$^QNI^@C#TwpcIFjK+G-K9@H+n5RHYRA6rxi@~-|9)8ubG-_sF|7{6A-2N zxi=;uyGUspTV0sCtf05~-lFQMtIeTksV(`Sb^j&Tsg5(LRpZ$P}0r_s%cZ8jmZG>fd%ljV4W`OOY`57cT`V^^u&ZEQ|KW&JxbxEMJg| zetCT+#%2q5^UCMf`KU3Cti`Sn);05`gAibjH_R}3x30_4^p;bh{U0X*v1(doX|%_cR*)3c_9=xW}P)ubu@Q= zb=+u#K-xq)uXP-iv-zSchj{;qUk&lc0l_4GWyLEkL=BOx`uN@|2b&G%97)LI%I!>8 zH2EdDt{3pG6Di871%SXml*WN(77$f6ThMDmj@FPpN9d6ba!w74oeSSo$a9|z&C0Af ze0+7V)g~p|%=X^(-*6j$=xz8LNUx4B%u__Ar^KEQ474>enmj~Ro1`>R>mWoDH;&^e6k(`{3Py5Ty#s|)0=d%|IA7uz~2Is2%gtA~J zXn9RRMvF!Bavodi4Ak-0nQ41eNyF?yo9$IX`6=VSvM1y zT`BGgafoV_8@1}ml2_iUwuY9=+{Rh;+A(8#jeRwu-r36C&4Y*LF;rB>l^$XYL&`i^ z7%h{^YBAgZ@#P{pZS}!~qtjznCPmB0xp0=1tTSQ|g5I?ekg%F(T%oG3CI6}1arVW4 z=XD^g*NtrI3#}rItk6n$t>vx+IiM|q#ttZpYMyQft{o7)&6WkCp0c$hRjbFO?X~Sk z+w-|r^+_xuzXuS1Y;+pSiu|CeXB*ORSFkXOM2UT|JK+7-0E^6$&~8sqR=TT~#+Q|% zCL1AP*M4}X$qCC21?K6q7*54*l;E{EAqrWRhpq*e%T#neDf}&EYqcvh!3|7+2sVSQ zAxqg85)!V&aZ$DWujNrKHUrdyMXd4%Euqm2sid0P`T6&*In=9}szFma)EsJzO;w>g z^{Hrz;4`$HL!R-1dDWMi=^`hevG7)gsfQO5DTfQB{WTxLI$c2w+Nl4XIdilKUC7!Q z1~JY6bG;RWi(o^rQCNux8oh{%1_V7edjP~Mk`x|iW);z6iB?Jt-pG~Pe8p?y_L2|I zef)53s08TGYpv;D>K@VLfDXp5xpK{YyS=+{-K)K>eYRS9JcA-ZabuSYpvq)Gk$?n2 z0AGy)rqWM7Yyj$KP}&iNO#P@th0MmuthV--WWZ?SQ@^RY_kJqmgFluqo38Z02Dfz+ zXo%U5mx~Zf3q`r-ii+lcVz@&46vyPe3^j4mq2Wi38k1CVgXdb)8kI_^0b0=+vbPA; z+kw)^{_ZJ$NRaJi=eeepT>llu=Q9JhMd0xonfKQ#=*BsR9A$=_Q{U{2C}yz52aENn zG=x__Vm#pjG;w3#HqFm8VF}C1F{Wh{elR)ptWY-k%ADpvw*OMVnI_Z33%jaa~7bZG4(M9G1Sf{ zAUNSbP6T_eGv7t=vK;Tb78WnbsY@`8#Nak>w;J-m+O^RT({rl;Fyw}nuh)`mh9~_s zy9a&H=8IWfx=&=H3kN~>McQ(hc|A*-=a@tX$=`M^+!#XFNPJ6?T zgK8oa8wR?gITOXi1|UcR{tQp`4PJxIPOCoR} zL8f16NVt)1JyRvyz_T@*JZ}fmg8a2P2P91qr%`?miMjw@9;am9C1hx4bfp=xa$DIlkD1tWAQT?fO~B9)L6}E;E zVL@m04$|;J?CW-cVo?k5j|OP!$t&R4VNo_vwFVO8c0xFO9(dLfYVtLnv4WYfHk`5& z5R!-D;i)(!8~>Ih)pS018}Bak<&ucvB7Un+yJySQv<&g09G8avSk{Fm)`!gzk5hx! zD8@`e+@Y6Nn{Az|lZDe1iQ(XtHDiBoV*9Fbagl$3b8nl@X2S5Y9AEFO>lm{h%gw*MFxuM*wL3K0*{bU&SWLV>CAc`xU0BXQdn;ql_ zO}GF&I>G?p9#EY+>i}z4#5pUmfh{YGhF}H=z}ixk6!>sKj><^X5Uwv{VrPc4eiLlk z0@|0ZVl&Fq<}^^qe_T1=q9judCdb~6sKpU&wB~TuXNK>cR*#Ivo?N$LNho@I6It|< zFMT(5b5$QYXB$HOJ`UBA&u0T(9*Qj=jnjDWC<7|*#ONlj!n|Q0n{0=R&x=y z5H(Fh0QCScS6C!y1?%5Re¨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 z z;gGS$xVgCn6XqNz0i~R%_${Vnr`vCVc^*z@hpWRyX=Y};C_w3CN(3(FfR zXw}L6N=k}mYYcf9Zs20Fin&d&9S=R-jy4v!)$GeB>q-b(8eeDpv+%X&cb;mnoKnu{ zBp1X28aPo3;uOZ&N{z2hhOFOat9u^AM)bU~s<-#m+n{Q2ptzp9k%gBdZ>J=QbmE)) zi?iA7F{G`UB`cO9X-(d-94vfEKbUG3X(MGQR_;9Oj#@)HgLQ*6g+#_~n8x=xu_YFG z567%b;DHK%MBZxaT%MpEx=uQ85`A|> z`Ulllw|4bUj~PaUOmvM3Oy;lXeL$w$=~9jxdmpPzm4d@ORSfd#s>-*rGj;L40Zrpx z7Y4zh^E9St3%`BKjxTnMHjr;N08FM*y-jN^NHWqayYK4>NJaaV2?;8hIptM*w;WWI-}^`b5$^9^ytdV&zf!Erl|vUa{loPd^8@oD=SSK9se>LT5vb zwEIrjXweMBz}P?CJT5dMZ5t!`1iAQLcALF*(0Sx5%yA7tGT6eT@s&tP$+Xr1|4Y)m ztnh7>YzDA4(0xpF7~z9|qp2oIsv0AqDR=+z;}f3h+QPtlx7VY|HY;0{DE2m2*i)EO zJ-pu4tTve_9bMOPtO>Du57ikPO1k3w^TZNv z|HDJXgt!E!!vH0~4D6jKRyokEa?+^FAd4QFeMN)#vt+Sg=-#=(6EYuUM(&U0NY3op z9bU<|&=%bdyO2y7r0w|Zsv>hb{+5t5fFy7jtfiX?kSqhCI< zu-KvQ_$jTjYrOl(x2%VxzL;KEN*I?L?Qb}pzg%&99W(u`e0lmVes6nDi@v#79qCpe zvdbrPxa9^8bES2Yg#V1YE?dN!MOaVs+|dujQLnRM{5)mvOkjG{P80Q9NuqHw$`Q3% z+kerI2P7L~-!o~Pg|_kix1l>XzE%qrROuTieOmOR% zc5QicK0`b$fUVz}&5ONuer&OG)Ef4qp<_kH_&HFS9I?Lk4X*#K`@I#tFRMT)wZx~n zV8}VMTtiwB-T1m3Gs5kC7BEnzRA2aX?U8>}BtGe$0MkCBnbKzSw#nFN+Jog`)OF~) z>xlKhq>FBg0l(|d?R{<3$gcU_34P>5UvuQMeCEs}rC@Sd zx3YG%yVza!sl6ZJxU<~be(`k8{=s>pAhoELfaMJa4!zW+eGeiQaL~_e0B8$ImU#>c=-HTbRX(m8!Ld6Jm-}Z6EmzU1>#{ig zydtdI&Bb(!>LXnx_VmY_LbViU&_gErbOt)($D6x^9N4cr)d*%L<@zS!cS!AbrTOyn z-<4SV6=<%k*3G+(N&cV+zwonm?sojHHESyWK(D%hB8g`H9jL(7EaRO;5>WB_gg3hT z08#t{Joxi{m+p8z->TPfP5M@`)5{70tx=EBf={zDdlx%a6y{|F99+HmN5^r%_e^w(= zZ3eJJo9E<>hq^!pyB1O~jMNoe(WQND+euJms~DNDT(Z1UQ$Z^v;RTIci9?9j79HUk zokM3RUXT3vD6Y8t>$&-|-GkoI_-ECv!CU>}r6c;hAy&s)hfF_YCi zw8+3#jIawjlbAyMDT|V5?XK#B;yL&uU=@{$hz|_-)Mq2eTM5Fd3t8z$p^7#T`UHR* zVU8+4>rJO)KJ_8+gL8W}M)CS=)GYQ|j9&R#s|~EpT>z7jKVSthMWe(RX$pi{V=YrNXOz+XzheE@Jj`~an z99!JTIvmLMvlk^i4xb10nAk(!t`PZSe8+yGR6i>u=$WVxY05!JhQxI^=xi%ejt3-W zR!5sPj&%+V^tml>go3|4XstMz95@JSQ!Aj1r7M!{S+@AJP7%9Kfmo;bu%6NN@E9pZ z>Etti!v4Z(PT`QIG1^mq?azfuCx?HUSJC=7ss&*YH{|RRF}$|%(nkQZGOBv#kGcKt zazOKv!q*wwb;=^j&WIVe^RqDB$S1F!*-(ScjC~`CmMs}T*NJWG=M!*EXtW8(@g$Pb zGS`cpQa^Lj)XL-PI7ITr<^@v2-ipCtkDqv;T5J1FiotoKMP(IUiWG%^@YGVev5=K6 z9*8*XJg7Qcu`qpY9a?}0G<+%HP~5`k14P;HpBsPR`}o*ukW+O6u%5xZ7f1XO{GK(z@D~*3uHfT>?yBAxtA@p_U&I3a`fLFwBf#~<@4q~{5aIw~E zUpf)JI9>Ubmh5eKbL5f#*zJafj*g>~QCaUV}3(3uLHCD-p00ajS;Xpkgx+kJ?kgQ_D}0yJ~hbKnFIMz!Uk&x(Cu3qi`kG= zpfhEtP5Gx&>p;Cpd1fp{LBmqJ(wVwYA_|g8sc*ASVG*4%-w_5kukIiGQU85Q0^A$O zg>?3*0T%1pe6;sc!Y^Oj1-unvm7jH?C}{pJsz@|~>(ovlF=oR$xP&gxWlQ??^h{(^ zD;hVL_-aNN_t?XNsXw#0j0b{3*K$I6ZzpOj?s7MTx)nxsZ8*;^aK2uQ>lMAL;|&W( zv;dH0Rw@&)aQEZ_(J<}pkMZlFqw;)m-HR}Txv-bX3S4otrk8N#jLv>0*<&5&# zKj!0m%?L9190icCw(8p)@BCzy3Kf?FwxDN(dEy;$O?Ov$-{axQ(7t>w^=?s_5O^r| z0ywxx6#XyG8k(l+1eS;}QWRg*0@z4zh%y|@AO9HMXeyrTmp2_=1#MMlPrPwBcxezB zcnEhxsh_XQ0TC13a*T_^Cy+q*22n(QB~nC3FTXqkqq6EtV>$o5MJzG->Ikr_eq73J zz3Jg}uE=F(TO%3_G)^PuH=gQU6QO%=-q52Qv?_SoD6Oi_+uG%bKE7;-GMbgdmY4x! z8=^6{iY7S)H!6RMe24}$J_q?!k+_ zVb*I)v7$dus4bEjI#!*zrc&m}5P}JJW4v2C^k&$%2KWy=LLN^#+c_5KJ4Z}b1M0vU z$mT7*HZbJR;YDHASTR-0*pmIO#r3{pp{^8ej$~`&@u7xL?6TcRRt3iyH@P9dRwfUm z?Mp9Yc2RbQgFrfG6tJOLVcdFbk7fNR^p%~+40G;pOUmtj5M5XdD|@_(JUWj+SgnHJ za5SJyVflOK!dqVXhkN&}J@ZgI$Fzp6B4Ztk2f_|JC5P=aWQfz@x5BZ0QFo>M$E+mf zg}#jfm=3363Up}FgYv~3oNiwF5MQ3VI&+~6 z=%B`A*cPR3wtRNuSoxk#1%)nzXpc3k^J7Ongni7BbrrH%#`` zYr4oFy575oOM8F)u?aMALW&{?62OYPb7>Y;;2-&Vh^yYOe_a#Ck1zj-Ul3}j#jy|e;%x{BAP--pA)?-%zy&>BZ+FV)uH4UTN{9?j?8+1|J{^C@FSO&xlH@IawO z&|jd&`!Qt#?cb1NVAK?f{Igr1>lDuw#OXl5j!RTS#~F&_@GdZ63SFRyZ0IndyZC$= z{}2@o`@(IW7XU0E<7z_u$Pn63wHvlP4mVD&0mbL`?99)TZY%DqYL+4Un6nMs+#u@gd&+%z= zrqrfe^(_n+_asg)p1;}eBy6%}C2e-=fcUt{ZOqEkiFyQ`p4!jc5}o;2Ur$x~2RSRErXk5a<$b0LY>)$CrX+l;Gdf41`2ncubjh7~Y z!Ap*Sqqj~6vw2r}nmco1K1S1`R=T!0qNVkD`9}{L69$SKNzWp$^Y=P_Z@%(Cu7|(s z{rAZcB=7pz(>YLiUPQ}1EE0&Jbt z0tAF+tofxll{t$+v0_jSZ#Yub-u@(alsKiQU|{z3u0odW74OF{Q^IOy!rmc)P?|Fh z6_V)At2qx#M{SW~ifMsF0p?(P3g-&IzSe3&J>rF@JxojETZgSS>PSsnOK`kQuTHZCNb)-HWT-KjgOs(g0kwa*}U^q#|x z)p5UlawNBoH*Xj68nIF`@65@f91!!~z42ecO#6J=eo?r~1&4O&X9< zIkQQ?`a5CfOqOpP|C&^^Uu&20U8Xk&NL%i4VS07*vFKd%GLyZS0IzO9D*HthPs5kP zt93aQ+CJEhQ|K>+CD^t+;k{Ff@v3}m%|S5q6uaf&1k5PtF4p^iQ2V;U-nRNM9XFM? zzh@K3?X@|rx9SwdVPDJm;Lb>Gp7~y5ag5>m=PgE^p*4;Pehv8vAu-&?$JfkLdkn{+ z6J4<#pGD{(XRk|kd_uJ=7 zvFI_InDW|W5~Y#&XJv#O8Wr|jXD_7b_I>EN6|7Q@EoX9Mr=akVt?>a0xYtRVPR%0d zLR>36wL|W*lPT}BZ9QIW7GiU}KjqYaMaW_2p0M?=f`w;{K+!ho#eW5#4YdJFHRYAP zObk%s^T^W7)9{LSy$>0%bc;Ugb(uJh;ZWhZ>X$bZPF3%q3DHIwfiq(Ffv&;866R+L zR!@sM#7U@tCB-FaE4r`ab07Hd9@2KoId~+6qL$$4(N(RB(#co0wgUY@U;UzNEn0`s z)H2C1IU&(iOrceeYH`(6dDsI&6KcFFv-CV}O!aF2Hv=8*#booYvQXe>SrV*Pcj{@B zzCUvk)+yNNcVE%8(bO0k{^{<>?b1n%NxBal5x>szRkVmQ5>PaCCa2l4syJi-Cc$MI z9mzyKN3SV{w$V1`*p{wdC1vONax2Gx3?uf;rAJiQN9$M24($U|e!lZG$+lwG;9fT- z=nwobw$=bz)!m}i$ybNLe=*?>V#u1UeM&O|Ekdxyuo3SAPA$)>>yJN*<+>8!`SrAv zB#E!FKP<#02sbQ11MiIJWY;HINNCkHGaV+IP4q6!7qgu(O?-o06lS|C4Y^S^y4`-d z%KEbS@bPqAY0)CXcx`qn+M?D%+ePY7Obw_pWo>P!=ew4_upMvSPXp%^3OW>nF4hJ3 zQLV#uuCUBatMRKHM)Q|V+Fw^-wrp8#)6kc>P4!&Uffb{jIa?{ay&6f+%(i4r_TQJU zeiCbl;_8|Sv)0Q$?%%9I&Mz^$I`leX@{66EsacOFAjLa$lwF+{N3gXm?&6&ppA~-& zMk1xn!kMQ|yLam^TLE3MiuG~9EV{p&0ePNYQ8t*P52tGb27C@qw z9IQ{OWanlVdHgL<<-yA~57|2IW>bUhquf|X7wvrgCYx3*>&;oskg{XkCaR)Ro zc_eXa25?7b51&Qb+Fq7_oV3;?5}~~Zdd;}t;e+vt^(48l%b_W5Wu1p1Td+UQrUy{- z@9U#D1$@xIr^B479iiORWL>_u0c>48N^UQ`$XhYkXopnIHd&`DE20iemw zN^R^MrwZ;wTx|JAnYR5i`TuV~gW_@m4mXB?ICz8m;xH}c3XzQYPJC~>&y2IZ2JL^d z+sA}gLeTl*3zIO$x8urhyriCA6gSG4);$zgcf{!T!dI^$Qj@HIc47U z+HF~Unj+roe?o7q-@P0H)ZzGd`qp26<eD-y%l&$HCxQqg2^HT4BB18I_ zSl#9vA)%v)5)bCj~lP-Nv3y!OK% zyXuzs89qwWe`?Me+q)o^!#k^%8cD zlyw)g>h=hFt-py^eNLoC$T2ro?q1YRA>x8)Fjf!_&K7up$eL5o3j#~sQ(KF-+7k%r z3%bq@pig!p!v&p-gLhdFsSz3 zI>0~tEV6mY3wj>Q!%aaIrJ|;h2%aC&+I3QCdvI6fCVn~@lPn%5pI3Y*0099Glflrs zu=l*Cp1fdU&_iOdpe!%Djycva{I|_PM#7o)a&_6mieaJxN(Ut1E!NjDyQ~BpnXfZs z@;r`aV@Y@~lU02vM7%q29*dwkry@KMjkt@HX}G_c$d|4<0sv)1Pb?ja8Ug;3wr&7k zkJtefQ13QPw4LNzKK*>FrR92KXjD^31~k~)mx1FG8~(qB+x{}sOWXa=MBe8r_Z3w9CA6N`ZY9o#-?>+AUB8e+BV>ku$>ADS5$0x>l-1sw~dwH0#GB zBJ(&st0grlEw~@w?p;4u(!jbYP})sNZFnO&?4fb1FgHFk+tBUXSENvxY|~B96|W8J zfU-q^9=gaxu>zc#xSR*e@002dx<8gavtg<2ZHYW2IC~WLB3%RL&VD_~O&zUS0yUe@ z#GSsu!H(wGb2aElb%06CtuNcuB(-kRvvrhv3@p3Vi?N$|(cuz2PD5{$c+%EK$GF(~ zfZo?eTUkWl&ep~BR9vD_@^b2owPpcdCyv|SlI(A?jz2cIO%57fpE;<RZRs%-?3} zLG30jNhy8xSla0dA-pnlojv<)+r#uYbWwy^w_kr-YLf5@-ZRkNt4u)=hGN)ho6k+s zPcO6hw{nah1t2qMa+a-Bb>6x4aLMQ;hMs?$ak?YDKOzkMwkqk!5$~{_bSRYt z=nNNy&CN^Agw>g;BYOtT-;){jp%E^=j7*-{s;f6c{t16nFzXw3 zkwN}82U^f4%KHenTFnheecn!+^2&$!-Cmk3<_)Kr7^K z_|0*1Mz;%m(vSb-=UyjKE1nQNuWSc~B#YOONb$*vUU7DE+7Gy}@=3Rp_D>w2L&K_| zeHj6iw8yQ_z=ub0E$flWgY?t!5)r8+K5U!H#mp}Xy7tfWmRrC?IENHDH}CVAm)DAA zRMx5GT{>l5-+(G6@~$lp21`8N`AHWt3AJ~8LNLJ+9nSYdGi@e<#?%*;s>~<47tzjO zQCXh)xO4*`fH)m)y%uf=G_7$jB43XO+{FgwXKLfwp$MrDRsE=xT9PztV+HEIQ#)H! z8$L|^2>t2ee2Yhtel*3wziT#Id7p2qf;3(W1vuXTXjSz(As%Z_;I6j6H@Xq|(_&ERWrV?{Vt13i5DBRhW{f=Z zYe}+fqG~EZzB!&zB9u8}6<}xj!vzcz`54W*bE)Ey$5H~%U{uU^SvA<31d6wrw?M%V zjYE!y_J>nRNyTP61Ag7q3ybYWfkB!VTyBN2IGS0eL0H1>2&(> zl*R5l^+};$W+Mp`z($Sl+ej$0O~eqvsuV@5&xzVtK>_L9WXN&r0{Gn<@Hxa*;a43} zCREvDZfNT@4ZC(NO0){uP$62U2%1MT;a0y!aNmK_GO5cL9bSInu;(9uG+;qDMXvVC zha_qPZO58|Mi|*iBOl12Kzk7xKq$mirxH{rw>TFr;;-`N4uO>_#SctMFHC76uVhlp zlDty`>v($2j8C=-P$gR6>rZ_&Nvbt=qKfus8~<^I!Q|t-gLWrowNGaGZl~`x2mQ7w`*4!C z3#J?aciB2Wa7#7h+VW!NCwzTy&)gJ0KGNux7qKse$JeQj$93EShtI^6i;mqVikh#K zh?5GvvS19%0y{9BTs@xE9%hS)1RJxfkW;jPuxk(98;Li;fwl!Pb)8g@Bxm%35Edg| z=9pSe2+2yv*32+d+$?fd*jLz6#X=Dw!l^&50IhP^z|J-fQ0=6nYadpdurRM+ZFO9cE$L9VL(jZr-dt=t3IVetVQlQ)jM=Yy$`22{#H) zzWGk(AZdIhl;2P;U<(x47**u$ov>23a3iJ^SPaw9cPP9Mwj7KRt`Wyq+cV2?xm^fJ zPwB(YC5^8EK<;#OeaG()|IiNalxmxd4H3%jY38drY{Yze`fg1wVOe4mzv$pmX)mhV zPak7tTft1a{>IBg5_vWzv-B;yt_;UH(>itx=Xaq5mD!OwNsJ$pKhqMfUhS9xXX9eVCj)&x2OOfvNQ#^F>-yJD@|2507%Hs=9( zuR5L+i_z)6+TH~FlT&}FLjm*FJlxr~unrWkCkP;=52<-!`Si(MO>KR?H0D z8H{)N&6U57d8VT8WL-hlPsfB{_aChh+iaml;z+Ac`uMtsGx_(dnT%ib=mcV})hkNU zK$+IK`kKuxp^l31Fx6Dp?oyR?A7%Tk!_^aLC#Ri~2D9}<@0bXEYG<-OHS|2!3P&QQ z{3#OX%Kvxy%YTUq1%1I>8|8`Zz*9%cB`u(IqNMJyDkW)>5Re9@PGfesQ9Tcbr&D)I zmV*#&!lpze?b(C|2#Gxvtk;LfA4Wc1!OnuR4Z=xh$F81~$GNJ`eGI@E%*gQc1_(XXED!-Z0W<@9L?-Ry%S3hAPIa{s~od$NdAU zcq?+CeiZ^^GzOK*H+hXxI!AT{qb@z$=C-QjX{raRxn~v;gzD_L0Zy7nvL>#Uyolg z1(j94yKM67;5DLDrv?m>NSH@@p>@GWoU7EFL3Qpe-d*(V5jIt&X zEkvRezAKrWuae&Inh2VCx)yz5M4XhODKpy+FB`8Qw!|J|Lrxbsrm(C{yk3pNpPmv( z-KJI7@Ty7e6UUvc1m*|XP8gBWQCSP1jKun9@j`QD>klHT`pQSkDul>>09fK{CgI}2 z2PYA{OLtD-=SPj)kV8m0Gkrj~S98or5)G$lRlg02WsW6It`B4%o6aRCrzGr!Kn$H}j z4dUKWI#QIA99pOJdFyRSvt(tR*icJHdH9xH+iyGYsg`(*(^Tb6+igo>WP=hcSB@0z z)2CEJvEV+7vIw3(3@5anO0qa#gDnr!ADA$`y}Zh3SiPd}sw(q8FY{25W2Mrl{hrx( z57I#AlThDXPOZSyGljYU{MGf9;U!$JkD3h&um}e{pnq591pp~F&^Y<85)1Asv}dcP z+4?#suq+T|(Fpwuqxc6?yR@$WqyN)chcYh@$0zs@V;PoNJbEW2!9QNf@~f8&#UBIC zmV}s}G66iNo~kO?Hxlt3(l{FD7XeWcrj=(0Q}BI0eV-+P7C+jzXn($O zf_9WKb9<_?gNob)6+#Ul4Zp$>X4*=86eNORn#9OX$%MC;+6l2X4OxLC;X(c)Z^35! zQ*Pd&_%JyK zO5y?zFswI;TW?93Tb9_rUIU)6PJHx?x5|Agoy65u#X%1h^BJcl2eriXofgN$jXr`C zUtgA?>j@|A{c+ht@AE~+~N+s&xeuNUdnRa92{N9#X;%AhjtUdtT2ZKeU<2!JJe> zQ^AroF5=%u1X<`wuPeOn*{2fJ0}7ah+lk1QW{0tI@>rl@TQ@sf$4b4S1&e@gk$b`E2uuZ+Ufi$Trw=iFb#=B9oIZ zfa{gS&6R%KVHN2iS+p?C@qYv+&XfVMu;Y;_B?_x#ij@j1J&(H^J~oDjLB^q6iV5Fa zh4yKHDAT<_b**~<&F-UmN1jn6W33-wYh|-P!&|8rzMbOtN8>kh^nH)Sh=}Id9`fE~ zRT0{9(RENn@_YxZTGoTFO;z&0vJ&xi()bE1mu|ZiKqQG>5N~bYim+&_cDf87h}>FF zb-m`=XC6E#KH)myp(Z3>>Lav_*EbKrieY?xNlF={9xA3O{mOQfoMk7VKNEY=Nx~_; zMx^q9G_OR{-myS0aS!zlD&sjA;t^47FYH{I)AOb(^T1rv>RQ*H*&~Sdno@pRb-~WQ zB-Y|p2B#)$du_y-b0Py)&cF3NA3pvVG}hEVZIDi{c)@b&im1R9xWuGl_i&?YFOSo#1O88!BT|T*BX@8Gj(- znd%3~1FSri-n~(H&hM^bV zXzJ)JAcKHd#y{bs;A~#Xm+jtQ|M16^O`!UE2bu?B@B@cuAbyyfz0u5+ zT651h>q*;)iluY%<+3K{fBoZ=kBtIQzLkZG@I20aH{r!mp_?@DEBhyXwh~lWYwPXK z(Itfff6P!vu!VyI=`f9Ogsu zidCw7%ez=80}mKRXSD;%vu$kqaE|%R0>e!zi8s^u@K|v2VSTkk#!m3C+`!c!ANwgWm0PE{`kGYv^)p@+NJ5g9!DHsaTjOwIMqK!=p#<`R5Xk^SHh)r$0v;YRJcd7J-`#e;5wAo4R*g)j);9TW z;r>f3TB(6R73LSd6Xq1qQs+pSyyDfQY^u=ki%P{n%e6R=JZZkVljZ{R@|4uASxg-{vym=@f4-gCSesWiU+Ft!X6AR}`DgQ@eVYjPU`-XD& zNOmZYGD{{fmD-}N0kMXXLE=~iLRfcr>4VFY50}>b+a^U#m{|Ao&7TTcZbR^4cKXw)OZ(fKHx0p`qu%; zVtpci4OyG>=97fr{(53e7r6KU=`c;JA z&AiuR&c1o;(m4xqS9}tK@0VrwWSPuMFCMi=s*x3WYfH*O4)!>;7BS)*P>Cf@U{LU{ zv66o)bziEK{>L`*ZONq1v%bF(ezRo{yF{br9lk3`^T`)Xt_v-*Fx4rGIsJ zyofLV5VX3;I?Bhjloz|^kilPhe)3Zi9}*$M*cW>TPz?}MHP^h(o zF1eX2z#cM!bb-s?`^-ga$j-cV;;{}fSMV9K2I3DqMO;nlv(#+ z2XD_CbnirKAZPg|KRc^{Kgs9X^L=*fk((T1e-uXn^Q}nkhon+D4*KOMk;V9x6t)dx z?CnpVmTSX@Uy{ebn5#w@tXa%LK$!XgrE0A2Y>5SA(K)(|`#Lzrt_<@5nPt3TsvmEwrvd0YK;&>o0>Ebd>%6xIpC zEPR)HhVFM&Dql6QrtW`Osv}59d?U^;JQ_HnS{@rq9H*|w;ma>HrF!j#fkkBp0vQI9aO8)Ry!lCGoqWh2 z2h4Soze5P$@|lW?qO)jpZgFT7rTD|*vjcYA=EN1x!Rpn`H55*d&L$M{Yc)4_qLRw^ zk^{YAF+{$S)agw>^8M!5@{&*R;eKM-g#3Qjw7T|kQoT}>3`lURZtt9T^!(is3tLsK z15mq?ggQaOBd0x;wU1@jvvzEZ`d#keX?8hmS{pd~#K92RKt!CPDdFrQobk+xCUHGU z#`liV1*IN98lfsuMYQ8#zOnRW6~`86&JhUqD~CdOZEVQS=!0*5jh$$|({_RZsyBLS zwz_cSk2_5~nWnd-^HOLbhkK85<9kRuZ4BxGi&gXcyB14ea5uQ=27(|L9FJv>@p#bo z>EV*E>6@oD*9lDeEY|2rf_XvSX*`hl$1-plMk;6Z!SnQM(YFYg7U!O@I9*lGEFL-& zpFPS(@3UpTAvUFok_BKoG2}=omRpt*CvzedacuXo?*PScvgl?|)7%AY%lSlq>9GMR zTaxDjb({xYo3lXWB4}f=o$w6aLu^a;afW+!`6iRm%q6~#Uo{Y~j@*nR;9QE5?>E6N zz`UL;jE_H#RfPCI6YLVK{&xgBs^u_%U`N)bjHsy2NQjWBe*Y_>w-S0*CKKMa_k@&B zkGOP(52n`8n#zn4D8hJ6Y(BCMUrn2l5Yu;?<`SI0k>w|?mganWmZZo$6(zdejv(jOp7@iFa{zeB>^erdWFcV|mudvW@0m9YiQ{^dD^G0(O zgw`x0wp2SW%h*V@y{$s=H=cQGf7r8&|I;wvPpqxuI&H!*?@O=S?)h1`5(VR`uP=MS zrx;7FR3F6VU(C+~>Wu$!KEYBG1yR!JxxA^cD+bs9k-HT!Kx~;@Zl00#7z7^NeM-XCe3EThoXJ~qOv^Vh8t(DR2J&|&B7!8< zd0+LWLm)?xj4E1~w+8koMa|ziDpN&YOd&gzc4|X{=tM zv&$_Fw>vmQf)!&%yAybDdc4#FoI{`TAir5|ZR7~=AY~2(Sr|J4+48Oi zVK%HX!Ep6X=dj{+1+k-9yUa1bhrTm!*ToX<8|nWBGx^4b%=ZmOFd5Ak=>x#enIY*$Hf)(Qw@^h&BtGUiu_wW?knXCkR53JxQD>s$%Mw4|h$XwP^C4fz)$Kef_Zg6NKJ_^Smq#@Ha_dO z;OeIArjdQo3$v_$Tiyg1v-G8(1;|NcSJz~hCaXX8bj2e~=B=np_UkYrI?J~sL`JSM z2fUMzZg4k|@b{LqKMC^=m0{RRCyvv-QBJ-rfe!ApH4Zm{*%}M1VnCC@#ZSUzb_Wj9 zb0}I)vipkiOD^qKT)Mn~WjA_k_3!GGisAX+e@bQsWKBGk4Z`eN91lRsjs5g!k=Jpw zq&k{K(m*lzxe|zNgFbAQ1|)n8-xpST4x)3C+@a1PJd*^R5f37)&jO^BZg6#PZfeVQ zpV>9O9l&vaB6vu-p+efggat_^4I3-HYj5?HBw71Fd@M8K0DfLCjeqY%_Dpkj?67_d zpib^oVV?s!UmCoKdK0CYRi@1@vfm`b#;42af#6;#^Jg>bm~=@IHfPZJBKZ6->e4mQl_?ZK7Z{i?WlMyIGfHO%t zWp38Kjl`E`VI{N1^Gs5Jyp))tT_}RUBz4?>mdYxrki|!LVL5&3bi0lIkZt>_lcKP- zwq+p^AbFX!Ij0}G0u1N42x#;^7IYwPhLrO*n1l;kj9v=;5>X|(<*I)IO2AQ&gUuQ} zs0@7SYXW=58d$y$tL**ObTH%RbMlBQCjrL+=SNEI!sV2nVJFnxhRmXDae!=46)47|GapW1#p;Zbk7`Es0|qqe=%l}b=KUQa@M^e?~37^<_Y=zXjn(w-1ND? z>FLq-Nljja+216+dU+8Ad}W@^#oO;YExwA>Dgn>G-zP7urXpYM7sv5$Rphq<05z=f zzv|sZXE!mfXyHw9(+2_Q3Gr{b%Xq7S@RQzWb-?nt_`05ooaJPWWS6{_I~;e(WurMM zVClFr{^j55-G?xf-`m{)BGwkla>hnC>$jlU(*#mD;=zlzD~g=#B1WD6qd_w zzQ(quzn;XsXY$k=*X3IU#AH+8FNDjK$xW&!bWP#j3$3CtVg2$Ft!dYC63?fvds4uZ z#{+*ij#H66S=RH00Y)MHblny;^)geIgvq@6J6~3vd4`qo7DuNBgKfOk{x4sgJNRf- zd!HKTX3o1zJ~vlCl=TR)OPo6bDhWMc-)jUT9S;|tFA!oK6cgt4vM3-5|EsSvjb<}# z<2XX1wJW1)3)4Z{LBmumwIpeE8T(ePwTPvHh;8gd6|D(fMysf$YN&byq`=hO4y`EWnyKKHrKeO>?m?~h^$cXC3!zXA-aZv0k#@F%Xc z^SpxSac6F!*)|~ZS8w#LT8}oHVU<;^|A}*{(|a|3NaCAOwuIv^joBQ84wwwJj+J;-L{V9*A(%%6wS!oa%9=FO8_6c& zUN*dMp*tsG@mGr1^L{p8;$h<3q8TL9^~Uf;&_1g9ba#X8heVyAvN`^&!&%(OEmPkF z6)W^jx0!Es&HYHwV{8sVg6VHjn5nE=a0)n;fxi7&>%_s32gxp%wZ6QUW|IhKjFz>$ zV_@}z&RKlrGGwi12&-I%xBnVL872w`;kW8Az&3h41ou3{$fmt}=(HR(RcjpY!)95H3P2+641cwTj#+;2 zr3ybdl$jf+-4@MxY&)0UVHfqKx9jx}mdpt=c0Jq}=!&Mx2M!KT7c#6U+RL)*^-(n+ zkfErI^KnjVtI+#S+-BpSH(O#Edv%H4AT zSI7^~^+#w{UChJ7wUQ>7tf?8=W_N4xLFUZQa`D2J`_{vMpFzlW_!CiknZmPJ^=%>O ze_f;hmd3s=|J_Y3=IT8)wPm>(KjSZ-HS1>trSH?Pb(&!zSQdS}^T0dQ>!3XZLaW{h z?76ZAt(@ExKQj6858XHYx~;^n>;)U$cFT~k5mO)^SGTv+KC8O7)V;ej^sb}lnnERQ zXM{LW(fp>5TGKG$E}Enm{&0cAEnc<&`kZ&xc(PHV0hMbOch<6Fft<4}bP@c9Cr0H$CPn(#DM$B!j= zQ6CwM0fNdmyA+x?)|qj**%WT2m`D?Y#bQ3s3je5HZN-u!qFL`u&kmx+-?4C6^RbV% zp3)6g9I6Zp(Dvg!vwJ&)(1M9WXE$$>PZR}7j|!*Nc>J!LXsnDCw1)f)K$mjK3=fS3 zHgpLH2Y5m2<7P*B{Afo$B(jfarx^Ic7g8`L*pQv<5lb9n0#6(fk>TW*Z|$V+&-Do@ zX&7jjNUp4iF@xq3vNyY0l|dO^7;q-gX>bU0NjXExtUIE!=BfNiWava+wY{H+_Cnfv zz^k*3>pDfR&=f;xpUq4<)G9umj|TMbDvW2qFKFTjDJ@&0nYvt4EjL$L7kean6o8j5iCw=3jKVr9IkSDMzixzca%(o>`Qi0CP1GR!LC2r}beBWfM?i2C+(O|70$C~57FDbYd$mWTP>xS&(eh?4lETcSH zcNGcZblW<0Ypf;ZwYH~2?>3lNLWEpK>}qP)L|Mzc&XbX&+b`?n)Ezt)5sSJty^x_T=>+xH1qcGf2PR}+ccal^vcKTUf zIHB*v{>#y_QeIP|TPG<4D`TgMt+o-6Mh<&dX1*L#ea%PmE~En8dHShetN<*MED(M& zo(<2LLTaK`sGpD;c!gzuofh5aeCs8=c(3nuQQj$mlz`Kn!tvPS$?Fd2%JNTzsM+HS zykW=+O%eo_^+=F#_aBssB#`a-e<&4Z-1$3`M-@X~bjay(1Sxb8LRBFR2qdH}mZ+n)OOI!vef(&5fw}-W}xQeRi(MaUz{+ z;)HSHi%V}?;*6h=moM?d3*+4uphTKUD0aFlU@2QcEqc>M9pU%3=`ao1eL?0Y+)6|GV1R)~zHchz{B=ltIkX}R zN2dq9%w-My{R6@DxTzbD~e=YDI%D}zR#mfr`YC%10 zkA_CSFs-JfA?~P-7YC@@C)4*F5Ck@_r8z2T@4ork+5$w=rlOrmu@NWn&}-jooNT{-aS053dJ!LY|6C=a=i>ib+v^w}K$f|} z?o^NQ{a1qSkk%zxxYJR%3@SybTRZ~=_g7U_OyX!r2lmDvK)ME*!?B{0#N8<>kBMw# q6`6>hbQ66F`Rj08#{z!$-UFen&$SU(lZodzfalVA({mL_7yO@yNJuyU literal 0 HcmV?d00001 diff --git a/Documentation/Projects/Build Analysis/Resources/AzureDevOpsPassedOnRerun.PNG b/Documentation/Projects/Build Analysis/Resources/AzureDevOpsPassedOnRerun.PNG new file mode 100644 index 0000000000000000000000000000000000000000..97106f65f883faf9e88eb48c3d3687f91894ead8 GIT binary patch literal 117980 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 Date: Tue, 28 Sep 2021 03:51:08 +0300 Subject: [PATCH 410/699] Allow multiple [SkipOnCoreClr] (#7960) * Set AllowMultiple to true in SkipOnCoreClrAttribute * Probe DOTNET_ variables related to COMPlus_ as well * Address CR feedback --- .../src/Attributes/SkipOnCoreClrAttribute.cs | 2 +- .../src/Discoverers/SkipOnCoreClrDiscoverer.cs | 17 +++++++++-------- .../src/RuntimeTestModes.cs | 14 +++++++------- 3 files changed, 17 insertions(+), 16 deletions(-) diff --git a/src/Microsoft.DotNet.XUnitExtensions/src/Attributes/SkipOnCoreClrAttribute.cs b/src/Microsoft.DotNet.XUnitExtensions/src/Attributes/SkipOnCoreClrAttribute.cs index a2d5b933eb9..ef527b206ec 100644 --- a/src/Microsoft.DotNet.XUnitExtensions/src/Attributes/SkipOnCoreClrAttribute.cs +++ b/src/Microsoft.DotNet.XUnitExtensions/src/Attributes/SkipOnCoreClrAttribute.cs @@ -7,7 +7,7 @@ namespace Xunit { [TraitDiscoverer("Microsoft.DotNet.XUnitExtensions.SkipOnCoreClrDiscoverer", "Microsoft.DotNet.XUnitExtensions")] - [AttributeUsage(AttributeTargets.Assembly | AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = false, Inherited = true)] + [AttributeUsage(AttributeTargets.Assembly | AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = true, Inherited = true)] public class SkipOnCoreClrAttribute : Attribute, ITraitAttribute { internal SkipOnCoreClrAttribute() { } diff --git a/src/Microsoft.DotNet.XUnitExtensions/src/Discoverers/SkipOnCoreClrDiscoverer.cs b/src/Microsoft.DotNet.XUnitExtensions/src/Discoverers/SkipOnCoreClrDiscoverer.cs index 24443a347a5..8f9fd31101e 100644 --- a/src/Microsoft.DotNet.XUnitExtensions/src/Discoverers/SkipOnCoreClrDiscoverer.cs +++ b/src/Microsoft.DotNet.XUnitExtensions/src/Discoverers/SkipOnCoreClrDiscoverer.cs @@ -13,13 +13,13 @@ namespace Microsoft.DotNet.XUnitExtensions { public class SkipOnCoreClrDiscoverer : ITraitDiscoverer { - private static readonly Lazy s_isJitStress = new Lazy(() => !string.Equals(GetEnvironmentVariableValue("COMPlus_JitStress"), "0", StringComparison.InvariantCulture)); - private static readonly Lazy s_isJitStressRegs = new Lazy(() => !string.Equals(GetEnvironmentVariableValue("COMPlus_JitStressRegs"), "0", StringComparison.InvariantCulture)); - private static readonly Lazy s_isJitMinOpts = new Lazy(() => string.Equals(GetEnvironmentVariableValue("COMPlus_JITMinOpts"), "1", StringComparison.InvariantCulture)); - private static readonly Lazy s_isTailCallStress = new Lazy(() => string.Equals(GetEnvironmentVariableValue("COMPlus_TailcallStress"), "1", StringComparison.InvariantCulture)); - private static readonly Lazy s_isZapDisable = new Lazy(() => string.Equals(GetEnvironmentVariableValue("COMPlus_ZapDisable"), "1", StringComparison.InvariantCulture)); - private static readonly Lazy s_isGCStress3 = new Lazy(() => CompareGCStressModeAsLower(GetEnvironmentVariableValue("COMPlus_GCStress"), "0x3", "3")); - private static readonly Lazy s_isGCStressC = new Lazy(() => CompareGCStressModeAsLower(GetEnvironmentVariableValue("COMPlus_GCStress"), "0xC", "C")); + private static readonly Lazy s_isJitStress = new Lazy(() => !string.Equals(GetEnvironmentVariableValue("JitStress"), "0", StringComparison.InvariantCulture)); + private static readonly Lazy s_isJitStressRegs = new Lazy(() => !string.Equals(GetEnvironmentVariableValue("JitStressRegs"), "0", StringComparison.InvariantCulture)); + private static readonly Lazy s_isJitMinOpts = new Lazy(() => string.Equals(GetEnvironmentVariableValue("JITMinOpts"), "1", StringComparison.InvariantCulture)); + private static readonly Lazy s_isTailCallStress = new Lazy(() => string.Equals(GetEnvironmentVariableValue("TailcallStress"), "1", StringComparison.InvariantCulture)); + private static readonly Lazy s_isZapDisable = new Lazy(() => string.Equals(GetEnvironmentVariableValue("ZapDisable"), "1", StringComparison.InvariantCulture)); + private static readonly Lazy s_isGCStress3 = new Lazy(() => CompareGCStressModeAsLower(GetEnvironmentVariableValue("GCStress"), "0x3", "3")); + private static readonly Lazy s_isGCStressC = new Lazy(() => CompareGCStressModeAsLower(GetEnvironmentVariableValue("GCStress"), "0xC", "C")); private static readonly Lazy s_isCheckedRuntime = new Lazy(() => IsCheckedRuntime()); private static readonly Lazy s_isReleaseRuntime = new Lazy(() => IsReleaseRuntime()); private static readonly Lazy s_isDebugRuntime = new Lazy(() => IsDebugRuntime()); @@ -81,7 +81,8 @@ private static bool StressModeApplies(RuntimeTestModes stressMode) => s_isJitStress.Value || s_isJitMinOpts.Value; - private static string GetEnvironmentVariableValue(string name) => Environment.GetEnvironmentVariable(name) ?? "0"; + private static string GetEnvironmentVariableValue(string name) => + Environment.GetEnvironmentVariable("DOTNET_" + name) ?? Environment.GetEnvironmentVariable("COMPlus_" + name) ?? "0"; private static bool IsCheckedRuntime() => AssemblyConfigurationEquals("Checked"); diff --git a/src/Microsoft.DotNet.XUnitExtensions/src/RuntimeTestModes.cs b/src/Microsoft.DotNet.XUnitExtensions/src/RuntimeTestModes.cs index b8c32c93654..f64318dd4d2 100644 --- a/src/Microsoft.DotNet.XUnitExtensions/src/RuntimeTestModes.cs +++ b/src/Microsoft.DotNet.XUnitExtensions/src/RuntimeTestModes.cs @@ -17,22 +17,22 @@ public enum RuntimeTestModes // JitStress, JitStressRegs, JitMinOpts and TailcallStress enable // various modes in the JIT that cause us to exercise more code paths, // and generate different kinds of code - JitStress = 1 << 1, // COMPlus_JitStress is set. - JitStressRegs = 1 << 2, // COMPlus_JitStressRegs is set. - JitMinOpts = 1 << 3, // COMPlus_JITMinOpts is set. - TailcallStress = 1 << 4, // COMPlus_TailcallStress is set. + JitStress = 1 << 1, // DOTNET_JitStress (or COMPlus_JitStress) is set. + JitStressRegs = 1 << 2, // DOTNET_JitStressRegs (or COMPlus_JitStressRegs) is set. + JitMinOpts = 1 << 3, // DOTNET_JITMinOpts (or COMPlus_JITMinOpts) is set. + TailcallStress = 1 << 4, // DOTNET_TailcallStress (or COMPlus_TailcallStress) is set. // ZapDisable says to not use NGEN or ReadyToRun images. // This means we JIT everything. - ZapDisable = 1 << 5, // COMPlus_ZapDisable is set. + ZapDisable = 1 << 5, // DOTNET_ZapDisable (or COMPlus_ZapDisable) is set. // GCStress3 forces a GC at various locations, typically transitions // to/from the VM from managed code. - GCStress3 = 1 << 6, // COMPlus_GCStress includes mode 0x3. + GCStress3 = 1 << 6, // DOTNET_GCStress (or COMPlus_GCStress) includes mode 0x3. // GCStressC forces a GC at every JIT-generated code instruction, // including in NGEN/ReadyToRun code. - GCStressC = 1 << 7, // COMPlus_GCStress includes mode 0xC. + GCStressC = 1 << 7, // DOTNET_GCStress (or COMPlus_GCStress) includes mode 0xC. AnyGCStress = GCStress3 | GCStressC // Disable when any GCStress is exercised. } } From 69adafa90890bae07301d3eb3678580bc33ac419 Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Tue, 28 Sep 2021 14:32:05 +0000 Subject: [PATCH 411/699] Update dependencies from https://github.com/dotnet/sourcelink build 20210927.2 (#7974) [main] Update dependencies from dotnet/sourcelink --- eng/Version.Details.xml | 8 ++++---- eng/Versions.props | 6 +++--- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index 4483770c876..e0133e2eccb 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -51,14 +51,14 @@ https://github.com/dotnet/linker d51cc207fac85547787bbba83f54f69d8e72e9f5 - + https://github.com/dotnet/sourcelink - 76dead04f4f2774e23e70b093a4fd618fc01b7ff + 91411fc2c299817f7fdaccebae49cb516ea93bb6 - + https://github.com/dotnet/sourcelink - 76dead04f4f2774e23e70b093a4fd618fc01b7ff + 91411fc2c299817f7fdaccebae49cb516ea93bb6 https://github.com/dotnet/symreader-converter diff --git a/eng/Versions.props b/eng/Versions.props index 96993c2d6ae..e3902570a29 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -77,12 +77,12 @@ 2.0.4 1.1.0-beta2-19575-01 1.1.0-beta.20258.6 - 1.1.0-beta-21475-01 - 1.1.0-beta-21475-01 + 1.1.0-beta-21477-02 + 1.1.0-beta-21477-02 7.0.0-beta.21474.2 1.0.0-beta.21475.1 1.1.0-beta.21378.2 - 1.0.0-prerelease.21472.2 + 1.0.0-prerelease.21472.2 2.0.0-preview.1.21474.2 2.0.0-preview.1.21474.2 6.0.100-preview.5.21254.11 From 9a94c6be4c355a4acdec6bc6956fec95ef6da562 Mon Sep 17 00:00:00 2001 From: Maryam Ariyan Date: Tue, 28 Sep 2021 18:50:19 -0700 Subject: [PATCH 412/699] Updating xunit package version on dotnet/arcade (#7911) * Updating xunit package version on dotnet/arcade * temporarily continue using nuget older xrunner console version * Update src/Microsoft.DotNet.Helix/Sdk/tools/xunit-runner/XUnitRunner.targets * Update src/Microsoft.DotNet.Helix/Sdk/tools/xunit-runner/XUnitRunner.targets * Update src/Microsoft.DotNet.Helix/Sdk/tools/xunit-runner/XUnitRunner.targets Co-authored-by: Eric StJohn --- Documentation/AzureDevOps/SendingJobsToHelix.md | 4 ++-- eng/Versions.props | 3 +-- src/Microsoft.DotNet.Arcade.Sdk/tools/DefaultVersions.props | 2 +- src/Microsoft.DotNet.Helix/Sdk/Readme.md | 2 +- .../Sdk/tools/xunit-runner/XUnitRunner.targets | 4 ++-- 5 files changed, 7 insertions(+), 8 deletions(-) diff --git a/Documentation/AzureDevOps/SendingJobsToHelix.md b/Documentation/AzureDevOps/SendingJobsToHelix.md index a452bde15de..7bfe6f68ba2 100644 --- a/Documentation/AzureDevOps/SendingJobsToHelix.md +++ b/Documentation/AzureDevOps/SendingJobsToHelix.md @@ -83,7 +83,7 @@ The simplest Helix use-case is zipping up a single folder containing your projec Simply specify the xUnit project(s) you wish to run (semicolon delimited) with the `XUnitProjects` parameter. Then, specify: * the `XUnitPublishTargetFramework` – this is the framework your **test projects are targeting**, e.g. `netcoreapp3.1`. * the `XUnitRuntimeTargetFramework` – this is the framework version of xUnit you want to use from the xUnit NuGet package, e.g. `netcoreapp2.0`. Notably, the xUnit console runner only supports up to netcoreapp2.0 as of 14 March 2018, so this is the target that should be specified for running against any higher version test projects. -* the `XUnitRunnerVersion` (the version of the xUnit nuget package you want to use, e.g. `2.4.1`). +* the `XUnitRunnerVersion` (the version of the xUnit nuget package you want to use, e.g. `2.4.2-pre.9`). Finally, set `IncludeDotNetCli` to true and specify which `DotNetCliPackageType` (`sdk`, `runtime` or `aspnetcore-runtime`) and `DotNetCliVersion` you wish to use. (For a full list of .NET CLI versions/package types, see these links: [3.0](https://dotnet.microsoft.com/download/dotnet-core/3.0), [2.1](https://dotnet.microsoft.com/download/dotnet-core/2.1), [2.2](https://dotnet.microsoft.com/download/dotnet-core/2.2).) @@ -104,7 +104,7 @@ The list of available Helix queues can be found on the [Helix homepage](https:// # XUnitWorkItemTimeout: '00:05:00' -- a timeout (specified as a System.TimeSpan string) for all work items created from XUnitProjects XUnitPublishTargetFramework: netcoreapp3.1 # specify your publish target framework here XUnitRuntimeTargetFramework: netcoreapp2.0 # specify the framework you want to use for the xUnit runner - XUnitRunnerVersion: 2.4.1 # specify the version of xUnit runner you wish to use here + XUnitRunnerVersion: 2.4.2-pre.9 # specify the version of xUnit runner you wish to use here # WorkItemDirectory: '' -- payload directory to zip up and send to Helix; requires WorkItemCommand; incompatible with XUnitProjects # WorkItemCommand: '' -- a command to execute on the payload; requires WorkItemDirectory; incompatible with XUnitProjects # WorkItemTimeout: '' -- a timeout (specified as a System.TimeSpan string) for the work item command; requires WorkItemDirectory; incompatible with XUnitProjects diff --git a/eng/Versions.props b/eng/Versions.props index e3902570a29..7efc1328ac9 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -64,9 +64,8 @@ 4.5.2 4.4.0 8.5.0 - 2.4.1 + 2.4.2-pre.9 2.0.3 - 2.4.1 7.0.0-beta.21474.2 7.0.0-beta.21474.2 1.22.0 diff --git a/src/Microsoft.DotNet.Arcade.Sdk/tools/DefaultVersions.props b/src/Microsoft.DotNet.Arcade.Sdk/tools/DefaultVersions.props index e3426bf8703..e2936888774 100644 --- a/src/Microsoft.DotNet.Arcade.Sdk/tools/DefaultVersions.props +++ b/src/Microsoft.DotNet.Arcade.Sdk/tools/DefaultVersions.props @@ -89,7 +89,7 @@ $(ArcadeSdkVersion) $(ArcadeSdkVersion) 16.5.0 - 2.4.1 + 2.4.2-pre.9 $(XUnitVersion) 2.4.3 diff --git a/src/Microsoft.DotNet.Helix/Sdk/Readme.md b/src/Microsoft.DotNet.Helix/Sdk/Readme.md index 57a690c29e3..612fd72bd7d 100644 --- a/src/Microsoft.DotNet.Helix/Sdk/Readme.md +++ b/src/Microsoft.DotNet.Helix/Sdk/Readme.md @@ -228,7 +228,7 @@ Given a local folder `$(TestFolder)` containing `runtests.cmd`, this will run `r netcoreapp2.0 - 2.4.1 + 2.4.2-pre.9 diff --git a/src/Microsoft.DotNet.Helix/Sdk/tools/xunit-runner/XUnitRunner.targets b/src/Microsoft.DotNet.Helix/Sdk/tools/xunit-runner/XUnitRunner.targets index 4dc2c244878..c188051bc85 100644 --- a/src/Microsoft.DotNet.Helix/Sdk/tools/xunit-runner/XUnitRunner.targets +++ b/src/Microsoft.DotNet.Helix/Sdk/tools/xunit-runner/XUnitRunner.targets @@ -3,7 +3,7 @@ netcoreapp3.1 netcoreapp2.0 - 2.4.1 + 2.4.2-pre.9 <_XUnitPublishTargetsPath>$(MSBuildThisFileDirectory)XUnitPublish.targets @@ -12,7 +12,7 @@ - https://api.nuget.org/v3-flatcontainer/xunit.runner.console/$(XUnitRunnerVersion)/xunit.runner.console.$(XUnitRunnerVersion).nupkg + https://pkgs.dev.azure.com/dnceng/9ee6d478-d288-47f7-aacc-f6e6d082ae6d/_packaging/1a5f89f6-d8da-4080-b15f-242650c914a8/nuget/v3/flat2/xunit.runner.console/$(XUnitRunnerVersion)/xunit.runner.console.$(XUnitRunnerVersion).nupkg xunit-runner From c93266eb7c9b40a63f9eae2ce00c58b7cc49f721 Mon Sep 17 00:00:00 2001 From: Steve Pfister Date: Wed, 29 Sep 2021 09:25:26 -0400 Subject: [PATCH 413/699] Fix DiscovererHelper condition (#7978) Co-authored-by: Steve Pfister --- src/Microsoft.DotNet.XUnitExtensions/src/DiscovererHelpers.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Microsoft.DotNet.XUnitExtensions/src/DiscovererHelpers.cs b/src/Microsoft.DotNet.XUnitExtensions/src/DiscovererHelpers.cs index 78d7f258eb4..6adc2ba7f36 100644 --- a/src/Microsoft.DotNet.XUnitExtensions/src/DiscovererHelpers.cs +++ b/src/Microsoft.DotNet.XUnitExtensions/src/DiscovererHelpers.cs @@ -14,7 +14,7 @@ internal static class DiscovererHelpers { private static readonly Lazy s_isMonoRuntime = new Lazy(() => Type.GetType("Mono.RuntimeStructs") != null); public static bool IsMonoRuntime => s_isMonoRuntime.Value; - public static bool IsRunningOnNetCoreApp { get; } = (Environment.Version.Major >= 5 || RuntimeInformation.FrameworkDescription.StartsWith(".NET", StringComparison.OrdinalIgnoreCase)); + public static bool IsRunningOnNetCoreApp { get; } = (Environment.Version.Major >= 5 || !RuntimeInformation.FrameworkDescription.StartsWith(".NET Framework", StringComparison.OrdinalIgnoreCase)); public static bool IsRunningOnNetFramework { get; } = RuntimeInformation.FrameworkDescription.StartsWith(".NET Framework", StringComparison.OrdinalIgnoreCase); public static bool TestPlatformApplies(TestPlatforms platforms) => From b4c2a057a5544884dfcdc52cb3e93f8e930053cd Mon Sep 17 00:00:00 2001 From: Alitzel Mendez <6895254+AlitzelMendez@users.noreply.github.com> Date: Wed, 29 Sep 2021 09:26:29 -0700 Subject: [PATCH 414/699] Test Retry documentation fix images (#7975) * update size of image * udpate files names * change image size * change image size * update image * update image --- .../Build Analysis/Resources/ArtifactsTab.png | Bin 383873 -> 377898 bytes .../Test Retry Documentation.md | 7 +++---- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/Documentation/Projects/Build Analysis/Resources/ArtifactsTab.png b/Documentation/Projects/Build Analysis/Resources/ArtifactsTab.png index f063f9dafd715257ef9eb35ec78aa78c70849b06..73775415df9dba8763e852be9fe8bbff0d90e473 100644 GIT binary patch literal 377898 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%0DF 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 `GR&geEc8IhFdoShVOr=?Cb5dHGdS4n6Qmd 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%0Ak{AsUXQ~3@LjA)9jaxaT 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 literal 383873 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�s!=J}xB%%DSQ#O(^? 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
      ?Pi2U-nT7tSI@v<0DXK4t)_QeH0gcH%XTQ!Ad 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
    1. cv0S*PkvYkPfHucd{Sm+-Rl;pA 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 Date: Wed, 29 Sep 2021 09:51:43 -0700 Subject: [PATCH 415/699] Add passthrough properties for specifying additional arguments to wix tools (#7941) --- .../build/wix/wix.targets | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/Microsoft.DotNet.Build.Tasks.Installers/build/wix/wix.targets b/src/Microsoft.DotNet.Build.Tasks.Installers/build/wix/wix.targets index 2156679165f..277e984fb37 100644 --- a/src/Microsoft.DotNet.Build.Tasks.Installers/build/wix/wix.targets +++ b/src/Microsoft.DotNet.Build.Tasks.Installers/build/wix/wix.targets @@ -244,7 +244,8 @@ -cg %(ComponentGroupName) ^ -srd ^ -dr %(DirectoryRef) ^ - -out %(WixSourceFile)" /> + -out %(WixSourceFile) + $(AdditionalHeatArgs)" /> @@ -305,6 +306,7 @@ <_wixArgs>$(_wixArgs) @(CandleVariables -> '-d%(Identity)="%(Value)"', ' ') <_wixArgs>$(_wixArgs) @(WixSrcFile -> '"%(FullPath)"', ' ') <_wixArgs>$(_wixArgs) @(DirectoryToHarvest -> '"%(WixSourceFile)"', ' ') + <_wixArgs>$(_wixArgs) $(AdditionalCandleArgs) $(_wixArgs) @(WixExtensions -> '-ext %(Identity)', ' ') <_wixArgs>$(_wixArgs) @(WixSrcFile -> '"$(WixObjDir)%(Filename).wixobj"', ' ') <_wixArgs>$(_wixArgs) @(DirectoryToHarvest -> '"%(WixObjFile)"', ' ') + <_wixArgs>$(_wixArgs) $(AdditionalLightArgs) <_lightCommand>light.exe $(_wixArgs) From e9aab1f22123a575af51aa90ac063333a42d6cb0 Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Thu, 30 Sep 2021 16:00:06 +0000 Subject: [PATCH 416/699] Update dependencies from https://github.com/dotnet/xharness build 20210929.1 (#7981) [main] Update dependencies from dotnet/xharness --- eng/Version.Details.xml | 4 ++-- eng/Versions.props | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index e0133e2eccb..df3d7e133d0 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -39,9 +39,9 @@ https://github.com/dotnet/arcade-services cac955fe259cb611f6a29d09209bd717deb69037 - + https://github.com/dotnet/xharness - bd48cb5e8e59710bb8a22e0e875cefde8b6f832f + abe89314abdb1ce88499d01a50ddcd7d0ff53596 https://github.com/dotnet/roslyn diff --git a/eng/Versions.props b/eng/Versions.props index 7efc1328ac9..05a279fa830 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -81,7 +81,7 @@ 7.0.0-beta.21474.2 1.0.0-beta.21475.1 1.1.0-beta.21378.2 - 1.0.0-prerelease.21472.2 + 1.0.0-prerelease.21479.1 2.0.0-preview.1.21474.2 2.0.0-preview.1.21474.2 6.0.100-preview.5.21254.11 From 27d286184f0ab35a2a252929a04fbb2fe3c57dde Mon Sep 17 00:00:00 2001 From: Chad Nedzlek Date: Thu, 30 Sep 2021 16:21:26 -0700 Subject: [PATCH 417/699] Deprecate xunit reporter (#7931) This code is already dead inside Helix... we no longer read the events this reporter is sending, so it's just spending a bunch of time to send dead events. I'm removing the code and having it send an obsolete warning. --- eng/common/templates/steps/send-to-helix.yml | 3 - src/Microsoft.DotNet.Helix/Sdk/Readme.md | 1 - ...crosoft.DotNet.Helix.Sdk.MonoQueue.targets | 18 +-- .../Sdk/tools/xharness-runner/Readme.md | 1 - .../tools/xunit-reporter/xunit-reporter.py | 122 +----------------- tests/XHarness.Tests.Common.props | 2 - 6 files changed, 5 insertions(+), 142 deletions(-) diff --git a/eng/common/templates/steps/send-to-helix.yml b/eng/common/templates/steps/send-to-helix.yml index cd02ae1607f..09a223989f7 100644 --- a/eng/common/templates/steps/send-to-helix.yml +++ b/eng/common/templates/steps/send-to-helix.yml @@ -20,7 +20,6 @@ parameters: IncludeDotNetCli: false # optional -- true will download a version of the .NET CLI onto the Helix machine as a correlation payload; requires DotNetCliPackageType and DotNetCliVersion DotNetCliPackageType: '' # optional -- either 'sdk', 'runtime' or 'aspnetcore-runtime'; determines whether the sdk or runtime will be sent to Helix; see https://raw.githubusercontent.com/dotnet/core/main/release-notes/releases-index.json DotNetCliVersion: '' # optional -- version of the CLI to send to Helix; based on this: https://raw.githubusercontent.com/dotnet/core/main/release-notes/releases-index.json - EnableXUnitReporter: false # optional -- true enables XUnit result reporting to Mission Control WaitForWorkItemCompletion: true # optional -- true will make the task wait until work items have been completed and fail the build if work items fail. False is "fire and forget." IsExternal: false # [DEPRECATED] -- doesn't do anything, jobs are external if HelixAccessToken is empty and Creator is set HelixBaseUri: 'https://helix.dot.net/' # optional -- sets the Helix API base URI (allows targeting int) @@ -54,7 +53,6 @@ steps: IncludeDotNetCli: ${{ parameters.IncludeDotNetCli }} DotNetCliPackageType: ${{ parameters.DotNetCliPackageType }} DotNetCliVersion: ${{ parameters.DotNetCliVersion }} - EnableXUnitReporter: ${{ parameters.EnableXUnitReporter }} WaitForWorkItemCompletion: ${{ parameters.WaitForWorkItemCompletion }} HelixBaseUri: ${{ parameters.HelixBaseUri }} Creator: ${{ parameters.Creator }} @@ -85,7 +83,6 @@ steps: IncludeDotNetCli: ${{ parameters.IncludeDotNetCli }} DotNetCliPackageType: ${{ parameters.DotNetCliPackageType }} DotNetCliVersion: ${{ parameters.DotNetCliVersion }} - EnableXUnitReporter: ${{ parameters.EnableXUnitReporter }} WaitForWorkItemCompletion: ${{ parameters.WaitForWorkItemCompletion }} HelixBaseUri: ${{ parameters.HelixBaseUri }} Creator: ${{ parameters.Creator }} diff --git a/src/Microsoft.DotNet.Helix/Sdk/Readme.md b/src/Microsoft.DotNet.Helix/Sdk/Readme.md index 612fd72bd7d..8b4a7d3a406 100644 --- a/src/Microsoft.DotNet.Helix/Sdk/Readme.md +++ b/src/Microsoft.DotNet.Helix/Sdk/Readme.md @@ -180,7 +180,6 @@ Given a local folder `$(TestFolder)` containing `runtests.cmd`, this will run `r test-results.xml test_results.xml --> - false false diff --git a/src/Microsoft.DotNet.Helix/Sdk/tools/Microsoft.DotNet.Helix.Sdk.MonoQueue.targets b/src/Microsoft.DotNet.Helix/Sdk/tools/Microsoft.DotNet.Helix.Sdk.MonoQueue.targets index 7f8604a40fa..b3f79a5c026 100644 --- a/src/Microsoft.DotNet.Helix/Sdk/tools/Microsoft.DotNet.Helix.Sdk.MonoQueue.targets +++ b/src/Microsoft.DotNet.Helix/Sdk/tools/Microsoft.DotNet.Helix.Sdk.MonoQueue.targets @@ -1,9 +1,5 @@ - - - false - - + $(RepositoryEngineeringDir)/test-configuration.json @@ -23,18 +19,6 @@ - - - - - - $(HelixPostCommands);$HELIX_PYTHONPATH -B $HELIX_CORRELATION_PAYLOAD/xunit-reporter.py - $(HelixPostCommands);%HELIX_PYTHONPATH% -B %HELIX_CORRELATION_PAYLOAD%\xunit-reporter.py - - 0 - - - diff --git a/src/Microsoft.DotNet.Helix/Sdk/tools/xharness-runner/Readme.md b/src/Microsoft.DotNet.Helix/Sdk/tools/xharness-runner/Readme.md index bebc13f69fa..89791ffa8bd 100644 --- a/src/Microsoft.DotNet.Helix/Sdk/tools/xharness-runner/Readme.md +++ b/src/Microsoft.DotNet.Helix/Sdk/tools/xharness-runner/Readme.md @@ -41,7 +41,6 @@ There are some required configuration properties that need to be set for XHarnes test/product/ https://helix.int-dot.net $(BUILD_SOURCEVERSIONAUTHOR) - true true diff --git a/src/Microsoft.DotNet.Helix/Sdk/tools/xunit-reporter/xunit-reporter.py b/src/Microsoft.DotNet.Helix/Sdk/tools/xunit-reporter/xunit-reporter.py index 3cc16f6d0b9..750909a815a 100644 --- a/src/Microsoft.DotNet.Helix/Sdk/tools/xunit-reporter/xunit-reporter.py +++ b/src/Microsoft.DotNet.Helix/Sdk/tools/xunit-reporter/xunit-reporter.py @@ -1,124 +1,10 @@ #!/usr/bin/env python -import re -import os -import urllib -import helix.azure_storage import helix.event import helix.settings -import helix.logs - -log = helix.logs.get_logger() - -acceptableXUnitFileNames = [ - "testResults.xml", - "test-results.xml", - "test_results.xml", - "TestResults.xUnit.xml" -] - -class HelixHelper: - def __init__(self, settings): - self.settings = settings - self.event_client = helix.event.create_from_uri(settings.event_uri) - self.upload_client = helix.azure_storage.get_upload_client(settings) - - def error(self, error_type, message, log_uri=None): - self.event_client.error(self.settings, error_type, message, log_uri) - - def xunit_event(self, results_uri, test_count, file_name): - self.event_client.send( - { - 'Type': 'XUnitTestResult', - 'WorkItemId': self.settings.workitem_id, - 'WorkItemFriendlyName': self.settings.workitem_friendly_name, - 'CorrelationId': self.settings.correlation_id, - 'ResultsXmlUri': results_uri, - 'TestCount': test_count, - } - ) - - def file_event(self, results_uri, file_name): - self.event_client.send( - { - 'Type': 'File', - 'Uri': results_uri, - 'FileName': file_name, - 'WorkItemId': self.settings.workitem_id, - 'WorkItemFriendlyName': self.settings.workitem_friendly_name, - 'CorrelationId': self.settings.correlation_id, - } - ) - - def upload_file_to_storage(self, file_path): - """ Copy file specified to azure storage account using Helix infrastructure - :param file_path: Path to file to be copied to Azure storage - :type file_path:string - """ - try: - return self.upload_client.upload(file_path, os.path.basename(file_path)) - except ValueError: - self.error("FailedUpload", "Failed to upload "+file_path+"after retry") - -def findXUnitResults(search_dir): - for root, dirs, files in os.walk(search_dir): - for file_name in files: - if file_name in acceptableXUnitFileNames: - return os.path.join(root, file_name) - return None - -def main(): - settings = helix.settings.settings_from_env() - - if settings.output_uri is None or settings.event_uri is None: - log.error("Unable to report xunit results: output_uri and/or event_uri are not set.") - return 1 - - helper = HelixHelper(settings) - working_dir = settings.workitem_working_dir - upload_dir = settings.workitem_upload_dir - need_to_upload_results = True - - results_path = findXUnitResults(working_dir) - - if results_path is None: - log.info("Didn't find test results in working directory, trying upload folder") - results_path = findXUnitResults(upload_dir) - need_to_upload_results = False - - if results_path is None: - log.error("Unable to report xunit results: no test results xml file found.") - return 2 - - log.info("Uploading results from {}".format(results_path)) - - with open(results_path, encoding="utf-8") as result_file: - test_count = 0 - total_regex = re.compile(r'total="(\d+)"') - for line in result_file: - if 'test/product/ $(AGENT_JOBNAME) true - true true https://helix.dot.net true @@ -23,7 +22,6 @@ - false false From b3364cfbf6e5f6551a4e5ad79640b1194b7ba8db Mon Sep 17 00:00:00 2001 From: Adeel Mujahid <3840695+am11@users.noreply.github.com> Date: Fri, 1 Oct 2021 18:44:07 +0300 Subject: [PATCH 418/699] Pass directory path from call-site (#7984) --- eng/common/native/init-compiler.sh | 18 ++++++++++-------- .../build/Microsoft.DotNet.CMake.Sdk.targets | 3 ++- 2 files changed, 12 insertions(+), 9 deletions(-) diff --git a/eng/common/native/init-compiler.sh b/eng/common/native/init-compiler.sh index 1daadf32a52..28f5145a6f7 100755 --- a/eng/common/native/init-compiler.sh +++ b/eng/common/native/init-compiler.sh @@ -3,9 +3,10 @@ # This file detects the C/C++ compiler and exports it to the CC/CXX environment variables # -if [[ "$#" -lt 2 ]]; then +if [[ "$#" -lt 3 ]]; then echo "Usage..." - echo "init-compiler.sh " + echo "init-compiler.sh