DevOps管道自动化-基础架构和应用程序部署

时间:2020-06-28 09:05:31

标签: azure azure-devops azure-kubernetes azure-container-registry azure-yaml-pipelines

在使用 Azure DevOps管道

的以下情况下,我遇到了实现问题
  1. 使用ARM模板在Azure订阅中提供两个资源
    • Azure容器注册表
    • Azure Kubernetes服务
  2. 将容器化的应用程序代码部署到Kubernetes集群中

我能够在单个管道中执行这两个步骤。在将两个管道合并/集成为一个管道时需要一些帮助。

如何在没有任何手动干预的情况下使以上两个步骤自动化。该过程必须足够健壮,才能在上一步中创建的相同ACR和AKS中处理应用程序部署?

基础结构和应用程序代码都位于同一GIT / Azure存储库中。

2 个答案:

答案 0 :(得分:0)

首先。我建议您不要将两个管道捆绑在一起。

尽管将基础结构作为代码很重要,但应该使用。出于许多充分的原因,将基础架构配置与应用程序配置分离是很重要的。

关于您的要求,您应该有一个创建ACR / AKS的任务,一个任务获取要在另一个任务中使用的凭据,该凭据将部署到矿石中创建的AKS和ACR

可能是这样。

ACR-AKS(如果要配置具有ACR集成的AKS,则需要按顺序进行配置)-docker构建/推送到ACR-使用外壳脚本和KubeCTL部署容器,利用第二步的凭据。

答案 1 :(得分:0)

您可以在一个Yaml管道中使用multiple stages。参见下面的简单示例:

以下yaml管道有两个阶段。第一阶段完成提供基础结构的任务。第二阶段是dependsOn的第一阶段,并在变量中定义了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 task来获取上述数据。为了使用Azure Powershell任务,您需要创建一个azure resource manager service connection

然后,您可以在任务中编写自定义内联脚本。参见以下示例:

    - 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']

获得这些变量。

请参阅here,以了解更多有关天蓝色的powershell cli。