azure-app-service / kudulite Goto Github PK
View Code? Open in Web Editor NEWKuduLite is the engine behind git/hg deployments, and various other features in Azure Web Sites on Linux.
License: Apache License 2.0
KuduLite is the engine behind git/hg deployments, and various other features in Azure Web Sites on Linux.
License: Apache License 2.0
This issue was logged in Oryx repo: microsoft/Oryx#56
We might consider also accepting .deployment
files with CRLF.
The KuduLite server should handle this request properly and return an expected deployment json.
Kudulite may fail to parse request when HTTP 100 Continue
happend.
curl -X POST -u %basicAuthInfo% --data-binary @"./helloworld.war" "https://toshida-tomcat-linux.scm.azurewebsites.net/api/publish?type=war" -v
Note: Unnecessary use of -X or --request, POST is already inferred.
* Trying 40.79.195.0:443...
* Connected to toshida-tomcat-linux.scm.azurewebsites.net (40.79.195.0) port 443
* schannel: disabled automatic use of client certificate
* ALPN: curl offers http/1.1
* ALPN: server accepted http/1.1
* using HTTP/1.1
* Server auth using Basic with user 'REDACTED'
> POST /api/publish?type=war HTTP/1.1
> Host: toshida-tomcat-linux.scm.azurewebsites.net
> Authorization: Basic REDACTED
> User-Agent: curl/8.4.0
> Accept: */*
> Content-Length: 5098301
> Content-Type: application/x-www-form-urlencoded
> Expect: 100-continue
>
* Done waiting for 100-continue
* We are completely uploaded and fine
< HTTP/1.1 400 Bad Request
< Content-Type: text/plain; charset=utf-8
< Date: Tue, 16 Jan 2024 09:44:18 GMT
< Server: Kestrel
< Set-Cookie: ARRAffinity=REDACTED;Path=/;HttpOnly;Secure;Domain=toshida-tomcat-linux.scm.azurewebsites.net
< Set-Cookie: ARRAffinitySameSite=REDACTED;Path=/;HttpOnly;SameSite=None;Secure;Domain=toshida-tomcat-linux.scm.azurewebsites.net
< Transfer-Encoding: chunked
<
Artifact type '' not supported* Connection #0 to host toshida-tomcat-linux.scm.azurewebsites.net left intact
Kudulite side log( /home/LogFiles/kudu/trace/2024-01-16T09-44-15_e3445e_081_POST_api-publish_400_4s.xml)
cat /home/LogFiles/kudu/trace/2024-01-16T09-44-15_e3445e_081_POST_api-publish_400_4s.xml
<step title="Incoming Request" date="2024-01-16T09:44:15.214" instance="e3445e" url="/api/publish?type=war" method="POST" type="request" pid="92,1,18" Accept="*/*" Host="toshida-tomcat-linux.scm.azurewebsites.net" User-Agent="curl/8.4.0" Authorization="Bas..." Content-Type="application/x-www-form-urlencoded" Expect="100-continue" Content-Length="5098301" X-ARR-LOG-ID="63159023-fe3c-45ff-a741-8ebd43307e11" CLIENT-IP="36.12.195.236:59051" X-Client-IP="36.12.195.236" X-SITE-DEPLOYMENT-ID="toshida-tomcat-linux" WAS-DEFAULT-HOSTNAME="toshida-tomcat-linux.scm.azurewebsites.net" X-Forwarded-Proto="https" X-AppService-Proto="https" X-Forwarded-TlsVersion="1.2" X-WAWS-Unencoded-URL="/api/publish?type=war" X-Client-Port="59051" >
<step title="Cleanup Xml Logs" date="2024-01-16T09:44:15.273" >
<step title="Cleanup Infos" date="2024-01-16T09:44:17.967" totalFiles="10784" totalCleanup="10624" /><!-- duration: 161ms -->
</step><!-- duration: 2866ms -->
<step title="OneDeploy" date="2024-01-16T09:44:18.782" /><!-- duration: 38ms -->
<step title="Outgoing response" date="2024-01-16T09:44:18.834" type="response" statusCode="400" statusText="BadRequest" /><!-- duration: 20ms -->
</step><!-- duration: 3659ms -->
This error not happen when I use small size war to avoid HTTP 100 Continue
curl -X POST -u %basicAuthInfo% --data-binary @"./app.war" "https://toshida-tomcat-linux.scm.azurewebsites.net/api/publish?type=war" -v
Note: Unnecessary use of -X or --request, POST is already inferred.
* Trying 40.79.195.0:443...
* Connected to toshida-tomcat-linux.scm.azurewebsites.net (40.79.195.0) port 443
* schannel: disabled automatic use of client certificate
* ALPN: curl offers http/1.1
* ALPN: server accepted http/1.1
* using HTTP/1.1
* Server auth using Basic with user 'REDACTED'
> POST /api/publish?type=war HTTP/1.1
> Host: toshida-tomcat-linux.scm.azurewebsites.net
> Authorization: Basic REDACTED
> User-Agent: curl/8.4.0
> Accept: */*
> Content-Length: 690778
> Content-Type: application/x-www-form-urlencoded
>
* We are completely uploaded and fine
< HTTP/1.1 200 OK
< Content-Length: 0
< Date: Tue, 16 Jan 2024 09:58:42 GMT
< Server: Kestrel
< Set-Cookie: ARRAffinity=REDACTED;Path=/;HttpOnly;Secure;Domain=toshida-tomcat-linux.scm.azurewebsites.net
< Set-Cookie: ARRAffinitySameSite=REDACTED;Path=/;HttpOnly;SameSite=None;Secure;Domain=toshida-tomcat-linux.scm.azurewebsites.net
< SCM-DEPLOYMENT-ID: 2353c115-057e-4dfa-8290-6124ba269269
<
* Connection #0 to host toshida-tomcat-linux.scm.azurewebsites.net left intact
Create kudulite image for Consumption and Dedicated/Premium
Check Python packages and remote build
kudulite build paths for Elastic Premium function apps take excessively long causing builds to crash. This is caused because the shared home directory in Elastic Premium containers are powered by Azure Files and during build, kudulite build process uses the /home directory for storing logs, caching packages etc.
We can make several improvements in this build process, by work-arounds like changing the default caching location for Python builds, storing logs temporarily in local disk and then moving over to home. More details TBD.
zip deploy using /api/publish?type=zip
by curl described below document result 400 error.
https://docs.microsoft.com/en-us/azure/app-service/deploy-zip?tabs=api#deploy-a-zip-package
curl -X POST -u <deployment_user> --data-binary @"<zip_file_path>" https://<app_name>.scm.azurewebsites.net/api/publish?type=zip
1.0.0.7 (e59ed50ca2)
> POST /api/publish?type=zip HTTP/1.1
> Host: testkuduzipdeoloy.scm.azurewebsites.net
> Authorization: Basic JHRlc■■■■==
> User-Agent: curl/7.68.0
> Accept: */*
> Content-Length: 740895
> Content-Type: application/x-www-form-urlencoded
> Expect: 100-continue
>
* Mark bundle as not supporting multiuse
< HTTP/1.1 100 Continue
* We are completely uploaded and fine
* Mark bundle as not supporting multiuse
< HTTP/1.1 400 Bad Request
< Cache-Control: no-cache
< Pragma: no-cache
< Expires: -1
< Server: Kestrel
< Set-Cookie: ARRAffinity=bc73405f088a481bce9031c7b1fcb03c60435387299bbfcd3c3234768c74f51e;Path=/;HttpOnly;Secure;Domain=testkuduzipdeoloy.scm.azurewebsites.net
< Set-Cookie: ARRAffinitySameSite=bc73405f088a481bce9031c7b1fcb03c60435387299bbfcd3c3234768c74f51e;Path=/;HttpOnly;SameSite=None;Secure;Domain=testkuduzipdeoloy.scm.azurewebsites.net
< Date: Wed, 06 Apr 2022 08:57:41 GMT
< Content-Length: 0
<
<step title="Incoming Request" date="2022-04-06T08:57:39.426" instance="bc7340" url="/api/publish?type=zip" method="POST" type="request" pid="69,1,14" Connection="Keep-Alive" Content-Type="application/x-www-form-urlencoded" Accept="*/*" Authorization="Bas..." Host="testkuduzipdeoloy.scm.azurewebsites.net" User-Agent="curl/7.68.0" Content-Length="740895" X-Client-IP="■■■■" X-Client-Port="51050" X-WAWS-Unencoded-URL="/api/publish?type=zip" CLIENT-IP=■■■■" X-ARR-LOG-ID="9f5ad4eb-4cde-4a7a-8003-73f39db5bb33" X-SITE-DEPLOYMENT-ID="testkuduzipdeoloy" WAS-DEFAULT-HOSTNAME="testkuduzipdeoloy.scm.azurewebsites.net" X-Forwarded-Proto="https" X-AppService-Proto="https" X-Forwarded-TlsVersion="1.2" >
<step title="Cleanup Xml Logs" date="2022-04-06T08:57:39.438" /><!-- duration: 27ms -->
<step title="OneDeploy" date="2022-04-06T08:57:39.900" >
<step title="Writing artifact to /tmp/zipdeploy/285426db-640c-4503-ae9a-a88964f10d19.zip" date="2022-04-06T08:57:39.971" /><!-- duration: 11ms -->
<step title="Attempting to fetch target branch HEAD" date="2022-04-06T08:57:39.996" /><!-- duration: 13ms -->
<step title="Acquiring Deployment Lock" date="2022-04-06T08:57:40.023" /><!-- duration: 10ms -->
<step title="Acquired Deployment Lock" date="2022-04-06T08:57:40.111" /><!-- duration: 12ms -->
<step title="Performing fetch based deployment" date="2022-04-06T08:57:40.150" >
<step title="Creating temporary deployment" date="2022-04-06T08:57:40.161" /><!-- duration: 217ms -->
<step title="Cleaning up temp folders from previous zip deployments and extracting pushed zip file /tmp/zipdeploy/285426db-640c-4503-ae9a-a88964f10d19.zip (0.00 MB) to /tmp/zipdeploy/extracted" date="2022-04-06T08:57:41.655" /><!-- duration: 21ms -->
<step title="Marking deployment as failed" date="2022-04-06T08:57:41.735" /><!-- duration: 7ms -->
</step><!-- duration: 1624ms -->
<step title="Releasing Deployment Lock" date="2022-04-06T08:57:41.782" /><!-- duration: 5ms -->
</step><!-- duration: 1916ms -->
<step title="Error occurred" date="2022-04-06T08:57:41.862" type="error" text="Central Directory corrupt." stackTrace=" at System.IO.Compression.ZipArchive.ReadEndOfCentralDirectory()
at System.IO.Compression.ZipArchive.Init(Stream stream, ZipArchiveMode mode, Boolean leaveOpen)
at System.IO.Compression.ZipArchive..ctor(Stream stream, ZipArchiveMode mode)
at Kudu.Services.Deployment.PushDeploymentController.LocalZipFetch(IRepository repository, DeploymentInfoBase deploymentInfo, String targetBranch, ILogger logger, ITracer tracer)
at Kudu.Services.Deployment.PushDeploymentController.LocalZipHandler(IRepository repository, DeploymentInfoBase deploymentInfo, String targetBranch, ILogger logger, ITracer tracer)
at Kudu.Core.Deployment.FetchDeploymentManager.PerformDeployment(DeploymentInfoBase deploymentInfo, IDisposable tempDeployment, ChangeSet tempChangeSet)
at Kudu.Core.Deployment.FetchDeploymentManager.PerformDeployment(DeploymentInfoBase deploymentInfo, IDisposable tempDeployment, ChangeSet tempChangeSet)
at Kudu.Core.Deployment.FetchDeploymentManager.<>c__DisplayClass9_0.<<FetchDeploy>b__0>d.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
at Kudu.Core.Deployment.FetchDeploymentManager.FetchDeploy(DeploymentInfoBase deployInfo, Boolean asyncRequested, Uri requestUri, String targetBranch)
at Kudu.Services.Deployment.PushDeploymentController.PushDeployAsync(ArtifactDeploymentInfo deploymentInfo, Boolean isAsync, HttpContext context, JObject requestJson)
at Kudu.Services.Deployment.PushDeploymentController.OneDeploy(String type, Boolean async, String path, Nullable`1 restart, Nullable`1 clean, Boolean ignoreStack, Boolean trackDeploymentProgress)
at Microsoft.AspNetCore.Mvc.Infrastructure.ActionMethodExecutor.TaskOfIActionResultExecutor.Execute(IActionResultTypeMapper mapper, ObjectMethodExecutor executor, Object controller, Object[] arguments)
at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.<InvokeActionMethodAsync>g__Awaited|12_0(ControllerActionInvoker invoker, ValueTask`1 actionResultValueTask)
at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.<InvokeNextActionFilterAsync>g__Awaited|10_0(ControllerActionInvoker invoker, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted)
at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.Rethrow(ActionExecutedContextSealed context)
at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.Next(State& next, Scope& scope, Object& state, Boolean& isCompleted)
at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.InvokeInnerFilterAsync()
--- End of stack trace from previous location where exception was thrown ---
at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeNextResourceFilter>g__Awaited|24_0(ResourceInvoker invoker, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted)
at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.Rethrow(ResourceExecutedContextSealed context)
at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.Next(State& next, Scope& scope, Object& state, Boolean& isCompleted)
at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.InvokeFilterPipelineAsync()
--- End of stack trace from previous location where exception was thrown ---
at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeAsync>g__Awaited|17_0(ResourceInvoker invoker, Task task, IDisposable scope)
at Microsoft.AspNetCore.Builder.RouterMiddleware.Invoke(HttpContext httpContext)
at Microsoft.AspNetCore.Builder.Extensions.MapMiddleware.Invoke(HttpContext context)
at Microsoft.AspNetCore.Builder.Extensions.MapMiddleware.Invoke(HttpContext context)
at Microsoft.AspNetCore.Builder.Extensions.MapMiddleware.Invoke(HttpContext context)
at Microsoft.AspNetCore.Builder.Extensions.MapMiddleware.Invoke(HttpContext context)
at Microsoft.AspNetCore.Builder.Extensions.MapMiddleware.Invoke(HttpContext context)
at Microsoft.AspNetCore.Builder.Extensions.MapMiddleware.Invoke(HttpContext context)
at Microsoft.AspNetCore.Builder.Extensions.MapMiddleware.Invoke(HttpContext context)
at Microsoft.AspNetCore.Builder.Extensions.MapMiddleware.Invoke(HttpContext context)
at Microsoft.AspNetCore.Builder.Extensions.MapMiddleware.Invoke(HttpContext context)
at Microsoft.AspNetCore.Builder.Extensions.MapMiddleware.Invoke(HttpContext context)
at Microsoft.AspNetCore.Builder.Extensions.MapMiddleware.Invoke(HttpContext context)
at Microsoft.AspNetCore.Builder.Extensions.MapMiddleware.Invoke(HttpContext context)
at Microsoft.AspNetCore.Builder.Extensions.MapMiddleware.Invoke(HttpContext context)
at Microsoft.AspNetCore.Builder.Extensions.MapWhenMiddleware.Invoke(HttpContext context)
at Kudu.Services.Web.Tracing.TraceMiddleware.Invoke(HttpContext context)" innerText="Invalid argument" innerStackTrace=" at System.IO.FileStream.CheckFileCall(Int64 result, Boolean ignoreNotSupported)
at System.IO.FileStream.Seek(Int64 offset, SeekOrigin origin)
at System.IO.Compression.ZipArchive.ReadEndOfCentralDirectory()" /><!-- duration: 37ms -->
<step title="Incoming Request" date="2022-04-06T08:57:41.925" url="/Error?type=zip" method="POST" type="request" pid="69,1,16" Connection="Keep-Alive" Content-Type="application/x-www-form-urlencoded" Accept="*/*" Authorization="Bas..." Host="testkuduzipdeoloy.scm.azurewebsites.net" User-Agent="curl/7.68.0" Content-Length="740895" X-Client-IP="■■■■" X-Client-Port="51050" X-WAWS-Unencoded-URL="/api/publish?type=zip" CLIENT-IP="■■■■" X-ARR-LOG-ID="9f5ad4eb-4cde-4a7a-8003-73f39db5bb33" X-SITE-DEPLOYMENT-ID="testkuduzipdeoloy" WAS-DEFAULT-HOSTNAME="testkuduzipdeoloy.scm.azurewebsites.net" X-Forwarded-Proto="https" X-AppService-Proto="https" X-Forwarded-TlsVersion="1.2" >
<step title="Outgoing response" date="2022-04-06T08:57:41.970" type="response" statusCode="400" statusText="BadRequest" /><!-- duration: 12ms -->
</step><!-- duration: 79ms -->
/api/zipDeoloy
with same module, it successfully deploy.-H "Content-Type:"
option, it successfully deploy.zipdeploy via POST /api/zipdeploy
to a Linux App Service is failing, error is related to "Missing content-type boundary".
This was working as of yesterday (16-07-2019).
Relevant snip of stack trace (full trace below):
Error occurred, type: error, text: Missing content-type boundary., stackTrace: at Kudu.Services.MultipartRequestHelper.GetBoundary(MediaTypeHeaderValue contentType, Int32 lengthLimit) in /tmp/KuduLite/Kudu.Services/Util/MultipartRequestHelper.cs:line 17
at Kudu.Services.FileStreamingHelper.StreamFile(HttpRequest request, Stream targetStream) in /tmp/KuduLite/Kudu.Services/Util/FileStreamingHelper.cs:line 29
at Kudu.Services.Deployment.PushDeploymentController.PushDeployAsync(ZipDeploymentInfo deploymentInfo, Boolean isAsync, HttpContext context) in /tmp/KuduLite/Kudu.Services/Deployment/PushDeploymentController.cs:line 225
at Kudu.Services.Deployment.PushDeploymentController.ZipPushDeploy(Boolean isAsync, String author, String authorEmail, String deployer, String message) in /tmp/KuduLite/Kudu.Services/Deployment/PushDeploymentController.cs:line 94
With PowerShell, follow Example 2 from https://github.com/projectkudu/kudu/wiki/REST-API#sample-of-using-rest-api-with-powershell:
$username = "`$website"
$password = "pwd"
$base64AuthInfo = [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes(("{0}:{1}" -f $username, $password)))
$userAgent = "powershell/1.0"
# Example 2: call the zipdeploy API (which uses POST)
$apiUrl = "https://{sitename}.scm.azurewebsites.net/api/zipdeploy"
$filePath = "C:\Temp\foo.zip"
Invoke-RestMethod -Uri $apiUrl -Headers @{Authorization=("Basic {0}" -f $base64AuthInfo)} -Method POST -InFile $filePath -ContentType "multipart/form-data"
The zip file is a packaged web app, which was previously deployed successfully via zipdeploy.
Request fails with a 500
:
Invoke-RestMethod : The remote server returned an error: (500) Internal Server Error.
The kudu trace logs show an exception:
2019-07-17T13:26:49 Startup Request, url: /api/zipdeploy, method: POST, type: request, pid: 72,1,4, ScmType: None
2019-07-17T13:26:51 Error occurred, type: error, text: Missing content-type boundary., stackTrace: at Kudu.Services.MultipartRequestHelper.GetBoundary(MediaTypeHeaderValue contentType, Int32 lengthLimit) in /tmp/KuduLite/Kudu.Services/Util/MultipartRequestHelper.cs:line 17
at Kudu.Services.FileStreamingHelper.StreamFile(HttpRequest request, Stream targetStream) in /tmp/KuduLite/Kudu.Services/Util/FileStreamingHelper.cs:line 29
at Kudu.Services.Deployment.PushDeploymentController.PushDeployAsync(ZipDeploymentInfo deploymentInfo, Boolean isAsync, HttpContext context) in /tmp/KuduLite/Kudu.Services/Deployment/PushDeploymentController.cs:line 225
at Kudu.Services.Deployment.PushDeploymentController.ZipPushDeploy(Boolean isAsync, String author, String authorEmail, String deployer, String message) in /tmp/KuduLite/Kudu.Services/Deployment/PushDeploymentController.cs:line 94
at Microsoft.AspNetCore.Mvc.Internal.ActionMethodExecutor.TaskOfIActionResultExecutor.Execute(IActionResultTypeMapper mapper, ObjectMethodExecutor executor, Object controller, Object[] arguments)
at System.Threading.Tasks.ValueTask`1.get_Result()
at Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.InvokeActionMethodAsync()
at Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.InvokeNextActionFilterAsync()
at Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.Rethrow(ActionExecutedContext context)
at Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.Next(State& next, Scope& scope, Object& state, Boolean& isCompleted)
at Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.InvokeInnerFilterAsync()
at Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.InvokeNextResourceFilter()
at Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.Rethrow(ResourceExecutedContext context)
at Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.Next(State& next, Scope& scope, Object& state, Boolean& isCompleted)
at Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.InvokeFilterPipelineAsync()
at Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.InvokeAsync()
at Microsoft.AspNetCore.Builder.RouterMiddleware.Invoke(HttpContext httpContext)
at Microsoft.AspNetCore.Builder.Extensions.MapMiddleware.Invoke(HttpContext context)
at Microsoft.AspNetCore.Builder.Extensions.MapMiddleware.Invoke(HttpContext context)
at Microsoft.AspNetCore.StaticFiles.StaticFileMiddleware.Invoke(HttpContext context)
at Swashbuckle.AspNetCore.SwaggerUI.SwaggerUIMiddleware.Invoke(HttpContext httpContext)
at Swashbuckle.AspNetCore.Swagger.SwaggerMiddleware.Invoke(HttpContext httpContext, ISwaggerProvider swaggerProvider)
at Microsoft.AspNetCore.StaticFiles.StaticFileMiddleware.Invoke(HttpContext context)
at Microsoft.AspNetCore.StaticFiles.StaticFileMiddleware.Invoke(HttpContext context)
at Microsoft.AspNetCore.Builder.Extensions.MapMiddleware.Invoke(HttpContext context)
at Microsoft.AspNetCore.Builder.Extensions.MapMiddleware.Invoke(HttpContext context)
at Microsoft.AspNetCore.Builder.Extensions.MapMiddleware.Invoke(HttpContext context)
at Microsoft.AspNetCore.Builder.Extensions.MapMiddleware.Invoke(HttpContext context)
at Microsoft.AspNetCore.Builder.Extensions.MapMiddleware.Invoke(HttpContext context)
at Microsoft.AspNetCore.Builder.Extensions.MapMiddleware.Invoke(HttpContext context)
at Microsoft.AspNetCore.Builder.Extensions.MapMiddleware.Invoke(HttpContext context)
at Microsoft.AspNetCore.Builder.Extensions.MapMiddleware.Invoke(HttpContext context)
at Microsoft.AspNetCore.Builder.Extensions.MapWhenMiddleware.Invoke(HttpContext context)
at Microsoft.AspNetCore.StaticFiles.StaticFileMiddleware.Invoke(HttpContext context)
at Kudu.Services.Web.Tracing.TraceMiddleware.Invoke(HttpContext context) in /tmp/KuduLite/Kudu.Services.Web/Tracing/TraceMiddleware.cs:line 53
2019-07-17T13:26:51 Error occurred, type: error, text: Missing content-type boundary., stackTrace: at Microsoft.AspNetCore.Http.Features.FormFeature.GetBoundary(MediaTypeHeaderValue contentType, Int32 lengthLimit)
at Microsoft.AspNetCore.Http.Features.FormFeature.InnerReadFormAsync(CancellationToken cancellationToken)
at Microsoft.AspNetCore.Antiforgery.Internal.DefaultAntiforgeryTokenStore.GetRequestTokensAsync(HttpContext httpContext)
at Microsoft.AspNetCore.Antiforgery.Internal.DefaultAntiforgery.ValidateRequestAsync(HttpContext httpContext)
at Microsoft.AspNetCore.Mvc.ViewFeatures.Internal.ValidateAntiforgeryTokenAuthorizationFilter.OnAuthorizationAsync(AuthorizationFilterContext context)
at Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.InvokeFilterPipelineAsync()
at Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.InvokeAsync()
at Microsoft.AspNetCore.Builder.RouterMiddleware.Invoke(HttpContext httpContext)
at Microsoft.AspNetCore.Builder.Extensions.MapMiddleware.Invoke(HttpContext context)
at Microsoft.AspNetCore.Builder.Extensions.MapMiddleware.Invoke(HttpContext context)
at Microsoft.AspNetCore.StaticFiles.StaticFileMiddleware.Invoke(HttpContext context)
at Swashbuckle.AspNetCore.SwaggerUI.SwaggerUIMiddleware.Invoke(HttpContext httpContext)
at Swashbuckle.AspNetCore.Swagger.SwaggerMiddleware.Invoke(HttpContext httpContext, ISwaggerProvider swaggerProvider)
at Microsoft.AspNetCore.StaticFiles.StaticFileMiddleware.Invoke(HttpContext context)
at Microsoft.AspNetCore.StaticFiles.StaticFileMiddleware.Invoke(HttpContext context)
at Microsoft.AspNetCore.Builder.Extensions.MapMiddleware.Invoke(HttpContext context)
at Microsoft.AspNetCore.Builder.Extensions.MapMiddleware.Invoke(HttpContext context)
at Microsoft.AspNetCore.Builder.Extensions.MapMiddleware.Invoke(HttpContext context)
at Microsoft.AspNetCore.Builder.Extensions.MapMiddleware.Invoke(HttpContext context)
at Microsoft.AspNetCore.Builder.Extensions.MapMiddleware.Invoke(HttpContext context)
at Microsoft.AspNetCore.Builder.Extensions.MapMiddleware.Invoke(HttpContext context)
at Microsoft.AspNetCore.Builder.Extensions.MapMiddleware.Invoke(HttpContext context)
at Microsoft.AspNetCore.Builder.Extensions.MapMiddleware.Invoke(HttpContext context)
at Microsoft.AspNetCore.Builder.Extensions.MapWhenMiddleware.Invoke(HttpContext context)
at Microsoft.AspNetCore.StaticFiles.StaticFileMiddleware.Invoke(HttpContext context)
at Kudu.Services.Web.Tracing.TraceMiddleware.Invoke(HttpContext context) in /tmp/KuduLite/Kudu.Services.Web/Tracing/TraceMiddleware.cs:line 53
Are there any plans to enable Docker CLI from KuduLite?
I use Azure App Service with image hosted on docker hub. The container has no SSH enabled and yes I know there is a way to enable it and it is well documented but it means:
All that just to inspect something within the container whereas with CLI enabled I could just go to Kudu and
docker exec -t -i mycontainer /bin/bash
When using ZipDeploy with external url requests are failing with 400 errors.
When certain app settings like
WEBSITE_CONTENTSHARE
WEBSITE_CONTENTAZUREFILECONNECTIONSTRING
are missing it can cause functions main site fail to load content correctly. Emit some warning logs in the deployment logs sent to the client as part of ZipDeploy to make debugging easier.
Due to validations fail in headers , zipDeploy is failing with 404. The best fix for this is to not add all the appsettings as part of headers and rather read them through app settings secret file.
Logs from envoy pods
[2021-11-01 13:07:46.151][1][warning][config] [source/common/config/grpc_subscription_impl.cc:126] gRPC config for type.googleapis.com/envoy.config.route.v3.RouteConfiguration rejected: Proto constraint validation failed (RouteConfigurationValidationError.VirtualHosts[1]: embedded message failed validation | caused by VirtualHostValidationError.RequestHeadersToAdd[4]: embedded message failed validation | caused by HeaderValueOptionValidationError.Header: embedded message failed validation | caused by HeaderValueValidationError.Value: value does not match regex pattern "^[^\x00\n\r]*$"): name: "internal_https_route"
virtual_hosts {
name: "k8se-apps_kafka-js-sample"
domains: "kafka-js-sample.internal.k4apps-example.io"
domains: "kafka-js-sample.internal.k4apps-example.io:*"
routes {
match {
prefix: "/admin"
}
route {
cluster: "k8se-apps_kafka-js-sample"
timeout {
seconds: 1800
}
idle_timeout {
seconds: 240
}
upgrade_configs {
upgrade_type: "websocket"
enabled {
value: true
}
}
}
request_headers_to_add {
header {
key: "x-k8se-app-name"
value: "kafka-js-sample"
}
append {
}
}
request_headers_to_add {
header {
key: "x-k8se-app-namespace"
value: "k8se-apps"
}
append {
}
}
request_headers_to_add {
header {
key: "x-k8se-secret-endpoint-name"
value: "kafka-js-sample-secrets"
}
append {
}
}
request_headers_to_add {
header {
key: "x-k8se-app-framework"
value: "NODE|14"
}
append {
}
}
request_headers_to_add {
header {
key: "x-k8se-protocol"
value: "http1"
}
append {
}
}
request_headers_to_add {
header {
key: "x-k8se-app-kind"
value: "functionapp"
}
append {
}
}
request_headers_to_add {
header {
key: "content-type"
value: "application/json"
}
append {
value: true
}
}
typed_per_filter_config {
key: "envoy.filters.http.rbac"
value {
}
}
}
routes {
match {
prefix: "/"
}
route {
cluster: "k8se-apps_kafka-js-sample"
timeout {
seconds: 1800
}
idle_timeout {
seconds: 240
}
upgrade_configs {
upgrade_type: "websocket"
enabled {
value: true
}
}
}
request_headers_to_add {
header {
key: "x-k8se-app-name"
value: "kafka-js-sample"
}
append {
}
}
request_headers_to_add {
header {
key: "x-k8se-app-namespace"
value: "k8se-apps"
}
append {
}
}
request_headers_to_add {
header {
key: "x-k8se-secret-endpoint-name"
value: "kafka-js-sample-secrets"
}
append {
}
}
request_headers_to_add {
header {
key: "x-k8se-app-framework"
value: "NODE|14"
}
append {
}
}
request_headers_to_add {
header {
key: "x-k8se-protocol"
value: "http1"
}
append {
}
}
request_headers_to_add {
header {
key: "x-k8se-app-kind"
value: "functionapp"
}
append {
}
}
typed_per_filter_config {
key: "envoy.filters.http.rbac"
value {
}
}
}
request_headers_to_add {
header {
key: "X-ARR-SSL"
value: "true"
}
append {
}
}
retry_policy {
retry_on: "reset,connect-failure,refused-stream,retriable-headers"
num_retries {
value: 5
}
retriable_headers {
name: "x-ms-k8se-activator-retry"
}
}
}
virtual_hosts {
name: "k8se-apps_kafka-js-sample_scm_internal"
domains: "kafka-js-sample.scm.internal.k4apps-example.io"
domains: "kafka-js-sample.scm.internal.k4apps-example.io:*"
routes {
match {
prefix: "/"
}
route {
cluster: "build_server_scm"
idle_timeout {
seconds: 240
}
}
typed_per_filter_config {
key: "envoy.filters.http.rbac"
value {
}
}
}
request_headers_to_add {
header {
key: "K8SE_APP_NAME"
value: "kafka-js-sample"
}
append {
}
}
request_headers_to_add {
header {
key: "x-k8se-app-name"
value: "kafka-js-sample"
}
append {
}
}
request_headers_to_add {
header {
key: "x-k8se-app-namespace"
value: "k8se-apps"
}
append {
}
}
request_headers_to_add {
header {
key: "K8SE_APP_TYPE"
value: "functionapp"
}
append {
}
}
request_headers_to_add {
header {
key: "APPSETTING_WEBSITE_AUTH_ENCRYPTION_KEY"
value: "cQuYwPZZAJ3F/FFkt3TOwC0L+hEgZs2QRbvd9Ih0xs0=\n"
}
append {
}
}
}
response_headers_to_remove: "x-envoy-upstream-service-time"
[2021-11-01 13:07:46.151][1][warning][config] [source/common/config/grpc_subscription_impl.cc:126] gRPC config for type.googleapis.com/envoy.config.route.v3.RouteConfiguration rejected: Proto constraint validation failed (RouteConfigurationValidationError.VirtualHosts[1]: embedded message failed validation | caused by VirtualHostValidationError.RequestHeadersToAdd[4]: embedded message failed validation | caused by HeaderValueOptionValidationError.Header: embedded message failed validation | caused by HeaderValueValidationError.Value: value does not match regex pattern "^[^\x00\n\r]*$"): name: "external_https_route"
virtual_hosts {
name: "k8se-apps_kafka-js-sample"
domains: "kafka-js-sample.k4apps-example.io"
domains: "kafka-js-sample.k4apps-example.io:*"
routes {
match {
prefix: "/admin"
}
route {
cluster: "k8se-apps_kafka-js-sample"
timeout {
seconds: 1800
}
idle_timeout {
seconds: 240
}
upgrade_configs {
upgrade_type: "websocket"
enabled {
value: true
}
}
}
request_headers_to_add {
header {
key: "x-k8se-app-name"
value: "kafka-js-sample"
}
append {
}
}
request_headers_to_add {
header {
key: "x-k8se-app-namespace"
value: "k8se-apps"
}
append {
}
}
request_headers_to_add {
header {
key: "x-k8se-secret-endpoint-name"
value: "kafka-js-sample-secrets"
}
append {
}
}
request_headers_to_add {
header {
key: "x-k8se-app-framework"
value: "NODE|14"
}
append {
}
}
request_headers_to_add {
header {
key: "x-k8se-protocol"
value: "http1"
}
append {
}
}
request_headers_to_add {
header {
key: "x-k8se-app-kind"
value: "functionapp"
}
It seems to be hard coded as /tmp/build-debug.log
.
https://github.com/Azure-App-Service/KuduLite/blob/dev/Kudu.Core/Deployment/Oryx/OryxArgumentsHelper.cs#L64
Is it possible to change log location under $HOME/LogFiles
?
It will be useful when troubleshooting.
https://azureossd.github.io/2023/02/09/troubleshooting-nodejs-deployments-on-appservice-linux/index.html#unexpected-error
For linux, we don't support siteversion.txt
. For a zipdeploy, we always need to set packagename.txt
instead.
Swap operation fails when WEBSITES_ENABLE_APP_CACHE=true is set only in production. If you check the documentation, it doesn't mention that this setting needs to be enabled in all slots:
https://github.com/Azure-App-Service/KuduLite/wiki/App-Cache
I think it would be valuable to add a mention of this situation to the documentation page.
When using WEBSITES_ENABLE_APP_CACHE
is it actually a read only volume that is mounted to /home/site/wwwroot
?
I'm testing out the WEBSITES_ENABLE_APP_CACHE
app setting on a App service hosting a NextJS application on App service on linux. Because we are experiencing some serious latency on cold start, which we suspect is latency related to fetching module files from Azure Storage. The NextJS cache folder is deleted on publish or restart of site, but the site recreates the folder and add files (images) to the folder.
If the volume was read only this should not be possible, but maybe for some reason the setting is not activating the cache in my App service? Ho can I tell that the cache is active? Other than the environment setting.
The cache folder is located at /home/site/wwwroot/.next/cache
.
I'm also facing av problem with disable the feature. After removing the setting, it is not possible to deploy new versions of the app. The deployment looks successfully i Azure DevOps release pipeline, but the web application still serves the old version. I had to re enable the cache by adding the app setting WEBSITES_ENABLE_APP_CACHE
back, then do a new deploy, an finally the new version was served by the app service.
The https://github.com/Azure-App-Service/KuduLite/wiki/App-Cache docs page heavily hints on App Cache only being a feature of Linux App Services, and the Local Cache docs warns about it being a Linux substitute to the Windows-only Local Cache but it's not explicitly stated that Windows is not supported. From my testing, it seems it's a Linux-only feature (in any case, configuring it doesn't seem to help under Windows).
BTW I'm working on the OrchardCMS/OrchardCore#14859 issue where it seems our performance problems with an Orchard Core feature are due to file IO being slow under a Windows App Service.
Linux Consumption does not support deployment with WEBSITE_RUN_FROM_PACKAGE = 1. This feature development is in progress on KuduLite and will be tracked here.
Virtual File System uses "application/octet-stream" mime type for .log files in KuduLite. This breaks some scenarios where curl
to get logfiles doesn't work. We would need to change it to "text/plain" to ensure old scenarios from Kudu don't break.
Ex:
KuduLite/Kudu.Core/Tracing/Analytics.cs
Line 27 in 8e3adac
ILB-ASE Function App.
Use devops to deploy. SCM Type VSTSRM.
Symptoms:
Deployments logs showed status "succeed" but files remained unchanged. 07-03
Found this exception during this deployments.
Afterwards, when deployments are without this exception, deployments are all healthy. 07-05 to 07-09
We have disabled the kudulite from setting currently.
Is this exception caused by Kudulite?
If it is, is there anyway not using KuduLite as the default option except adding the setting.
Open() at /tmp/KuduLite/Kudu.Core/Deployment/DeploymentStatusFile.cs:75 System.IO.IOException: The process cannot access the file '/home/site/deployments/1633388cead3453a9d77be9e75c3704d/status.xml' because it is being used by another process.
at System.IO.FileStream.Init(FileMode mode, FileShare share)
at System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access, FileShare share, Int32 bufferSize, FileOptions options)
at System.IO.Abstractions.FileWrapper.OpenRead(String path)
at Kudu.Core.Deployment.DeploymentStatusFile.<>c__DisplayClass6_0.b__0() in /tmp/KuduLite/Kudu.Core/Deployment/DeploymentStatusFile.cs:line 82
During kudulite function app build, if the client tries at any point of time to poll the deployment status and logs, we get locking issues which often cause the deployment to fail.
As a work-around, at the moment, the client is using /api/isdeploying
endpoint to check if any deployments are ongoing. This can be unreliable if as it's not associated with a specific deployment id. Even with this setup, I still see a status.lock
file in /home/site/locks
with this error below --
"OperationName": "Getting deployment status",
"AcquiredDateTime": "<my-timestamp>",
"StackTrace": " at System.Environment.get_StackTrace()\n at Kudu.Core.Infrastructure.WindowsLockFile.WriteLockInfo(String operationName, Stream lockStream)
in /tmp/KuduLite/Kudu.Core/Infrastructure/WindowsLockFile.cs:line 212
...
I have setup github actions for deployment of a laravel app in linux app service
When the WEBSITES_ENABLE_APP_CACHE is set true, the deployment seems to work as expected
Command: bash deploy.sh
Handling Basic Web Site deployment.
Kudu sync from: '/tmp/zipdeploy/extracted' to: '/home/site/wwwroot'
Ignoring: .deployment
Copying file: '.gitattributes'
Copying file: '.gitignore'
Copying file: '.gitmodules'
Copying file: 'Readme.md'
Copying file: 'artisan'
Copying file: 'composer.json'
Copying file: 'composer.lock'
Ignoring: deploy.sh
...
But then when I go to .scm.azurewebsites.net/webssh/host under home/site/wwwroot
I see only the default hostingstart.html
If I disable the WEBSITES_ENABLE_APP_CACHE, then i can see all the project files under home/site/wwwroot
Is there a way to make WEBSITES_ENABLE_APP_CACHE work with github actions or must I use a different option like App Service Build Service.
?
Getting site publishing info...
Creating archive for current directory...
Perform remote build for functions project (--build remote).
Uploading 390.89 KB [#############################################################################]
Remote build in progress, please wait...
Updating submodules.
Preparing deployment for commit id '1fcf65a885'.
Running oryx build...
App container will begin restart within 10 seconds.
Remote build failed!
Reported by @aluong
Since the endpoint /api/functions/synctrigger is missing so far, when user clicking the refresh button in portal, will receive a 404 response.
Failures are getting converted to 404 since the error page is diabled.
When setting FUNCTION_WORKER_RUNTIME
to dotnet
and ENABLE_ORYX_BUILD
to true
, the option --platform-version
of the oryx build command seems to be from an App Setting FUNCTION_EXTENSION_VERSION
.
For example, if setting FUNCTION_EXTENSION_VERSION
to ~4
,
the command option is set to --platform-version ~4
as the following screenshot.
It means when building by using .NET5/6 SDK, the App Setting FUNCTION_WORKER_RUNTIME
should be set to ~5
/~6
.
Of course, these values are invalid for the function host, then the host is down by the setting.
Could you please check if this is expected behavior?
The codes for selecting the version are these lines.
KuduLite/Kudu.Core/Deployment/Oryx/FunctionAppOryxArguments.cs
Lines 87 to 92 in 3854066
Hi all,
My Azure Function project is failing to deploy from VSTS (Azure DevOps). The logs have no relevant information that would help diagnose the issue. Similar projects with similar configurations and everything deploy just fine. I'm at a loss since there is no way to know what the issue is.
2022-03-29T18:28:04.3407860Z ##[section]Starting: Azure Function App Deploy
2022-03-29T18:28:04.3423219Z ==============================================================================
2022-03-29T18:28:04.3423627Z Task : Azure Functions
2022-03-29T18:28:04.3424081Z Description : Update a function app with .NET, Python, JavaScript, PowerShell, Java based web applications
2022-03-29T18:28:04.3424518Z Version : 1.200.1
2022-03-29T18:28:04.3424791Z Author : Microsoft Corporation
2022-03-29T18:28:04.3425132Z Help : https://aka.ms/azurefunctiontroubleshooting
2022-03-29T18:28:04.3425800Z ==============================================================================
2022-03-29T18:28:04.8651253Z Got service connection details for Azure App Service:'pex-app-auto-tagger-func4-qa'
2022-03-29T18:28:07.0910443Z Trying to update App Service Application settings. Data: {"AzureWebJobsStorage":"REDACTED","APPINSIGHTS_INSTRUMENTATIONKEY":"5cf863f1-87c9-457a-a0b9-86977bbe1348","AZURE_FUNCTIONS_ENVIRONMENT":"QA","WEBSITE_RUN_FROM_PACKAGE":"REDACTED.zip?***"}
2022-03-29T18:28:08.4219857Z Updated App Service Application settings.
2022-03-29T18:28:08.4222630Z Updated WEBSITE_RUN_FROM_PACKAGE Application setting to REDACTED.zip?***
2022-03-29T18:28:13.4233015Z Syncing triggers for function app
2022-03-29T18:29:08.7561306Z ##[error]Error: Failed to sync triggers for function app 'pex-app-auto-tagger-func4-qa'. Error: BadRequest - Encountered an error (InternalServerError) from host runtime. (CODE: 400)
2022-03-29T18:29:09.2520450Z Successfully added release annotation to the Application Insight : pex-app-auto-tagger-qa
2022-03-29T18:29:09.4738829Z App Service Application URL: REDACTED
2022-03-29T18:29:09.4802122Z ##[section]Finishing: Azure Function App Deploy
/newui
. But it will be a different instance than the one you selected.Expected: Selected instance ID page.
Actual: Not the selected instance ID page. (randomly)
When redirecting to /newui
, a cookie header like this is added...
Send cookie header:
Cookie: ARRAffinity=[object HTMLElement]; LoginNonce_405edcea=...; FedAuth1=....; ARRAffinity=34c46695ee21dee374a8022dd9e40334ed71886d093d06e62f05cd45b369eac5; ARRAffinitySameSite=34c46695ee21dee374a8022dd9e40334ed71886d093d06e62f05cd45b369eac5
There are two ARRAffinity
cookies being sent, which I think is causing unexpected results.
Maybe, this code is wrong.
Before the redirect, Set the NavigateToInstance
function in ajax to a cookie.
So clickLink function
should be unnecessary.
The proof is that It works if you overwrite the clickLink
function before the operation.
// from Chrome DevTools Console
function clickLink(){ }; // overwrite
@sanchitmehta - Is there a plan to move to .Net Core 3.1 and .Net Core 2.2 is out of LTS?
KuduLite/Kudu.Core/Kudu.Core.csproj
Line 4 in 97b2a5b
Issue:
In dev branch,
Kudu.Core\Helpers\PostDeploymentHelper.cs : 681
It does not support ".sh" file as a script.
Suggestions:
Add ".sh" into the where clause to support bash script file
Branch:
master
Docker Image:
appsvc/kudulite:1904042040
Steps to reproduce:
python_deploy.zip
Create new folder containing the following file structure
│ host.json
│ local.settings.json
│ requirements.txt
│
├───HttpTrigger
│ function.json
│ sample.dat
│ init.py
│
└───TimerTrigger
function.json
readme.md
sample.dat
init.py
Zip all files in the folder with Powershell command
Compress-Archive * -DestinationPath python_deploy.zip
Post the file to /api/zipdeploy endpoint
Use docker exec -it <kudulite-container> bash -c "ls /tmp/zipdeploy/extracted"
to inspect the folder structure.
The folder structure is destroyed as you can see in the output
HttpTrigger\__init__.py TimerTrigger\function.json local.settings.json
HttpTrigger\function.json TimerTrigger\readme.md requirements.txt
HttpTrigger\sample.dat TimerTrigger\sample.dat
TimerTrigger\__init__.py host.json
Suggestion:
Maybe the issue is caused by the extract() method in Kudu.Core\Infrastructure\ZipArchiveExtensions.cs
Miscellaneous:
Confirmed with @sanchitmehta that the issue only happens when the files are archived in Windows. Does not affect Linux zipped archive.
Volatile logs must detect container restart logs (which are new files)
Add checks for Python Functions App (Dedicated and Consumption).
Default the oryx build to
FRAMEWORK
FRAMEWORK_VERSION
If these two variables are not set,
we fall back to default verison
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.