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

已完成

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

创建 Azure DevOps 管道

重要

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

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

查看管道 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)

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

“变量”部分定义了在管道中使用的变量。 变量用于定义要使用的 Azure 容器注册表和 Dockerfile。

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

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

运行管道

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

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

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

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

A screenshot showing the status of an Azure Pipeline.

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

A screenshot of the build stage in a pipeline that has failed.

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

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

修复错误

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

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

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

    电子商店为名为 DockerfileProducts 的产品服务使用其他 docker 文件。 编辑第 17 行,如下所示:

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

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

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

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

    A screenshot showing the completed pipeline.

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

    A screenshot showing the Deploy stage and the successfully completed steps.