在《开始使用 MicroPython 和 Raspberry Pi Pico》中,我们了解到如何在 Raspberry Pi Pico 设备上设置、配置和运行 MicroPython。在本文中,我们将专注于实现该流程的自动化,并将其转变为持续集成 (CI) 流水线。将自动化转到 CI 将保证我们每次将交付推送到代码存储库时都会测试代码
既然我们已经了解如何开始使用 MicroPython 和 Raspberry Pi Pico 设备,那么接下来就该寻找进一步自动化代码开发过程的方法。在《开始使用 MicroPython 和 Raspberry Pi Pico》中,我们运行了几个不同的指令以演示 Raspberry Pi Pico 设备的不同功能集。在本文中,我们将研究如何使用脚本自动执行其中一个示例,然后将其置入 CI。让我们先观看在终端运行的示例:
此指令为我们提供了计算机实例信息。在示例中:
由此得知,我们在配备 RP2040 芯片的 Raspberry Pi Pico 上运行 MicroPython 1.19.1 版本。与其使用 PuTTY 或 Thonny IDE 通过解释器外层运行此指令,我们实际上可以使用与 MicroPython 库捆绑在一起的工具从指令行运行整个过程。Pyboard.py 工具为我们提供了一种机制,可以直接在目标设备上运行指令,而无需打开解释器外层(或者将新文件直接加载到电路板上)。此外,它还为我们提供了其他文件系统指令,例如列出文件并将其复制到目标设备/从目标设备复制文件。例如,可以使用 Pyboard.py 工具运行 sys.implementation 指令(上方),具体如下所示:
python pyboard.py --device $TARGET_PORT --command "import sys; print(sys.implementation)"
$TARGET_PORT 是您设备显示的 COM 端口。这会跳过 Putty/Thonny IDE 步骤并允许自动化。
现在可以在目标设备上远程自动执行指令,我们应该能够将其折叠成完整的 Python 脚本。事实证明,使用 Pyboard 库非常简单。在此示例 Python 脚本中,我们使用某些额外技巧来运行上面的相同指令(例如自动检测 COM 端口并添加基于断言的检查)。不过,原则是相同的:获取机器实例并验证我们认为正在运行的内容。
将以上所有装入脚本后,我们现在可以将其置入 CI 系统。我和往常一样使用 Gitlab 来实现,但使用我自己的运行器来编程 Raspberry Pi Pico 设备。您可以在此处关注整个项目,但有趣的文件是 .gitlab-ci.yml 脚本。它包含每次我更改代码并将其推送回 Gitlab 时自动进行构建的“说明”。
这里有几项“作业”,但只有一项不涉及 Raspberry Pi Pico 设备:Docker 构建阶段。构建 Docker 容器会将我们的环境装入虚拟机之类的系统。如果我在 Docker 容器中运行 CI 作业,我几乎可以在任何地方运行(给定一些最低要求)。在这种情况下,我不需要在连接到我的目标设备的台式计算机上安装任何特殊库,因为 Docker 容器附带了所有这些库。这样做的唯一区别是我的 Docker 容器必须在“特权”模式下运行(或者至少应提供访问目标设备的明确许可),否则它将无法与目标设备通信。
Docker 容器构建完成后,我就能在每次运行作业时从 Gitlab 检索图像,然后从中感受乐趣。您会注意到我的作业变得越来越抽象,也变得越来越复杂。最后,在上一份作业中,我们通过 Pytest 框架运行整个过程
如果您熟悉我之前的一些文章,比如《FPGAs: Creating Continuous Integration Pipelines for Embedded Systems or PCBs》、《Low-Cost Verification for Digital and Analog Filters》和《Configuring a Hardware in the Loop Project》,您会注意到我是 Pytest 框架的忠实粉丝。在这种情况下,MicroPython 也不例外,我仍然默认为 Pytest 作为验证我的部分 Python 脚本的简单方法。
调用的最后一个 CI 作业运行 test_rpi_pico.py Pytest 脚本。这与 rpi_pico_check.py 脚本几乎相同,只是它创建了测试报告。与往常一样,我们拿出那份测试报告并将其提交给 Gitlab 进行解析,这样我们就可以让那个小型测试部分显示通过结果:
图 1:Pytest 的测试摘要
这个简单的测试验证了我们在上一篇文章中看到的信息。这里的优点是自动化。每当修改代码时,我们都会进行检查,以确保它是我们期望的设备。在本例中,我们使用 RP2040 芯片在 Raspberry Pi Pico 上运行 MicroPython 版本 1.19.1。
在本文中,我们回顾了与 Raspberry Pi Pico 设备通信所涉及的手动步骤。然后,我们采用该手动过程并将其转换为脚本。通过脚本自动化流程后,我们研究了如何将工作流集成到 CI 系统,然后再将其与 Pytest 合并。看完本文中的示例后,您应该能够编写自己的脚本,甚至可以将其集成到 CI。