练习 - 创建 Azure DevOps 管道以部署云原生应用
你的经理希望更改公司 eShop 应用的 CI/CD,以使用 Azure Pipelines。 现在,你将创建一个 Azure DevOps Pipeline 来生成和部署产品服务。
创建 Azure DevOps 管道
重要
在开始之前,需要有一个 Azure DevOps 帐户。 如果没有,可以在 dev.azure.com 免费创建一个。
- 登录到 dev.azure.com。
- 选择 + 新建项目。
- 对于 项目名称,请输入 eShop 部署。
- 将 “可见性 ”设置为 “专用”,然后选择“ 创建”。
- 在左侧选择 “管道”,然后选择“ 创建管道”。
- 在 “连接”页上,对于 您的代码在哪里?,请选择 GitHub。
- 如果出现提示,请登录到 GitHub,并授权 Azure Pipelines 访问 GitHub 帐户。
- 请在 选择存储库 中选择您的派生存储库。
- 在 “配置 ”页上,选择“ 部署到 Azure Kubernetes 服务 ”选项。
- 在 “部署到 Azure Kubernetes 服务 ”窗格中,选择 Azure 订阅,然后选择“ 继续”。
- 如果系统提示,请登录到 Azure 订阅。
- 对于 群集,请选择在上一单元 aks-eshop 中创建的 AKS 群集。
- 对于 命名空间,保留 “现有 ”,然后选择 默认值。
- 对于 容器注册表,请选择在上一单元中创建的 Azure 容器注册表,例如 acseshop186748394。
- 请在 映像名称 中输入 productservice。
- 对于 服务端口,请输入 8080。
- 选择验证和配置。
查看管道 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 ”页的右上角,选择“ 保存并运行”。 在“保存并运行”窗格中:
- 选择“为此提交创建新分支”。
- 将所有其他选项设置为默认值。
- 选择保存并运行。
监视管道并对其进行故障排除
Azure Pipelines 通过 Azure DevOps 门户进行监视和管理。 让我们看看运行创建的管道所得到的输出。
摘要页显示正在运行的管道的所有阶段。 可以选择一个阶段来更详细地查看步骤。 片刻后,你将看到管道已失败。 选择生成阶段。
在生成阶段,可以看到生成失败。 选择 “生成”并将映像推送到 Azure 容器注册表 步骤。 日志文件中的错误显示:
##[error]Unhandled: No Dockerfile matching /home/vsts/work/1/s/**/Dockerfile was found.
修复错误
在 DevOps 中,返回到管道摘要页。 你将编辑创建的管道以修复错误。
在右上角,选择“ 更多作 ”菜单,然后选择“ 编辑管道”。
YAML 文件的第 17 行定义了要使用的 Dockerfile,默认情况下,管道要求存储库根目录中有一个名为 Dockerfile 的文件。
eShop 为名为 DockerfileProducts 的产品服务使用不同的 docker 文件。 将第 17 行编辑为:
dockerfilePath: '**/DockerfileProducts.acr'
选择“保存”。
在 “保存 ”窗格中,选择“ 保存”。
选择“ 运行 ”,然后在“ 运行管道 ”窗格中,选择“ 运行”。
观看 生成阶段 的完成。 部署阶段会暂停,直到选择它并允许它运行。
管道成功完成。 选择 “部署 ”阶段以查看步骤。