本文档涵盖了OpenHands中使用的构建编排、依赖管理和容器化基础设施。构建系统包括本地开发工作流、Docker镜像创建、CI/CD管道和代码质量强制执行。
有关开发设置和安装的信息,请参阅设置与安装。有关代码质量工具和 linting 配置的信息,请参阅代码风格与 linting。
OpenHands采用多层构建系统,支持本地开发和生产部署。该系统通过Poetry协调Python后端依赖,通过npm协调前端依赖,通过Docker容器化,并通过GitHub Actions实现自动化CI/CD。
主要的构建编排通过全面的Makefile处理,该Makefile为开发、测试和部署工作流提供了标准化的目标。
构建目标和依赖项
Makefile定义了几个关键目标来协调构建过程
build:协调所有构建步骤的主构建目标check-dependencies:验证系统需求和工具版本install-python-dependencies:管理基于Poetry的Python依赖安装install-frontend-dependencies:处理npm包安装run:启动完整的开发环境来源: Makefile24-31 Makefile33-44 Makefile138-174 Makefile244-248
构建系统在继续安装之前执行全面的环境验证
系统验证特定的版本要求,并在缺少依赖项时提供详细的错误消息和安装说明。
来源: Makefile46-61 Makefile63-70 Makefile81-95 Makefile118-136
OpenHands使用复杂的Docker构建系统,创建支持多架构的应用程序和运行时镜像。
应用程序Docker镜像使用containers/app/Dockerfile中定义的多阶段构建过程
构建过程创建了一个具有特定UID/GID配置以兼容沙箱的openhands用户,并设置了具有适当权限的工作区目录。
来源: containers/app/Dockerfile2-12 containers/app/Dockerfile13-29 containers/app/Dockerfile31-99
该containers/build.sh脚本为构建所有容器镜像提供了一个统一的接口
该脚本处理多架构构建、基于Git上下文的标签生成以及与容器注册表的集成。
来源: containers/build.sh13-22 containers/build.sh45-76 containers/build.sh137-144
GitHub Actions通过复杂的构建矩阵和测试策略来协调持续集成和部署管道。
CI系统使用动态矩阵策略构建多个运行时变体
矩阵根据触发上下文动态调整——拉取请求仅构建nikolaik变体,而主分支构建包含两个变体。
来源: .github/workflows/ghcr-build.yml31-53 .github/workflows/ghcr-build.yml112-114
CI管道包含在不同用户上下文中进行全面运行时测试
RUN_AS_OPENHANDS=false)openhands用户执行运行时测试(RUN_AS_OPENHANDS=true)两个测试套件都使用pytest-xdist进行并行执行,并包含对不稳定测试的重试逻辑。
来源: .github/workflows/ghcr-build.yml307-315 .github/workflows/ghcr-build.yml377-382
OpenHands为后端和前端组件采用了不同的依赖管理策略。
Poetry通过基于环境变量的条件安装来管理Python依赖项
POETRY_GROUP:控制安装哪些依赖组INSTALL_PLAYWRIGHT:控制Playwright浏览器的安装来源: Makefile150-155 Makefile156-173
前端使用npm进行包管理,强制执行锁定文件并检测Node.js版本
构建系统包含Node.js版本检测并强制执行兼容性要求。
来源: Makefile176-182 .github/workflows/lint.yml29-32
构建系统通过预提交钩子和自动化linting集成代码质量检查。
系统会自动安装预提交钩子,在提交前强制执行代码质量标准。
来源: Makefile184-188 dev_config/python/.pre-commit-config.yaml21-44
前端和后端linting都已集成到构建过程中
ruff进行linting和格式化,mypy进行类型检查系统同时提供手动(make lint)和自动(CI)linting执行。