如何在Bitbucket本地CI Runner的Arduino Due上运行单元测试
解决方案
首先明确:无法将tty设备的访问权限预写入Docker镜像。因为/dev/ttyACM3是宿主机上的动态设备节点,镜像构建阶段该设备并不存在,且设备的权限由宿主机的udev规则、用户组配置决定,镜像无法提前预设这类宿主机层面的动态权限。
以下是几个更优的替代方案:
1. 修改Bitbucket本地运行器全局配置,自动挂载设备
这是最推荐的方案,无需修改流水线或重新构建镜像,只需调整本地运行器的配置文件,让所有流水线容器自动挂载目标设备:
- 找到本地运行器安装目录下的
config.yml文件 - 在
docker配置块中添加devices字段,指定要挂载的设备:docker: devices: - "/dev/ttyACM3:/dev/ttyACM3" - 重启Bitbucket本地运行器,让配置生效
- 额外确保本地运行器的运行用户拥有访问
/dev/ttyACM3的权限:将用户加入dialout组(Linux系统)
完成后重启运行器,避免权限问题。sudo usermod -aG dialout <runner-username>
2. 在流水线步骤中手动执行docker run挂载设备
如果不想修改全局runner配置,可以在流水线脚本中跳过默认的容器启动逻辑,直接用docker run命令挂载设备并运行测试:
pipelines: default: - step: script: # 手动启动镜像并挂载设备,执行测试命令 - docker run --rm --device=/dev/ttyACM3 your-custom-image:latest run-arduino-tests
注意:需要确保本地运行器的用户拥有Docker命令执行权限(即加入docker组),否则会出现权限错误。
3. 调整宿主机udev规则,放宽设备权限
如果容器内访问设备时遇到权限问题,可以通过宿主机的udev规则让Arduino Due的设备节点默认拥有更宽松的权限:
- 创建udev规则文件
/etc/udev/rules.d/99-arduino-due.rules,内容如下(替换为你的设备实际vendor和product ID,可通过lsusb命令查看):SUBSYSTEM=="tty", ATTRS{idVendor}=="2341", ATTRS{idProduct}=="003e", MODE="0666", GROUP="dialout" - 重新加载udev规则并触发设备重识别:
这样设备节点创建时会自动设置为全局可读可写,容器内无需额外权限配置即可访问。sudo udevadm control --reload-rules sudo udevadm trigger
内容的提问来源于stack exchange,提问作者ilja
相关产品推荐
相关产品推荐

