DevOps Pipeline Automation - развертывание инфраструктуры и приложений
Я столкнулся с проблемами реализации в приведенном ниже сценарии с использованием конвейеров Azure DevOps.
- Предоставление двух ресурсов в подписке Azure с помощью шаблонов ARM
- Реестр контейнеров Azure
- Службы Azure Kubernetes
- Разверните контейнерный код приложения в кластеры Kubernetes
Я могу выполнить оба шага в отдельных конвейерах. Нужна помощь с объединением / объединением двух конвейеров в один.
Как я могу автоматизировать оба вышеперечисленных шага, не вмешиваясь в процесс вручную. Процесс должен быть достаточно надежным, чтобы обрабатывать развертывание приложения в тех же ACR и AKS, которые были созданы на предыдущем шаге?
И инфраструктура, и код приложения находятся в одном репозитории GIT/ Azure.
2 ответа
Вы можете использовать несколько этапов в одном конвейере yaml. См. Ниже простой пример:
Ниже ямл конвейер состоит из двух этапов. На первом этапе выполняются задачи по предоставлению инфраструктуры. Второй этап зависит от первого этапа и определяет ACR и AKS в переменных, а затем выполняет задачи по развертыванию в кластерах Kubernetes.
trigger:
- master
stages:
- stage: Infrastructure Deployment
pool:
vmImage: windows-latest
jobs:
- job: Infrastructure
steps:
- task: AzureResourceManagerTemplateDeployment@3
inputs:
.....
- stage: Application Deployment
dependsOn: Infrastructure Deployment
pool:
vmImage: windows-latest
variables:
ACRName: "ACRName"
AKSName: "ACRName"
azureSubscriptionEndpoint: ..
azureContainerRegistry: ..
azureResourceGroup: ..
jobs:
- job: Application
steps:
# - task: Docker@2
# inputs:
# containerRegistry: $(ACRName)
# ...
- powershell: |
# Log in to Docker with service principal credentials
docker login $(ACRName).azurecr.io --username $SP_APP_ID --password $SP_PASSWD
docker build
docker push
- task: Kubernetes@1
displayName: kubectl apply
inputs:
connectionType: Azure Resource Manager
azureSubscriptionEndpoint: $(azureSubscriptionEndpoint)
azureResourceGroup: $(azureResourceGroup)
kubernetesCluster: $(AKSName)
....
Обновление: динамически фиксируйте имя ACR и AKS вместе с учетными данными ACR
Вы можете использовать задачу Azure PowerShell для получения вышеуказанных данных. Чтобы использовать задачу Azure PowerShell, вам необходимо создать подключение к службе диспетчера ресурсов Azure.
Затем вы можете написать собственные встроенные скрипты в задаче. См. Пример ниже:
- task: AzurePowerShell@5
name: AzurePowershell
inputs:
azureSubscription: 'Microsoft Azure Internal Consumption (daaeef3e-d7fe-49e8-baaa-b3df9d072825)'
ScriptType: InlineScript
Inline: |
$json = (Get-Content "$(system.defaultworkingdirectory)\template.json" -Raw) | ConvertFrom-Json
$AKS = $json.resources | where {$_.type -eq "Microsoft.ContainerService/managedClusters"} | select name
$ACR = $json.resources | where {$_.type -eq "Microsoft.ContainerRegistry/registries"} | select name
echo "##vso[task.setvariable variable=ACRName;isOutput=true]$($ACR.name)"
echo "##vso[task.setvariable variable=AKSName;isOutput=true]$($AKS.name)"
$ACRCred = Get-AzContainerRegistryCredential -ResourceGroupName "MyResourceGroup" -Name $($ACR.name)
echo "##vso[task.setvariable variable=UserName;isOutput=true]$($ACRCred.Username)"
echo "##vso[task.setvariable variable=Password;isOutput=true]$($ACRCred.Password)"
azurePowerShellVersion: LatestVersion
Затем вы можете получить эти переменные на следующем этапе, обратившись к stageDependencies.stageName.jobName.outputs['stepName.variableName']
Смотрите здесь для более лазурного Powershell кли.
Прежде всего. Я хотел бы порекомендовать вам не связывать два трубопровода вместе.
Хотя инфраструктура как код важна и должна использоваться. По многим веским причинам важно отделить подготовку инфраструктуры от подготовки приложения.
Что касается вашего вопроса, у вас должна быть задача, которая создает ACR/AKS, одна задача, которая получает учетные данные для использования в другой задаче, которая будет развертываться в созданных ранее AKS и ACR
Поток мог быть.
ACR —AKS (если вы хотите настроить AKS с интеграцией ACR, вам нужно, чтобы они были последовательными) - docker build/push to ACR - развертывание контейнера с помощью сценария оболочки с KubeCTL, использующим учетные данные со второго шага.