从 Azure Pipelines 部署到 Azure 容器应用

Azure 容器应用允许使用 Azure Pipelines 将修订版发布到容器应用。 将提交推送到 Azure DevOps 存储库时,会触发一个管道来更新容器注册表中的容器映像。 Azure 容器应用基于更新的容器映像创建新修订版。

管道由推送到存储库中特定分支的提交触发。 创建管道时,需要确定哪个分支是触发器。

容器应用 Azure Pipelines 任务

该任务支持以下方案:

  • 从 Dockerfile 生成并部署到容器应用
  • 在没有 Dockerfile 的情况下从源代码生成并部署到容器应用。 支持的语言包括 .NET、Java、Node.js、PHP 和 Python
  • 将现有容器映像部署到容器应用

在生产版本中,此任务附带 Azure DevOps,且不再需要显式安装。 有关完整文档,请参阅 AzureContainerApps@1 - Azure 容器应用部署 v1 任务

用法示例

下面是该任务的一些常见使用方案。 有关详细信息,请参阅任务的文档

生成并部署到容器应用

以下代码片段演示如何从源代码生成容器映像并将其部署到容器应用。

steps:
- task: AzureContainerApps@1
  inputs:
    appSourcePath: '$(Build.SourcesDirectory)/src'
    azureSubscription: 'my-subscription-service-connection'
    acrName: 'myregistry'
    containerAppName: 'my-container-app'
    resourceGroup: 'my-container-app-rg'

该任务使用 appSourcePath 中的 Dockerfile 生成容器映像。 如果找不到 Dockerfile,该任务将尝试从 appSourcePath 中的源代码生成容器映像。

将现有容器映像部署到容器应用

以下代码片段演示如何将现有容器映像部署到容器应用。 该任务使用服务连接向注册表进行身份验证。 如果未为服务连接的标识分配注册表的 AcrPush 角色,请使用 acrUsernameacrPassword 输入参数提供注册表的管理员凭据。

steps:
  - task: AzureContainerApps@1
    inputs:
      azureSubscription: 'my-subscription-service-connection'
      containerAppName: 'my-container-app'
      resourceGroup: 'my-container-app-rg'
      imageToDeploy: 'myregistry.azurecr.cn/my-container-app:$(Build.BuildId)'

重要

如果你在单独的步骤中生成容器映像,请确保使用生成 ID 等唯一标记,而不要使用类似于 latest 的稳定标记。 有关详细信息,请参阅映像标记最佳做法

向 Azure 容器注册表进行身份验证

Azure 容器应用任务需要向 Azure 容器注册表进行身份验证才能推送容器映像。 容器应用也需要向 Azure 容器注册表进行身份验证才能拉取容器映像。

为了推送映像,该任务将使用 azureSubscription 中提供的服务连接自动向 acrName 中指定的容器注册表进行身份验证。 如果未为服务连接的标识分配注册表的 AcrPush 角色,请使用 acrUsernameacrPassword 提供注册表的管理员凭据。

为了拉取映像,Azure 容器应用将使用托管标识(建议)或管理员凭据向 Azure 容器注册表进行身份验证。 若要使用托管标识,任务的目标容器应用必须配置为使用托管标识。 若要使用注册表的管理员凭据进行身份验证,请设置任务的 acrUsernameacrPassword 输入。

配置

执行以下步骤来配置 Azure DevOps 管道以部署到 Azure 容器应用。

  • 为应用创建 Azure DevOps 存储库
  • 创建启用了托管标识的容器应用
  • 将 Azure 容器注册表的 AcrPull 角色分配到容器应用的托管标识
  • 从 Azure DevOps 市场安装 Azure 容器应用任务
  • 为 Azure 订阅配置 Azure DevOps 服务连接
  • 创建 Azure DevOps 管道

先决条件

要求 说明
Azure 帐户 如果没有,请创建一个试用版订阅。 需要拥有 Azure 订阅的“参与者”或“所有者”权限才能继续操作。 有关详细信息,请参阅使用 Azure 门户分配 Azure 角色
Azure DevOps 项目 转到 Azure DevOps 并选择“免费开始”。 然后创建新项目。
Azure CLI 安装 Azure CLI

创建 Azure DevOps 存储库并克隆源代码

