diff --git a/source/Calamari.AzureAppService/ArchivePackagProvider/FlexConsumptionZipPackageProvider.cs b/source/Calamari.AzureAppService/ArchivePackagProvider/FlexConsumptionZipPackageProvider.cs new file mode 100644 index 0000000000..31d7d2b514 --- /dev/null +++ b/source/Calamari.AzureAppService/ArchivePackagProvider/FlexConsumptionZipPackageProvider.cs @@ -0,0 +1,29 @@ +using System; +using System.IO; +using System.Threading.Tasks; +using SharpCompress.Archives; +using SharpCompress.Archives.Zip; +using SharpCompress.Common; + +namespace Calamari.AzureAppService; + +public class FlexConsumptionZipPackageProvider : IPackageProvider +{ + public string UploadUrlPath => "/api/publish"; + public bool SupportsAsynchronousDeployment => true; + + public async Task PackageArchive(string sourceDirectory, string targetDirectory) + { + await Task.Run(() => + { + using var archive = ZipArchive.Create(); + archive.AddAllFromDirectory( + $"{sourceDirectory}"); + archive.SaveTo($"{targetDirectory}/app.zip", CompressionType.Deflate); + }); + return new FileInfo($"{targetDirectory}/app.zip"); + } + + public async Task ConvertToAzureSupportedFile(FileInfo sourceFile) => await Task.Run(() => sourceFile); + public string ContentType => "application/zip"; +} \ No newline at end of file diff --git a/source/Calamari.AzureAppService/ArchivePackagProvider/IPackageProvider.cs b/source/Calamari.AzureAppService/ArchivePackagProvider/IPackageProvider.cs index fd752bfb71..b4d12b5804 100644 --- a/source/Calamari.AzureAppService/ArchivePackagProvider/IPackageProvider.cs +++ b/source/Calamari.AzureAppService/ArchivePackagProvider/IPackageProvider.cs @@ -12,5 +12,7 @@ public interface IPackageProvider Task PackageArchive(string sourceDirectory, string targetDirectory); Task ConvertToAzureSupportedFile(FileInfo sourceFile); + + string ContentType { get; } } } \ No newline at end of file diff --git a/source/Calamari.AzureAppService/ArchivePackagProvider/JavaPackageProvider.cs b/source/Calamari.AzureAppService/ArchivePackagProvider/JavaPackageProvider.cs index 17ac1f6ae0..f39c198900 100644 --- a/source/Calamari.AzureAppService/ArchivePackagProvider/JavaPackageProvider.cs +++ b/source/Calamari.AzureAppService/ArchivePackagProvider/JavaPackageProvider.cs @@ -4,7 +4,6 @@ using Calamari.Common.Features.Packages; using Calamari.Common.Features.Packages.Java; using Calamari.Common.Features.Processes; -using Calamari.Common.Plumbing.Extensions; using Calamari.Common.Plumbing.FileSystem; using Calamari.Common.Plumbing.Logging; using Calamari.Common.Plumbing.Variables; @@ -56,6 +55,6 @@ await Task.Run(() => } public async Task ConvertToAzureSupportedFile(FileInfo sourceFile) => await Task.Run(() => sourceFile); - + public string ContentType => "application/octet-stream"; } } \ No newline at end of file diff --git a/source/Calamari.AzureAppService/ArchivePackagProvider/NugetPackageProvider.cs b/source/Calamari.AzureAppService/ArchivePackagProvider/NugetPackageProvider.cs index 243391bbcf..705f9038b4 100644 --- a/source/Calamari.AzureAppService/ArchivePackagProvider/NugetPackageProvider.cs +++ b/source/Calamari.AzureAppService/ArchivePackagProvider/NugetPackageProvider.cs @@ -29,5 +29,7 @@ public async Task ConvertToAzureSupportedFile(FileInfo sourceFile) await Task.Run(() => File.Copy(sourceFile.FullName, newFilePath)); return new FileInfo(newFilePath); } + + public string ContentType => "application/octet-stream"; } } \ No newline at end of file diff --git a/source/Calamari.AzureAppService/ArchivePackagProvider/ZipPackageProvider.cs b/source/Calamari.AzureAppService/ArchivePackagProvider/ZipPackageProvider.cs index dacd9a33d3..9357971a5d 100644 --- a/source/Calamari.AzureAppService/ArchivePackagProvider/ZipPackageProvider.cs +++ b/source/Calamari.AzureAppService/ArchivePackagProvider/ZipPackageProvider.cs @@ -8,7 +8,7 @@ namespace Calamari.AzureAppService { public class ZipPackageProvider : IPackageProvider { - public string UploadUrlPath => @"/api/zipdeploy"; + public string UploadUrlPath => "/api/zipdeploy"; public bool SupportsAsynchronousDeployment => true; public async Task PackageArchive(string sourceDirectory, string targetDirectory) @@ -24,5 +24,6 @@ await Task.Run(() => } public async Task ConvertToAzureSupportedFile(FileInfo sourceFile) => await Task.Run(() => sourceFile); + public string ContentType => "application/octet-stream"; } } \ No newline at end of file diff --git a/source/Calamari.AzureAppService/Behaviors/AzureAppServiceZipDeployBehaviour.cs b/source/Calamari.AzureAppService/Behaviors/AzureAppServiceZipDeployBehaviour.cs index 865f90b66f..3ec8777436 100644 --- a/source/Calamari.AzureAppService/Behaviors/AzureAppServiceZipDeployBehaviour.cs +++ b/source/Calamari.AzureAppService/Behaviors/AzureAppServiceZipDeployBehaviour.cs @@ -18,16 +18,13 @@ using Calamari.AzureAppService.Azure; using Calamari.CloudAccounts; using Calamari.Common.Commands; -using Calamari.Common.FeatureToggles; using Calamari.Common.Plumbing.Extensions; using Calamari.Common.Plumbing.FileSystem; using Calamari.Common.Plumbing.Logging; using Calamari.Common.Plumbing.Pipeline; using Calamari.Common.Plumbing.Variables; -using Octopus.CoreUtilities.Extensions; using Polly; using Polly.Timeout; -using AccountVariables = Calamari.AzureAppService.Azure.AccountVariables; namespace Calamari.AzureAppService.Behaviors { @@ -92,12 +89,19 @@ public async Task Execute(RunningDeployment context) var webSiteResource = armClient.GetWebSiteResource(targetSite.CreateWebSiteResourceIdentifier()); Log.Verbose($"App Service '{targetSite.Site}' found, with Azure Resource Manager Id '{webSiteResource.Id.ToString()}'."); + var siteInfo = webSiteResource.Get(); + WebSiteResource? webSiteInforResource = null; + if (siteInfo != null && siteInfo.HasValue && siteInfo.Value.HasData) + { + Log.Verbose($"App Service Plan running on '{siteInfo.Value.Data.Sku}' tier"); + webSiteInforResource = siteInfo.Value; + } var packageFileInfo = new FileInfo(variables.Get(TentacleVariables.CurrentDeployment.PackageFilePath)!); - + IPackageProvider packageProvider = packageFileInfo.Extension switch { - ".zip" => new ZipPackageProvider(), + ".zip" => GetZipPackageProvider(webSiteInforResource), ".nupkg" => new NugetPackageProvider(), ".war" => new JavaPackageProvider(Log, fileSystem, variables, context, "/api/wardeploy"), ".jar" => new JavaPackageProvider(Log, fileSystem, variables, context, "/api/publish?type=jar"), @@ -150,7 +154,7 @@ public async Task Execute(RunningDeployment context) Log.Verbose($"Retrieving publishing profile for App Service to determine correct deployment endpoint."); using var publishingProfileXmlStream = await armClient.GetPublishingProfileXmlWithSecrets(targetSite); var publishingProfile = await PublishingProfile.ParseXml(publishingProfileXmlStream); - + Log.Verbose($"Using deployment endpoint '{publishingProfile.PublishUrl}' from publishing profile."); Log.Info($"Uploading package to {targetSite.SiteAndSlot}"); @@ -176,6 +180,16 @@ public async Task Execute(RunningDeployment context) } } + static IPackageProvider GetZipPackageProvider(WebSiteResource? webSiteResource) + { + if (webSiteResource != null && webSiteResource.Data.Sku.Equals("FlexConsumption", StringComparison.OrdinalIgnoreCase)) + { + return new FlexConsumptionZipPackageProvider(); + } + + return new ZipPackageProvider(); + } + private async Task FindOrCreateSlot(ArmClient armClient, WebSiteResource webSiteResource, AzureTargetSite site) { Log.Verbose($"Checking if deployment slot '{site.Slot}' exists."); @@ -233,7 +247,7 @@ private async Task UploadZipAsync(IAzureAccount azureAccount, { await using var fileStream = new FileStream(uploadZipPath, FileMode.Open, FileAccess.Read, FileShare.Read); using var streamContent = new StreamContent(fileStream); - streamContent.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream"); + streamContent.Headers.ContentType = new MediaTypeHeaderValue(packageProvider.ContentType); //we have to create a new request message each time var request = new HttpRequestMessage(HttpMethod.Post, zipUploadUrl) @@ -287,7 +301,7 @@ private async Task UploadZipAndPollAsync(IAzureAccount azureAccount, if (!new FileInfo(uploadZipPath).Exists) throw new FileNotFoundException(uploadZipPath); - var zipUploadUrl = $"{publishingProfile.PublishUrl}{packageProvider.UploadUrlPath}?isAsync=true"; + var zipUploadUrl = $"{publishingProfile.PublishUrl}{packageProvider.UploadUrlPath}?remoteBuild=false&deployer=Octopus"; Log.Verbose($"Publishing {uploadZipPath} to {zipUploadUrl} and checking for deployment"); using var httpClient = new HttpClient(new HttpClientHandler @@ -311,7 +325,7 @@ private async Task UploadZipAndPollAsync(IAzureAccount azureAccount, //we have to create a new request message each time await using var fileStream = new FileStream(uploadZipPath, FileMode.Open, FileAccess.Read, FileShare.Read); using var streamContent = new StreamContent(fileStream); - streamContent.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream"); + streamContent.Headers.ContentType = new MediaTypeHeaderValue(packageProvider.ContentType); var uploadRequest = new HttpRequestMessage(HttpMethod.Post, zipUploadUrl) { diff --git a/source/Calamari.AzureAppService/Calamari.AzureAppService.csproj b/source/Calamari.AzureAppService/Calamari.AzureAppService.csproj index 3f9c626993..d24e4cd02c 100644 --- a/source/Calamari.AzureAppService/Calamari.AzureAppService.csproj +++ b/source/Calamari.AzureAppService/Calamari.AzureAppService.csproj @@ -12,8 +12,8 @@ true - - + +