-
Notifications
You must be signed in to change notification settings - Fork 352
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Publish artifacts and symbols one file at a time #7086
Changes from all commits
2ca72c8
8197834
9d3a66e
271e5c2
23fd68d
086bc12
583c310
b82c1c0
ff093e1
91f474a
68e8ea8
7c1325a
30e72f6
037401b
6d73f0b
ff239e8
42edf24
696ae33
3cc26df
d2d4146
cf46b2d
8b0a82b
16826fb
2a3eda7
0cada85
99cbcaf
5db58cc
53f99f8
32cc9b0
05ba152
90bafde
41244b9
d9f0469
1da7ed1
21fc09f
86215a9
8de357d
8a5d431
07f63c4
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
@@ -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,26 +122,24 @@ public async Task<bool> PushItemsToFeedAsync( | |||||||||||||||||||||||||||||||||||||||||||||||
return !Log.HasLoggedErrors; | ||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||
public async Task PublishToFlatContainerAsync(IEnumerable<ITaskItem> taskItems, int maxClients, PushOptions pushOptions) | ||||||||||||||||||||||||||||||||||||||||||||||||
public async Task PublishToFlatContainerAsync(IEnumerable<ITaskItem> 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); } | ||||||||||||||||||||||||||||||||||||||||||||||||
)); | ||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||
public async Task UploadAssetAsync( | ||||||||||||||||||||||||||||||||||||||||||||||||
epananth marked this conversation as resolved.
Show resolved
Hide resolved
|
||||||||||||||||||||||||||||||||||||||||||||||||
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}"; | ||||||||||||||||||||||||||||||||||||||||||||||||
michellemcdaniel marked this conversation as resolved.
Show resolved
Hide resolved
|
||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||
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<bool> PushAsync(IEnumerable<string> items, PushOptions options) | ||||||||||||||||||||||||||||||||||||||||||||||||
public async Task<bool> PushAsync(IEnumerable<string> items, PushOptions options) | ||||||||||||||||||||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. It looks like this method is basically wrapped by https://github.com/dotnet/arcade/blob/main/src/Microsoft.DotNet.Build.Tasks.Feed/src/BlobFeedAction.cs#L103, Is there a reason to make this public instead of using that? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I am calling PushAsync in PublishArtifactsInManifestBase, before it was called only in BlobFeedAction There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Yes, what I'm saying is that there's another method (the one I link in my comment) that is already public and calls into this private method that you're making public. My question is whether that is intentional, or just that you didn't see the other one. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Yes other method which calls PushAsync which is PushToFeedAsync, does a sanity check to see if there are any duplicated in the ItemsList. Since I'm only pushing one item at a time. That part is not required. So I called PushAsync directly There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. So, looking at arcade/src/Microsoft.DotNet.Build.Tasks.Feed/src/BlobFeedAction.cs Lines 103 to 125 in 4535393
Alternatively, you could add parameter validation and error handling, but then you'd end up with pretty much the same method as the one I'm saying to use. |
||||||||||||||||||||||||||||||||||||||||||||||||
{ | ||||||||||||||||||||||||||||||||||||||||||||||||
LocalSettings settings = GetSettings(); | ||||||||||||||||||||||||||||||||||||||||||||||||
SleetLogger log = new SleetLogger(Log, NuGet.Common.LogLevel.Verbose); | ||||||||||||||||||||||||||||||||||||||||||||||||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
is the extra slash at the end necessary?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actually I copied the paths we already had in the yaml. But I checked without the / or with the / it will work.