你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

适用于 Azure 数据资源管理器的 Azure DevOps 任务

Azure DevOps Services 提供开发协作工具,例如高性能管道、免费专用 Git 存储库、可配置看板,以及各种自动化和持续测试功能。 Azure Pipelines 是 Azure DevOps 中的一项功能,可用于管理适用于任何语言、平台和云的 CI/CD(使用高性能管道部署代码)。 Azure 数据资源管理器 - 管道工具是 Azure Pipelines 的一项任务,可用于创建发布管道,以及将数据库更改部署到 Azure 数据资源管理器数据库。 它在 Visual Studio Marketplace 中免费提供。 此扩展包括 3 个基本任务:

  • Azure 数据资源管理器命令 - 针对 Azure 数据资源管理器群集运行命令

  • Azure 数据资源管理器查询 - 针对 Azure 数据资源管理器群集运行查询并分析结果

  • Azure 数据资源管理器查询服务器入口 - 入口的无代理任务根据查询结果发布

    任务类型。

本文档介绍一个简单的示例,说明如何使用 “Azure 数据资源管理器 - 管道工具”任务将架构更改部署到数据库。 有关完整的 CI/CD 管道,请参阅 Azure DevOps 文档

先决条件

准备发布内容

有三种方法可以对任务中的群集运行管理员命令。

命令源代码管理选项。

  • 使用搜索模式从本地代理文件夹(生成源或发布项目)获取多个命令文件

    本地文件夹选项。

  • 编写内联命令

    内联命令选项。

  • 指定文件路径,以直接从 git 源代码管理获取命令文件(推荐)

    Git 文件选项。

    在 Git 存储库中创建以下示例文件夹(“Functions”、“Policies”、“Tables”) 。 如下所示,将文件从此处复制到相应的文件夹中,并提交更改。 提供示例文件以执行以下工作流。

    为存储库创建文件夹。

    提示

    创建自己的工作流时,建议使用幂等方法编写代码。 例如,使用 .create-merge table 而不是 .create table,并使用 .create-or-alter 函数而不是 .create 函数。

创建发布管道

  1. 登录到你的 Azure DevOps 组织

  2. 从左侧菜单选择“管道”>“发布”,然后选择“新建管道” 。

    新建管道。

  3. “新建发布管道”窗口随即打开。 在“管道”选项卡的“选择模板”窗格中,选择“空作业” 。

    选择模板。

  4. 选择“阶段”按钮。 在“阶段”窗格中,添加“阶段名称” 。 选择“保存”以保存管道。

    为阶段命名。

  5. 选择“添加项目”按钮。 在“添加项目”窗格中,选择代码所在的存储库,填写相关信息,然后单击“添加” 。 选择“保存”以保存管道。

    添加项目。

  6. 在“变量”选项卡中,选择“+ 添加”,为将在任务中使用的“终结点 URL”创建变量 。 填写终结点的“名称”和“值” 。 选择“保存”以保存管道。

    创建变量。

    要查找 Endpoint_URL,请前往 Azure 门户中 Azure 数据资源管理器群集的概述页面,查看 Azure 数据资源管理器群集 URI。 采用以下格式 https://<Azure Data Explorer cluster URI>?DatabaseName=<DBName> 构造 URI。 例如: https://kustodocs.westus.kusto.windows.net?DatabaseName=SampleDB

    Azure 数据资源管理器群集 URI。

