Развертывание кода из репозитория GitLab в Azure Web App с помощью PowerShell и Azure CLI.

Я хочу настроить непрерывное развертывание из репозитория GitLab в приложение Azure с помощью сценария PowerShell и интерфейса командной строки Azure. Уже есть решение для этого с помощью модуля Azure RM и Windows PowerShell, но так как они теперь устарело, я специально ищу решение, которое использует новый модуль Az. и ядро PowerShell.

Решение должно предоставить сценарий PowerShell (Core) для настройки непрерывного развертывания непосредственно из GitLab в Azure. Он должен использовать модуль Az. После запуска сценария установки каждая последующая фиксация/слияние с репозиторием GitLab должна автоматически развертываться в Azure. Предпочтительно, чтобы этот сценарий PowerShell работал как для общедоступных, так и для частных репозиториев, размещенных в GitLab, но я готов принять решения, которые работают только в общедоступных репозиториях.


person MagicAndi    schedule 17.12.2018    source источник
comment
Обратите внимание, что для того, чтобы все проголосовали за закрытие, я задал этот вопрос, поскольку Windows Powershell и модуль Azure RM устаревают в пользу PowerShell Core и нового модуля Az (с использованием Azure CLI). Я создал этот новый вопрос специально для канонического ответа, используя Azure CLI и Powershell Core. Я планирую предложить вознаграждение за этот вопрос, когда он будет открыт для меня через 2 дня. Спасибо.   -  person MagicAndi    schedule 17.12.2018
comment
@rickvdbosch Этот вопрос создан, чтобы дать канонический ответ для будущей разработки Azure с использованием PowerShell Core и нового модуля Az (с использованием Azure CLI). У меня уже есть ответ на мои конкретные потребности на stackoverflow.com/a/53729332/35483, и я только что наградил вознаграждение за это. Если у меня возникла проблема с этим конкретным вопросом, я буду рад закрыть.   -  person MagicAndi    schedule 17.12.2018
comment
Вы выяснили, как настроить автоматическое развертывание при фиксации? Ответ на предыдущий вопрос выглядит так же, как пример github, теперь он работает с gitlab?   -  person Mike Twc    schedule 18.12.2018
comment
Привет, какие-нибудь обновления по этой проблеме?   -  person Joy Wang    schedule 19.12.2018
comment
@MikeTwc извините, в моем первоначальном комментарии недостаточно места, чтобы упомянуть, что, поскольку в модуле PowerShell AzureRM не ведется дальнейшая разработка, с его помощью никогда не будет возможности настроить автоматизированный CI в репозиторий GitLab в Azure. Единственный способ написать сценарий — использовать Azure CLI (модуль PowerShell Az), как в ответе Джой Ван ниже.   -  person MagicAndi    schedule 19.12.2018
comment
@JoyWang извините, я не очень понимаю, что вы имеете в виду под обновлениями? Вам нужна дополнительная информация для вашего ответа?   -  person MagicAndi    schedule 19.12.2018
comment
@MikeTwc нет, ответ идентичен сценарию на странице docs.microsoft.com/en-gb/azure/app-service/scripts/ Это только настроит ваше веб-приложение с кодом из репозитория Git, но не будет автоматически развертываться при дальнейших коммитах. У вас есть 2 варианта: либо перестроить веб-приложение (в другом слоте развертывания), чтобы получить все дальнейшие фиксации, либо вручную синхронизировать последние фиксации в колонке Центра развертывания портала Azure. Можно настроить автоматизированный CI с помощью GitLab с помощью Azure CLI, отсюда и этот новый вопрос.   -  person MagicAndi    schedule 19.12.2018
comment
Я имею в виду, работает ли мое решение или нет?   -  person Joy Wang    schedule 19.12.2018
comment
@JoyWang спасибо за разъяснение. У меня еще не было возможности протестировать его - я сделаю это сегодня и сообщу вам.   -  person MagicAndi    schedule 19.12.2018
comment
ну, я верю, что это сработает, жду тебя. ;-)   -  person Joy Wang    schedule 19.12.2018


Ответы (2)


Я играл с API-интерфейсами gitlab и kudu rest и выяснил, как автоматизировать ручное решение, которое вы упомянули. Единственный дополнительный шаг — добавить токен API gitlab в ваш код, но вы просто делаете это один раз для всех проектов. Вы можете получить его в настройках своей учетной записи gitlab в разделе «Токены доступа». Некоторые другие примечания:

