Giter VIP home page Giter VIP logo

kudulite's People

Contributors

anandanthony avatar ankitkumarr avatar balag0 avatar divyagandhisethi avatar dorfire avatar hazhzeng avatar jennylawrance avatar jjk2673 avatar karshinlin avatar maiqbal11 avatar michimune avatar nlucas2 avatar patricklee2 avatar ppvasude avatar puneetg1983 avatar purva-vasudeo avatar sanchitmehta avatar satishranjan avatar shrishrirang avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

kudulite's Issues

/api/publish fail with 400 Artifact type '' not supported

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

Elastic Premium Function App builds are slow

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 400 error due to Central Directory corrupt.

Problem

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

Repro Step:

curl -X POST -u <deployment_user> --data-binary @"<zip_file_path>" https://<app_name>.scm.azurewebsites.net/api/publish?type=zip

Environment:

1.0.0.7 (e59ed50ca2)

Log:

> 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.&lt;&gt;c__DisplayClass9_0.&lt;&lt;FetchDeploy&gt;b__0&gt;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.&lt;InvokeActionMethodAsync&gt;g__Awaited|12_0(ControllerActionInvoker invoker, ValueTask`1 actionResultValueTask)
   at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.&lt;InvokeNextActionFilterAsync&gt;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&amp; next, Scope&amp; scope, Object&amp; state, Boolean&amp; 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.&lt;InvokeNextResourceFilter&gt;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&amp; next, Scope&amp; scope, Object&amp; state, Boolean&amp; 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.&lt;InvokeAsync&gt;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 -->

Misc

  • This error occur on only Linux(Kudulite). On Windows, same command with same module successfully deploy.
  • When I use /api/zipDeoloy with same module, it successfully deploy.
  • When I remove Content-Type request header with -H "Content-Type:" option, it successfully deploy.

POST /api/zipdeploy failing with "Missing content-type boundary"

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

Repro

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.

Error

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

Docker CLI from KuduLite

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:

  1. I have to pull the image from docker hub to my localhost.
  2. Enable SSH, change entrypoint, build a new image
  3. Setup Azure Container Registry
  4. Push modified image to ACR
  5. Configure Azure App Service to pull from ACR

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

[Premium] Emit warning logs if app settings are missing

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.

/api/ZipDeploy Fails with 404 due to app settings data in headers

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"
      }

`WEBSITES_ENABLE_APP_CACHE` actually read only volume?

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.

Clarify if App Cache is only for Linux

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.

VFS Based logfiles should have text/plain mimetype

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.

In deployments, /KuduLite throw out System.IO.IOException: The process cannot access the file

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

Getting deployment status and logs can cause race conditions

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
...

Is WEBSITES_ENABLE_APP_CACHE=true compatible GITHUB ACTION DEPLOYMENT ? (Linux app service)

I have setup github actions for deployment of a laravel app in linux app service

image

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

image

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.?

Support for Functions v3 remote build in linux consumption.

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!

Endpoint /api/functions/synctrigger is missing

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.

  1. We should migrate the synctrigger endpoint from kudu to here.
  2. The portal re-design is on the way, the new portal button will call the ARM API, the ARM API will forward the synctrigger request to function runtime. In this case, once the new portal page rolls out, Kudulite's synctrigger logic should be removed.

`--platform-version` option for oryx build command is from the App Setting `FUNCTION_EXTENSION_VERSION`

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,
image
the command option is set to --platform-version ~4 as the following screenshot.
image

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.

var workerVersion = ResolveWorkerRuntimeVersion(FunctionsWorkerRuntime);
if (!string.IsNullOrEmpty(workerVersion))
{
Version = workerVersion;
OryxArgumentsHelper.AddLanguageVersion(args, workerVersion);
}

Error: Failed to sync triggers for function app

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

Switch Instance does not work. (KuduLite 1.0.0.7)

  • Webapps for linux
  • KuduLite 1.0.0.7

Reproduction

  • Run of 2 instances or many
  • Select any instances from switch instances dropdown.
  • Redirect to /newui. But it will be a different instance than the one you selected.

expected/actual

Expected: Selected instance ID page.
Actual: Not the selected instance ID page. (randomly)

When redirecting to /newui, a cookie header like this is added...

image

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.

Problem code

Maybe, this code is wrong.

document.getElementById("curr-instance") +

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

[Bug] api/zipdeploy extraction flattens Windows folder structure

Branch:
master

Docker Image:
appsvc/kudulite:1904042040

Steps to reproduce:
python_deploy.zip

  1. 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

  2. Zip all files in the folder with Powershell command
    Compress-Archive * -DestinationPath python_deploy.zip

  3. Post the file to /api/zipdeploy endpoint

  4. Use docker exec -it <kudulite-container> bash -c "ls /tmp/zipdeploy/extracted" to inspect the folder structure.

  5. 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.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.