持续集成和持续部署到 Azure IoT Edge 设备(经典编辑器)

适用于:IoT Edge 1.4 复选标记 IoT Edge 1.4

重要

IoT Edge 1.4 是受支持的版本。 如果使用的是较低的版本,请参阅更新 IoT Edge

Azure Pipelines 包含一个内置的 Azure IoT Edge 任务,可帮助你在 Azure IoT Edge 应用程序中采用 DevOps。 本文演示了如何在经典编辑器中使用 Azure Pipelines 的持续集成和持续部署功能,快速高效地生成和测试应用程序并将其部署到 Azure IoT Edge。 也可使用 YAML

用于开发和生产的持续集成和持续开发分支的示意图。

本文介绍如何使用 Azure Pipelines 的内置 Azure IoT Edge 任务为 IoT Edge 解决方案创建生成和发布管道。 添加到管道中的每个 Azure IoT Edge 任务都可执行以下四个操作之一:

操作 说明
生成模块映像 使用 IoT Edge 解决方案代码生成容器映像。
推送模块映像 将模块映像推送到指定的容器注册表。
生成部署清单 使用 deployment.template.json 文件和变量来生成最终的 IoT Edge 部署清单文件。
部署到 IoT Edge 设备 创建目标为一个或多个 IoT Edge 设备的 IoT Edge 部署。

除非另行指定,否则本文中的过程不会探讨通过任务参数提供的所有功能。 有关更多信息,请参见以下资源:

先决条件

  • Azure Repos 存储库。 如果没有存储库,可在项目中创建一个新的 Git 存储库。 在本文中,我们创建了名为“IoTEdgeRepo”的存储库。

  • 提交 IoT Edge 解决方案并将其推送到存储库。 如果要为测试本文创建新的示例解决方案,请按使用 Visual Studio Code 开发 Azure IoT Edge 模块中的步骤操作。 在本文中,我们在名为“IoTEdgeSolution”的存储库中创建了一个解决方案,其中包含名为“filtermodule”的模块的代码 。

    对于本文,你只需要 Visual Studio Code 或 Visual Studio 中的 IoT Edge 模板创建的解决方案文件夹。 在继续操作之前,无需生成、推送、部署或调试此代码。 你将在 Azure Pipelines 中设置这些流程。

    了解解决方案中 deployment.template.js 文件的路径,该路径在几个步骤中使用。 如果不熟悉部署模板的角色,请参阅了解如何部署模块和建立路由

    提示

    如果要创建新解决方案,请首先在本地克隆存储库。 然后,在创建解决方案时,可以选择直接在存储库文件夹中创建它。 可以轻松从中提交和推送新文件。

  • 容器注册表,你可以在其中推送模块图像。 可使用 Azure 容器注册表或第三方注册表。

  • 一个活动的具有至少两个 IoT Edge 设备的 Azure IoT 中心,用于测试单独的测试和生产部署阶段。 可按照快速入门文章在 LinuxWindows 上创建 IoT Edge 设备

创建用于持续集成的生成管道