创建任务以部署文件夹

  1. 在“管道”选项卡中,单击“1 个作业,0 个任务”以添加任务 。

    添加任务。

  2. 重复以下步骤创建命令任务,从“Tables”、“Functions”和“Policies”文件夹部署文件 :

    添加管理员命令。

    1. 在“任务”选项卡中,选择“代理作业”旁的 +,然后搜索“Azure 数据资源管理器”。

    2. 在“运行 Azure 数据资源管理器命令”下,选择“添加” 。

    3. 选择“Kusto 命令”,然后利用以下信息更新任务:

      • 显示名称:任务的名称。 例如,Deploy <FOLDER>,其中 <FOLDER> 是要创建的部署任务的文件夹的名称。

      • 文件路径:对于每个文件夹,请将路径指定为 */<FOLDER>/*.csl,其中 <FOLDER> 是任务的相关文件夹。

      • 终结点 URL:指定上一步中创建的 EndPoint URL 变量。

      • 使用服务终结点:选择此选项。

      • 服务终结点:选择现有的服务终结点或创建一个新的终结点(+ 新建),并在“添加 Azure 数据资源管理器服务连接”窗口中提供以下信息 :

        设置 建议的值
        连接名称 输入名称以标识此服务终结点
        群集 URL 可在 Azure 门户中 Azure 数据资源管理器群集的概述部分查找值
        服务主体 ID 输入创建为先决条件 (Microsoft Entra应用 ID)
        服务主体应用密钥 输入创建为必备) Microsoft Entra应用密钥 (
        Microsoft Entra租户 ID 输入Microsoft Entra租户 (,例如 microsoft.com 或 contoso.com)

      选择“允许所有管道使用此连接”复选框,然后选择“确定” 。

      添加服务连接。

  3. 选择“保存”,然后在“任务”选项卡中,验证是否有以下三个任务:“部署表”、“部署函数”和“部署策略” 。

    部署所有文件夹。

创建查询任务

如果需要,请创建一个任务来对群集运行查询。 在生成或发布管道中运行查询可用于验证数据集,并根据查询结果执行成功或失败的步骤。 任务成功条件可以基于行计数阈值或单个值,具体取决于查询返回的结果。

  1. 在“任务”选项卡中,选择“代理作业”旁的 +,然后搜索“Azure 数据资源管理器”。

  2. 在“运行 Azure 数据资源管理器查询”下,选择“添加” 。

  3. 选择“Kusto 查询”,然后使用以下信息更新任务:

    • 显示名称:任务的名称。 例如“查询群集”。
    • 类型:选择“内联”。
    • 查询:输入要运行的查询。
    • 终结点 URL:指定之前创建的 EndPoint URL 变量。
    • 使用服务终结点:选择此选项。
    • 服务终结点:选择服务终结点。

    查询任务。

  4. 在任务结果下,根据查询的结果选择任务的成功条件,如下所示:

    • 如果查询返回行,请选择“行计数”并提供所需条件。

      查询任务行计数。

    • 如果查询返回一个值,请选择“单个值”并提供预期结果。

      查询任务单个值。

创建查询服务器入口任务

如果需要,请创建一个任务来对群集运行查询,并对等待查询结果行计数的发布进度进行限制。 服务器查询入口任务是一个无代理作业,这意味着查询会直接在 Azure DevOps Server 上运行。

  1. 在“任务”选项卡中,选择“无代理作业”旁的 +,然后搜索“Azure 数据资源管理器”。

  2. 在“运行 Azure 数据资源管理器查询服务器入口”下,选择“添加” 。

  3. 选择“Kusto 查询服务器入口”,然后选择“服务器入口测试” 。

    选择服务器入口任务。

  4. 配置任务并提供以下信息:

    • 显示名称:入口的名称。
    • 服务终结点:选择服务终结点。
    • 数据库名称:指定数据库名称。
    • 类型:选择“内联查询”。
    • 查询:输入要运行的查询。
    • 最大阈值:指定查询成功条件的最大行数。

    配置服务器入口任务。

注意

运行发布时,应会看到如下所示的结果。

查询入口任务。

运行发布

  1. 选择“+ 发布”>“创建发布”以创建发布 。

    创建发布。

  2. 在“日志”选项卡中,检查部署状态是否为“成功”。

    部署成功。

至此已完成用于部署到预生产的发布管道的创建。

Yaml 管道配置

这些任务可以通过 Azure DevOps Web UI(如上所示)和管道架构中的 Yaml 代码来配置

管理员命令示例用法

steps:
- task: Azure-Kusto.PublishToADX.PublishToADX.PublishToADX@1
  displayName: '<Task Name>'
  inputs:
    script: '<inline Script>'
    waitForOperation: true
    kustoUrls: '$(CONNECTIONSTRING):443?DatabaseName=""'
    customAuth: true
    connectedServiceName: '<Service Endpoint Name>'
    serialDelay: 1000
  continueOnError: true
  condition: ne(variables['ProductVersion'], '') ## Custom condition Sample

查询示例用法

steps:
- task: Azure-Kusto.PublishToADX.ADXQuery.ADXQuery@1
  displayName: '<Task Display Name>'
  inputs:
    script: |  
     let badVer=
     RunnersLogs | where Timestamp > ago(30m)
         | where EventText startswith "$$runnerresult" and Source has "ShowDiagnostics"
         | extend State = extract(@"Status='(.*)', Duration.*",1, EventText)
         | where State == "Unhealthy"
         | extend Reason = extract(@'"NotHealthyReason":"(.*)","IsAttentionRequired.*',1, EventText)
         | extend Cluster = extract(@'Kusto.(Engine|DM|CM|ArmResourceProvider).(.*).ShowDiagnostics',2, Source)
         | where Reason != "Merge success rate past 60min is < 90%"
         | where Reason != "Ingestion success rate past 5min is < 90%"
         | where Reason != "Ingestion success rate past 5min is < 90%, Merge success rate past 60min is < 90%"
         | where isnotempty(Cluster)
         | summarize max(Timestamp) by Cluster,Reason 
         | order by  max_Timestamp desc      
         | where Reason startswith "Differe"
         | summarize by Cluster
     ;   
      DimClusters | where Cluster in (badVer)
     | summarize by Cluster , CmConnectionString , ServiceConnectionString ,DeploymentRing
     | extend ServiceConnectionString = strcat("#connect ", ServiceConnectionString)
     | where DeploymentRing == "$(DeploymentRing)"
    kustoUrls: 'https://<ClusterName>.kusto.windows.net?DatabaseName=<DataBaneName>'
    customAuth: true
    connectedServiceName: '<Service Endpoint Name>'
  continueOnError: true