通过PowerShell将WebApp文件上载/发布到Azure

时间:2016-06-13 10:43:49

标签: powershell azure

您好我目前在更新用于Azure的旧PowerShell脚本时遇到问题。它最初是在询问用户的几个问题之后编写的。这很简单,因为您可以通过New-AzureWebsite创建一个新网站,然后使用Publish-AzureWebsite上传文件。

我现在正在使用New-AzureRmWebApp,但无法弄清楚如何上传文件,没有发布命令,而Set-AzureRmWebApp命令没有参数来覆盖这个。

有人知道这是否还可以吗?

谢谢,

2 个答案:

答案 0 :(得分:2)

答案 1 :(得分:1)

我知道这是一个老问题,但想与我分享我的经验。

在资源管理器中绝对不是那么简单 - 正常的方法,比如上传一个zip文件,已经被自动化和与其他服​​务(如GitHub)集成甚至与Dropbox同步所篡夺 - 你也可以与之集成一个本地版本的Git,你可以从技术上将git从你的计算机推送到本地" (即网站/应用服务的本地)Git repo。然后,Git repo会从您的推送中部署该网站。

如果您想要简单,也可以使用curl和wget等FTP解决方案。

Web Deploy(msdeploy.exe)等其他解决方案需要安装软件,特别是Visual Studio。

此处列出了有关上述所有部署方法的信息:https://docs.microsoft.com/en-us/azure/app-service-web/web-sites-deploy

我最终使用的解决方案是中途 - Azure App Service的部署引擎称为Kudu。正是这项服务实现了本地Git repo推送,以便从您的Git推送部署您的网站,但它可以做更多。

Kudu has an API我遇到了一个PowerShell脚本,它允许直接从您的计算机上传目录,以便使用Kudu部署到该站点。该脚本最初是为与ASM一起使用而编写的,因此我进行了一些小的更改,以允许它与Resource Manager Web应用程序集成。

为了确保原始作者的记入,要点在于:https://gist.github.com/lwsrbrts/a2c9bfe1949ea0ebe34b6c6d5c0b11b6

那些讨厌发布链接的人的代码:

Param(
[Parameter(Mandatory = $true)]
[string]$websiteName,
[Parameter(Mandatory = $true)]
[string]$resourceGroupName,
[Parameter(Mandatory = $true)]
[string]$sourceDir,
[string]$destinationPath = "/site/wwwroot"
)

# Usage: .\kuduSiteUpload.ps1 -websiteName mySite -sourceDir C:\Temp\mydir -resourceGroupName myResourceGroup

Function d3-KuduUploadDirectory
{
param( 
    [string]$siteName = $( throw "Missing required parameter siteName"),
    [string]$sourcePath = $( throw "Missing required parameter sourcePath"),
    [string]$destinationPath = $( throw "Missing required parameter destinationPath"),
    [string]$resourceGroupName = $( throw "Missing required parameter resourceGroupName")
)

$zipFile = [System.IO.Path]::GetTempFileName() + ".zip"

d3-ZipFiles -zipfilename $zipFile -sourcedir $sourcePath

d3-KuduUploadZip -siteName $siteName -sourceZipFile $zipFile -destinationPath $destinationPath -resourceGroupName $resourceGroupName
}

Function d3-KuduUploadZip
{
param( 
    [string]$siteName = $( throw "Missing required parameter siteName"),
    [string]$sourceZipFile = $( throw "Missing required parameter sourceZipFile"),
    [string]$destinationPath = $( throw "Missing required parameter destinationPath"),
    [string]$resourceGroupName = $( throw "Missing required parameter resourceGroupName")

)

[xml]$publishSettings = Get-AzureRmWebAppPublishingProfile -Format WebDeploy -OutputFile .\Temp.publishsettings -ResourceGroupName $resourceGroupName -Name $siteName
$website = $publishSettings.SelectSingleNode("//publishData/publishProfile[@publishMethod='MSDeploy']")

$timeOutSec = 900

$username = $webSite.userName
$password = $webSite.userPWD
$base64AuthInfo = [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes(("{0}:{1}" -f $username,$password)))

$baseUrl = "https://" + $siteName + ".scm.azurewebsites.net"
$apiUrl = d3-JoinParts ($baseUrl, "api/zip", $destinationPath) '/'

Invoke-RestMethod -Uri $apiUrl -Headers @{Authorization=("Basic {0}" -f $base64AuthInfo)} -Method PUT -InFile $sourceZipFile -ContentType "multipart/form-data" -TimeoutSec $timeOutSec
}

Function d3-JoinParts {
param ([string[]] $Parts, [string] $Separator = '/')

# example:
#  d3-JoinParts ('http://mysite','sub/subsub','/one/two/three') '/'

$search = '(?<!:)' + [regex]::Escape($Separator) + '+'  #Replace multiples except in front of a colon for URLs.
$replace = $Separator
($Parts | ? {$_ -and $_.Trim().Length}) -join $Separator -replace $search, $replace
}

Function d3-ZipFiles
{
Param(
    [Parameter(Mandatory = $true)]
    [String]$zipfilename,
    [Parameter(Mandatory = $true)]
    [String]$sourcedir
)

Add-Type -Assembly System.IO.Compression.FileSystem
$compressionLevel = [System.IO.Compression.CompressionLevel]::Optimal
[System.IO.Compression.ZipFile]::CreateFromDirectory($sourcedir, $zipfilename, $compressionLevel, $false)
}

$startTime = Get-Date
d3-KuduUploadDirectory -siteName $websiteName -sourcePath $sourceDir -destinationPath $destinationPath -resourceGroupName $resourceGroupName
$finishTime = Get-Date
Write-Host (" Total time used (minutes): {0}" -f ($finishTime -$startTime).TotalMinutes)