我有一个从ARM模板创建的 Azure AppService (Web站点微服务)。它包含一个drupal应用程序。我已将其配置为从bitbucket中的git服务器读取。当我第一次创建时,它成功地从bitbucket(master分支)中提取文件。都好 :-) App Service是使用PowerShell脚本创建的,该脚本使用从Jenkins项目启动的ARM模板。该项目名为 ReCreateXXXAppService ,并执行PowerShell,检测AppService是否存在,如果是这种情况则删除它,然后再次部署。
这是我的代码摘要 New-AzureRmResourceGroupDeployment :
$repoUrl = "https://"+$AppServiceUsername+":"+$AppServicePassword+"@bitbucket.org/XXX/as-cms.git"
$params = @{siteName=$AppServiceName ; hostingPlanName="$($AppServiceName)-HP"; siteLocation=$AppServiceLocationName; repoUrl=$repoUrl; branch="master";}
$templateFile = Join-Path $scriptDir "templates\$TemplateName"
Write-Host "Using template file $TemplateFile"
New-AzureRmResourceGroupDeployment -Mode Complete -Force -TemplateParameterObject $params -Name "$($AppServiceName)-dn" -ResourceGroupName $azureResourceGroupName -TemplateFile $templateFile
当我在master分支中更改某些内容时,我有两个选择:
我的问题是:
如何从PowerShell自动化相当于点击“同步”按钮?
注1:有一个类似的问题here,没有答案。
注2:创建源代码控制的模板部分就是这个:
{
"apiVersion": "2014-04-01",
"name": "web",
"type": "sourcecontrols",
"dependsOn": [
"[resourceId('Microsoft.Web/Sites', parameters('siteName'))]",
"[concat('Microsoft.Web/Sites/', parameters('siteName'), '/config/web')]"
],
"properties": {
"RepoUrl": "[parameters('repoUrl')]",
"branch": "[parameters('branch')]",
"IsManualIntegration": true
}
}
注3:我试过@MichaelB的答案没有运气。它似乎工作但不更新文件。输出
Name : as-xxxx-dev01
ResourceId : /subscriptions/a303bbb8-8c07-wq10-8a6a-6c1eceef81bb/resourceGroups/as-rg-xxxx-EUN-DEV01/providers/Microsoft.Web/sites/as-cms-dev01/sourcecontrols/web
ResourceName : as-xxxx-dev01/web
ResourceType : Microsoft.Web/sites/sourcecontrols
ResourceGroupName : as-rg-xxxx-EUN-DEV01
Location : North Europe
SubscriptionId : a303ibb8-7i77-41d0-8a2s-6c1aaaaf81aa
Tags : {System.Collections.Hashtable}
Properties : @{RepoUrl=https://deployments:*******@bitbucket.org/project/as-xxxx.git; Branch=master; IsManualIntegration=False; DeploymentRollbackEnabled=False;
IsMercurial=False; ProvisioningState=Succeeded}
答案 0 :(得分:5)
我自己遇到过类似情况,这似乎是解决方案(或者至少是解决方案)
如果您最初删除了repo,然后重新添加它,它显然会强制重新同步。
Remove-AzureRmResource -ResourceGroupName $AppServiceResourceGroupName `
-ResourceType Microsoft.Web/sites/SourceControls `
-Name $AppServiceWebAppName/Web `
-ApiVersion 2015-08-01 `
-Force
$props = @{
RepoUrl = "https://github.com/{account}/{repo}"
Branch = "master"
isManualIntegration = "false"
}
########## -- Configure Source Control --##########
New-AzureRmResource -ResourceGroupName $AppServiceResourceGroupName `
-ResourceType Microsoft.Web/sites/SourceControls `
-Name $AppServiceWebAppName/Web `
-PropertyObject $props `
-ApiVersion 2015-08-01 `
-Force
答案 1 :(得分:4)
Sync
按钮从BitBucket到Azure的git pull
。您可以直接推送到Azure来完成同样的事情。
首先,设置:
Git clone url
(将两个刀片备份到主Web应用程序门户页面)。我看起来像https://robrich@thedescriptivename.scm.azurewebsites.net:443/thedescriptivename.git
.git
文件夹所在的位置)中打开命令提示符或powershell。git remote add azure https://{that_url_you_copied_above}
。现在让我们从命令行进行实验:
.git
文件夹所在的位置)中打开命令提示符或powershell。这可以与您上面使用的cmd相同。git push origin azure
。现在它工作了,让我们把它添加到powershell:
git push origin azure
请注意,您需要修改上面的URL以包含密码,或者从脚本中找到另一种进行身份验证的方法 - 您可能不希望在每次运行过程中弹出窗口。
为什么这更好还是更糟?你只是跳过Jenkins,所以在部署之前你没有运行你的测试套件。你的部署速度要快得多。仔细权衡这些。
答案 2 :(得分:4)
以下是如何使用API调用来模仿“同步”按钮*。 网站与“外部存储库”部署方法联系在一起。
POST /deploy HTTP/1.1
Host: $SiteLevelUsername:SiteLevelPassword@WebAppName.scm.azurewebsites.net
Content-Type: application/json
Accept: application/json
X-SITE-DEPLOYMENT-ID: WebAppName
Cache-Control: no-cache
{
"format":"basic",
"url":"https://username:password@example.com/git/reponame.git"
}
你还需要一个Content-Length
标题。如果匆忙,你可以使用Transfer-encoding: chunked
来逃避。
200 OK
*来源:我想通过门户网站查看https://github.com/projectkudu/kudu/blob/master/Kudu.Services/ServiceHookHandlers/GenericHandler.cs以及成功“同步”的Kudu跟踪。
D:\home\LogFiles\kudu\trace>head 2016-04-08T10-43-27_2a1598_086_POST_deploy_200_3s.xml
<step title="Incoming Request" date="2016-04-08T10:43:27.636" instance="2a1598"
url="/deploy?scmType=ExternalGit" method="POST" type="request"
pid="35604,2,68" Connection="Keep-Alive" Content-Length="107"
Content-Type="application/json; charset=utf-8" Accept="application/json"
Accept-Language="en-US" Expect="100-continue"
Host="WebAppName.scm.azurewebsites.net"
User-Agent="Azure-Portal/5.16.00298.15"
x-ms-client-request-id="xxxxxxxxxxxx"
x-ms-client-session-id="xxxxxxxxxxx"
X-SITE-DEPLOYMENT-ID="WebAppName"
Azure PowerShell的相同请求:
# Action sync
Invoke-AzureRmResourceAction -ResourceGroupName <ResourceGroupName> `
-ResourceType Microsoft.Web/sites `
-ResourceName <WebAppName> `
-Action sync `
-ApiVersion 2015-08-01 `
-Force -Verbose
# Expected output:
# ----------------
# VERBOSE: Performing the operation "Invoking the 'sync' action
# on the resource." on target
# subscriptions/xx-xx-xx-xx/resourceGroups/xxxx/providers/Microsoft.Web/sites/xxxx".
和卷曲:
:: cmd.exe uses ^ (caret) to escape new lines (the equivalent of \ in bash)
C:\>curl -k -v https://$siteLevelUsername:SiteLevelPassword@WebAppName.scm.azurewebsites.net/deploy ^
-H "Transfer-encoding: chunked" -H "X-SITE-DEPLOYMENT-ID: WebAppName" ^
-H "Content-type: application/json" -H "Accept: application/json" ^
--data-ascii "{ \"format\":\"basic\", \"url\":\"http://user:pass@example.com/git/repo.git\" }"
> POST /deploy HTTP/1.1
> Authorization: Basic xxxxxxxxxxxxxxxxxxx=
> User-Agent: curl/7.28.1
> Host: WebAppName.scm.azurewebsites.net
> Transfer-encoding: chunked
> X-SITE-DEPLOYMENT-ID: WebAppName
> Content-type: application/json
> Accept: application/json
>
> 66
* upload completely sent off: 109 out of 102 bytes
< HTTP/1.1 200 OK
< Cache-Control: private
< Content-Length: 0