你当前正在访问 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 应用程序。

先决条件

添加服务连接

在创建管道之前,应首先创建服务连接,因为系统会要求你在创建模板时选择并验证连接。 使用服务连接,你可以在使用任务模板时连接到所选注册表(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 的存储库后,你可以按照以下步骤创建管道。

  1. 导航到左侧菜单栏上的“管道”,然后单击“创建管道”按钮
  2. 在下一个屏幕上,选择“Azure Repos Git”作为存储库选项,然后选择代码所在的存储库
  3. 在“配置”选项卡下,选择“初学者管道”选项
  4. 在后面的“审阅”选项卡下,单击“保存”按钮

生成映像并将其推送到 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'