学者如登山焉,动而益高,如寤寐焉,久而益足——徐干

https://github.com/harness/harness

Harness:一座会自己运转的开发城邦,正在把研发这件事重新讲一遍

如果把现代软件研发比作一场漫长而复杂的远征,那么很多团队其实一直都在背着一堆彼此不太熟的工具同行:代码托管一个地方,持续集成一个地方,持续交付又在另一个地方,开发环境散落四周,制品管理也各有自己的脾气。它们都在努力干活,却常常像一群能力很强、但没进过同一间会议室的同事。

而 Harness Open Source 想做的事情,很直接,也很有野心:它不想只做其中某一个环节的工具,它想把整条研发链路请到同一张桌子上,搭成一个完整的开发平台。

用它自己的描述来说,Harness Open Source 是一个端到端的开发者平台,包含源码托管、CI/CD 流水线、托管式开发环境,以及制品仓库。换句话说,它不是只想帮你“写完代码后跑一下构建”,而是想从代码诞生开始,到测试、集成、交付,再到产物沉淀,把整条路都铺平。

这不是一个只会在角落里埋头敲命令的工具,它更像一个很会组织协作的总指挥:一边照看代码仓库,一边安排流水线开工,一边给开发者准备工作台,还不忘把构建产物好好收进仓库里。你甚至能感觉到,它不是来补一个点的,它是来搭一个面。


Harness 到底是什么

Harness Open Source 是一个开源开发平台,核心能力围绕这几个方向展开:

  • Source Control Management
  • CI/CD Pipelines
  • Hosted Developer Environments
  • Artifact Registries

也就是说,在 Harness 的世界里,代码仓库不是孤立的,流水线也不是悬空的,开发环境不必再靠每个人本地“各自修行”,而制品仓库也不再是发布流程最后被临时想起来的一站。

它试图给团队一种更完整的研发体验:代码写在哪里,如何被管理;变更来了之后,怎样自动构建、测试、集成;开发者在哪里启动环境;构建产物又如何沉淀并继续流转。这一切,都不是彼此分家的岛,而是一张连接起来的地图。

这也是 Harness 让人觉得有趣的地方。很多工具像某个岗位上的专家,能力很强,但边界也很明显;Harness 更像一个愿意主动跨部门的人,它不满足于“我只管 CI”,而是想把开发这件事从头到尾捋顺。


它想解决的,不只是效率,而是研发体验的割裂

今天大家谈 DevOps、平台工程、工程效率,已经不是新鲜话题。真正让团队疲惫的,常常不是某一个工具不够强,而是工具太多、链路太碎、上下文来回切换。

开发者上午还在代码平台看分支,下午就跳到 CI 平台查日志,晚上再切到另一个系统翻制品,再配合本地环境、容器环境、云端环境,整套流程像在跨城通勤。每个站点都认识你,但它们彼此不熟。

Harness 就像一个不太愿意看到这种分裂的人。它把代码托管、流水线、开发环境、制品仓库这些关键能力揉到一起,试图让研发链路不再东一块、西一块。你可以把它理解成一个“研发工作流的一体化操作场”。

这种一体化的价值不只在于少点几个网页标签页,而在于流程、权限、上下文、资产都更容易形成连续性。代码知道自己从哪来,流水线知道自己该去验证谁,开发环境知道自己该服务什么任务,产物也知道自己从哪次构建中诞生。

当工具之间不再像陌生人,团队的协作成本才会真正往下掉。


它从哪里来,又准备走向哪里

README 里有一个很值得注意的信息:Harness Open Source 代表着对下一代 Drone 的一次巨大投入。

很多老 DevOps 用户对 Drone 都不陌生。它曾经非常专注于持续集成,把 CI 这件事做得直接、利落、工程味十足。README 也很坦诚地说了,Drone 过去主要聚焦于持续集成,而 Harness 在这个基础上,往前多走了很多步:加入源码托管、开发者环境、制品仓库,以及更多平台级能力。

