这一步为什么合理?
因为当时最重要的不是建立一套长期系统,而是尽快得到真实反馈:页面能不能打开,视觉是不是成立,别人能不能理解我在做什么。
直接部署把“写代码”和“看到结果”之间的距离压到了很短。它让一个想法先拥有了网址,也让后面的讨论不再停留在本地文件里。
FIELD STORY / DELIVERY INFRASTRUCTURE
Portfolio Ops 不是一开始就被设计好的系统。它从一次直接部署开始,在持续更新中接入 GitHub,最后又因为产品变多,演进成一套单仓多产品、多域名的交付方式。
00 / THE CONTEXT
我只是先遇到了一个很具体的问题:如何把自己写出来的页面,尽快变成一个别人可以打开的页面。后来,产品开始变化,问题也跟着变化。
这是一段从“能上线”走向“可持续管理”的过程。 其中最重要的决定,不是选择了哪一个平台,而是每一次都认真回应上一阶段暴露出的限制。
01 / DIRECT DEPLOY
THE BEGINNING / JUST SHIP IT
最开始没有复杂的架构,也没有多产品规划。我写完一个页面,就直接通过 Cloudflare CLI / Pages 把它部署出去。
因为当时最重要的不是建立一套长期系统,而是尽快得到真实反馈:页面能不能打开,视觉是不是成立,别人能不能理解我在做什么。
直接部署把“写代码”和“看到结果”之间的距离压到了很短。它让一个想法先拥有了网址,也让后面的讨论不再停留在本地文件里。
想法第一次从本地文件变成了可访问的页面。
代码、部署动作和线上版本之间没有稳定的历史关系。
当页面不再是一次性 Demo,而是要被反复修改时,“直接部署”开始从优势变成了需要被管理的动作。
02 / GITHUB MANAGED
THE SHIFT / MAKE CHANGE TRACEABLE
于是代码先进入私有 GitHub 仓库,再由 GitHub Actions 把变更送到 Cloudflare。部署不再是一次手工动作,而成为代码生命周期的一部分。
每一次修改有了提交记录,线上版本有了对应的来源,错误也不再只能靠回忆去定位。即使未来需要协作,或者需要借助 AI 一起改代码,也有一个清晰的共同上下文。
更重要的是,我不需要把部署凭证写进代码里。仓库保持闭源,Cloudflare 的认证信息只作为 CI 环境中的安全配置存在。
我可以回看、回退,也更容易判断线上问题来自哪里。
当未来出现更多产品时,仓库、Actions、Secrets 和发布规则可能被复制很多遍。
这次真正需要解决的,已经不是“怎么部署一个页面”,而是“怎么持续照看一组正在生长的产品”。
03 / MONOREPO SYSTEM
THE DECISION / MANY PRODUCTS, ONE ORDER
直觉方案是“一个产品一个代码仓,再分别接入 Cloudflare”。它当然可行,而且隔离性很强;但对一个人维护的产品组合来说,重复配置本身很快就会变成新的负担。
所以最后的选择不是把所有产品揉成一个应用,而是把代码放在一个私有仓库里分区管理:每个产品有自己的文件夹、自己的发布目标和自己的域名;统一的只是管理方式。
每个产品都可以独立配置和部署,但每增加一个产品,就要重复一套维护动作。
用目标清单描述“哪个文件夹对应哪个发布目标”,用一个工作流按变更选择需要部署的产品。
最终形成的是一种“统一维护、独立交付”的关系:我只需要照看一套系统,但产品不会因此失去自己的边界。
04 / THE TAKEAWAY
如果是大型团队、强隔离组织或完全不同的技术栈,独立代码仓可能更合适。对现在的个人产品实验来说,单仓多目录减少了重复运维,又保留了独立产品的发布能力。
“先让想法拥有一个网址,
再让它拥有一套可以持续生长的秩序。”
Portfolio Ops 的价值,不是把部署包装得更复杂,而是让每一次迭代都留下痕迹,让下一个产品不必从零开始。
这套系统还会继续变化,但它的方向已经清楚:让产品独立生长,让交付方式保持可复用。