DevOps Pipeline Automation - развертывание инфраструктуры и приложений

Я столкнулся с проблемами реализации в приведенном ниже сценарии с использованием конвейеров Azure DevOps.

  1. Предоставление двух ресурсов в подписке Azure с помощью шаблонов ARM
    • Реестр контейнеров Azure
    • Службы Azure Kubernetes
  2. Разверните контейнерный код приложения в кластеры 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, использующим учетные данные со второго шага.