这意味着 Harness 并不是凭空出现的,它站在已有 CI 思想和实践的土地上,同时试图把边界进一步打开。它像一个从擅长单兵作战成长起来的角色,开始学着建设军需、道路、营地和指挥系统。

更有意思的是,项目并没有回避现实。README 明确提到,目标是最终在流水线能力上和 Drone 达到完全对齐,让用户能够平滑迁移;但这个过程还需要时间。为此,仓库里保留了一个 drone 分支,作为 Drone 的特性快照;而 Harness 本身的开发,则发生在 main 分支上。

这份坦率很难得。它没有把未来说得像魔法降临,而是清楚地承认演进需要过程。一个好的平台不是靠一句“我们全都有”建立信任,而是靠持续把能力补齐、把迁移路径说明白。


第一次见面,它就能在本地站起来

一个平台工具如果上来就要求你准备一长串组件、拧一堆配置、补三页环境变量,那很多人很快就会把窗口关掉。Harness 在快速启动上显得很聪明:它知道第一次见面最重要的是别把人吓跑。

README 给出的本地启动方式非常直接,核心就是一个 Docker 命令。把镜像拉起来后,浏览器打开 http://localhost:3000 就能访问。

1
2
3
4
5
6
7
8
docker run -d \
-p 3000:3000 \
-p 3022:3022 \
-v /var/run/docker.sock:/var/run/docker.sock \
-v /tmp/harness:/data \
--name harness \
--restart always \
harness/harness

这个启动方式很有画面感。你只需要给它一台能跑容器的机器,它就像一位拎包入住的新住客,把自己在本地安顿下来:对外打开 Web 入口,把数据存放位置安排妥当,再顺手接上 Docker socket,好让流水线后续有地方施展拳脚。

这里还有个很重要的细节:README 提醒,镜像会使用卷来存储数据库和仓库数据,因此推荐使用 bind mount 或 named volume,否则容器停止后数据就会丢失。也就是说,Harness 虽然愿意轻装上阵,但它并不是那种“看起来跑起来了,转身就把记忆忘光”的家伙。你得给它一个稳定的家,它才能替你稳稳地看住数据。

对于第一次体验者来说,这种启动方式足够友好。它没有强迫你先理解整个平台的内部构造,而是先把门打开,让你走进去看看。


跑起来之后,它不只是一个后端服务,它还有完整界面

很多开源基础设施工具第一次启动后,迎接你的往往是一段日志、一个命令行帮助页面,或者一份你还得自己接 UI 的 API。Harness 不太一样,它明确包含完整的用户界面。

当应用运行后,可以直接通过浏览器访问 http://localhost:3000。这意味着它不是一个只愿意和命令行老手说话的项目,它也想让研发团队中的更多角色能通过可视化界面参与进来:查看仓库、浏览流程、管理平台能力、理解系统状态。

你会发现这和它的平台定位是统一的。如果它的目标是把开发链路拉到一处,那么 UI 不是附带的小装饰,而是整个平台对外表达自己的语言。一个真正想承载研发活动的平台,不能只在终端里低声耳语,它需要有自己的大厅、看板和门牌。


不止有 UI,它也把 API 摆在台前

对于平台型产品来说,只会自己用还不够,能被外部系统调用、编排、集成,才算真正长出了生态触角。Harness 也很清楚这一点。

README 提到,项目包含 swagger 规范;服务运行后,可以通过 http://localhost:3000/swagger 查看 Swagger 规格。对于 registry 相关接口,则还有单独的 swagger 地址。

这件事的意义,在于 Harness 并没有把自己关成一座“只能手动点击操作”的城。它保留了清晰的程序化入口,方便外部工具、自动化脚本和团队内部平台继续围绕它做集成。

对平台工程团队来说,这一点会很加分。一个平台如果只有 UI,它更像一个产品;一个平台如果同时认真经营 API,它才更像可以继续生长的基础设施。


CLI 也在,而且很务实

