你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。
使用 Azure Pipelines 将自定义容器部署到应用服务
借助 Azure DevOps,你能够使用免费的工作流来托管、构建、规划和测试代码。 通过将 Azure Pipelines 用作这些工作流之一,可以使用适用于任何平台和云的 CI/CD 部署应用程序。 在存储库的根目录中,管道定义为 YAML 文件。
在本文中,我们使用 Azure Pipelines 将 Windows 容器应用程序从 Azure DevOps 中的 Git 存储库部署到应用服务。 它假定你已在 Azure DevOps 中拥有一个具有支持性 dockerfile 的 .NET 应用程序。
先决条件
- 具有活动订阅的 Azure 帐户。 免费创建帐户。
- Azure DevOps 组织。 免费创建一个。
- 托管在 Azure Repos 上且具有 Dockerfile 的在用 Windows 应用。
添加服务连接
在创建管道之前,应首先创建服务连接,因为系统会要求你在创建模板时选择并验证连接。 使用服务连接,你可以在使用任务模板时连接到所选注册表(ACR 或 Docker Hub)。 添加新服务连接时,请选择“Docker 注册表”选项。 接下来的窗体将要求你选择 Docker Hub 或 Azure 容器注册表以及相关信息。 若要按照本教程进行操作,请使用 Azure 容器注册表。 你可以按照此处的说明创建新的服务连接。
保护机密
由于我们使用的是你不希望其他人访问的敏感信息,因此我们将使用变量来保护我们的信息。 请按照此处的说明创建变量。
若要添加变量,请单击管道编辑视图右上角“保存”按钮旁边的“变量”按钮。 选择“新建变量”按钮并输入信息。 请添加以下变量,以及你自己的适合每个资源的机密。
- vmImageName: 'windows-latest'
- imageRepository: 'your-image-repo-name'
- dockerfilePath: '$(Build.SourcesDirectory)/path/to/Dockerfile'
- dockerRegistryServiceConnection: 'your-service-connection-number'
创建新管道
创建包含 .NET 应用程序和支持性 dockerfile 的存储库后,你可以按照以下步骤创建管道。
- 导航到左侧菜单栏上的“管道”,然后单击“创建管道”按钮
- 在下一个屏幕上,选择“Azure Repos Git”作为存储库选项,然后选择代码所在的存储库
- 在“配置”选项卡下,选择“初学者管道”选项
- 在后面的“审阅”选项卡下,单击“保存”按钮
生成映像并将其推送到 Azure 容器注册表
创建并保存管道后,需要编辑管道,以运行生成容器、推送到注册表以及将映像部署到应用服务的步骤。 若要开始,请导航到“管道”菜单,选择你创建的管道,然后单击“编辑”按钮。
首先,你需要添加 docker 任务,以便生成映像。 请添加以下代码,并将 Dockerfile: app/Dockerfile 替换为指向 Dockerfile 的路径。
trigger:
- main
pool:
vmImage: 'windows-latest'
variables:
vmImageName: 'windows-latest'
imageRepository: 'your-image-repo-name'
dockerfilePath: '$(Build.SourcesDirectory)/path/to/Dockerfile'
dockerRegistryServiceConnection: 'your-service-connection-number'
- stage: Build
displayName: Build and push 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)
添加应用服务部署任务
接下来,你需要设置部署任务。 这需要订阅名称、应用程序名称和容器注册表。 请通过粘贴以下代码,在 yaml 文件中添加新阶段。
- stage: Deploy
displayName: Deploy to App Service
jobs:
- job: Deploy
displayName: Deploy
pool:
vmImage: $(vmImageName)
steps:
接下来,导航到右上角的“显示助理”选项卡,找到“Azure 应用服务部署”任务并填写以下窗体:
- 连接类型:Azure 资源管理器
- Azure 订阅:你的订阅名称
- 应用服务类型:用于容器的 Web 应用 (Windows)
- 应用服务名称:你的应用名称
- 注册表或命名空间:你的 Azure 容器注册表命名空间
- 映像:你的 Azure 容器注册表映像名称
填写这些内容后,单击“添加”按钮以添加以下任务:
- task: AzureRmWebAppDeployment@4
inputs:
ConnectionType: 'AzureRM'
azureSubscription: 'my-subscription-name'
appType: 'webAppHyperVContainer'
WebAppName: 'my-app-name'
DockerNamespace: 'myregsitry.azurecr.io'
DockerRepository: 'dotnetframework:12'
添加任务后,管道即可运行。 单击“验证并保存”按钮并运行管道。 该管道将完成相关步骤,以生成 Windows 容器映像并将其推送到 Azure 容器注册表,然后将映像部署到应用服务。
下面是完整 yaml 文件的示例:
trigger:
- main
pool:
vmImage: 'windows-latest'
variables:
vmImageName: 'windows-latest'
imageRepository: 'your-image-repo-name'
dockerfilePath: '$(Build.SourcesDirectory)/path/to/Dockerfile'
dockerRegistryServiceConnection: 'your-service-connection-number'
- stage: Build
displayName: Build and push 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)
- stage: Deploy
displayName: Deploy to App Service
jobs:
- job: Deploy
displayName: Deploy
pool:
vmImage: $(vmImageName)
steps:
- task: AzureRmWebAppDeployment@4
inputs:
ConnectionType: 'AzureRM'
azureSubscription: 'my-subscription-name'
appType: 'webAppHyperVContainer'
WebAppName: 'my-app-name'
DockerNamespace: 'myregsitry.azurecr.io'
DockerRepository: 'dotnetframework:12'