练习 - 创建 Azure DevOps 管道以部署云原生应用

已完成

你的经理希望更改公司 eShop 应用的 CI/CD,以使用 Azure Pipelines。 现在,你将创建一个 Azure DevOps Pipeline 来生成和部署产品服务。

创建 Azure DevOps 管道

重要

在开始之前,需要有一个 Azure DevOps 帐户。 如果没有,可以在 dev.azure.com 免费创建一个。

  1. 登录到 dev.azure.com
  2. 选择 + 新建项目
  3. 对于 项目名称,请输入 eShop 部署
  4. “可见性 ”设置为 “专用”,然后选择“ 创建”。
  5. 在左侧选择 “管道”,然后选择“ 创建管道”。
  6. “连接”页上,对于 您的代码在哪里?,请选择 GitHub
  7. 如果出现提示,请登录到 GitHub,并授权 Azure Pipelines 访问 GitHub 帐户。
  8. 请在 选择存储库 中选择您的派生存储库。
  9. “配置 ”页上,选择“ 部署到 Azure Kubernetes 服务 ”选项。
  10. “部署到 Azure Kubernetes 服务 ”窗格中,选择 Azure 订阅,然后选择“ 继续”。
  11. 如果系统提示,请登录到 Azure 订阅。
  12. 对于 群集,请选择在上一单元 aks-eshop 中创建的 AKS 群集。
  13. 对于 命名空间,保留 “现有 ”,然后选择 默认值
  14. 对于 容器注册表,请选择在上一单元中创建的 Azure 容器注册表,例如 acseshop186748394
  15. 请在 映像名称 中输入 productservice
  16. 对于 服务端口,请输入 8080
  17. 选择验证和配置

查看管道 YAML 文件

Azure Pipelines 使用 YAML 文件定义生成和部署应用的步骤。 YAML 文件存储在 GitHub 存储库中,并根据提供的信息自动为你创建。

让我们查看 YAML 文件:

trigger:
- main

resources:
- repo: self

variables:

  # Container registry service connection established during pipeline creation
  dockerRegistryServiceConnection: '3bcbb23c-6fca-4ff0-8719-bfbdb64a89b1'
  imageRepository: 'productservice'
  containerRegistry: 'acseshop186748394.azurecr.io'
  dockerfilePath: '**/Dockerfile'
  tag: '$(Build.BuildId)'
  imagePullSecret: 'acseshop18674839414442d34-auth'

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


stages:
- stage: Build
  displayName: Build stage
  jobs:
  - job: Build
    displayName: Build
    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)

    - upload: manifests
      artifact: manifests

- stage: Deploy
  displayName: Deploy stage
  dependsOn: Build

  jobs:
  - deployment: Deploy
    displayName: Deploy
    pool:
      vmImage: $(vmImageName)
    environment: 'PhilStollerymod9cloudnativeexercisecode-1959.default'
    strategy:
      runOnce:
        deploy:
          steps:
          - task: KubernetesManifest@0
            displayName: Create imagePullSecret
            inputs:
              action: createSecret
              secretName: $(imagePullSecret)
              dockerRegistryEndpoint: $(dockerRegistryServiceConnection)

          - task: KubernetesManifest@0
            displayName: Deploy to Kubernetes cluster
            inputs:
              action: deploy
              manifests: |
                $(Pipeline.Workspace)/manifests/deployment.yml
                $(Pipeline.Workspace)/manifests/service.yml
              imagePullSecrets: |
                $(imagePullSecret)
              containers: |
                $(containerRegistry)/$(imageRepository):$(tag)

触发器和资源部分定义管道何时应运行。 在这种情况下,将更改提交到存储库的主分支时,管道将运行。

variables 节定义管道中使用的变量。 变量用于定义要使用的 Azure 容器注册表和 Dockerfile。

然后,YAML 定义使用 ubuntu-latest 代理的生成作业。 该作业使用 Docker 任务生成映像并将其推送到 Azure 容器注册表。

最后一个阶段 是将更新 的产品和服务部署到 AKS。 该作业使用 KubernetesManifest 任务将映像部署到 AKS。

运行管道

“查看管道 YAML ”页的右上角,选择“ 保存并运行”。 在“保存并运行”窗格中:

  1. 选择“为此提交创建新分支”。
  2. 将所有其他选项设置为默认值。
  3. 选择保存并运行

监视管道并对其进行故障排除

Azure Pipelines 通过 Azure DevOps 门户进行监视和管理。 让我们看看运行创建的管道所得到的输出。

显示 Azure Pipeline 状态的屏幕截图。

摘要页显示正在运行的管道的所有阶段。 可以选择一个阶段来更详细地查看步骤。 片刻后,你将看到管道已失败。 选择生成阶段。

管道中失败的构建阶段的截图。

在生成阶段,可以看到生成失败。 选择 “生成”并将映像推送到 Azure 容器注册表 步骤。 日志文件中的错误显示:

##[error]Unhandled: No Dockerfile matching  /home/vsts/work/1/s/**/Dockerfile  was found.

修复错误

在 DevOps 中,返回到管道摘要页。 你将编辑创建的管道以修复错误。

  1. 在右上角,选择“ 更多作 ”菜单,然后选择“ 编辑管道”。

  2. YAML 文件的第 17 行定义了要使用的 Dockerfile,默认情况下,管道要求存储库根目录中有一个名为 Dockerfile 的文件。

    eShop 为名为 DockerfileProducts 的产品服务使用不同的 docker 文件。 将第 17 行编辑为:

      dockerfilePath: '**/DockerfileProducts.acr'
    
  3. 选择“保存”

  4. “保存 ”窗格中,选择“ 保存”。

  5. 选择“ 运行 ”,然后在“ 运行管道 ”窗格中,选择“ 运行”。

    观看 生成阶段 的完成。 部署阶段会暂停,直到选择它并允许它运行。

    显示完全完成的管道的屏幕截图。

    管道成功完成。 选择 “部署 ”阶段以查看步骤。

    显示“部署”阶段和成功完成步骤的屏幕截图。