【问题标题】:Azure project Kudu accepts uploaded zip file to the Zipdeploy endpoint but does not deployAzure 项目 Kudu 接受上传的 zip 文件到 Zipdeploy 端点但不部署
【发布时间】:2018-04-23 23:49:59
【问题描述】:

我有一个 ASP.NET Core 2.0 API 作为 Azure 应用服务,并有一个用于 QA 的部署槽,我已经使用了几个月。我在 VS2017 中开发,并使用项目的内置发布到 Azure 应用服务组件发布到 Azure。这工作得很好。

我现在正在尝试将部署移动到 Bamboo 部署服务器。

我通常遵循类似于此链接how to use azure kudu zipdeploy from a bamboo deployment server的过程

在我的 Bamboo 构建中,我运行了一个 Powershell 脚本来调用 dotnet publish 以将发布文件放入输出文件夹中,然后我将这些文件压缩到单个 zip 文件中并将其用作工件。然后,在我的 Bamboo 部署项目中,我引用该工件并运行一个 Powershell 脚本,该脚本使用 Invoke-WebRequest 调用 Kudu 端点,如下所示;

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,在 Head 部分的 Title 属性中也有文本“登录到您的帐户”。我也看到了 DENY (X-Frame-Options: DENY) 这个词,但我不知道这是否与我看到的问题有关。

有什么想法吗?

【问题讨论】:

标签: powershell azure bamboo kudu azure-app-service-envrmnt


【解决方案1】:

我认为问题在于Invoke-WebRequest 不尊重在 URL 中传递的凭据。相反,您需要显式传递基本身份验证标头。

试试这样的:

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

有关相关信息,另请参阅here

【讨论】:

  • 我不得不将 -Method 参数从 PUT 更改为 POST 但除此之外,您提供的链接中的示例有效。谢谢你的帮助。奇怪的是,当我使用 Invoke-WebRequest 时,如果我使用了无效的凭据,它会给我一个 401,并在我提供正确的凭据时传递一个 200 状态码,但仍然没有上传文件。
  • @whiskytangofoxtrot 我想我可能把你弄糊涂了。我向您指出该示例只是因为它执行 auth 的方式。该示例的其余部分使用 /zip API,它不适合一般部署。所以你真的需要使用/api/zipdeploy API(这是一个POST),但只需改变你做auth的方式。
  • @whiskytangofoxtrot 我编辑了我的答案以获得使用 zipdeploy 的完整示例。
  • @David_Ebbo 我以为您并不是要我实际使用 zip API 并在我的解决方案中使用 ZipDeploy。但感谢您的额外澄清。
  • @whiskytangofoxtrot 很酷,只是确保!有些人一直在使用 zip API 进行部署,这不是一个好的选择。
猜你喜欢
  • 2019-09-12
  • 1970-01-01
  • 1970-01-01
  • 2021-01-09
  • 2012-10-02
  • 1970-01-01
  • 1970-01-01
  • 2015-02-20
  • 1970-01-01
相关资源
最近更新 更多