受够了 Jenkins + Ansible + Portainer 三件套,我用一个 Go 二进制把它们合了
·
我手头有几台小 VPS,跑一些自己的副业项目。很长一段时间,我的「部署体系」是这么个老三样:
- 一个 CI runner(先是 Jenkins,后来换 Drone)负责构建;- 一堆 Ansible / Kamal 脚本负责把产物推到服务器;- 再加个 Portainer,好让我能看见容器到底在跑什么、出问题能进去戳两下。听起来挺专业。但现实是:在一台 2GB 内存的小机器上,伺候这三个工具本身的开销,比我真正要上线的应用还大。装、配、续命,占满了我本该写业务的时间。于是几周前,我开始动手做那个我真正想要的东西:> CI/CD + 多服务器部署 + 基础运维,全塞进一个 Go 二进制,零运行时依赖。它叫 Pipewright。安装就一步:把一个文件 scp 到服务器,跑起来,打开浏览器——完事。没有 nginx,没有外挂数据库,没有 runtime。## 它到底能干嘛- 可视化流水线编排:两级(阶段 → 任务)的 DAG 画布。横向连线串行跑,纵向连线真并行。而且它和
.pipewright.yml双向同步——你可以在画布上点,也可以直接提交 YAML,两边等价。- 隔离构建:版本钉死、容器隔离的构建步骤,带依赖缓存;产物(镜像 / JAR / 前端 dist 包)可以推到私有 registry。- 无 agent 的 SSH 部署:零停机切换 + 失败自动回滚,支持一把推到多台服务器,并且能看清「哪几台成了、哪几台挂了」的部分失败状态。- 服务器与容器运维:跨主机管理容器 / 镜像 / Stack / 卷 / 网络,实时 stats、日志,还有一个浏览器里的终端。- 它能自己更新自己:从 UI 点一下,它会去 GitHub 查最新 release,然后「下载 → 校验 checksum → 原子替换 → 重启」一条龙。
## 技术栈后端 Go,前端 Vue 3,全部用 embed.FS打进同一个二进制。数据库默认 SQLite(零配置),想用 MySQL 也行。鉴权是 argon2id + CSRF,凭据存在加密保险库里(永远不回显明文),还有一份只追加的审计日志。整个二进制约 50MB,小机器上跑得很从容。
## 做这玩意儿学到的几件事- 把整个前端塞进 Go 二进制(embed.FS)被严重低估了。 一个产物,不用 nginx,不用单独的静态托管。部署心智负担直接归零。- 「自我更新」是个绝佳的逼自己变强的机制。 当你的工具要在生产环境给自己热更新的那一刻,你就再也不敢对 release 产物、checksum、原子文件替换这些事马虎了。我现在就是用 Pipewright 自己来发布它自己的版本(dogfooding)。- 「全装进一个二进制」是个真实存在的设计张力。 总忍不住想再加点功能。我得不停提醒自己:目标恰恰是 Jenkins-at-scale 的反面——用最轻的东西,跑通「构建 → 部署 → 观测」这条完整闭环,服务好那几台小机器就够了。## 它不是什么它不打算替代 GitLab / Jenkins 去服务一个 200 人的工程团队。没有多租户 RBAC,没有庞大的插件生态。如果你在一个大组织里,请继续用那些重型工具。但如果你是个独立开发者、或者小团队,只想要「构建 → 部署 → 运维」而不想为此立起三个独立服务——那它就是为你做的。项目还很早(才几周),我在密集开发中。特别想听听反馈:尤其是「all-in-one 单二进制」这个定位,你觉得成立吗?还是它管得太多了?代码、截图和一行命令的快速上手都在仓库里(MIT 协议),欢迎提 issue 拍砖:https://github.com/huangchengsir/pipewright
更多推荐




所有评论(0)