适用于:IoT Edge 1.4
重要
IoT Edge 1.5 LTS 和 IoT Edge 1.4 是受支持的版本。 如果你使用的是早期版本,请参阅更新 IoT Edge。
Azure Pipelines 包含一项内置的 Azure IoT Edge 任务,可帮助你将 DevOps 与 Azure IoT Edge 应用程序一起使用。 本文演示如何使用 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.json 文件的路径,该路径在几个步骤中会用到。 如果不熟悉部署模板的角色,请参阅了解如何部署模块和建立路由。
小提示
如果要创建新解决方案,请首先在本地克隆存储库。 然后,在创建解决方案时,可以选择直接在存储库文件夹中创建它。 可以轻松从中提交和推送新文件。
容器注册表,你可以在其中推送模块图像。 可使用 Azure 容器注册表或第三方注册表。
一个活跃的 Azure IoT 中心,至少配有两个 IoT Edge 设备,用于测试分开的测试和生产部署阶段。 可按照快速入门文章在 Linux 或 Windows 上创建 IoT Edge 设备
创建用于持续集成的生成管道
在本部分中,您将创建一个新的构建管道。 将管道配置为在提交对 IoT Edge 解决方案的更改时自动运行并发布构建日志。
登录 Azure DevOps 组织 (
https://dev.azure.com/{your organization}
),打开包含 IoT Edge 解决方案存储库的项目。在项目的左窗格菜单中,选择“管道”。 在页面正中选择“创建管道”。 或者,如果已有生成管道,则选择右上方的“新建管道”按钮。
在 代码位置 的底部,选择“ 使用经典编辑器”。 如果要使用 YAML 创建项目的生成管道,请参阅 YAML 指南。
按照提示创建管道。
提供新构建管道的源信息。 选择 Azure Repos Git 作为源,然后选择 IoT Edge 解决方案代码所在的项目、存储库和分支。 然后选择“继续”。
选择 “空作业” 而不是模板。
创建管道后,将进入管道编辑器。 在这里,您可以更改管道的名称、代理池以及代理规范。
可以选择由 Microsoft 托管的池,或由您管理的自托管池。
在管道说明中,根据目标平台选择正确的代理规范:
如果要在适用于 Linux 容器的平台 amd64 中生成模块,请选择 ubuntu-18.04
如果要在平台 amd64 for Windows 1809 容器中生成模块,需要在 Windows 上设置自承载代理。
如果要在适用于 Linux 容器的平台 arm32v7 或 arm64 中生成模块,需要在 Linux 上设置自承载代理。
管道预配置了一个名为“代理作业 1”的作业。 选择加号(+)将四个任务添加到作业中:Azure IoT Edge 两次,复制文件 一次,以及 发布生成工件 一次。 搜索每个任务,并将鼠标悬停在任务的名称上以查看 “添加 ”按钮。
添加所有四个任务后,代理作业如以下示例所示:
选择要编辑的第一个 Azure IoT Edge 任务。 此任务使用指定的目标平台生成解决方案中的所有模块。 使用以下值编辑任务:
参数 说明 显示名称 “操作”字段更改时,显示名称会自动更新。 行动 选择“构建模块镜像”。 .template.json 文件 选择省略号(...),然后导航到包含 IoT Edge 解决方案的存储库中的 deployment.template.json 文件。 默认平台 根据目标 IoT Edge 设备为模块选择相应的操作系统。 输出变量 提供一个引用名称,以与 deployment.json 文件生成的文件路径(例如 边缘)相关联。 有关此任务及其参数的详细信息,请参阅 Azure IoT Edge 任务。
这些配置使用文件中定义的
module.json
映像存储库和标记来命名和标记模块映像。 生成模块映像 还有助于将变量替换为在module.json
文件中定义的确切值。 在 Visual Studio 或 Visual Studio Code 中,你可以在.env
文件中指定实际值。 在 Azure Pipelines 中,在 “管道变量 ”选项卡上设置值。在管道编辑器菜单中选择“ 变量 ”选项卡,并按如下所示配置名称和值:- ACR_ADDRESS:Azure 容器注册表的“登录服务器”值。 可以在 Azure 门户中容器注册表的概述页上找到登录服务器值。
如果项目中还有其他变量,则可以在此选项卡上指定名称和值。 生成模块映像 仅识别格式的
${VARIABLE}
变量。 请确保在**/module.json
文件中使用此格式。选择要编辑的第二个 Azure IoT Edge 任务。 此任务将所有模块映像推送到所选容器注册表。
参数 说明 显示名称 “操作”字段更改时,显示名称会自动更新。 行动 选择“推送模块镜像”。 容器注册表类型 使用默认类型: Azure Container Registry
.Azure 订阅 选择订阅。 Azure 容器注册表 选择用于存储模块映像的容器注册表的类型。 根据所选注册表类型,窗体会发生变化。 如果选择 Azure 容器注册表,请使用下拉列表选择 Azure 订阅和容器注册表的名称。 如果选择 “通用容器注册表”,请选择“ 新建 ”以创建注册表服务连接。 .template.json 文件 选择省略号(...),然后导航到包含 IoT Edge 解决方案的存储库中的 deployment.template.json 文件。 默认平台 根据目标 IoT Edge 设备为模块选择相应的操作系统。 将注册凭证添加到部署清单 指定 true 来添加将 Docker 镜像推送至部署清单所需的注册表凭据。 有关此任务及其参数的详细信息,请参阅 Azure IoT Edge 任务。
如果有多个容器注册表来托管模块映像,则需要复制此任务,选择不同的容器注册表,并使用“高级设置”中的“绕过”模块来绕过不用于此特定注册表的映像。
选择要编辑的 “复制文件” 任务。 使用此任务将文件复制到工件暂存目录。
参数 说明 显示名称 使用默认名称或自定义 源文件夹 包含要复制的文件的文件夹。 内容 添加两行: deployment.template.json
和**/module.json
。 这两个文件用作生成 IoT Edge 部署清单的输入。目标文件夹 指定变量 $(Build.ArtifactStagingDirectory)
。 请参阅生成变量,了解相关说明。有关此任务及其参数的详细信息,请参阅复制文件任务。
选择 “发布生成工件”任务以进行编辑。 为任务提供工件暂存目录的路径,以便将该路径发布到发布管道中。
参数 说明 显示名称 使用默认名称或自定义。 发布路径 指定变量 $(Build.ArtifactStagingDirectory)
。 有关详细信息,请参阅 生成变量 。工件名称 请使用默认名称:drop 工件发布位置 使用默认位置: Azure Pipelines 有关此任务及其参数的详细信息,请参阅发布生成工件任务。
打开 “触发器 ”选项卡并选中复选框以 启用持续集成。 请确保您的代码所在的分支被包含。
- 从“保存和排队”下拉列表中选择“保存”。
现在,此管道配置为在将新代码推送到存储库时自动运行。 最后的任务是发布管道工件,这会触发发布流水线。 继续到下一部分以构建发布流水线。
为持续部署创建发布管道
在本部分中,您将创建一个发布管道,该管道配置为在生成管道生成并传递工件时自动运行,并将在 Azure Pipelines 中展示部署日志。
创建新管道,然后添加新阶段:
在“管道”选项卡下的“发布”中,选择“+ 新建管道”。 或者,如果已有发布管道,则选择“+ 新建”按钮并选择“+ 新建发布管道” 。
当提示选择模板时,选择从“空白作业”开始。
新发布管道初始化时包含一个阶段,即“阶段 1”。 将阶段 1 重命名为“dev”,并将其视为适用于你的开发环境的持续部署管道。 通常情况下,持续部署管道具有多个阶段,包括开发、过渡和生产。可以使用不同的名称并根据 DevOps 实践创建更多阶段 。 重命名后关闭阶段详细信息窗口。
您还可以通过选择顶部的"新发布管道"文本来重命名您的发布管道。
将发布版本链接到由构建管道发布的构建工件。 单击制品区中的添加。
在“添加工件”页上,选择“构建”作为“源类型”。 选择项目和创建的生成管道。 如果需要,可将“源别名”更改为更具说明性的名称。 然后选择“添加”。
打开工件触发器,并选择开关以启用持续部署触发器。 现在,每次有新版本可用时都会创建一个新版本。
dev阶段预先配置了一个作业和零个任务。 从流水线菜单中,选择“任务”,然后选择“dev”阶段。 选择“代理任务”,并将其“显示名称”更改为“QA”。 可配置有关代理作业的详细信息,但部署任务对平台不敏感,因此可在所选的“代理池”中使用任何“代理规格” 。
在 QA 作业中,选择加号 (+) 以添加两个任务。 搜索并添加“Azure IoT Edge”两次。
选择第一个 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。 “生成部署清单”也有助于将变量替换为在 文件中定义的具体值。 在 Visual Studio/Visual Studio Code 中,你是在.env
文件中指定实际值。 在 Azure Pipelines 中,请在“发布管道变量”选项卡中设置值。转到“变量”选项卡,按如下所示配置名称和值- ACR_ADDRESS:Azure 容器注册表的“登录服务器”值。 可以在 Azure 门户的容器注册表的“概述”页中检索登录服务器。
- ACR_PASSWORD:你的 Azure 容器注册表密码。
- ACR_USER:你的 Azure 容器注册表用户名。
如果你在项目中有其他变量,可以在此选项卡中指定名称和值。“生成部署清单”只能识别 样式的变量。 请确保在
*.template.json
文件中使用此样式。"registryCredentials": { "<ACR name>": { // Your Azure Container Registry **Registry name** value "username": "${ACR_USER}", "password": "${ACR_PASSWORD}", "address": "${ACR_ADDRESS}" } }
选择第二个 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 环境变量设置为 以跳过图像验证。
选择“保存”,将更改保存到新发布管道。 从菜单中选择“管道”选项卡,返回管道视图。
注释
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”以查看运行进度。 可选择该作业来查看作业的输出日志。
如果构建流水线成功完成,则会触发向dev阶段的发布。 dev 发布成功以后,会自动创建 IoT Edge 部署,针对目标 IoT Edge 设备进行部署。
单击 开发 阶段以查看发布日志。
如果你的管道出现问题,首先查看日志。 可导航到管道运行摘要并选择作业和任务来查看日志。 如果某个任务失败,请检查该任务的日志。 有关配置和使用日志的详细说明,请参阅查看日志以诊断管道问题。
后续步骤
- 在单设备或大规模 IoT Edge 部署中了解 IoT Edge 部署
- 阅读大规模地部署和监视 IoT Edge 模块,详细了解创建、更新或删除部署的步骤。