虽然 Harness 有界面,也有 API,但它并没有忘记命令行用户。README 里明确提到,这个项目包含基础的 CLI 工具,用于开发和运行服务。不过有一个前提:你得先把服务跑起来,CLI 才能执行命令。

最直接的例子是查看帮助:

1
./gitness --help

这里有个很有意思的名字:gitness。这像是 Harness 在历史演进中留下的一道影子,也让整个项目多了一点辨识度。它提醒你,这不是一个平地起高楼的概念产品,而是一套在演进中逐步沉淀出来的系统。

README 还给出了测试 API 时生成 PAT 的方式。先登录,再生成 token,然后用 Bearer Token 调接口:

1
2
3
4
5
6
7
8
# LOGIN (user: admin, pw: changeit)
./gitness login

# GENERATE PAT
./gitness user pat "my-pat-uid" 2592000

curl http://localhost:3000/api/v1/user \
-H "Authorization: Bearer $TOKEN"

这个流程非常适合本地验证与开发调试。它像一个认真负责的接待员,不只告诉你“大门在哪里”,还顺便把临时通行证的办理流程也写给你了。对于想快速摸清接口、写自动化脚本、做二次集成的人来说,这比一句“支持 API”要具体得多,也体贴得多。


它不只会跑,还鼓励你自己把它造出来

如果你只是想体验,Docker 就够了;但如果你想深入开发、参与贡献,Harness 也把构建路径写得比较清楚。

README 中的开发前置条件包含:

  • 安装最新版稳定的 Node
  • Go 版本 1.20 或更高
  • 安装 protobuf
  • 安装 protoc-gen-go
  • 安装 protoc-gen-go-grpc

之后,先准备依赖与工具:

1
2
make dep
make tools

再构建前端资源:

1
2
3
4
pushd web
yarn install
yarn build
popd

然后构建二进制:

1
make build

最后启动服务:

1
./gitness server .local.env

这个过程透露出一个关键信号:Harness 不只是“可运行”,而且“可参与”。它有完整的前后端构建路径,也明确面向贡献者开放。从工程结构来看,它并不打算做一个只接受围观的开源展品,而是欢迎你走进后台、拧动齿轮、参与施工。

一个真正有生命力的开源项目,往往不是因为它把一切都藏得严严实实,而是因为它愿意把自己的骨架和血管展示出来。Harness 在这点上是有诚意的。


它对开发环境的态度,是希望你别再被环境牵着走

README 里有一句话特别值得注意:这个项目支持 Go 所支持的所有操作系统和架构,本地开发并不要求 Docker 容器。

这说明 Harness 并没有把开发方式钉死在“你必须按照我的容器化节奏来”。它当然拥抱容器,也依赖 Docker 来承载流水线,但它并没有要求所有开发动作都在容器里完成。相反,它给了开发者更灵活的选择:你可以本机直接构建和运行。

这种态度很成熟。一个平台要是太强势,往往会试图把一切都纳入自己的秩序;Harness 看起来更像一个经验丰富的组织者,它知道什么时候该规范,什么时候该给自由。

而且,它还认真写了 Docker 运行时配置。比如默认期待 Docker socket 在 /var/run/docker.sock,如果你用的是 Rancher Desktop 或 Colima,可以创建软链接,或者通过 .local.env 设置 GITNESS_DOCKER_HOST。如果要做兼容性测试,还可以指定 Docker API 版本:

1
2
3
4
5
6
7
# For Rancher Desktop
GITNESS_DOCKER_HOST=unix:///Users/<username>/.rd/docker.sock

# For Colima
GITNESS_DOCKER_HOST=unix:///Users/<username>/.colima/default/docker.sock

GITNESS_DOCKER_API_VERSION=1.45

这种细节很能说明项目气质。它不是只把“理想使用方式”写给你看,而是知道现实世界里大家会用不同的运行时、不同的本机环境。它愿意低下头,认真处理这些细碎但真实的问题。一个平台是否值得信任,往往就藏在这种地方。


