Powershell Azure project Kudu接受上传到Zipdeploy端点的zip文件,但不部署
我有一个ASP.NET Core 2.0 API作为Azure应用程序服务,它有一个用于QA的部署槽,我已经使用了几个月。我在VS2017中开发,并使用项目的内置发布到Azure应用程序服务组件发布到Azure。这很好用 我现在正试图将部署移动到一个部署服务器 我通常遵循与此链接类似的过程 在我的竹子构建中,我运行一个Powershell脚本调用dotnet publish,将发布文件放在一个输出文件夹中,然后将这些文件压缩到一个zip文件中,并将其用作工件。然后,在我的竹类部署项目中,我引用该工件并运行Powershell脚本,该脚本使用Invoke WebRequest调用Kudu端点,如下所示Powershell Azure project Kudu接受上传到Zipdeploy端点的zip文件,但不部署,powershell,azure,bamboo,kudu,azure-app-service-envrmnt,Powershell,Azure,Bamboo,Kudu,Azure App Service Envrmnt,我有一个ASP.NET Core 2.0 API作为Azure应用程序服务,它有一个用于QA的部署槽,我已经使用了几个月。我在VS2017中开发,并使用项目的内置发布到Azure应用程序服务组件发布到Azure。这很好用 我现在正试图将部署移动到一个部署服务器 我通常遵循与此链接类似的过程 在我的竹子构建中,我运行一个Powershell脚本调用dotnet publish,将发布文件放在一个输出文件夹中,然后将这些文件压缩到一个zip文件中,并将其用作工件。然后,在我的竹类部署项目中,我引用该
Invoke-WebRequest -Uri "https://userName:userPassword@MySiteDeploymentSlot.scm.azurewebsites.net/api/zipdeploy" `
-InFile zipfileName -ContentType "multipart/form-data" -Method Post -UseBasicParsing
Username和UserPassword是我从Azure门户中部署槽的发布配置文件中获得的,ZipFileName是工件中的zip文件,它是我项目的压缩发布输出
注意:我现在使用Kudu URL中的实际值只是为了让流程正常工作,而不必在将用户名和密码属性作为参数传递给Powershell时回勾,其他人在使用Powershell进行此流程时已报告了这些参数
当脚本运行时,我得到以下结果
StatusCode : 200
StatusDescription : OK
Content :
<!DOCTYPE html>
<html dir="ltr" class="" lang="en">
<head>
<title>Sign in to your account</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta http-eq...
RawContent : HTTP/1.1 200 OK
Pragma: no-cache
Strict-Transport-Security: max-age=31536000; includeSubDomains
X-Content-Type-Options: nosniff
X-Frame-Options: DENY
x-ms-request-id: 31607f18-c30a-46f3-bdaf-d84a...
Forms :
Headers : {[Pragma, no-cache], [Strict-Transport-Security, max-age=31536000; includeSubDomains],
[X-Content-Type-Options, nosniff], [X-Frame-Options, DENY]...}
Images : {}
InputFields : {}
Links : {}
ParsedHtml :
RawContentLength : 34599
由于我得到一个状态代码200,我假设它已上载,但当我查看Kudu部署端点时,它不会出现在部署列表中
我的理解是,您只需将一个zip文件上载到Kudu zipdeploy端点,然后将其部署到指定的Azure部署槽中。但当我查看Kudo网站的文件日期时,它们都表明了我一周前在VS2017上做的最后一次发布
很明显,我遗漏了一些东西
从ZipDeploy返回的响应,即使是状态200,也会在标题部分Title属性中的文本登录到您的帐户。我还看到DENY X-Frame-Options:DENY这个词,但我不知道这是否与我看到的问题有关
有什么想法吗?我认为问题在于调用WebRequest不尊重URL中传递的信誉。相反,您需要显式地传递基本auth头 试着这样做:
$webapp = "MyApp"
$username = "`$MyApp"
$password = "ThePasswordFromPublishProfile"
# Note that the $username here should look like `SomeUserName`, and **not** `SomeSite\SomeUserName`
$base64AuthInfo = [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes(("{0}:{1}" -f $username, $password)))
$apiUrl = "https://$webapp.scm.azurewebsites.net/api/zipdeploy"
$filePath = "C:\Temp\books.zip"
Invoke-RestMethod -Uri $apiUrl -Headers @{Authorization=("Basic {0}" -f $base64AuthInfo)} -Method POST -InFile $filePath -ContentType "multipart/form-data"
另请参见相关信息。不确定这是否有帮助。。。我在这里写了一篇关于上传到kudu应用程序的文章:我不得不将-Method参数从PUT改为POST,但除此之外,您提供的链接中的示例起了作用。谢谢你的帮助。奇怪的是,当我使用Invoke WebRequest时,如果我使用了无效凭据,并且在提供正确凭据时传递了200状态码,但仍然没有上载文件,它会给我一个401。我想我可能把你搞糊涂了。我给你指出那个例子只是为了证明它的正确性。该示例的其余部分使用/zip API,这不适合一般部署。所以你真的需要使用/api/zipdeploy api,这是一个帖子,但只需改变你的身份验证方式即可。@Whiskytangofextrot我编辑了我的答案,以获得使用zipdeploy的完整示例。@David_Ebbo我以为你不是有意让我在我的解决方案中实际使用ZipAPI和zipdeploy。但是谢谢你的补充说明。@whiskytangofoxtrot很酷,请确认一下!有些人一直在使用zip API进行部署,这不是一个好的选择。