Partager via

从 Azure Pipelines 部署到 Azure 容器应用

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

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

容器应用 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'

该任务使用 Dockerfile appSourcePath 生成容器映像。 如果找不到 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 容器注册表进行身份验证才能推送容器映像。 容器应用还需要使用容器注册表进行身份验证才能拉取容器映像。

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

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

配置

完成以下步骤,将 Azure DevOps 管道配置为部署到容器应用。

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

先决条件

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

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

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

  1. 登录到 Azure DevOps 并转到项目。

  2. 在左窗格中选择 Repos

  3. 选择“ 导入存储库”。

  4. 输入以下值,然后选择“ 导入” :

    字段
    存储库类型 Git
    克隆 URL https://github.com/Azure-Samples/containerapps-albumapi-csharp.git
  5. 选择导入

  6. 选择“克隆”以查看存储库 URL 并复制它。

  7. 打开命令提示符并运行以下命令:

    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
    

    在命令输出中,记下托管标识的主体 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.cn \
      --identity system
    

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

创建 Azure DevOps 服务连接

若要部署到容器应用,需要为 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 的分支。