如何基于Powershell脚本同步Azure AppService git?

时间:2016-01-25 18:33:24

标签: powershell azure azure-web-sites

我有一个从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分支中更改某些内容时,我有两个选择:

  1. 自动化:在Jenkins中再次执行RecreateXXXAppService,等待大约1-2分钟(检测,删除和创建App Service时),我已部署更改。
  2. 手动:转到azure portal,选择应用服务,持续部署,然后点击同步。它只需要15-20秒。 (查看截图)enter image description here
  3. 我的问题是:

    如何从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}
    

3 个答案:

答案 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来完成同样的事情。

首先,设置:

  1. 复制Azure门户中的Git clone url(将两个刀片备份到主Web应用程序门户页面)。我看起来像https://robrich@thedescriptivename.scm.azurewebsites.net:443/thedescriptivename.git
  2. 设置/获取Git部署凭据。转到Azure站点中的“部署凭据”刀片,然后设置您要使用的凭据。如果你之前已经完成了这个(我认为你有),那么你可以使用你之前设置的凭据。
  3. 在项目的工作目录(.git文件夹所在的位置)中打开命令提示符或powershell。
  4. 添加名为“azure”的第二个遥控器(如原点):git remote add azure https://{that_url_you_copied_above}
  5. 现在让我们从命令行进行实验:

    1. 更改并提交未推送到Jenkins的内容。
    2. 在项目的工作目录(.git文件夹所在的位置)中打开命令提示符或powershell。这可以与您上面使用的cmd相同。
    3. 推送更改:git push origin azure
    4. 如果您之前没有这样推过,它会邀请您登录。使用您从上面创建/记住的凭据。
    5. 观看门户网站,注意新的更改,并部署新代码。
    6. 现在它工作了,让我们把它添加到powershell:

      1. git push origin azure
      2. 请注意,您需要修改上面的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