Merge pull request #8354 from johnbeisner/CoalesceDebInstaller
Remove method to publish to Debian feeds.
This commit is contained in:
commit
ed2ca5d49a
20 changed files with 0 additions and 673 deletions
|
@ -222,8 +222,6 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "tool_fsc", "src\tool_fsharp
|
||||||
EndProject
|
EndProject
|
||||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.DotNet.MSBuildSdkResolver", "src\Microsoft.DotNet.MSBuildSdkResolver\Microsoft.DotNet.MSBuildSdkResolver.csproj", "{FCDFAF40-CC16-4D49-96C0-E49F195E7142}"
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.DotNet.MSBuildSdkResolver", "src\Microsoft.DotNet.MSBuildSdkResolver\Microsoft.DotNet.MSBuildSdkResolver.csproj", "{FCDFAF40-CC16-4D49-96C0-E49F195E7142}"
|
||||||
EndProject
|
EndProject
|
||||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "dotnet-cli-build.Tests", "build_projects\dotnet-cli-build.Tests\dotnet-cli-build.Tests.csproj", "{84BB2DD5-B2D8-4C85-AAF9-29D2A74FBF94}"
|
|
||||||
EndProject
|
|
||||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "dotnet-restore.Tests", "test\dotnet-restore.Tests\dotnet-restore.Tests.csproj", "{B4EE3671-C103-4A37-8DEB-C74E0134104E}"
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "dotnet-restore.Tests", "test\dotnet-restore.Tests\dotnet-restore.Tests.csproj", "{B4EE3671-C103-4A37-8DEB-C74E0134104E}"
|
||||||
EndProject
|
EndProject
|
||||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.DotNet.TestFramework", "test\Microsoft.DotNet.TestFramework\Microsoft.DotNet.TestFramework.csproj", "{44759218-B558-4AF0-8991-515F1100DCF5}"
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.DotNet.TestFramework", "test\Microsoft.DotNet.TestFramework\Microsoft.DotNet.TestFramework.csproj", "{44759218-B558-4AF0-8991-515F1100DCF5}"
|
||||||
|
@ -1522,30 +1520,6 @@ Global
|
||||||
{FCDFAF40-CC16-4D49-96C0-E49F195E7142}.RelWithDebInfo|x64.Build.0 = Release|Any CPU
|
{FCDFAF40-CC16-4D49-96C0-E49F195E7142}.RelWithDebInfo|x64.Build.0 = Release|Any CPU
|
||||||
{FCDFAF40-CC16-4D49-96C0-E49F195E7142}.RelWithDebInfo|x86.ActiveCfg = Release|Any CPU
|
{FCDFAF40-CC16-4D49-96C0-E49F195E7142}.RelWithDebInfo|x86.ActiveCfg = Release|Any CPU
|
||||||
{FCDFAF40-CC16-4D49-96C0-E49F195E7142}.RelWithDebInfo|x86.Build.0 = Release|Any CPU
|
{FCDFAF40-CC16-4D49-96C0-E49F195E7142}.RelWithDebInfo|x86.Build.0 = Release|Any CPU
|
||||||
{84BB2DD5-B2D8-4C85-AAF9-29D2A74FBF94}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
|
||||||
{84BB2DD5-B2D8-4C85-AAF9-29D2A74FBF94}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
|
||||||
{84BB2DD5-B2D8-4C85-AAF9-29D2A74FBF94}.Debug|x64.ActiveCfg = Debug|Any CPU
|
|
||||||
{84BB2DD5-B2D8-4C85-AAF9-29D2A74FBF94}.Debug|x64.Build.0 = Debug|Any CPU
|
|
||||||
{84BB2DD5-B2D8-4C85-AAF9-29D2A74FBF94}.Debug|x86.ActiveCfg = Debug|Any CPU
|
|
||||||
{84BB2DD5-B2D8-4C85-AAF9-29D2A74FBF94}.Debug|x86.Build.0 = Debug|Any CPU
|
|
||||||
{84BB2DD5-B2D8-4C85-AAF9-29D2A74FBF94}.MinSizeRel|Any CPU.ActiveCfg = Debug|Any CPU
|
|
||||||
{84BB2DD5-B2D8-4C85-AAF9-29D2A74FBF94}.MinSizeRel|Any CPU.Build.0 = Debug|Any CPU
|
|
||||||
{84BB2DD5-B2D8-4C85-AAF9-29D2A74FBF94}.MinSizeRel|x64.ActiveCfg = Debug|Any CPU
|
|
||||||
{84BB2DD5-B2D8-4C85-AAF9-29D2A74FBF94}.MinSizeRel|x64.Build.0 = Debug|Any CPU
|
|
||||||
{84BB2DD5-B2D8-4C85-AAF9-29D2A74FBF94}.MinSizeRel|x86.ActiveCfg = Debug|Any CPU
|
|
||||||
{84BB2DD5-B2D8-4C85-AAF9-29D2A74FBF94}.MinSizeRel|x86.Build.0 = Debug|Any CPU
|
|
||||||
{84BB2DD5-B2D8-4C85-AAF9-29D2A74FBF94}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
|
||||||
{84BB2DD5-B2D8-4C85-AAF9-29D2A74FBF94}.Release|Any CPU.Build.0 = Release|Any CPU
|
|
||||||
{84BB2DD5-B2D8-4C85-AAF9-29D2A74FBF94}.Release|x64.ActiveCfg = Release|Any CPU
|
|
||||||
{84BB2DD5-B2D8-4C85-AAF9-29D2A74FBF94}.Release|x64.Build.0 = Release|Any CPU
|
|
||||||
{84BB2DD5-B2D8-4C85-AAF9-29D2A74FBF94}.Release|x86.ActiveCfg = Release|Any CPU
|
|
||||||
{84BB2DD5-B2D8-4C85-AAF9-29D2A74FBF94}.Release|x86.Build.0 = Release|Any CPU
|
|
||||||
{84BB2DD5-B2D8-4C85-AAF9-29D2A74FBF94}.RelWithDebInfo|Any CPU.ActiveCfg = Release|Any CPU
|
|
||||||
{84BB2DD5-B2D8-4C85-AAF9-29D2A74FBF94}.RelWithDebInfo|Any CPU.Build.0 = Release|Any CPU
|
|
||||||
{84BB2DD5-B2D8-4C85-AAF9-29D2A74FBF94}.RelWithDebInfo|x64.ActiveCfg = Release|Any CPU
|
|
||||||
{84BB2DD5-B2D8-4C85-AAF9-29D2A74FBF94}.RelWithDebInfo|x64.Build.0 = Release|Any CPU
|
|
||||||
{84BB2DD5-B2D8-4C85-AAF9-29D2A74FBF94}.RelWithDebInfo|x86.ActiveCfg = Release|Any CPU
|
|
||||||
{84BB2DD5-B2D8-4C85-AAF9-29D2A74FBF94}.RelWithDebInfo|x86.Build.0 = Release|Any CPU
|
|
||||||
{B4EE3671-C103-4A37-8DEB-C74E0134104E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
{B4EE3671-C103-4A37-8DEB-C74E0134104E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
{B4EE3671-C103-4A37-8DEB-C74E0134104E}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
{B4EE3671-C103-4A37-8DEB-C74E0134104E}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
{B4EE3671-C103-4A37-8DEB-C74E0134104E}.Debug|x64.ActiveCfg = Debug|Any CPU
|
{B4EE3671-C103-4A37-8DEB-C74E0134104E}.Debug|x64.ActiveCfg = Debug|Any CPU
|
||||||
|
@ -1734,7 +1708,6 @@ Global
|
||||||
{08A40B6A-F695-4EA9-AC8D-CF88FADEA796} = {17735A9D-BFD9-4585-A7CB-3208CA6EA8A7}
|
{08A40B6A-F695-4EA9-AC8D-CF88FADEA796} = {17735A9D-BFD9-4585-A7CB-3208CA6EA8A7}
|
||||||
{602976C5-2477-4B4C-AD9A-1EAFB250529A} = {ED2FE3E2-F7E7-4389-8231-B65123F2076F}
|
{602976C5-2477-4B4C-AD9A-1EAFB250529A} = {ED2FE3E2-F7E7-4389-8231-B65123F2076F}
|
||||||
{FCDFAF40-CC16-4D49-96C0-E49F195E7142} = {ED2FE3E2-F7E7-4389-8231-B65123F2076F}
|
{FCDFAF40-CC16-4D49-96C0-E49F195E7142} = {ED2FE3E2-F7E7-4389-8231-B65123F2076F}
|
||||||
{84BB2DD5-B2D8-4C85-AAF9-29D2A74FBF94} = {88278B81-7649-45DC-8A6A-D3A645C5AFC3}
|
|
||||||
{B4EE3671-C103-4A37-8DEB-C74E0134104E} = {17735A9D-BFD9-4585-A7CB-3208CA6EA8A7}
|
{B4EE3671-C103-4A37-8DEB-C74E0134104E} = {17735A9D-BFD9-4585-A7CB-3208CA6EA8A7}
|
||||||
{44759218-B558-4AF0-8991-515F1100DCF5} = {17735A9D-BFD9-4585-A7CB-3208CA6EA8A7}
|
{44759218-B558-4AF0-8991-515F1100DCF5} = {17735A9D-BFD9-4585-A7CB-3208CA6EA8A7}
|
||||||
{E7C72EF2-8480-48B4-AAE8-A596F1A6048E} = {17735A9D-BFD9-4585-A7CB-3208CA6EA8A7}
|
{E7C72EF2-8480-48B4-AAE8-A596F1A6048E} = {17735A9D-BFD9-4585-A7CB-3208CA6EA8A7}
|
||||||
|
|
|
@ -3,13 +3,11 @@
|
||||||
<LinuxDistrosNeedNativeInstaller Include="debian.8-x64">
|
<LinuxDistrosNeedNativeInstaller Include="debian.8-x64">
|
||||||
<DockerFolder>debian</DockerFolder>
|
<DockerFolder>debian</DockerFolder>
|
||||||
<InstallerExtension>deb</InstallerExtension>
|
<InstallerExtension>deb</InstallerExtension>
|
||||||
<RepositoryId>$(debian8x64RepositoryId)</RepositoryId>
|
|
||||||
<DistroNameInInstaller>x64</DistroNameInInstaller>
|
<DistroNameInInstaller>x64</DistroNameInInstaller>
|
||||||
</LinuxDistrosNeedNativeInstaller>
|
</LinuxDistrosNeedNativeInstaller>
|
||||||
<LinuxDistrosNeedNativeInstaller Include="rhel.7-x64">
|
<LinuxDistrosNeedNativeInstaller Include="rhel.7-x64">
|
||||||
<DockerFolder>rhel</DockerFolder>
|
<DockerFolder>rhel</DockerFolder>
|
||||||
<InstallerExtension>rpm</InstallerExtension>
|
<InstallerExtension>rpm</InstallerExtension>
|
||||||
<RepositoryId>$(rhel7x64RepositoryId)</RepositoryId>
|
|
||||||
<DistroNameInInstaller>rhel-x64</DistroNameInInstaller>
|
<DistroNameInInstaller>rhel-x64</DistroNameInInstaller>
|
||||||
</LinuxDistrosNeedNativeInstaller>
|
</LinuxDistrosNeedNativeInstaller>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
|
@ -33,7 +33,6 @@
|
||||||
<UsingTask TaskName="TarGzFileExtractToDirectory" AssemblyFile="$(CLIBuildDll)" />
|
<UsingTask TaskName="TarGzFileExtractToDirectory" AssemblyFile="$(CLIBuildDll)" />
|
||||||
<UsingTask TaskName="UpdateVersionsRepo" AssemblyFile="$(CLIBuildDll)"/>
|
<UsingTask TaskName="UpdateVersionsRepo" AssemblyFile="$(CLIBuildDll)"/>
|
||||||
<UsingTask TaskName="UploadToAzure" AssemblyFile="$(CLIBuildDll)"/>
|
<UsingTask TaskName="UploadToAzure" AssemblyFile="$(CLIBuildDll)"/>
|
||||||
<UsingTask TaskName="UploadToLinuxPackageRepository" AssemblyFile="$(CLIBuildDll)"/>
|
|
||||||
<UsingTask TaskName="ZipFileCreateFromDirectory" AssemblyFile="$(CLIBuildDll)"/>
|
<UsingTask TaskName="ZipFileCreateFromDirectory" AssemblyFile="$(CLIBuildDll)"/>
|
||||||
<UsingTask TaskName="ZipFileExtractToDirectory" AssemblyFile="$(CLIBuildDll)"/>
|
<UsingTask TaskName="ZipFileExtractToDirectory" AssemblyFile="$(CLIBuildDll)"/>
|
||||||
</Project>
|
</Project>
|
||||||
|
|
|
@ -2,7 +2,6 @@
|
||||||
<Project ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
<Project ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||||
<Import Project="$(MSBuildThisFileDirectory)/publish/FinishBuild.targets" />
|
<Import Project="$(MSBuildThisFileDirectory)/publish/FinishBuild.targets" />
|
||||||
<Import Project="$(MSBuildThisFileDirectory)/publish/PublishContent.targets" />
|
<Import Project="$(MSBuildThisFileDirectory)/publish/PublishContent.targets" />
|
||||||
<Import Project="$(MSBuildThisFileDirectory)/publish/PublishDebian.targets" />
|
|
||||||
<Import Project="$(MSBuildThisFileDirectory)/publish/PublishNupkgToBlobFeed.targets" />
|
<Import Project="$(MSBuildThisFileDirectory)/publish/PublishNupkgToBlobFeed.targets" />
|
||||||
<Import Project="$(MSBuildThisFileDirectory)/publish/Badge.targets" />
|
<Import Project="$(MSBuildThisFileDirectory)/publish/Badge.targets" />
|
||||||
<Import Project="$(MSBuildThisFileDirectory)/publish/Checksum.targets" />
|
<Import Project="$(MSBuildThisFileDirectory)/publish/Checksum.targets" />
|
||||||
|
@ -35,7 +34,6 @@
|
||||||
UploadArtifactsToAzure;
|
UploadArtifactsToAzure;
|
||||||
UploadChecksumsToAzure;
|
UploadChecksumsToAzure;
|
||||||
PublishNupkgToBlobFeed;
|
PublishNupkgToBlobFeed;
|
||||||
PublishDebFilesToDebianRepo;
|
|
||||||
PublishCliVersionBadge" />
|
PublishCliVersionBadge" />
|
||||||
|
|
||||||
<Target Name="GatherItemsForPattern">
|
<Target Name="GatherItemsForPattern">
|
||||||
|
|
|
@ -1,23 +0,0 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<Project ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
|
||||||
<PropertyGroup>
|
|
||||||
<SdkDebianPackageName>dotnet-sdk-$(SdkVersion)</SdkDebianPackageName>
|
|
||||||
</PropertyGroup>
|
|
||||||
|
|
||||||
<Target Name="PublishDebFilesToDebianRepo"
|
|
||||||
DependsOnTargets="SetupDebProps;"
|
|
||||||
Condition=" '$(IsBuildingAndPublishingAllLinuxDistrosNativeInstallers)' == 'true' AND '$(SkipPublishToDebianRepo)' != 'true' AND '$(IslinuxPortable)' != 'true' " >
|
|
||||||
<Error Condition="'$(REPO_USER)' == ''" Text="REPO_USER must be set as a MsBuild Property variable for debian publishing." />
|
|
||||||
<Error Condition="'$(REPO_PASS)' == ''" Text="REPO_PASS must be set as a MsBuild Property variable for debian publishing." />
|
|
||||||
<Error Condition="'$(REPO_SERVER)' == ''" Text="REPO_SERVER must be set as a MsBuild Property variable for debian publishing." />
|
|
||||||
|
|
||||||
<UploadToLinuxPackageRepository Condition=" '%(LinuxDistrosNeedNativeInstaller.RepositoryId)' != '' "
|
|
||||||
Username="$(REPO_USER)"
|
|
||||||
Password='$(REPO_PASS)'
|
|
||||||
Server='$(REPO_SERVER)'
|
|
||||||
RepositoryId='%(LinuxDistrosNeedNativeInstaller.RepositoryId)'
|
|
||||||
PathOfPackageToUpload='$(InstallerOutputDirectory)/$(DistroSpecificArtifactNameWithVersionCombinedHostHostFxrFrameworkSdkWithoutHostMonikerRid)%(LinuxDistrosNeedNativeInstaller.DistroNameInInstaller).%(LinuxDistrosNeedNativeInstaller.InstallerExtension)'
|
|
||||||
PackageNameInLinuxPackageRepository='$(SdkDebianPackageName)'
|
|
||||||
PackageVersionInLinuxPackageRepository='$(NugetVersion)' />
|
|
||||||
</Target>
|
|
||||||
</Project>
|
|
|
@ -1,92 +0,0 @@
|
||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
using FluentAssertions;
|
|
||||||
using Microsoft.DotNet.Cli.Build.UploadToLinuxPackageRepository;
|
|
||||||
using Xunit;
|
|
||||||
|
|
||||||
namespace dotnet_cli_build.Tests
|
|
||||||
{
|
|
||||||
public class GivenActionAndRetryTimes
|
|
||||||
{
|
|
||||||
public static IEnumerable<Task> NoWaitTimer()
|
|
||||||
{
|
|
||||||
while (true)
|
|
||||||
{
|
|
||||||
yield return Task.CompletedTask;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
[Fact]
|
|
||||||
public void ExponentialRetryShouldProvideIntervalSequence()
|
|
||||||
{
|
|
||||||
ExponentialRetry.Intervals.First().Should().Be(TimeSpan.FromSeconds(5));
|
|
||||||
ExponentialRetry.Intervals.Skip(1).First().Should().Be(TimeSpan.FromSeconds(10));
|
|
||||||
ExponentialRetry.Intervals.Skip(2).First().Should().Be(TimeSpan.FromSeconds(20));
|
|
||||||
ExponentialRetry.Intervals.Skip(3).First().Should().Be(TimeSpan.FromSeconds(40));
|
|
||||||
ExponentialRetry.Intervals.Skip(4).First().Should().Be(TimeSpan.FromSeconds(80));
|
|
||||||
}
|
|
||||||
|
|
||||||
[Fact]
|
|
||||||
public void ExponentialShouldNotRetryAfterFirstSucceess()
|
|
||||||
{
|
|
||||||
var fakeAction = new FakeAction(0);
|
|
||||||
ExponentialRetry.ExecuteWithRetry(
|
|
||||||
fakeAction.Run,
|
|
||||||
s => s == "success",
|
|
||||||
10,
|
|
||||||
NoWaitTimer).Wait();
|
|
||||||
fakeAction.Count.Should().Be(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
[Fact]
|
|
||||||
public void ExponentialShouldRetryUntilSuccess()
|
|
||||||
{
|
|
||||||
var fakeAction = new FakeAction(5);
|
|
||||||
ExponentialRetry.ExecuteWithRetry(
|
|
||||||
fakeAction.Run,
|
|
||||||
s => s == "success",
|
|
||||||
10,
|
|
||||||
NoWaitTimer).Wait();
|
|
||||||
fakeAction.Count.Should().Be(5);
|
|
||||||
}
|
|
||||||
|
|
||||||
[Fact]
|
|
||||||
public void ExponentialShouldThrowAfterMaximumAmountReached()
|
|
||||||
{
|
|
||||||
var fakeAction = new FakeAction(10);
|
|
||||||
Action a = () => ExponentialRetry.ExecuteWithRetry(
|
|
||||||
fakeAction.Run,
|
|
||||||
s => s == "success",
|
|
||||||
5,
|
|
||||||
NoWaitTimer,
|
|
||||||
"testing retry").Wait();
|
|
||||||
a.ShouldThrow<RetryFailedException>()
|
|
||||||
.WithMessage("Retry failed for testing retry after 5 times with result: fail");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public class FakeAction
|
|
||||||
{
|
|
||||||
private readonly int _successAfter;
|
|
||||||
|
|
||||||
public FakeAction(int successAfter)
|
|
||||||
{
|
|
||||||
_successAfter = successAfter;
|
|
||||||
}
|
|
||||||
|
|
||||||
public int Count { get; private set; }
|
|
||||||
|
|
||||||
public Task<string> Run()
|
|
||||||
{
|
|
||||||
if (_successAfter == Count)
|
|
||||||
{
|
|
||||||
return Task.FromResult("success");
|
|
||||||
}
|
|
||||||
|
|
||||||
Count++;
|
|
||||||
return Task.FromResult("fail");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,22 +0,0 @@
|
||||||
<Project Sdk="Microsoft.NET.Sdk">
|
|
||||||
<Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
|
|
||||||
|
|
||||||
<PropertyGroup>
|
|
||||||
<TargetFramework>$(CliTargetFramework)</TargetFramework>
|
|
||||||
<VersionPrefix>1.0.0</VersionPrefix>
|
|
||||||
<AssetTargetFallback>$(AssetTargetFallback);portable-net45+win8+wp8+wpa81</AssetTargetFallback>
|
|
||||||
<IsPackable>false</IsPackable>
|
|
||||||
</PropertyGroup>
|
|
||||||
|
|
||||||
<ItemGroup>
|
|
||||||
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="$(MicrosoftTestPlatformCLIPackageVersion)" />
|
|
||||||
<PackageReference Include="xunit" Version="2.2.0" />
|
|
||||||
<PackageReference Include="xunit.runner.visualstudio" Version="2.2.0" />
|
|
||||||
<PackageReference Include="FluentAssertions" Version="4.18.0" />
|
|
||||||
</ItemGroup>
|
|
||||||
|
|
||||||
<ItemGroup>
|
|
||||||
<ProjectReference Include="..\dotnet-cli-build\dotnet-cli-build.csproj" />
|
|
||||||
</ItemGroup>
|
|
||||||
|
|
||||||
</Project>
|
|
|
@ -1,62 +0,0 @@
|
||||||
// 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;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Net.Http;
|
|
||||||
using System.Text;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
using Newtonsoft.Json;
|
|
||||||
|
|
||||||
namespace Microsoft.DotNet.Cli.Build.UploadToLinuxPackageRepository
|
|
||||||
{
|
|
||||||
internal class AddPackageStrategy : IAzurelinuxRepositoryServiceHttpStrategy
|
|
||||||
{
|
|
||||||
private readonly IdInRepositoryService _idInRepositoryService;
|
|
||||||
private readonly string _packageName;
|
|
||||||
private readonly string _packageVersion;
|
|
||||||
private readonly string _repositoryId;
|
|
||||||
|
|
||||||
public AddPackageStrategy(
|
|
||||||
IdInRepositoryService idInRepositoryService,
|
|
||||||
string packageName,
|
|
||||||
string packageVersion,
|
|
||||||
string repositoryId)
|
|
||||||
{
|
|
||||||
_idInRepositoryService = idInRepositoryService
|
|
||||||
?? throw new ArgumentNullException(nameof(idInRepositoryService));
|
|
||||||
_packageName = packageName;
|
|
||||||
_packageVersion = packageVersion;
|
|
||||||
_repositoryId = repositoryId;
|
|
||||||
}
|
|
||||||
|
|
||||||
public async Task<string> Execute(HttpClient client, Uri baseAddress)
|
|
||||||
{
|
|
||||||
var debianUploadJsonContent = JsonConvert.SerializeObject(new Dictionary<string, string>
|
|
||||||
{
|
|
||||||
["name"] = _packageName,
|
|
||||||
["version"] = AppendDebianRevisionNumber(_packageVersion),
|
|
||||||
["fileId"] = _idInRepositoryService.Id,
|
|
||||||
["repositoryId"] = _repositoryId
|
|
||||||
});
|
|
||||||
var content = new StringContent(debianUploadJsonContent,
|
|
||||||
Encoding.UTF8,
|
|
||||||
"application/json");
|
|
||||||
|
|
||||||
using (var response = await client.PostAsync(new Uri(baseAddress, "/v1/packages"), content))
|
|
||||||
{
|
|
||||||
if (!response.IsSuccessStatusCode)
|
|
||||||
throw new FailedToAddPackageToPackageRepositoryException(
|
|
||||||
$"request:{debianUploadJsonContent} response:{JsonConvert.SerializeObject(response)}");
|
|
||||||
return response.Headers.GetValues("Location").Single();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private static string AppendDebianRevisionNumber(string packageVersion)
|
|
||||||
{
|
|
||||||
return packageVersion + "-1";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,53 +0,0 @@
|
||||||
// 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;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
|
|
||||||
namespace Microsoft.DotNet.Cli.Build.UploadToLinuxPackageRepository
|
|
||||||
{
|
|
||||||
public static class ExponentialRetry
|
|
||||||
{
|
|
||||||
public static IEnumerable<TimeSpan> Intervals
|
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
var seconds = 5;
|
|
||||||
while (true)
|
|
||||||
{
|
|
||||||
yield return TimeSpan.FromSeconds(seconds);
|
|
||||||
seconds *= 2;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static async Task ExecuteWithRetry(Func<Task<string>> action,
|
|
||||||
Func<string, bool> isSuccess,
|
|
||||||
int maxRetryCount,
|
|
||||||
Func<IEnumerable<Task>> timer,
|
|
||||||
string taskDescription = "")
|
|
||||||
{
|
|
||||||
var count = 0;
|
|
||||||
foreach (var t in timer())
|
|
||||||
{
|
|
||||||
await t;
|
|
||||||
var result = await action();
|
|
||||||
if (isSuccess(result))
|
|
||||||
return;
|
|
||||||
count++;
|
|
||||||
if (count == maxRetryCount)
|
|
||||||
throw new RetryFailedException(
|
|
||||||
$"Retry failed for {taskDescription} after {count} times with result: {result}");
|
|
||||||
}
|
|
||||||
throw new Exception("Timer should not be exhausted");
|
|
||||||
}
|
|
||||||
|
|
||||||
public static IEnumerable<Task> Timer(IEnumerable<TimeSpan> interval)
|
|
||||||
{
|
|
||||||
return interval.Select(Task.Delay);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,24 +0,0 @@
|
||||||
// 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;
|
|
||||||
|
|
||||||
namespace Microsoft.DotNet.Cli.Build.UploadToLinuxPackageRepository
|
|
||||||
{
|
|
||||||
public class FailedToAddPackageToPackageRepositoryException : Exception
|
|
||||||
{
|
|
||||||
public FailedToAddPackageToPackageRepositoryException(string message) : base(message)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
public FailedToAddPackageToPackageRepositoryException()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
public FailedToAddPackageToPackageRepositoryException(string message, Exception innerException) : base(message,
|
|
||||||
innerException)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,49 +0,0 @@
|
||||||
// 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.IO;
|
|
||||||
using System.Net.Http;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
using Newtonsoft.Json;
|
|
||||||
|
|
||||||
namespace Microsoft.DotNet.Cli.Build.UploadToLinuxPackageRepository
|
|
||||||
{
|
|
||||||
internal class FileUploadStrategy : IAzurelinuxRepositoryServiceHttpStrategy
|
|
||||||
{
|
|
||||||
private readonly string _pathToPackageToUpload;
|
|
||||||
|
|
||||||
public FileUploadStrategy(string pathToPackageToUpload)
|
|
||||||
{
|
|
||||||
_pathToPackageToUpload = pathToPackageToUpload
|
|
||||||
?? throw new ArgumentNullException(nameof(pathToPackageToUpload));
|
|
||||||
}
|
|
||||||
|
|
||||||
public async Task<string> Execute(HttpClient client, Uri baseAddress)
|
|
||||||
{
|
|
||||||
var fileName = Path.GetFileName(_pathToPackageToUpload);
|
|
||||||
|
|
||||||
using (var content =
|
|
||||||
new MultipartFormDataContent())
|
|
||||||
{
|
|
||||||
var url = new Uri(baseAddress, "/v1/files");
|
|
||||||
content.Add(
|
|
||||||
new StreamContent(
|
|
||||||
new MemoryStream(
|
|
||||||
File.ReadAllBytes(_pathToPackageToUpload))),
|
|
||||||
"file",
|
|
||||||
fileName);
|
|
||||||
using (var message = await client.PostAsync(url, content))
|
|
||||||
{
|
|
||||||
if (!message.IsSuccessStatusCode)
|
|
||||||
{
|
|
||||||
throw new FailedToAddPackageToPackageRepositoryException(
|
|
||||||
$"{JsonConvert.SerializeObject(message)} failed to post file to {url} file name:{fileName} pathToPackageToUpload:{_pathToPackageToUpload}");
|
|
||||||
}
|
|
||||||
return await message.Content.ReadAsStringAsync();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,15 +0,0 @@
|
||||||
// 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.Net.Http;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
|
|
||||||
namespace Microsoft.DotNet.Cli.Build.UploadToLinuxPackageRepository
|
|
||||||
{
|
|
||||||
internal interface IAzurelinuxRepositoryServiceHttpStrategy
|
|
||||||
{
|
|
||||||
Task<string> Execute(HttpClient client, Uri baseAddress);
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,18 +0,0 @@
|
||||||
// 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;
|
|
||||||
|
|
||||||
namespace Microsoft.DotNet.Cli.Build.UploadToLinuxPackageRepository
|
|
||||||
{
|
|
||||||
internal class IdInRepositoryService
|
|
||||||
{
|
|
||||||
public IdInRepositoryService(string id)
|
|
||||||
{
|
|
||||||
Id = id ?? throw new ArgumentNullException(nameof(id));
|
|
||||||
}
|
|
||||||
|
|
||||||
public string Id { get; }
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,38 +0,0 @@
|
||||||
// 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;
|
|
||||||
|
|
||||||
namespace Microsoft.DotNet.Cli.Build.UploadToLinuxPackageRepository
|
|
||||||
{
|
|
||||||
internal class LinuxPackageRepositoryDestiny
|
|
||||||
{
|
|
||||||
private readonly string _password;
|
|
||||||
private readonly string _server;
|
|
||||||
private readonly string _username;
|
|
||||||
|
|
||||||
public LinuxPackageRepositoryDestiny(string username,
|
|
||||||
string password,
|
|
||||||
string server,
|
|
||||||
string repositoryId)
|
|
||||||
{
|
|
||||||
_username = username ?? throw new ArgumentNullException(nameof(username));
|
|
||||||
_password = password ?? throw new ArgumentNullException(nameof(password));
|
|
||||||
_server = server ?? throw new ArgumentNullException(nameof(server));
|
|
||||||
RepositoryId = repositoryId ?? throw new ArgumentNullException(nameof(repositoryId));
|
|
||||||
}
|
|
||||||
|
|
||||||
public string RepositoryId { get; }
|
|
||||||
|
|
||||||
public Uri GetBaseAddress()
|
|
||||||
{
|
|
||||||
return new Uri($"https://{_server}");
|
|
||||||
}
|
|
||||||
|
|
||||||
public string GetSimpleAuth()
|
|
||||||
{
|
|
||||||
return $"{_username}:{_password}";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,46 +0,0 @@
|
||||||
// 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.Net.Http;
|
|
||||||
using System.Net.Http.Headers;
|
|
||||||
using System.Text;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
|
|
||||||
namespace Microsoft.DotNet.Cli.Build.UploadToLinuxPackageRepository
|
|
||||||
{
|
|
||||||
internal class LinuxPackageRepositoryHttpPrepare
|
|
||||||
{
|
|
||||||
private readonly IAzurelinuxRepositoryServiceHttpStrategy _httpStrategy;
|
|
||||||
private readonly LinuxPackageRepositoryDestiny _linuxPackageRepositoryDestiny;
|
|
||||||
|
|
||||||
public LinuxPackageRepositoryHttpPrepare(
|
|
||||||
LinuxPackageRepositoryDestiny linuxPackageRepositoryDestiny,
|
|
||||||
IAzurelinuxRepositoryServiceHttpStrategy httpStrategy
|
|
||||||
)
|
|
||||||
{
|
|
||||||
_linuxPackageRepositoryDestiny = linuxPackageRepositoryDestiny
|
|
||||||
?? throw new ArgumentNullException(nameof(linuxPackageRepositoryDestiny));
|
|
||||||
_httpStrategy = httpStrategy ?? throw new ArgumentNullException(nameof(httpStrategy));
|
|
||||||
}
|
|
||||||
|
|
||||||
public async Task<string> RemoteCall()
|
|
||||||
{
|
|
||||||
using (var handler = new HttpClientHandler())
|
|
||||||
{
|
|
||||||
using (var client = new HttpClient(handler))
|
|
||||||
{
|
|
||||||
var authHeader =
|
|
||||||
Convert.ToBase64String(Encoding.UTF8.GetBytes((string) _linuxPackageRepositoryDestiny.GetSimpleAuth()));
|
|
||||||
client.DefaultRequestHeaders.Authorization =
|
|
||||||
new AuthenticationHeaderValue("Basic", authHeader);
|
|
||||||
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
|
|
||||||
client.Timeout = TimeSpan.FromMinutes(10);
|
|
||||||
|
|
||||||
return await _httpStrategy.Execute(client, _linuxPackageRepositoryDestiny.GetBaseAddress());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,34 +0,0 @@
|
||||||
// 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.Net.Http;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
using Newtonsoft.Json.Linq;
|
|
||||||
|
|
||||||
namespace Microsoft.DotNet.Cli.Build.UploadToLinuxPackageRepository
|
|
||||||
{
|
|
||||||
internal class PullQueuedPackageStatus : IAzurelinuxRepositoryServiceHttpStrategy
|
|
||||||
{
|
|
||||||
private readonly QueueResourceLocation _queueResourceLocation;
|
|
||||||
|
|
||||||
public PullQueuedPackageStatus(QueueResourceLocation queueResourceLocation)
|
|
||||||
{
|
|
||||||
_queueResourceLocation = queueResourceLocation
|
|
||||||
?? throw new ArgumentNullException(nameof(queueResourceLocation));
|
|
||||||
}
|
|
||||||
|
|
||||||
public async Task<string> Execute(HttpClient client, Uri baseAddress)
|
|
||||||
{
|
|
||||||
using (var response = await client.GetAsync(new Uri(baseAddress, _queueResourceLocation.Location)))
|
|
||||||
{
|
|
||||||
if (!response.IsSuccessStatusCode)
|
|
||||||
throw new FailedToAddPackageToPackageRepositoryException(
|
|
||||||
"Failed to make request to " + _queueResourceLocation.Location);
|
|
||||||
var body = await response.Content.ReadAsStringAsync();
|
|
||||||
return !body.Contains("status") ? "" : JObject.Parse(body)["status"].ToString();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,18 +0,0 @@
|
||||||
// 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;
|
|
||||||
|
|
||||||
namespace Microsoft.DotNet.Cli.Build.UploadToLinuxPackageRepository
|
|
||||||
{
|
|
||||||
internal class QueueResourceLocation
|
|
||||||
{
|
|
||||||
public QueueResourceLocation(string location)
|
|
||||||
{
|
|
||||||
Location = location ?? throw new ArgumentNullException(nameof(location));
|
|
||||||
}
|
|
||||||
|
|
||||||
public string Location { get; }
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,23 +0,0 @@
|
||||||
// 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;
|
|
||||||
|
|
||||||
namespace Microsoft.DotNet.Cli.Build.UploadToLinuxPackageRepository
|
|
||||||
{
|
|
||||||
public class RetryFailedException : Exception
|
|
||||||
{
|
|
||||||
public RetryFailedException(string message) : base(message)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
public RetryFailedException()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
public RetryFailedException(string message, Exception innerException) : base(message, innerException)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,121 +0,0 @@
|
||||||
// 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.Net.Http;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
using Microsoft.Build.Framework;
|
|
||||||
using Newtonsoft.Json.Linq;
|
|
||||||
using Task = Microsoft.Build.Utilities.Task;
|
|
||||||
|
|
||||||
namespace Microsoft.DotNet.Cli.Build.UploadToLinuxPackageRepository
|
|
||||||
{
|
|
||||||
public class UploadToLinuxPackageRepository : Task
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// The Azure repository service user name.
|
|
||||||
/// </summary>
|
|
||||||
[Required]
|
|
||||||
public string Username { get; set; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// The Azure repository service Password.
|
|
||||||
/// </summary>
|
|
||||||
[Required]
|
|
||||||
public string Password { get; set; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// The Azure repository service URL ex: "tux-devrepo.corp.microsoft.com".
|
|
||||||
/// </summary>
|
|
||||||
[Required]
|
|
||||||
public string Server { get; set; }
|
|
||||||
|
|
||||||
[Required]
|
|
||||||
public string RepositoryId { get; set; }
|
|
||||||
|
|
||||||
[Required]
|
|
||||||
public string PathOfPackageToUpload { get; set; }
|
|
||||||
|
|
||||||
[Required]
|
|
||||||
public string PackageNameInLinuxPackageRepository { get; set; }
|
|
||||||
|
|
||||||
|
|
||||||
[Required]
|
|
||||||
public string PackageVersionInLinuxPackageRepository { get; set; }
|
|
||||||
|
|
||||||
|
|
||||||
public override bool Execute()
|
|
||||||
{
|
|
||||||
ExecuteAsyncWithRetry().GetAwaiter().GetResult();
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
private async System.Threading.Tasks.Task ExecuteAsyncWithRetry()
|
|
||||||
{
|
|
||||||
await ExponentialRetry.ExecuteWithRetry(
|
|
||||||
UploadAndAddpackageAndEnsureItIsReady,
|
|
||||||
s => s == "",
|
|
||||||
maxRetryCount: 3,
|
|
||||||
timer: () => ExponentialRetry.Timer(ExponentialRetry.Intervals),
|
|
||||||
taskDescription: $"running {nameof(UploadAndAddpackageAndEnsureItIsReady)}");
|
|
||||||
}
|
|
||||||
|
|
||||||
private async Task<string> UploadAndAddpackageAndEnsureItIsReady()
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
Log.LogMessage(
|
|
||||||
MessageImportance.High,
|
|
||||||
"Begin uploading Linux Package to feed service, RepositoryId {0}, Server {1}, Package to upload {2}.",
|
|
||||||
RepositoryId,
|
|
||||||
Server,
|
|
||||||
PathOfPackageToUpload);
|
|
||||||
|
|
||||||
var linuxPackageRepositoryDestiny =
|
|
||||||
new LinuxPackageRepositoryDestiny(Username, Password, Server, RepositoryId);
|
|
||||||
var uploadResponse = await new LinuxPackageRepositoryHttpPrepare(
|
|
||||||
linuxPackageRepositoryDestiny,
|
|
||||||
new FileUploadStrategy(PathOfPackageToUpload)).RemoteCall();
|
|
||||||
|
|
||||||
var idInRepositoryService = new IdInRepositoryService(JObject.Parse(uploadResponse)["id"].ToString());
|
|
||||||
|
|
||||||
var addPackageResponse = await new LinuxPackageRepositoryHttpPrepare(
|
|
||||||
linuxPackageRepositoryDestiny,
|
|
||||||
new AddPackageStrategy(
|
|
||||||
idInRepositoryService,
|
|
||||||
PackageNameInLinuxPackageRepository,
|
|
||||||
PackageVersionInLinuxPackageRepository,
|
|
||||||
linuxPackageRepositoryDestiny.RepositoryId)).RemoteCall();
|
|
||||||
|
|
||||||
var queueResourceLocation = new QueueResourceLocation(addPackageResponse);
|
|
||||||
|
|
||||||
Func<Task<string>> pullQueuedPackageStatus = new LinuxPackageRepositoryHttpPrepare(
|
|
||||||
linuxPackageRepositoryDestiny,
|
|
||||||
new PullQueuedPackageStatus(queueResourceLocation)).RemoteCall;
|
|
||||||
|
|
||||||
await ExponentialRetry.ExecuteWithRetry(
|
|
||||||
pullQueuedPackageStatus,
|
|
||||||
s => s == "fileReady",
|
|
||||||
5,
|
|
||||||
() => ExponentialRetry.Timer(ExponentialRetry.Intervals),
|
|
||||||
$"PullQueuedPackageStatus location: {queueResourceLocation.Location}");
|
|
||||||
|
|
||||||
Log.LogMessage(
|
|
||||||
MessageImportance.High,
|
|
||||||
"Upload to feed service is completed, queue resource location {0}",
|
|
||||||
queueResourceLocation.Location);
|
|
||||||
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
catch (FailedToAddPackageToPackageRepositoryException e)
|
|
||||||
{
|
|
||||||
return e.ToString();
|
|
||||||
}
|
|
||||||
catch (HttpRequestException e)
|
|
||||||
{
|
|
||||||
return e.ToString();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -120,9 +120,6 @@ docker run $INTERACTIVE -t --rm --sig-proxy=true \
|
||||||
--name $DOTNET_BUILD_CONTAINER_NAME \
|
--name $DOTNET_BUILD_CONTAINER_NAME \
|
||||||
-v $DOCKER_HOST_SHARE_DIR:/opt/code \
|
-v $DOCKER_HOST_SHARE_DIR:/opt/code \
|
||||||
-e CHANNEL \
|
-e CHANNEL \
|
||||||
-e REPO_ID \
|
|
||||||
-e REPO_USER \
|
|
||||||
-e REPO_SERVER \
|
|
||||||
-e DOTNET_BUILD_SKIP_CROSSGEN \
|
-e DOTNET_BUILD_SKIP_CROSSGEN \
|
||||||
-e PUBLISH_TO_AZURE_BLOB \
|
-e PUBLISH_TO_AZURE_BLOB \
|
||||||
-e NUGET_FEED_URL \
|
-e NUGET_FEED_URL \
|
||||||
|
|
Loading…
Reference in a new issue