在创建管道之前,应用的源代码必须在存储库中。

  1. 登录到 Azure DevOps 并导航到你的项目。

  2. 打开“存储库”页。

  3. 在顶部导航栏中选择“存储库”下拉菜单,然后选择“导入存储库”。

  4. 输入以下信息并选择“导入”:

    字段 Value
    存储库类型 Git
    克隆 URL https://github.com/Azure-Samples/containerapps-albumapi-csharp.git
    名称 my-container-app
  5. 选择“克隆”以查看存储库 URL 并复制它。

  6. 打开终端并运行以下命令以克隆存储库:

    git clone <REPOSITORY_URL> my-container-app
    

    请将 <REPOSITORY_URL> 替换为复制的 URL。

创建容器应用并配置托管标识

执行以下步骤使用 az containerapp up 命令创建容器应用。 此命令将创建 Azure 资源,生成容器映像,将映像存储在注册表中,然后将其部署到容器应用。

创建应用后,可将托管标识添加到该应用,并为该标识分配 AcrPull 角色,以允许该标识从注册表中拉取映像。

  1. 切换到克隆的存储库的 src 文件夹。

    cd my-container-app
    cd src
    
  2. 使用 az containerapp up 命令创建 Azure 资源并部署容器应用。

    az containerapp up \
      --name my-container-app \
      --source . \
      --ingress external 
    
  3. 在命令输出中,记下 Azure 容器注册表的名称。

  4. 获取容器注册表的完整资源 ID。

    az acr show --name <ACR_NAME> --query id --output tsv
    

    <ACR_NAME> 替换为注册表的名称。

  5. 为容器应用启用托管标识。

    az containerapp identity assign \
      --name my-container-app \
      --resource-group my-container-app-rg \
      --system-assigned \
      --output tsv
    

    在命令输出中,记下托管标识的主体 ID。

  6. 将 Azure 容器注册表的 AcrPull 角色分配到容器应用的托管标识。

    az role assignment create \
      --assignee <MANAGED_IDENTITY_PRINCIPAL_ID> \
      --role AcrPull \
      --scope <ACR_RESOURCE_ID>
    

    请将 <MANAGED_IDENTITY_PRINCIPAL_ID> 替换为托管标识的主体 ID,并将 <ACR_RESOURCE_ID> 替换为 Azure 容器注册表的资源 ID。

  7. 配置容器应用以使用托管标识从 Azure 容器注册表中拉取映像。

    az containerapp registry set \
      --name my-container-app \
      --resource-group my-container-app-rg \
      --server <ACR_NAME>.azurecr.io \
      --identity system
    

    <ACR_NAME> 替换为 Azure 容器注册表的名称。

创建 Azure DevOps 服务连接

若要部署到 Azure 容器应用,需要为 Azure 订阅创建一个 Azure DevOps 服务连接。

  1. 在 Azure DevOps 中选择“项目设置”。

  2. 选择“服务连接”。

  3. 选择“新建服务连接”。

  4. 选择“Azure 资源管理器”。

  5. 选择“服务主体(自动)”,然后选择“下一步”。

  6. 输入以下信息并选择“保存”:

    字段
    订阅 选择 Azure 订阅。
    资源组 选择包含你的容器应用和容器注册表的资源组 (my-container-app-rg)。
    服务连接名称 my-subscription-service-connection

若要详细了解服务连接,请参阅连接到 Azure

创建 Azure DevOps YAML 管道

  1. 在你的 Azure DevOps 项目中,选择“管道”。

  2. 选择“新建管道”。

  3. 选择“Azure Repos Git”。

  4. 选择包含你的源代码的存储库 (my-container-app)。

  5. 选择“初学者管道”。

  6. 在编辑器中,将文件内容替换为以下 YAML:

    trigger:
      branches:
        include:
          - main
    
    pool:
      vmImage: ubuntu-latest
    
    steps:
      - task: AzureContainerApps@1
        inputs:
          appSourcePath: '$(Build.SourcesDirectory)/src'
          azureSubscription: '<AZURE_SUBSCRIPTION_SERVICE_CONNECTION>'
          acrName: '<ACR_NAME>'
          containerAppName: 'my-container-app'
          resourceGroup: 'my-container-app-rg'
    

    请将 <AZURE_SUBSCRIPTION_SERVICE_CONNECTION> 替换为在上一步骤中创建的 Azure DevOps 服务连接的名称 (my-subscription-service-connection),并将 <ACR_NAME> 替换为你的 Azure 容器注册表的名称。

  7. 选择“保存并运行”。

Azure Pipelines 运行将开始生成并部署你的容器应用。 若要检查进度,请导航到“管道”并选择该运行。 在执行第一个管道运行期间,系统可能会提示你授权管道使用你的服务连接。

若要部署应用的新修订版,请将新提交推送到 main 分支。