从 CI 工具走向开发平台,它的野心并不轻

当我们回头再看 Harness 的 description,会发现一句话里其实装了很多层含义:

Harness Open Source is an end-to-end developer platform with Source Control Management, CI/CD Pipelines, Hosted Developer Environments, and Artifact Registries.

“端到端开发者平台”这几个字说起来容易,做起来却非常重。因为这意味着它不能只优化某个局部,而要面对整个研发链路里那些最难统一的问题:

  • 代码与流水线如何天然衔接
  • 构建与交付如何减少切换成本
  • 开发环境如何更标准、更可复现
  • 制品如何在链路中被可靠管理
  • 平台能力如何同时服务个人开发者与团队协作

很多工具在某一个点上都可以做得非常漂亮,但只要链路一拉长,问题就会从工具功能本身转移到工具之间的关系上。Harness 的思路恰恰是在回答“关系问题”。

它像一个不愿意只守着自己工位的人,主动去协调整个研发现场:代码来了,先安排住处;提交到了,流水线接手;需要开发空间了,Gitspaces 介入;构建产物出来了,Registry 收拢;团队继续协作时,这些能力还都保持在同一套平台语境里。

这就是为什么它更像“平台”,而不是“工具集合”。工具集合只是把零件摆在一张桌上;平台则要让这些零件彼此咬合,并且一起转起来。


Gitspaces 和 Registry 让它的边界继续向外延伸

很多人第一次看到 Harness,可能会先把注意力放在源码管理和 CI/CD 上,这很正常,因为这是最醒目的入口。但如果你只看到这里,就会低估它。

README 提到的 Gitspaces 和 artifact registries,其实让 Harness 的边界明显往外扩了一大圈。

Gitspaces 代表的是开发环境能力。它关注的不是“代码提交之后怎么办”,而是“代码提交之前,开发者在哪里工作”。这是一个很微妙却非常关键的前移。平台一旦把触角伸到开发环境,意味着它开始参与研发最上游的体验设计:环境一致性、启动速度、协作便利性、上下文共享。

Artifact registries 则把平台能力延伸到构建结果的管理层。制品不是流水线跑完后随手丢在桌上的包装盒,它们是需要长期归档、分发、追踪、复用的资产。Harness 把 registry 纳入自己怀里,说明它不满足于只见证构建过程,它还想继续照看构建成果。

这两个能力像给平台添上了前哨和后勤:Gitspaces 管前线工作台,Registry 管战果仓库,而 CI/CD 负责中间的调度与推进。这样一来,平台的故事才真正完整起来。


它为什么容易让平台团队产生兴趣

如果你站在平台工程、研发效能或者基础设施团队的视角看 Harness,会发现它很容易激起兴趣,原因大概有三层。

第一层,它提供的是一体化思路。
这对那些已经厌倦了在十几个工具之间抹平差异的团队来说,很有吸引力。不是每个团队都愿意继续当“工具整合外包商”。

第二层,它是开源的。
这意味着你不只是一个消费者,你还有机会成为改造者。你可以评估它、试跑它、研究它的实现、根据自己的组织需求进行调整,甚至参与贡献。

第三层,它的能力版图是贴近现代研发现实的。
代码托管、流水线、开发环境、制品仓库,这几块都不是花架子,而是今天软件团队每天都在面对的核心问题。Harness 的视野没有停留在“如何把一次构建跑快一点”,而是放在“如何把研发活动组织得更完整”。

对于许多中大型团队来说,这种平台化思维天然具有吸引力。因为当团队规模上来后,单点优化带来的收益会慢慢触顶,真正决定体验的,往往是链路是否顺、上下文是否连续、平台是否统一。

Harness 瞄准的,正是这些更深的地带。


它身上有一种很典型的开源气质:边建设,边公开,边邀请

看完 README,你会有一种感觉:这个项目并不是把自己包装成一个“已经定型、只能使用”的成品,它更像一座正在扩建中的城市。

