持续集成和持续部署到 Azure IoT Edge 设备

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

重要

IoT Edge 1.5 LTS 和 IoT Edge 1.4 LTS 是受支持的版本。 IoT Edge 1.4 LTS 的生命周期结束日期为 2024 年 11 月 12 日。 如果你使用的是较低的版本,请参阅更新 IoT Edge

借助 Azure Pipelines 中的内置 Azure IoT Edge 任务,可以轻松地在 Azure IoT Edge 应用程序中采用 DevOps。 本文演示了如何通过 Azure Pipelines 来使用 YAML 生成、测试和部署 Azure IoT Edge 模块。

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

本文介绍如何使用 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 设备

若要详细了解如何使用 Azure 存储库,请参阅 Share your code with Visual Studio and Azure Repos(与 Visual Studio 和 Azure 存储库共享代码)。

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

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

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

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

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

    屏幕截图显示了如何使用“新建管道”按钮创建新的生成管道。

  3. 在“你的代码位于何处?”页上,选择“Azure Repos Git YAML”。

  4. 选择要为其创建管道的存储库。

    屏幕截图显示了如何为生成管道选择存储库。

  5. 在“配置管道”页上,选择“初学者管道”。 如果你有一个现有的 Azure Pipelines YAML 文件并希望用它来创建此管道,则你可以选择“现有 Azure Pipelines YAML 文件”,并提供该文件在存储库中的分支和路径。

    选择“初学者管道”或“现有 Azure Pipelines YAML 文件”开始生成管道

  6. 在“查看管道 YAML”页面中,可选择默认名称 azure-pipelines.yml,对管道的配置文件进行重命名。

    选择“显示助手”打开“任务”面板。

    屏幕截图显示了如何选择“显示助手”以打开“任务”面板。

  7. 若要添加任务,请将光标置于 YAML 的末尾,或者置于要将任务指令添加到的任何位置。 搜索并选择“Azure IoT Edge”。 按如下所示填写任务的参数。 然后选择“添加”。

    参数 说明
    操作 选择“生成模块映像”。
    .template.json 文件 提供包含你的 IoT Edge 解决方案的存储库中 deployment.template.json 文件的路径。
    默认平台 根据目标 IoT Edge 设备为模块选择相应的操作系统。

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

    屏幕截图显示了“使用任务”面板以及如何将任务添加到管道。

    提示

    添加每个任务后,编辑器将自动突出显示添加的行。 为了防止意外覆盖,请在添加其他任务之前取消选择这些行,并为下一个任务提供新的空间。

  8. 重复此过程,使用以下参数额外添加三个任务:

    • 任务:“Azure IoT Edge”

      参数 说明
      操作 选择“推送模块映像”。
      容器注册表类型 使用默认类型:“Azure 容器注册表”。
      Azure 订阅 选择订阅。
      Azure 容器注册表 选择你要用于管道的注册表。
      .template.json 文件 提供包含你的 IoT Edge 解决方案的存储库中 deployment.template.json 文件的路径。
      默认平台 根据目标 IoT Edge 设备为模块选择相应的操作系统。

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

    • 任务:“复制文件”

      参数 说明
      源文件夹 要从中进行复制的源文件夹。 留空表示使用存储库的根目录。 如果文件不在存储库中,请使用变量。 示例:$(agent.builddirectory)
      目录 添加两行:deployment.template.json**/module.json
      目标文件夹 指定变量 $(Build.ArtifactStagingDirectory)。 请参阅生成变量,了解相关说明。

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

    • 任务:“发布生成工件”

      参数 说明
      要发布的路径 指定变量 $(Build.ArtifactStagingDirectory)。 请参阅生成变量,了解相关说明。
      项目名称 指定默认名称:drop
      项目发布位置 使用默认位置:Azure Pipelines

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

  9. 从右上方的“保存并运行”下拉菜单中选择“保存”。

  10. 默认已为 YAML 管道启用了持续集成触发器。 如果你要编辑这些设置,请选择你的管道,然后选择右上方的“编辑”。 选择右上方的“运行”按钮旁边的“更多操作”,然后转到“触发器”。 在管道名称下,“持续集成”显示为“已启用”。 如果你要查看触发器的详细信息,请选中“从此处替代 YAML 持续集成触发器”框。

屏幕截图显示了如何从“更多操作”下的“触发器”菜单查看管道的触发器设置。

继续下一部分以生成发布管道。

为持续部署创建发布管道

在本部分中,你将创建一个发布管道,此管道配置为在生成管道放置项目时自动运行,并且它会在 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. 选择“保存”,将更改保存到新发布管道。 从菜单中选择“管道”选项卡,返回管道视图。

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

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

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

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

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

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

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

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

    查看作业的日志输出

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

    发布到 dev

  6. 选择“开发”阶段,查看发布日志

    发布日志

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

后续步骤