Развертывание кода из репозитория GitLab в веб-приложение Azure с помощью PowerShell и Azure CLI

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

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

Обратите внимание: чтобы все проголосовали за закрытие, я задал этот вопрос, поскольку Windows Powershell и модуль Azure RM не рекомендуются в пользу PowerShell Core и нового модуля Az (с использованием Azure CLI). Я создал этот новый вопрос, в котором конкретно просил дать канонический ответ с помощью Azure CLI и Powershell Core. Я планирую предложить вознаграждение за этот вопрос, когда он будет открыт для меня через 2 дня. Спасибо.

MagicAndi 17.12.2018 11:57

@rickvdbosch Этот вопрос создан, чтобы дать канонический ответ для будущей разработки Azure с использованием PowerShell Core и нового модуля Az (с использованием Azure CLI). У меня уже есть ответ на мои конкретные потребности на stackoverflow.com/a/53729332/35483, и я только что наградил за него награду. Если есть проблема с тем, что я задаю этот конкретный вопрос, я буду рад закрыть.

MagicAndi 17.12.2018 11:59

Вы выяснили, как настроить автоматическое развертывание при фиксации? Ответ на предыдущий вопрос выглядит так же, как и в примере на github, работает ли он с gitlab сейчас?

Mike Twc 18.12.2018 18:07

Привет, есть какие-нибудь обновления по этой проблеме?

Joy Wang 19.12.2018 01:59

@MikeTwc, извините, в моем первоначальном комментарии недостаточно места, чтобы упомянуть, что, поскольку в модуле PowerShell AzureRM не ведется дальнейшая разработка, никогда не будет возможно настроить автоматизированный CI в репозиторий GitLab в Azure с его помощью. Единственный способ создать сценарий для этого - использовать Azure CLI (модуль PowerShell Az), как в ответе Джой Ванга ниже.

MagicAndi 19.12.2018 13:16

@JoyWang, извини, я не совсем понимаю, что ты имеешь в виду под обновлениями? Вам нужна дополнительная информация для ответа?

MagicAndi 19.12.2018 13:17

@MikeTwc нет, ответ идентичен сценарию в docs.microsoft.com/en-gb/azure/app-service/scripts/…. Он настроит ваше веб-приложение только с кодом из репозитория Git, но не будет автоматически развертываться при последующих фиксациях. У вас есть 2 варианта: либо перестроить веб-приложение (в другом слоте развертывания), чтобы задействовать любые дальнейшие фиксации, либо вручную синхронизировать последние фиксации в колонке Центра развертывания портала Azure. Можно настроить автоматический CI с GitLab с помощью Azure CLI, отсюда и этот новый вопрос.

MagicAndi 19.12.2018 13:18

Я имею в виду, работает ли мое решение или нет?

Joy Wang 19.12.2018 14:31

@JoyWang спасибо за разъяснения. У меня еще не было возможности протестировать его - я сделаю это сегодня и сообщу вам.

MagicAndi 19.12.2018 14:34

ну я верю, что сработает, жду тебя. ;-)

Joy Wang 19.12.2018 14:38
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
Как установить LAMP Stack 1/2 на Azure Linux VM
Как установить LAMP Stack 1/2 на Azure Linux VM
В дополнение к нашему предыдущему сообщению о намерении Azure прекратить поддержку Azure Database для MySQL в качестве единого сервера после 16...
2
10
1 047
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Попробуйте команду ниже для 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

Хорошо, я наконец нашел время проверить этот ответ (извинения за задержку), и данное решение НЕ РАБОТАЕТ для репозиториев, размещенных на GitLab. Это ошибка в строке Set-AzResource с сообщением об ошибке «Параметр gitlab.com/MagicAndi/geekscode.net.git имеет недопустимое значение». Он будет работать, если для свойства isManualIntegration установлено значение false, но в этом случае он не будет автоматически развертывать дальнейшие коммиты в репозиторий GitLab для веб-приложения в Azure. Это отражает поведение устаревшего командлета AzureRM Set-AzureRmResource. Если вам нужна дополнительная информация, дайте мне знать.

MagicAndi 25.12.2018 00:46

@MagicAndi Не уверен, почему isManualIntegration не работает с GitLab, не могли бы вы согласиться на использование GitHub?

Joy Wang 25.12.2018 03:34

Извините но нет. Ранее я зеркалировал свой репозиторий GitLab в GitHub и автоматически развертывал его в Azure оттуда (см. Подробности вопроса stackoverflow.com/questions/52664359/…). Этот вопрос предназначен для получения канонического ответа для настройки CI в Azure из репозиториев, размещенных на GitLab, с использованием PowerShell и Azure CLI.

MagicAndi 25.12.2018 13:00
Ответ принят как подходящий

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

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

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"

Привет, извините за задержку с ответом. Просто чтобы подтвердить, что я протестировал код для общедоступного репозитория, и он успешно настраивает CI из GitLab в Azure. В настоящее время я тестирую частный репозиторий.

MagicAndi 25.12.2018 13:57

Просто чтобы подтвердить, что я принял это решение в качестве ответа и назначил вам награду. Спасибо за вашу помощь. Данный код отлично работает для общедоступного репозитория, но для меня не работает для частного репозитория, при этом веб-перехватчик выдает сообщение об ошибке «Выполнение перехвата не удалось: Net :: ReadTimeout», когда я тестирую его в GitLab (Проект> Настройки> Интеграции ). Я все еще занимаюсь этим.

MagicAndi 25.12.2018 16:34

Игнорируйте мой последний. Через несколько часов это начало успешно работать. Понятия не имею, почему он не работал изначально или почему он решил работать сейчас. Можно подтвердить, что как для общедоступных, так и для частных репозиториев веб-перехватчик автоматически развертывает последний код в Azure.

MagicAndi 25.12.2018 18:16

Другие вопросы по теме