首页 > 解决方案 > 如何使用 DevOps 管道部署多个微服务

问题描述

我正在尝试使用 DevOps 将两个 .Net Core 应用程序部署到 Azure Kubernetes。默认管道仅构建和部署我添加的第一个项目。

我创建了一个包含两个解决方案文件夹的单个解决方案,每个文件夹都包含一个 .Net Core 项目。我为这两个项目添加了编排支持,并使用 DevOps 中的“向导”创建了一个 Azure 管道。我在成功部署第一个项目后添加了辅助项目。我认为问题存在是因为 Docker Registry Service Connection 不包含新项目,所以我删除了它并重新创建了连接,但它仍然只部署了第一个项目。我正在使用 Azure Git。

azure-pipeline.yaml 非常标准。我已接受创建管道时创建的默认值。这是我的 buildAndPush 阶段。

stages:
- stage: Build
  displayName: Build stage
  jobs:  
  - job: Build
    displayName: Build job
    pool:
      vmImage: $(vmImageName)
    steps:
    - task: Docker@2
      displayName: Build and push an image to container registry
      inputs:
        command: buildAndPush
        repository: $(imageRepository)
        dockerfile: $(dockerfilePath)
        containerRegistry: $(dockerRegistryServiceConnection)
        tags: |
          $(tag)
    - task: PublishPipelineArtifact@0
      inputs:
        artifactName: 'manifests'
        targetPath: 'manifests'

我如何让它来构建和部署其他剩余的项目?

标签: dockerkubernetes.net-coreazure-devopsazure-pipelines

解决方案


我已经设法使用单个 azure-pipelines.yml 文件部署了两个项目;但是,我几乎可以肯定这是不正确的。我为每个项目复制了构建阶段,并指定了两个单独的 Dockerfile。另外,我为每个项目添加了一个deployment.yml 和service.yml 文件。请参阅下面的 azure-pipelines.yml。任何有关如何正确执行此操作的建议将不胜感激。

# Deploy to Azure Kubernetes Service
# Build and push image to Azure Container Registry; Deploy to Azure Kubernetes Service
# https://docs.microsoft.com/azure/devops/pipelines/languages/docker

trigger:
- master

resources:
- repo: self

variables:

  # Container registry service connection established during pipeline creation
  dockerRegistryServiceConnection: '<hidden>'
  imageRepository1: 'k8spocfront'
  imageRepository2: 'k8spocback'
  containerRegistry: '<hidden>.azurecr.io'
  dockerfilePath1: 'k8sPOC/Dockerfile'
  dockerfilePath2: 'k8sPOCApi/Dockerfile'
  tag: '$(Build.BuildId)'

  # Kubernetes Namespace
  k8sNamespace: 'default'
  imagePullSecret: '<hidden>'

  # Agent VM image name
  vmImageName: 'ubuntu-latest'

stages:
- stage: Build_FrontEnd
  displayName: Build stage 1
  jobs:  
  - job: Build
    displayName: Build job
    pool:
      vmImage: $(vmImageName)
    steps:
    - task: Docker@2
      displayName: Build and push an image to container registry
      inputs:
        command: buildAndPush
        repository: $(imageRepository1)
        dockerfile: $(dockerfilePath1)
        containerRegistry: $(dockerRegistryServiceConnection)
        tags: |
          $(tag)

- stage: Build_BackEnd
  displayName: Build stage 2
  jobs:  
  - job: Build
    displayName: Build job
    pool:
      vmImage: $(vmImageName)
    steps:
    - task: Docker@2
      displayName: Build and push an image to container registry
      inputs:
        command: buildAndPush
        repository: $(imageRepository2)
        dockerfile: $(dockerfilePath2)
        containerRegistry: $(dockerRegistryServiceConnection)
        tags: |
          $(tag)          

    - task: PublishPipelineArtifact@0
      inputs:
        artifactName: 'manifests'
        targetPath: 'manifests'

- stage: Deploy_FrontEnd
  displayName: Deploy stage
  dependsOn: Build_BackEnd
  jobs:
  - deployment: Deploy
    displayName: Deploy job
    pool:
      vmImage: $(vmImageName)
    environment: '<hidden>.default'
    strategy:
      runOnce:
        deploy:
          steps:
          - task: DownloadPipelineArtifact@1
            inputs:
              artifactName: 'manifests'
              downloadPath: '$(System.ArtifactsDirectory)/manifests'

          - task: KubernetesManifest@0
            displayName: Create imagePullSecret
            inputs:
              action: createSecret
              secretName: $(imagePullSecret)
              namespace: $(k8sNamespace)
              dockerRegistryEndpoint: $(dockerRegistryServiceConnection)

          - task: KubernetesManifest@0
            displayName: Deploy to Kubernetes cluster
            inputs:
              action: deploy
              namespace: $(k8sNamespace)
              manifests: |
                $(System.ArtifactsDirectory)/manifests/deployment1.yml
                $(System.ArtifactsDirectory)/manifests/service1.yml
                $(System.ArtifactsDirectory)/manifests/deployment2.yml
                $(System.ArtifactsDirectory)/manifests/service2.yml                
              imagePullSecrets: |
                $(imagePullSecret)
              containers: |
                $(containerRegistry)/$(imageRepository1):$(tag)
                $(containerRegistry)/$(imageRepository2):$(tag)

推荐阅读