Для взаимодействия с kudu API скрипт использует автоматически сгенерированные учетные данные для развертывания. Но вы можете создать отдельного пользователя для развертывания и использовать его во всех других проектах (пропустив этот шаг). Вы можете сделать это в лазурном интерфейсе командной строки:

az webapp deployment user set --user-name someUser --password somepassword

GitLab API использует идентификатор проекта, а не имя проекта. Скрипт пытается автоматически получить идентификатор проекта из URL-адреса репо, но вы можете скопировать/вставить его из общих настроек проекта на gitlab, чтобы быть в безопасности.

Это решение работает и с частными репозиториями. Единственное, вы увидите какую-то ошибку при создании ресурса (поскольку ключ ssh еще не настроен). Но после завершения скрипта все должно быть в порядке, поэтому игнорируйте ошибку. Для общедоступных репозиториев вы можете вообще пропустить эту настройку ключей.

Вот сценарий:

function log {param($memo); Write-Host "[$((get-date).ToString("HH:mm:ss"))]: $memo" -ForegroundColor Green}

# =============== App and GitLab settings ==============


$webapp="geekscodeStackOverflow"
$resgroup = $webapp + "Group"
$plan = $webapp + "Plan"
$location="centralus"

$gitToken = "yourGitLabTokenHere"  
$repoUrl = "https://gitlab.com/MagicAndi/geekscode.net"
# $projID =  "99..."



# ============== DEPLOYMENT SCRIPT ==========================#

log "Setting up the app on azure"

New-AzResourceGroup -Name $resgroup -Location $location
New-AzAppServicePlan -Name $plan -Location $location -ResourceGroupName $resgroup -Tier Free
New-AzWebApp -Name $webapp -Location $location -AppServicePlan $plan -ResourceGroupName $resgroup

$appInfo = Get-AzWebApp -Name $webapp
$appRef = @{Name=$appInfo.Name; ResourceGroupName = $appInfo.ResourceGroup}
if(!$appInfo){Write-Host "app deployment failed" -ForegroundColor Red; return} else {Write-Host "App created:" -ForegroundColor Green}


# ================= linking web app to gitlab ========================= 
# you can do this manually: app dashboard / Deployment Centrer / External / App Service Kudu / git

log "setting up deployment "

$deployment = @{
  PropertyObject = @{ repoUrl = $repoUrl; branch = "master"; isMercurial= $false; isManualIntegration = $true }
  ResourceGroupName = $appInfo.ResourceGroup
  ResourceType = "Microsoft.Web/sites/sourcecontrols"
  ResourceName = $appInfo.Name + "/web"
  ApiVersion = "2018-02-01"
}

# you'll get error on this step for private repos because the key is not set up yet. You can ignore that error
Set-AzResource @deployment -Force

log "Extracting Deployment credentials"
# you can also create a user credentials in AZ CLI and skip this or manually get it in App's deployment center
$prof = Get-AzWebAppPublishingProfile @appRef | Select-Xml -XPath "//*[@publishMethod='MSDeploy']"
$deployCreds = $prof.node.userName + ":" + $prof.node.userPWD


log "Extracting Deployment key"
# Can skip for public repors
$keyUrl = "https://$webapp.scm.azurewebsites.net/api/sshkey?ensurePublicKey=1"
$base64AuthInfo = [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes($deployCreds))
$head = @{Authorization=("Basic {0}" -f $base64AuthInfo)}
$deployKey =  Invoke-RestMethod -Uri $keyUrl -Headers $head -Method Get


#============== Setting Up GIT LAB ================ #

$gitApi = "https://gitlab.com/api/v4"
$gitHead = @{'PRIVATE-TOKEN'= $gitToken; 'Content-Type'='application/json'} 

# looking up project id by user/repo name. You can skip that and get the id from project general setting on GitLab
$repo = $repoUrl.Split("/")[-2,-1] -join "%2F"
$project = Invoke-RestMethod -Uri "$gitApi/projects/$repo" -Headers $head
$projID = $project.id
log "Setting up $repoUrl (project id $projID)"