它已经有主干道,有城区,有入口,有运行规则;你进来之后可以生活、可以工作、可以观察它的节奏。与此同时,很多区域还在继续施工,它也不掩饰这一点。它告诉你哪里是现在的重点,哪里保留了历史分支,哪里仍在朝目标靠近。

这其实很符合优秀开源项目的精神。真正有生命力的开源,不是把一切修好后才允许别人进来,而是在建设过程中持续公开、持续解释、持续邀请。

Harness 在 README 里给出本地运行方式、给出开发前置条件、给出构建路径、给出 API、给出 CLI、给出贡献入口,这本质上就是在说:
我不是一个只让你远观的系统,你可以来试,可以来跑,也可以来参与。

这份开放,不只是许可证层面的开放,更是工程层面的开放。


如果你想快速上手,可以这样开始

对于第一次想体验 Harness 的人,我会建议你按这样一条路径走:

1. 先用 Docker 把它跑起来

1
2
3
4
5
6
7
8
docker run -d \
-p 3000:3000 \
-p 3022:3022 \
-v /var/run/docker.sock:/var/run/docker.sock \
-v /tmp/harness:/data \
--name harness \
--restart always \
harness/harness

2. 打开浏览器看看它的界面

访问:

1
http://localhost:3000

3. 再看看它的 API 轮廓

访问:

1
http://localhost:3000/swagger

4. 想继续往下探,就用 CLI 试试

1
./gitness --help

5. 如果你是开发者,就尝试本地构建

1
2
make dep
make tools
1
2
3
4
pushd web
yarn install
yarn build
popd
1
./gitness server .local.env

这样的顺序比较自然:先体验,再理解;先跑起来,再决定要不要深入。Harness 这种平台型项目,本来就不适合一上来只靠文档脑补。最好的认识方式,是让它先在你面前动起来。


一个值得注意的现实判断

当然,像 Harness 这样的平台型项目,也天然意味着复杂度不会低。因为它承担的不是单一职责,而是一整条研发链路里的多个关键角色。它的目标越完整,工程上的重量也就越真实。

但这未必是坏事。

恰恰相反,一个认真面对完整研发链路的平台,本来就不应该显得轻飘飘。真正值得关注的不是它有没有复杂度,而是它有没有把复杂度组织好、表达清楚、逐步开放给用户和贡献者。

从 README 和 description 来看,Harness 至少在一个方向上是清晰的:它知道自己不只是 CI,不只是代码托管,也不只是某个局部能力,而是一个端到端开发者平台。这个定位很明确,也很少含糊。

对于评估这类项目的人来说,定位清晰往往比“什么都能做一点”更重要。因为只有当一个项目知道自己是谁,它才知道后面应该长成什么样子。


写在最后

Harness Open Source 给人的第一印象,不是某一个功能点有多花哨,而是它试图把研发活动重新编排成一套连贯的体验。

它像一个很会张罗事情的人,把源码托管、CI/CD 流水线、开发环境、制品仓库都请进同一个屋檐下,让原本四散奔忙的研发流程,开始有机会在一个统一的平台里彼此照应。

如果说传统工具链像一支各自擅长、但交流成本不低的乐队,那么 Harness 想做的,是把它们重新排练成一场真正合拍的演出。代码不再是孤单的前奏,流水线也不是匆忙的副歌,开发环境和制品仓库更不是被遗忘在幕后的人。它们都被拉回了舞台中央,成为同一首作品的一部分。

这正是 Harness 最有魅力的地方:它不满足于做一个帮你完成某一步的工具,它更想成为那个把整段旅程安排妥帖的平台。

对于正在寻找开源研发平台、关心工程效率、关注平台工程演进的人来说,Harness 是一个很值得认真看一眼的项目。它不只是告诉你“可以怎么构建和交付”,它还在努力回答一个更大的问题:

一支现代软件团队,究竟应该在怎样的平台上,把代码写成真正流动的生产力。