OneDev 介绍与选型指南
OneDev 一体化 DevOps 平台的定位、架构、功能与选型分析:基于 16.9.3 在 Ubuntu 22.04 实测安装、首个构建与 REST API,并给出与 GitLab CE、Jenkins、Gitea 的横向选型建议。
OneDev 介绍与选型指南
目标:说清 OneDev 是什么、能做什么、怎么跑起来,以及它相对 GitLab CE、Jenkins、Gitea 等同类平台的选型取舍。文中全部命令与回显均已在 Ubuntu 22.04 服务器(OpenJDK 17 + OneDev 16.9.3)上实测通过,首个项目与首个构建也已实际运行。
一、环境信息
本文所有实测在如下环境完成,读者复现时保持相近版本即可:
- 操作系统:Ubuntu 22.04.5 LTS(x86_64)
- Java:OpenJDK 17.0.20.1(
17.0.20.1+1-1-22.04-Ubuntu,通过openjdk-17-jdk-headless安装) - Git:2.34.1
- curl:7.81.0
- OneDev:16.9.3(构建日期 2026-10-17,commit
47d730d4798dd94aeaa176ec113e943d2eac76f3) - 服务端口:HTTP
6610、SSH6611(Git over SSH)、集群通信5710 - 安装目录:
/opt/onedev - 数据采集日期:2026-10-17
二、软件概述
OneDev 是一个用 Java 编写的一体化 DevOps 平台:在一个进程里同时提供 Git 代码托管、CI/CD 流水线、问题(Issue)跟踪、敏捷看板、制品(Package)仓库、Wiki 与代码搜索等能力,开箱即用,不需要像「GitLab + Jenkins + Nexus」那样拼装三套系统。
它的几个关键身份信息(均实查于官方仓库与发行包,查询日期 2026-10-17):
| 项目 | 内容 |
|---|---|
| 开发方 | OneDev Pty(作者 Robin Shen),GitHub 组织 theonedev |
| 开源协议 | 非 EE 文件为 MIT;lib 下以 io.onedev.server-ee 开头的 EE 模块为商业许可,对应集群高可用等订阅功能 |
| 当前版本 | 16.9.3(2026-10-17 发布) |
| 技术栈 | Java 17 起步(发行包 conf/wrapper.conf 中 wrapper.java.version.min=17),内嵌 HSQLDB,可外接 MySQL/PostgreSQL/MariaDB |
| 部署形态 | 虚拟机/裸金属发行包、官方镜像、Kubernetes Chart 三种 |
| 社区数据 | GitHub 15,316 stars / 988 forks / 141 watchers,仓库创建于 2018-11-06 |
💡 说明:OneDev 的发行节奏非常快,实测拉取官方 Releases 列表显示 2026-10-02 至 2026-10-17 的 16 天内连续发布了 v16.8.3 到 v16.9.3 共 10 个版本,属于「高频小步快跑」型项目。这带来持续的新特性,也意味着升级是运维常态,备份恢复能力要一开始就建好(见《OneDev Docker Compose 部署指南》备份章节思路:定期
backup-db.sh+ 异机存放备份包)。
三、核心架构
OneDev 是单体架构:一个 JVM 进程承载全部 Web、API、Git 服务与构建调度,靠目录布局把代码数据、构建数据、数据库分开落盘。这种设计的代价是纵向扩容,收益是部署与备份都极其简单——备份整个安装目录加一个数据库导出包即可整体迁移。
3.1 目录结构
解压发行包后得到如下结构(实测 ls /opt/onedev,与官方发行包一致):
/opt/onedev/
├── bin/ # server.sh 等管理脚本(启动、备份、恢复、升级、重置密码)
├── boot/ # 引导 jar 与 OneDev Wrapper 平台二进制
├── conf/ # server.properties、hibernate.properties、wrapper.conf 等配置
├── lib/ # 全部应用 jar(EE 模块也在这里,以 io.onedev.server-ee 开头)
├── site/ # 运行期站点数据:项目 Git 裸仓、构建日志、附件
├── internaldb/ # 默认内嵌 HSQLDB 数据文件
├── db-backup/ # 数据库备份 zip 的默认输出目录
├── agent/ # 内置构建 agent 发行包(供远端执行机下载)
├── logs/ # server.log、console.log、backup-db.log 等日志
├── temp/ # 构建工作区、升级/备份临时文件
├── license.txt # 许可说明
└── release.properties # 版本与构建信息
release.properties 实测内容(节选):
date=2026-10-17 00\:50\:59
commit=47d730d4798dd94aeaa176ec113e943d2eac76f3
version=16.9.3
3.2 引导与进程模型
自 16.9.0 起,服务端与 agent 发行包改用 OneDev Wrapper 引导(替代原 Java Service Wrapper)。bin/server.sh 是一个壳脚本,最终执行 boot/wrapper-linux-x86-64 --script server conf/wrapper.conf <子命令>(实测脚本尾部为 exec "$DIRECTORY/../boot/$BINARY" --script ...)。因此 server.sh 天然支持 console(前台)、start/stop/status、install/remove(注册系统服务)等子命令,实测 bin/server.sh status 在服务运行时返回:
RUNNING
JVM 参数集中在 conf/wrapper.conf。两个最常用的默认值(实测文件原文):
wrapper.java.version.min=17
set.default.max_memory_percent=50
即堆上限默认为物理内存的 50%,可通过 wrapper.java.initmemory/wrapper.java.maxmemory(MB)改写为固定值。修改后用 ps -ef | grep [j]java 核对进程实际生效的 -Xms/-Xmx 即可确认(详见《OneDev 16.9.3 核心原理详解》5.3 节的实测示例)。
3.3 端口与数据流
conf/server.properties 实测默认值:
http_host=0.0.0.0
http_port=6610
ssh_port=6611
cluster_port=5710
6610:Web UI 与 REST/GraphQL API;6611:内嵌 SSH 服务,承载 Git over SSH 与远程命令;5710:集群与 agent 通信端口,构建任务通过它分配到执行器(实测构建日志中可见Executing job (executor: server-shell, server: 127.0.0.1:5710))。
💡 技术拓展:构建任务的执行位置由「作业执行器(Job Executor)」决定,不止一种——
server-shell(直接在服务端 shell 执行,零额外依赖)、隔离执行器(把步骤放进指定的隔离环境执行,需服务端具备相应运行时能力)、以及远程 agent(在目标机器上安装 OneDev agent,任务下发到 agent 执行,适合多机与多环境)。本文快速开始用默认的server-shell,原因是不依赖任何额外运行时、一台机器即可跑通;多机执行见官方 Administration → Agents 文档。
3.4 持久化
默认使用内嵌 HSQLDB(conf/hibernate.properties 中 hibernate.dialect=org.hibernate.dialect.HSQLDialect,数据落在 internaldb/),官方明确标注适合演示与试用;生产建议外接 MySQL 5.0+ / PostgreSQL 9.0+ / MariaDB 5.0+,切换方式是改 hibernate.properties 对应注释段并用 backup-db.sh/restore-db.sh 做数据搬家。
四、功能特性
以下特性均在 16.9.3 实例上实际操作过,不是罗列官方宣传页。
代码托管:每个项目一个 Git 裸仓,落盘在 site/projects/<项目ID>/git/,实测目录内含 refs/(含 pulls/ 分支引用,说明 PR 引用由服务端管理)、hooks/post-receive、hooks/pre-receive(服务端推送钩子,用于触发构建与校验)、lfs/(Git LFS 支持)。
CI/CD:构建规范 .onedev-buildspec.yml 与代码同库存放,支持步骤级条件(condition)、失败重试(retryCondition)、触发器(BranchUpdateTrigger 等,可限定分支与操作者 userMatch)。实测项目 hello-onedev 的构建规范(节选,完整解释见原理篇):
jobs:
- name: build
steps:
- !CheckoutStep
name: checkout code
cloneCredential: !DefaultCredential {}
condition: SUCCESSFUL
- !CommandStep
name: run build commands
condition: SUCCESSFUL
runInContainer: false
interpreter: !PosixInterpreter
shell: sh
commands: |
echo "== build on $(hostname) =="
./hello.sh
triggers:
- !BranchUpdateTrigger
branches: main
userMatch: anyone
retryCondition: never
实测第 5 次构建成功,其中命令步骤输出(提取自构建日志原文):
== build on 0870c5949ac5 ==
Hello, OneDev 16.9.3!
Linux 6.8.0-138-generic x86_64
2026-10-17 10:25:26
== check required artifact ==
Step "run build commands" is successful
问题跟踪与构建联动:实测构建 #3 因缺少制品失败后,在问题里记录「CI 构建失败:缺少 dist/app.tar.gz」,通过 REST API 能同时查到问题与构建状态,二者天然关联。
制品仓库:项目级 packManagement: true(实测 REST API 返回字段),支持 Maven/npm/镜像等包类型的私有仓库。
REST API:内置 API 文档页,接口走 Basic Auth 或访问令牌。实测匿名请求返回 401、携带管理员凭据返回 200:
$ curl -s -m 10 -w '\nHTTP=%{http_code}\n' "http://localhost:6610/~api/projects?offset=0&count=5"
Not authenticated
HTTP=401
$ curl -s -m 10 -u admin:q1w2e3r4 "http://localhost:6610/~api/projects?offset=0&count=5"
[ {
"id" : 1,
"parentId" : null,
"forkedFromId" : null,
"name" : "hello-onedev",
"path" : "hello-onedev",
"description" : "OneDev CI demo project",
"createDate" : "2026-10-17T10:01:37.216+00:00",
"codeManagement" : true,
"wikiManagement" : false,
"packManagement" : true,
"issueManagement" : true,
...
} ]
HTTP=200
备份恢复:bin/backup-db.sh 把数据库逐表导出为 XML 并打包成 db-backup/backup-<时间戳>.zip,bin/restore-db.sh 从备份包整体恢复。实测备份日志尾部:
2026-10-17 11:00:05,213 INFO - Database is successfully backed up to /opt/onedev/db-backup/backup-20261017190000.zip
恢复实测日志尾部:
2026-10-17 11:02:36,300 INFO - Database is successfully restored from /opt/onedev/db-backup/backup-20261017190000.zip
此外还有版本化的代码搜索(服务端自动索引)、Pull Request 评审与必需检查、构建指标统计、以及 16.x 引入的 AI 辅助能力(官方定位为 AI teammates)。
五、快速开始(最小可用示例)
目标:在一台 Ubuntu 22.04 服务器上从零把 OneDev 跑起来,建一个项目并跑通第一次 CI 构建。全程约 10 分钟。
5.1 安装前置依赖
OneDev 服务端只需要系统里有 Java(17+)与 Git(2.11.1+),发行包自带其余全部内容。实测安装与版本确认:
sudo apt-get update
sudo DEBIAN_FRONTEND=noninteractive apt-get install -y openjdk-17-jdk-headless git curl
实测版本回显:
$ java -version
openjdk version "17.0.20.1" 2026-08-18
OpenJDK Runtime Environment (build 17.0.20.1+1-1-22.04-Ubuntu)
OpenJDK 64-Bit Server VM (build 17.0.20.1+1-1-22.04-Ubuntu, mixed mode, sharing)
$ git --version
git version 2.34.1
$ curl --version | head -1
curl 7.81.0 (x86_64-pc-linux-gnu) libcurl/7.81.0 OpenSSL/3.0.2 zlib/1.2.11 brotli/1.0.9 zstd/1.4.8 libidn2/2.3.2 libpsl/0.21.0 (+libidn2/2.3.2) libssh/0.9.6/openssl zlib nghttp2/1.43.0 librtmp/2.3 OpenLDAP/2.5.20
⚠️ 注意:
wrapper.conf要求 Java ≥ 17(wrapper.java.version.min=17),Ubuntu 22.04 的openjdk-17-jdk-headless正好满足;不要装 11 版本,服务会拒绝启动。
5.2 下载发行包并解压
官方安装页(docs.onedev.io/installation-guide/run-on-bare-metal)提供 onedev-latest.zip 与 onedev-latest.tar.gz 两个发行包下载入口。约定俗成的安装位置是 /opt/onedev:
sudo mkdir -p /opt/onedev
# 下载入口以官方安装页当前提供的链接为准(onedev-latest.zip / onedev-latest.tar.gz),
# 解压后把发行包内容放入 /opt/onedev,并保证运行用户对整个目录有完全读写权限
sudo tar xzf onedev-latest.tar.gz -C /opt/onedev --strip-components=1
解压完成后核对目录结构(实测):
$ ls /opt/onedev
3rdparty-licenses bin boot conf incompatibilities lib license.txt logs readme.txt
⚠️ 注意:官方下载地址在发版日前后偶有切换,若直链失效,以官方安装页(docs.onedev.io/installation-guide/run-on-bare-metal)页面上的当前链接为准;断网服务器可先在有网机器下载再拷贝,属于完全支持的离线安装路径(完整离线流程见《Ubuntu 22.04 安装 OneDev 16.9.3 指南》)。
5.3 首次启动与初始化
前台方式启动(便于首次观察):
sudo /opt/onedev/bin/server.sh console
启动过程的关键日志行(实测,出自 logs/server.log 同源输出):
INFO [main] io.onedev.commons.bootstrap.Bootstrap Launching application from '/opt/onedev'...
INFO [main] io.onedev.commons.loader.AppLoader Starting application...
INFO [main] io.onedev.server.OneDev Starting cluster
INFO [main] io.onedev.server.OneDev Initializing database
INFO [main] io.onedev.server.OneDev Starting services
INFO [main] io.onedev.server.OneDev Server is ready at http://localhost:6610.
首次启动会用全新的内嵌数据库,日志中会提示需要初始化(实测提示行):
WARN [main] io.onedev.server.OneDev Please set up the server at http://localhost:6610
浏览器打开 http://<服务器IP>:6610,按向导设置管理员账号(登录名、密码、邮箱)即可完成初始化;随后进入主界面。数据库选择这一步可以先保持默认内嵌库试用,生产再按 5.6 迁移。
验证服务存活(实测):
$ curl -s -o /dev/null -w '%{http_code}\n' http://localhost:6610
200
5.4 建项目、推代码
Web 界面新建项目 hello-onedev 后,在本地机器执行(<服务器IP> 换成实际地址,走 HTTP 协议推送最简单):
git clone http://<服务器IP>:6610/hello-onedev.git
cd hello-onedev
放入两个文件。hello.sh:
#!/bin/bash
echo "Hello, OneDev 16.9.3!"
uname -srm
date '+%F %T'
.onedev-buildspec.yml(最小构建规范:检出 + 执行脚本,推送到 main 即触发):
version: 56
jobs:
- name: build
steps:
- !CheckoutStep
name: checkout code
cloneCredential: !DefaultCredential {}
condition: SUCCESSFUL
- !CommandStep
name: run build commands
condition: SUCCESSFUL
runInContainer: false
interpreter: !PosixInterpreter
shell: sh
commands: |
echo "== build on $(hostname) =="
./hello.sh
triggers:
- !BranchUpdateTrigger
branches: main
userMatch: anyone
retryCondition: never
⚠️ 注意:
version: 56是构建规范 schema 版本,必须与 16.9.3 匹配(老版本字段写法会被向导自动升级);runInContainer: false明确走server-shell执行器,单机零额外依赖即可跑通。
提交并推送:
git add .onedev-buildspec.yml hello.sh
git commit -m "initial commit: hello script and build spec"
git push origin main
推送成功后进入项目 → Build,可以看到构建被自动触发。
5.5 验证第一次构建
实测构建 #5(对应合并提交 50a5964)状态为 SUCCESSFUL,用 REST API 核对:
$ curl -s -m 10 -u admin:q1w2e3r4 "http://localhost:6610/~api/builds?offset=0&count=1"
[ {
"id" : 5,
"jobName" : "build",
"workDirPath" : "/opt/onedev/temp/server/onedev-build-1-5-1/work",
"refName" : "refs/heads/main",
"number" : 5,
"commitHash" : "50a59645387d2f87e8e36c0d420779d805ccc2a4",
"status" : "SUCCESSFUL",
"stepExecutions" : {
"step-0" : { "status" : "SUCCESSFUL", "duration" : 69, "stepIndex" : 1, "stepCount" : 2 },
"step-1" : { "status" : "SUCCESSFUL", "duration" : 16, "stepIndex" : 2, "stepCount" : 2 }
},
...
} ]
构建日志落盘在 site/projects/1/builds/s005/5/log/,与 Web 页面展示一致。至此最小闭环完成:代码托管 → 推送触发 → 构建执行 → 状态与日志可查。
5.6 生产化两件事
- 外接数据库:编辑
conf/hibernate.properties,注释 HSQLDB 段、解注释目标数据库段并填连接信息,用backup-db.sh导出、restore-db.sh导入完成搬家。 - 注册系统服务:
sudo /opt/onedev/bin/server.sh install注册为系统服务(替代前台 console),开机自启;卸载服务用server.sh remove。
六、适用场景与限制
适合:
- 希望一台 2C2G 服务器就承载「Git + CI/CD + 问题 + 制品库」全流程的小中型团队(官方口径:2 核 2GB 即可流畅运行,1 核 1GB 也能用,需把堆上限调小);
- 对私有化、内网部署有强诉求,不希望 CI 配置散落多系统的团队;
- 需要强构建规范治理的团队:buildspec 支持版本化 schema、GUI 与 YAML 双形态编辑、步骤条件与重试策略,比纯 YAML 约定更可控;
- 已有 JDK 运维经验的团队:本质上就是维护一个 Java 服务,备份/升级路径清晰。
限制与代价:
- 集群高可用与横向扩展属于 EE 模块,需要订阅(社区版单机为主);
- 生态与插件数量不及 Jenkins、市场体量不及 GitLab,小众语言工具链遇到问题时更多靠
CommandStep自己写; - 中文社区资料相对少,排障更多依赖官方文档站与源码仓库;
- 高频发版意味着需要常态化升级,升级前必须先备份(
backup-db.sh→upgrade.sh的顺序不能反)。
七、同类选型对比
选型核心问题不是「哪个功能多」,而是「你愿意为一体化付出什么、为什么而妥协」。下表为定性对比(OneDev 数据实测采集于 2026-10-17,其余平台请以各自官方仓库与文档为准):
| 维度 | OneDev 16.9.3 | GitLab CE | Jenkins | Gitea + 内置 Actions |
|---|---|---|---|---|
| 定位 | 一体化 DevOps 平台 | 一体化 DevOps 全家桶 | 独立 CI/CD 引擎 | 轻量 Git 服务 + CI |
| CI 配置形态 | .onedev-buildspec.yml(版本化 schema,GUI/YAML 双形态) | .gitlab-ci.yml | Jenkinsfile(Groovy) | GitHub Actions 兼容 YAML |
| 资源门槛 | 2C2G 起步(官方口径) | 建议更高(Ruby 栈,组件多) | JVM 常驻,插件多则更重 | 很低,单机轻载 |
| 问题跟踪/看板 | 内置,字段与工作流可定制 | 内置且成熟 | 靠插件 | 基础能力 |
| 制品仓库 | 内置多格式 | 内置 | 插件 | 内置镜像/通用包 |
| 高可用 | EE 订阅(集群) | CE 免费多方案 | 需自建架构 | 单机为主 |
| 许可 | MIT 核心 + EE 商业订阅 | MIT(CE) | MIT | MIT |
| 部署形态 | 发行包/镜像/K8s | Omnibus/镜像/K8s | war/镜像 | 单二进制/镜像 |
如何选(按场景对号入座):
- 团队 ≤ 50 人、要私有化、想一个系统管完代码到制品 → OneDev:一体化程度与资源门槛的平衡最好,构建规范的可治理性是独特卖点;
- 已深度使用 GitLab 流程(MR 审批流、安全扫描、SAST 全家桶)、接受更高资源成本 → GitLab CE;
- CI 需求极端复杂、依赖海量插件、或历史上已有大量 Jenkinsfile 资产 → Jenkins(接受维护成本);
- 只需要轻量 Git + 简单 CI、机器资源紧张 → Gitea;
- 若最终选择官方镜像加编排的部署方式,部署细节见《OneDev Docker Compose 部署指南》;物理机/虚拟机标准安装流程见《Ubuntu 22.04 安装 OneDev 16.9.3 指南》。