0

我在使用Azure DevOps 管道的以下场景中遇到了实现问题

  1. 使用 ARM 模板在 Azure 订阅中预配两个资源
    • Azure 容器注册表
    • Azure Kubernetes 服务
  2. 将容器化的应用程序代码部署到 Kubernetes 集群

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

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

基础结构和应用程序代码都驻留在同一个 GIT/Azure 存储库中。

4

2 回答 2

0

您可以在一个 yaml 管道中使用多个阶段。请参见下面的简单示例:

下面的 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']在下一阶段获取这些变量

有关更多 azure powershell cli,请参见此处

于 2020-06-29T03:32:37.227 回答
0

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

虽然基础设施即代码很重要并且应该被使用。出于许多充分的原因,将基础设施供应与应用供应分离很重要。

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

流量可以。

ACR —AKS(如果要使用 ACR 集成配置 AKS,则需要将它们按顺序排列) — docker build/push to ACR — 使用带有 KubeCTL 的 shell 脚本部署容器,利用第二步的凭据。

于 2020-06-28T14:10:57.797 回答