# --- Adding deploy key to GitLab project (public repos can skip) ---
# You can copy the key manually - Go to Project / Settings / Repository / Deploy Keys
log "Adding deploy keys to GitLab project"
$keyBody = @{title="Azure_Key";key=$deployKey; can_push=$true} | ConvertTo-Json
Invoke-RestMethod "$gitApi/projects/$projID/deploy_keys/" -Headers $gitHead -Body $keyBody -Method Post

log "Setting up a webhook"
# this can be set manualy - go to Project / Settings / Integrations.
$whBody = @{url = "https://$deployCreds@$webapp.scm.azurewebsites.net/deploy"} | ConvertTo-Json
Invoke-RestMethod -Uri "$gitApi/projects/$projID/hooks/" -Headers $gitHead -Body $whBody -Method Post

log "deployment completed `ncheck out your app at https://$webapp.azurewebsites.net"
person Mike Twc    schedule 19.12.2018
comment
Привет, извините за задержку с ответом. Просто чтобы подтвердить, что я протестировал код для общедоступного репозитория, и он успешно установил CI из GitLab в Azure. В настоящее время я тестирую частный репозиторий. - person MagicAndi; 25.12.2018
comment
Просто чтобы подтвердить, что я принял это решение в качестве ответа и присудил вам награду. Спасибо за вашу помощь. Данный код отлично работает для общедоступного репо, но не работает для частного репозитория, когда веб-хук выдает сообщение об ошибке «Ошибка выполнения ловушки: Net:: ReadTimeout», когда я тестирую его в GitLab (Проект › Настройки › Интеграции ). Я все еще изучаю это. - person MagicAndi; 25.12.2018
comment
Не обращайте внимания на мой последний. Через несколько часов это начало успешно работать. Не знаю, почему он не работал изначально или почему он решил работать сейчас. Могу подтвердить, что как для общедоступных, так и для частных репозиториев веб-перехватчик автоматически развертывает последний код в Azure. - person MagicAndi; 25.12.2018

Попробуйте выполнить приведенную ниже команду для Az, мой репозиторий общедоступен, на моей стороне он работает нормально.

$gitrepo="your git repository url"
$webappname="joyazapp"
$location="centralus"

New-AzResourceGroup -Name joyazgroup -Location $location

New-AzAppServicePlan -Name joyazplan -Location $location -ResourceGroupName joyazgroup -Tier Free

New-AzWebApp -Name joyazapp -Location $location -AppServicePlan joyazplan -ResourceGroupName joyazgroup

$PropertiesObject = @{
    repoUrl = "$gitrepo";
    branch = "master";
    isManualIntegration = $false
}

Set-AzResource -PropertyObject $PropertiesObject -ResourceGroupName joyazgroup -ResourceType Microsoft.Web/sites/sourcecontrols -ResourceName $webappname/web -ApiVersion 2018-02-01 -Force
person Joy Wang    schedule 18.12.2018
comment
Хорошо, я наконец-то добрался до тестирования этого ответа (извиняюсь за задержку), и данное решение НЕ работает для репозиториев, размещенных в GitLab. Ошибка в строке Set-AzResource с сообщением об ошибке «Параметр gitlab.com/MagicAndi/ geekscode.net.git имеет недопустимое значение». Он будет работать, если для свойства isManualIntegration задано значение false, но в этом случае он не будет автоматически развертывать дальнейшие фиксации в репозитории GitLab для веб-приложения в Azure. Это отражает поведение устаревшего командлета AzureRM Set-AzureRmResource. Если вам нужна дополнительная информация, пожалуйста, дайте мне знать. - person MagicAndi; 25.12.2018
comment
@MagicAndi Не уверен, почему isManualIntegration не работает с GitLab, не могли бы вы согласиться использовать GitHub? - person Joy Wang; 25.12.2018
comment
Извините но нет. Ранее я зеркалировал свой репозиторий GitLab в GitHub и автоматически развертывал его в Azure оттуда (подробности вопроса см. -azure-web-app-using-powershell" title="развернуть код из репозитория gitlab в веб-приложении Azure с помощью powershell">stackoverflow.com/questions/52664359/). Этот вопрос предназначен для получения канонического ответа для настройки CI в Azure из репозиториев, размещенных в GitLab, с использованием PowerShell и Azure CLI. - person MagicAndi; 25.12.2018