本文档涵盖了为 OpenHands 做出贡献的开发流程、工具和最佳实践。它侧重于开发环境设置、构建编排、代码质量强制以及支持高效开发工作流的 CI/CD 管道基础设施。
有关初始设置和安装步骤的信息,请参阅 设置与安装。有关详细的构建系统机制,请参阅 构建系统。有关代码风格指南和 linting 配置,请参阅 代码风格与 linting。
OpenHands 提供了一个全面的开发环境,支持本地开发和容器化工作流。开发过程通过集中的 Makefile 进行协调,该 Makefile 协调依赖管理、环境设置和各种开发任务。
开发工作流架构
开发环境支持多种平台(macOS、Linux、WSL),具有自动平台检测和特定于平台的配置。系统需要 Python 3.12、Node.js 22+、用于 Python 依赖管理的 Poetry,以及用于容器化开发的 Docker(可选)。
来源: Makefile1-336 Makefile46-61 Makefile63-136
构建系统以 Make 目标为中心,协调 Poetry (Python)、npm (Node.js) 和 Docker 构建过程。该系统支持本地开发构建和生产 Docker 镜像构建。
构建系统组件
构建脚本 containers/build.sh 支持多种构建模式,包括用于注册表发布的 --push、用于本地 Docker 镜像的 --load,以及用于在不构建的情况下生成配置的 --dry。它自动处理特定于平台的构建(linux/amd64、linux/arm64),并根据 Git refs 和环境变量生成相应的标签。
来源: Makefile24-31 containers/build.sh1-183 containers/app/Dockerfile1-99 .github/workflows/ghcr-build.yml55-103
OpenHands 通过使用 pre-commit 钩子、用于前端代码的 ESLint 以及用于 Python 代码的 Ruff/mypy 的多层方法来强制执行代码质量。Linting 系统集成到本地开发和 CI/CD 管道中。
代码质量管道
前端使用支持 TypeScript 的 ESLint、Airbnb 配置和 Prettier 集成。配置包括针对未使用导入、导入扩展和特定于 React 的模式的规则。Python 代码质量通过 Ruff(用于 linting 和格式化)、mypy(用于类型检查)以及用于 YAML 验证和尾部空格的其他钩子来强制执行。
来源: dev_config/python/.pre-commit-config.yaml1-45 frontend/.eslintrc1-76 frontend/.husky/pre-commit1-12 .github/workflows/lint.yml1-70 .github/workflows/lint-fix.yml1-92
测试基础设施涵盖了前端和后端组件,支持在不同的执行环境中进行单元测试、集成测试和特定于运行时的测试。
测试架构
测试系统使用 pytest 进行并行执行(pytest-xdist)和失败时自动重试(pytest-rerunfailures)。运行时测试在具有不同用户配置的 Docker 容器中执行,以验证沙箱行为。CI 管道包括跨不同基础镜像(nikolaik、ubuntu)和运行时配置的矩阵测试。
来源: .github/workflows/py-unit-tests.yml1-84 .github/workflows/fe-unit-tests.yml1-45 .github/workflows/ghcr-build.yml249-384 Makefile206-208
CI/CD 管道通过 GitHub Actions 实现,拥有处理开发生命周期中不同方面的多个工作流,包括 linting、测试、构建和部署。
CI/CD 工作流架构
该管道使用 GitHub 的容器注册表 (ghcr.io) 进行镜像存储,并支持多平台构建(linux/amd64、linux/arm64)。工作流包括哈希验证以确保构建的可重复性,并自动更新 PR 描述以提供 Docker 运行命令,便于测试。
来源: .github/workflows/ghcr-build.yml1-455 .github/workflows/lint.yml1-70 .github/workflows/lint-fix.yml1-92 .github/workflows/stale.yml1-23
OpenHands 通过 Docker Compose 和专用开发容器支持容器化开发。容器系统为应用程序和运行时环境提供了隔离。
容器开发架构
容器入口点脚本 containers/app/entrypoint.sh 基于 SANDBOX_USER_ID、Docker 套接字权限和工作空间挂载进行动态用户创建。系统支持以 root 用户或动态创建的用户身份运行,以匹配主机文件系统权限。
来源: containers/app/Dockerfile1-99 containers/app/entrypoint.sh1-62 containers/build.sh1-183 Makefile250-262 Makefile302-310