You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 13:32:28