Как синхронизировать Azure AppService git от Powershell script?

У меня есть Azure AppService (микросервис веб-сайта), созданный из шаблона ARM. Он содержит приложение drupal. Я настроил его для чтения с сервера git в битбакете. Когда я создаю первый раз, он успешно извлекает файлы из битбакета (главная ветка). Все хорошо:-) Служба App создана из PowerShell script, которая использует шаблоны ARM, запущенные из проекта Jenkins. Проект называется 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

Когда я что-то меняю в главной ветке, у меня есть два варианта:

  • Автоматизировано: Запустите RecreateXXXAppService снова в Jenkins, подождите около 1-2 минут (пока приложение App обнаружено, удалено и создано), и у меня есть развернутое изменение.
  • Вручную: Перейдите на портал azure, выберите App Service, Continuous Deployment и нажмите Синхронизировать. Требуется только 15-20 секунд. (Проверьте скриншот) введите описание изображения здесь

Мой вопрос:

Как я могу автоматизировать с PowerShell эквивалент нажатия кнопки "Синхронизация"?

ПРИМЕЧАНИЕ 1: здесь есть аналогичный вопрос , без ответа.

ПРИМЕЧАНИЕ 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}

Ответы

Ответ 1

Как только мы сталкиваемся с подобной ситуацией, кажется, это решение (или, по крайней мере, решение)

Если вы сначала удалите репо, а затем снова добавите его, он будет - очевидно - принудительно выполнить повторную синхронизацию.

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

Ответ 2

Что делает кнопка Sync, это git pull от BitBucket до Azure. Вы можете выполнить одно и то же, просто нажав на Azure.

Сначала установите:

  • Скопируйте Git clone url в Azure Portal (создайте резервную копию двух клинков на главной странице портала веб-приложений). Шахта выглядит как https://[email protected]:443/thedescriptivename.git
  • Установить/получить Git учетные данные развертывания. Перейдите в раздел "Учетные данные развертывания" на сайте Azure и установите учетные данные, которые вы хотите использовать. Если вы сделали это ранее (я думаю, что у вас есть), вы можете просто использовать учетные данные, которые вы установили ранее.
  • Откройте командную строку или powershell в рабочем каталоге проекта (где находится папка .git).
  • Добавьте второй пульт (например, источник) с именем "azure": git remote add azure https://{that_url_you_copied_above}.

Теперь давайте эксперимент из командной строки:

  • Измените и совершите что-то, что не подтолкнуло Дженкинсу.
  • Откройте командную строку или powershell в рабочем каталоге проекта (где находится папка .git). Это может быть тот же самый cmd, который вы использовали выше.
  • Нажмите изменения: git push origin azure.
  • Он пригласит вас войти в систему, если вы этого не сделали раньше. Используйте учетные данные, которые вы создали/запомнили выше.
  • Наблюдайте за новостями портала о новых изменениях и развертывании нового кода.

Теперь, когда он работает, добавьте его в powershell:

  • git push origin azure

Обратите внимание, что вам необходимо изменить URL-адрес выше, чтобы включить пароль или найти другой способ аутентификации из script - вы, вероятно, не хотите, чтобы всплывающее окно было посередине каждого прогона.

Почему это лучше или хуже? Вы просто прыгнули вокруг Дженкинса, поэтому перед развертыванием вы не запускаете свой тестовый пакет. Однако вы развертываете гораздо быстрее. Внимайте их внимательно.

Ответ 3

Здесь, как имитировать кнопку "Синхронизация" с вызовом API *. Сайт подключен к методу развертывания "Внешний репозиторий".

Запрос:

POST /deploy HTTP/1.1

Host: $SiteLevelUsername:[email protected]
Content-Type: application/json
Accept: application/json
X-SITE-DEPLOYMENT-ID: WebAppName
Cache-Control: no-cache

{
    "format":"basic",
    "url":"https://username:[email protected]/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".

и rot:

:: cmd.exe uses ^ (caret) to escape new lines (the equivalent of \ in bash)

C:\>curl -k -v https://$siteLevelUsername:[email protected]/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:[email protected]/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