在本部分中,将创建新的生成管道。 配置管道使其自动运行,并在向 IoT Edge 解决方案签入任何更改时发布生成日志。

  1. 登录 Azure DevOps 组织 (https://dev.azure.com/{your organization}),打开包含 IoT Edge 解决方案存储库的项目。

    屏幕截图显示了如何打开 DevOps 项目。

  2. 在项目的左窗格菜单中,选择“管道”。 在页面正中选择“创建管道”。 或者,如果已有生成管道,则选择右上方的“新建管道”按钮。

    屏幕截图显示了如何创建新的生成管道。

  3. 在“代码位置”页的底部,选择“使用经典编辑器”。 如果要使用 YAML 创建项目的生成管道,请参阅 YAML 指南

    屏幕截图显示了如何使用经典编辑器。

  4. 按照提示创建管道。

    1. 提供新生成管道的源信息。 选择“Azure Repos Git”作为源,然后选择 IoT Edge 解决方案代码所在的项目、存储库和分支。 然后选择“继续”。

      屏幕截图显示了如何选择管道源。

    2. 选择“空作业”而不是模板。

      屏幕截图显示了如何从空作业开始创建生成管道。

  5. 创建管道后,将转到管道编辑器。 可在此处更改管道的名称、代理池和代理规范。

    可选择一个 Microsoft 托管池或由你自己管理的自承载池。

    在管道描述中,根据目标平台选择正确的代理规范:

    配置生成代理规范。

  6. 管道预先配置了名为“代理作业 1”的作业。 选择加号 (+),向作业添加四个任务:“Azure IoT Edge”两次,“复制文件”一次,“发布生成项目”一次。 搜索每个任务并将鼠标悬停在任务的名称上以查看“添加”按钮。

    添加 Azure IoT Edge 任务。

    添加所有四个任务后,代理作业如下所示:

    生成管道中的四个任务。

  7. 选择第一个“Azure IoT Edge”任务进行编辑。 此任务通过指定的目标平台生成解决方案中的所有模块。 使用以下值编辑任务:

    参数 说明
    显示名称 “操作”字段更改时,显示名称会自动更新。
    操作 选择“生成模块映像”。
    .template.json 文件 选择省略号 (...) 并导航到包含 IoT Edge 解决方案的存储库中的“deployment.template.json”文件
    默认平台 根据目标 IoT Edge 设备为模块选择相应的操作系统。
    输出变量 提供一个将与文件路径(在其中生成 deployment.json 文件)关联的引用名称,例如 edge

    有关此任务及其参数的详细信息,请参阅 Azure IoT Edge 任务

    这些配置使用 module.json 文件中定义的映像存储库和标记来命名和标记模块映像。 “生成模块映像”也有助于将变量替换为在 module.json 文件中定义的具体值。 在 Visual Studio 或 Visual Studio Code 中,可以在 .env 文件中指定实际值。 在 Azure Pipelines 中,请在“管道变量”选项卡中设置值。在管道编辑器菜单上选择“变量”选项卡并配置名称和值,如下所示:

    • ACR_ADDRESS:Azure 容器注册表的“登录服务器”值。 可以在 Azure 门户中容器注册表的概述页面上找到登录服务器值。

    如果你在项目中有其他变量,可以在此选项卡上指定名称和值。“生成模块映像”仅识别 ${VARIABLE} 格式的变量。 请确保在 **/module.json 文件中使用此格式。

  8. 选择第二个“Azure IoT Edge”任务进行编辑。 此任务会把所有模块图像推送到所选容器注册表。

    参数 说明
    显示名称 “操作”字段更改时,显示名称会自动更新。
    操作 选择“推送模块映像”。
    容器注册表类型 使用默认类型:Azure Container Registry
    Azure 订阅 选择订阅。
    Azure 容器注册表 选择用于存储模块图像的容器注册表类型。 窗体会根据选择的注册表类型进行更改。 如果选择“Azure 容器注册表”,请使用下拉列表选择 Azure 订阅和容器注册表的名称。 如果选择“通用容器注册表”,请选择“新建”以创建注册表服务连接 。
    .template.json 文件 选择省略号 (...) 并导航到包含 IoT Edge 解决方案的存储库中的“deployment.template.json”文件
    默认平台 根据目标 IoT Edge 设备为模块选择相应的操作系统。
    向部署清单添加注册表凭据 指定 true 以添加用于将 Docker 映像推送到部署清单的注册表凭据。

    有关此任务及其参数的详细信息,请参阅 Azure IoT Edge 任务

    如果有多个用于托管模块映像的容器注册表,则需重复此任务,选择其他容器注册表,并使用“高级”设置中的“绕过模块”来绕过不适用于此特定注册表的映像。

  9. 选择“复制文件”任务进行编辑。 使用此任务将文件复制到项目暂存目录。

    参数 说明
    显示名称 使用默认名称或自定义
    源文件夹 包含要复制的文件的文件夹。
    目录 添加两行:deployment.template.json**/module.json。 这两个文件充当生成 IoT Edge 部署清单所需的输入。
    目标文件夹 指定变量 $(Build.ArtifactStagingDirectory)。 请参阅生成变量,了解相关说明。

    有关此任务及其参数的详细信息,请参阅复制文件任务

  10. 选择“发布生成项目”任务进行编辑。 提供到任务的项目暂存目录路径,使该路径可以发布到发布管道。

    参数 说明
    显示名称 使用默认名称或自定义。
    要发布的路径 指定变量 $(Build.ArtifactStagingDirectory)。 请参阅生成变量,了解详细信息。
    项目名称 使用默认名称:drop
    项目发布位置 使用默认位置:Azure Pipelines

    有关此任务及其参数的详细信息,请参阅发布生成工件任务

  11. 打开“触发器”标签,然后选中“启用持续集成”框 。 确保包含代码的分支已包括在内。

屏幕截图显示了如何开启持续集成触发器。

  1. 从“保存并排队”下拉列表中选择“保存”。

此管道现配置为在将新代码推送到存储库时自动运行。 发布管道项目的最后一项任务是触发发布管道。 继续下一部分以生成发布管道。

为持续部署创建发布管道

在本部分中,会创建一个发布管道,此管道配置为在生成管道放置项目时自动运行,并且它将在 Azure Pipelines 中显示部署日志。

创建新管道,然后添加新阶段:

  1. 在“管道”下的“发布”选项卡中,选择“+ 新建管道” 。 或者,如果已有发布管道,则选择“+ 新建”按钮并选择“+ 新建发布管道” 。

    使用“+ 新建管道”按钮添加发布管道

  2. 提示选择模板时,选择以“空作业”开头。

    从发布管道的空作业开始

  3. 新版本管道初始化为一个阶段,称为“阶段 1”。 将阶段 1 重命名为“dev”,并将其视为适用于你的开发环境的持续部署管道。 通常情况下,持续部署管道具有多个阶段,包括开发、过渡和生产。可以使用不同的名称并根据 DevOps 实践创建更多阶段 。 重命名后关闭阶段详细信息窗口。

    还可选择顶部的“新建发布管道”文本来重命名发布管道。

  4. 将发布链接到生成管道发布的生成项目。 在项目区域中,单击“添加”。

    单击界面的项目区域中的“添加”

  5. 在“添加项目”页上,选择“生成”作为“源类型” 。 选择项目和创建的生成管道。 如果需要,可将“源别名”更改为更具说明性的名称。 然后选择“添加”。

    在“添加项目”页上,选择“添加”以创建项目

  6. 打开项目触发器并选择切换以启用持续部署触发器。 现在,每次有新的生成时,都会创建新版本。

    打开项目触发器并切换以启用持续部署触发器

  7. “dev”阶段预先配置了一个作业和零个任务。 从管道菜单中,选择“任务”,然后选择“dev”阶段 。 选择“代理作业”并将其“显示名称”更改为“QA” 。 可配置有关代理作业的详细信息,但部署任务对平台不敏感,因此可在所选的“代理池”中使用任何“代理规格” 。

    在“任务”选项卡下查看开发阶段的任务

  8. 在 QA 作业中,选择加号 (+) 以添加两个任务。 搜索并添加“Azure IoT Edge”两次。

  9. 选择第一个 Azure IoT Edge 任务,并使用以下值对其进行配置:

    参数 说明
    显示名称 “操作”字段更改时,显示名称会自动更新。
    操作 选择 Generate deployment manifest
    .template.json 文件 指定路径:$(System.DefaultWorkingDirectory)/Drop/drop/deployment.template.json。 路径从生成管道发布。
    默认平台 根据目标 IoT Edge 设备为模块选择相应的操作系统。
    输出路径 放置路径 $(System.DefaultWorkingDirectory)/Drop/drop/configs/deployment.json。 此路径是最终的 IoT Edge 部署清单文件。

    这些配置有助于替换 deployment.template.json 文件中的模块映像 URL。 “生成部署清单”也有助于将变量替换为在 deployment.template.json 文件中定义的具体值。 在 Visual Studio/Visual Studio Code 中,你是在 .env 文件中指定实际值。 在 Azure Pipelines 中,请在“发布管道变量”选项卡中设置值。转到“变量”选项卡,按如下所示配置名称和值

    • ACR_ADDRESS:Azure 容器注册表的“登录服务器”值。 可以在 Azure 门户的容器注册表的“概述”页中检索登录服务器。
    • ACR_PASSWORD:你的 Azure 容器注册表密码。
    • ACR_USER:你的 Azure 容器注册表用户名。

    如果你在项目中有其他变量,可以在此选项卡中指定名称和值。“生成部署清单”只能识别 ${VARIABLE} 样式的变量。 请确保在 *.template.json 文件中使用此样式。

    "registryCredentials": {
      "<ACR name>": { // Your Azure Container Registry **Registry name** value
        "username": "${ACR_USER}",
        "password": "${ACR_PASSWORD}",
        "address": "${ACR_ADDRESS}"
      }
    }
    

    在“变量”选项卡中配置发布管道的变量

  10. 选择第二个 Azure IoT Edge 任务,并使用以下值对其进行配置:

    参数 说明
    显示名称 “操作”字段更改时,显示名称会自动更新。
    操作 选择 Deploy to IoT Edge devices
    部署文件 放置路径 $(System.DefaultWorkingDirectory)/Drop/drop/configs/deployment.json。 此路径指向 IoT Edge 部署清单文件。
    Azure 订阅 选择包含 IoT 中心的订阅。
    IoT 中心名称 选择 IoT 中心。
    选择单个/多个设备 选择是否要将发布管道部署到一个或多个设备。 如果部署到单个设备,请输入“IoT Edge设备 ID”。 如果要部署到多个设备,请指定设备“目标条件”。 目标条件是用于在 IoT 中心匹配一组 IoT Edge 设备的筛选器。 若想将设备标记用作条件,则需要使用 IoT 中心设备孪生更新对应的设备标记。 在高级设置中更新“IoT Edge 部署 ID”和“IoT Edge 部署优先级” 。 有关为多个设备创建部署的详细信息,请参阅了解 IoT Edge 自动部署
    设备 ID 或目标条件 根据前面的选择,指定要部署到多个设备的设备 ID 或目标条件
    高级 对于 IoT Edge 部署 ID,请指定 $(System.TeamProject)-$(Release.EnvironmentName)。 此变量将项目和发布名称映射到你的 IoT Edge 部署 ID。

    如果任务涉及使用公有云不可见的专用 Docker 受信任注册表中的映像,你可将 SKIP_MODULE_IMAGE_VALIDATION 环境变量设置为 true 以跳过图像验证。

    为开发阶段添加 Azure IoT Edge 任务

  11. 选择“保存”,将更改保存到新发布管道。 从菜单中选择“管道”选项卡,返回管道视图。

注意

Azure DevOps 中的 Azure IoT Edge 任务尚不支持分层部署。

但是,可以使用 Azure DevOps 中的 Azure CLI 任务将部署创建为分层部署。 对于“内联脚本”值,你可以使用 az iot edge deployment create 命令

az iot edge deployment create -d {deployment_name} -n {hub_name} --content modules_content.json --layered true

使用生成和发布管道验证 IoT Edge CI/CD

要触发生成作业,可以将提交推送到源代码存储库或手动触发该作业。 在本部分中,手动触发 CI/CD 管道以测试它是否正常工作。 然后验证部署是否成功。

  1. 在左窗格菜单中,选择“管道”,并打开在本文开头创建的生成管道。

  2. 通过选择右上角的“运行管道”按钮,可在生成管道中触发生成作业。

    使用“运行管道”按钮手动触发生成管道

  3. 查看“运行管道”设置。 然后,选择“运行”。

    指定运行管道选项,然后选择“运行”

  4. 选择“代理作业 1”以查看运行进度。 可选择该作业来查看作业的输出日志。

    查看作业的日志输出

  5. 如果生成管道成功完成,则会触发到“dev”阶段的发布。 dev 发布成功以后,会创建 IoT Edge 部署,部署到目标 IoT Edge 设备。

    发布到 dev

  6. 单击 dev 阶段即可查看发布日志。

    发布日志

  7. 如果管道失败,首先查看日志。 可导航到管道运行摘要并选择作业和任务来查看日志。 如果某个任务失败,请检查该任务的日志。 有关配置和使用日志的详细说明,请参阅查看日志以诊断管道问题

后续步骤