尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

告别Jenkins和FTP:小团队轻量自动化部署方案实践

告别Jenkins和FTP:小团队轻量自动化部署方案实践 1. 为什么我劝大多数小团队别碰Jenkins也别再手动拖FTP先说说我看到的一个普遍现象一提到自动化部署很多人脑子里就跳出Jenkins。仿佛不上Jenkins就显得不专业不用Jenkins就不算DevOps。但说句实话这两年我看过太多小团队、个人开发者、外包项目组在Jenkins上栽跟头——不是Jenkins本身不好而是大多数小团队根本不需要它也养不起它。先给Jenkins一个客观评价功能是真的强插件生态是真的全但凡你能想到的构建场景它几乎都能覆盖。但代价是Jenkins的重量级也是实打实的。一个最简安装Java环境、2G以上内存、系统服务配置、插件下载起步折腾半天很正常。等用起来之后还要面对一堆运维问题插件版本冲突、Pipeline语法调试、构建日志撑爆磁盘、有段时间没升级结果连插件列表都拉不动。一个三五个人的团队业务代码还没写多少先花大量时间伺候一个CI平台这本身就有点本末倒置。另一个极端是手动FTP。FTP传文件这个动作本身当然没问题但把它当作部署方式就处处难受了本地代码改了一行你要重新打包、打开FTP工具、找到对应目录、上传、覆盖运气不好遇到“文件被占用”或者“权限不足”又得停下来排查。而且FTP部署最坑的一点是你永远无法确定线上跑的是哪个版本的代码。昨天传了A文件今天覆盖了B文件哪天线上出问题想回滚得靠记忆猜。说实话我见过不少团队连FTP上传的文件是哪个分支的代码都说不清楚。小团队自动化部署的真实需求拆开来其实就是这么几件事提交代码后能自动同步到服务器不用手动传文件部署过程可重复、可还原不会因为漏了一个文件导致线上炸掉占用资源少、维护成本低普通人花一两个小时能搞定最好回滚也简单出问题能快速切回上一个稳定版本敢说吗这些需求根本不需要Jenkins那样的大平台。轻量方案完全能覆盖甚至更合适。所以这篇就想聊透如果你现在正在“不想搭Jenkins又想摆脱手动FTP”的纠结中有哪些方案值得选各自的适用边界在哪我拿实际踩过的坑帮你把路探好。2. 轻量部署的核心思路先有Git才有一切在具体聊工具之前必须先理清一个底层逻辑自动化部署的本质不是“传文件”而是“让服务器自己从版本库拿到最新代码并跑起来”。FTP的思路是“推”本地作为源头把文件一个个推到服务器覆盖式更新。这种方式天然有三大弱点一是没有版本概念你传上去什么服务器就只是什么二是文件容易“漏传”尤其是改了配置、加了依赖、删了文件之后本地和线上很容易漂移三是故障回溯极其痛苦。而基于Git的自动化部署思路是“拉”服务器上直接拉取版本库指定分支的代码配合构建脚本完成依赖安装、编译打包、服务重启。好处非常明显服务器上的代码永远等于某个确定的commit提交版本线上出问题说白了就是回退到上一个commit的问题。这套思路里的关键角色是Git仓库和WebhookGit仓库不用多解释了团队代码统一托管在GitHub、Gitee、GitLab或者自建Gitea上Webhook则是自动化触发的“开关”。以Gitee为例代码推送到仓库后Gitee会向你在服务器上配置好的一个URL发一次HTTP回调服务器收到回调后执行部署脚本整个流程跑通之后你看到的效果就是本地git push回车过个两三分钟服务器上代码已经是最新版本服务也已经重启完了。这个体验和Jenkins流水线虽然是两回事但对小团队来说效率上的获得感几乎一致。为什么很多人习惯性想上Jenkins因为他们把“自动化部署”和“CI/CD平台”划了等号。这是一个普遍的思维惯性也恰恰是最需要在观念上松绑的地方。自动化部署本身是个几乎不需要“平台”就能完成的事。一个Webhook、一个部署脚本、一个进程管理器就构成了一个可以跑很久的部署机制。Jenkins等平台解决的核心问题其实是多项目、多环境、多流水线、权限隔离、构建矩阵这些复杂诉求。如果团队只有一个项目或者两三个项目、一个服务器引入平台反而是给系统引入了不必要的新复杂度。拿一个真实案例来说明。我之前帮一个六个人的外包团队做部署改造他们原来的流程是后端在本地maven打包前端npm run build然后一堆人用Xftp分别传文件。每次上线配合的“仪式感”极强先在群里喊一声“别传了我在传”传完再大喊“OK可以测了”。改造的时候他们以为要上Jenkins说预算和机器资源可以额外准备。我给他们定的方案就是宝塔面板里开一个Git仓库配一个Webhook写一个一会儿会给大家展示的部署脚本。整体从零到落地大约两个多小时唯一的额外资源是服务器存储里多出来的一个仓库目录。现在大半年了他们没再碰过FTP工具上线迭代基本都是push代码后等个自动构建通知。所以如果你现在还在“Jenkins太重、FTP太原始”之间摇摆先停下来想想一个问题你的部署链路里到底哪一环是需要“一个平台”才能解决的如果只是想省去手动传文件那这就是一个“Git仓库Webhook脚本”的活儿根本不必升级到平台级别。3. 几种轻量方案盘点照抄之前先搞清楚它们各自的适用边界轻量不等于只有一个选项。我自己在实践和帮别人做方案的时候通常会根据团队情况从下面这几种方案里挑一个来落地。每个方案都有自己的适用边界选错了照样会难受。我把它们挨个展开讲。3.1 方案一宝塔面板 Git Webhook这是国内小团队里最普遍、也最容易上的方案主要原因就是宝塔面板的普及度实在太高了。一台云服务器装个宝塔面板图形化界面管理Nginx、MySQL、PHP这些环境本身就是很多小项目的标配。在这个基础上宝塔应用商店直接提供“Webhook”插件装好之后以HTTP方式触发指定脚本再把Gitee或Gitea仓库的Webhook地址指向宝塔生成的URL一个最小闭环就出来了。这个方案最大的优点是完全可视化、上手门槛极低适合团队里有熟悉宝塔但不熟悉命令行的运维角色的情况。服务器上装环境用宝塔代码部署也靠宝塔所有操作都能在网页里完成出了问题在论坛一搜也全是同类玩家。但它的边界也很清楚适合单服务器、中小型项目、部署流程不太复杂的场景。如果项目已经发展到微服务多模块或者需要多服务器同时发布宝塔Webhook就吃力了你很快会感受到“平台缺席”的代价——脚本越写越长逻辑越来越绕最后就跟玩杂技似的。3.2 方案二自建轻量Git Drone CI如果你的团队对Docker有一点概念管理着一台或几台服务器又希望保留“流水线”式的部署体验提交触发、多步骤执行、失败通知那Drone CI是个很值得考虑的替代品。它对比Jenkins最大的特点就是“轻”整个CI服务以容器方式跑资源占用通常只有Jenkins的几分之一一条流水线就是一个.drone.yml文件放在Git仓库里新项目想接入直接在仓库加文件就行几乎不用在平台上做额外配置。Drone非常适合搭配Gitea/Gogs一起用仓库用Gitea自建Drone通过OAuth方式接入Gitea用户在Gitea的仓库里配置激活Drone自动读取仓库根目录下的.drone.yml并执行流水线。适用边界在于团队需要有基础的Docker技能否则挂在容器网络、挂载目录这类环节时会遇到小障碍。但要论轻量且功能齐备的程度这套组合是所有自建方案里我目前最认可的。3.3 方案三直接用云效、CODING这类SaaS平台这几年国内云厂商提供的DevOps平台阿里云云效、腾讯云CODING等已经足够成熟对个人和小团队甚至有免费额度。这类制品库、流水线、代码托管、自动部署一站式解决最大的诱惑是你根本不用自己维护任何CI基础设施整个部署过程在网页上可视化编排。适合的团队画像很明确嫌自建麻烦、不想碰服务器细节、预算有限但希望有完整流水线体验。像云效的流水线绑定代码仓库后可以配置Java项目跑Maven构建构建完自动上传到服务器执行发布脚本。整个过程免运维、稳定、可观测性也好。这个方案的短板也如实说免费额度通常有限制构建并发数不多遇到大规模依赖构建排队可能比较难受这时候就得考虑付费了。另外代码和数据面都在别人平台上对数据敏感或者有完全私有化要求的团队这条路天然走不通。3.4 方案四最极简的方式——纯Git Hook 脚本不要笑这个方案在特定场景下是真的够用且合理。我在一些个人项目、学习实验、或者临时演示环境里会直接在服务器上的Git仓库里写一个post-receive钩子脚本。当代码push到服务器的裸仓库时Git自身就会执行这个钩子完成代码检出、依赖安装、服务重启。这个方案的好处是“零附加组件”甚至不需要宝塔面板不需要Webhook服务只要有Git就能转。它是所有方案里依赖最少、最不容易坏的。但它的边界同样明显没有可视化界面没有部署历史没有失败告警一切靠脚本和日志。适合只有一两个人维护的轻量项目一旦团队超过四个人或者项目数量多了管理起来的成本反而会上升。我把这四种方案的对比整理成了表格方便你对照决策对比维度宝塔Git WebhookGiteaDrone CI云效/CODINGGit Hook脚本部署架构单服务器为主支持单机/多机云端编排服务器代理极简单机上手难度最低中等需Docker基础低低但需要够懂Shell和Git资源占用极低低容器化无本机占用极低功能完整度满足基本部署有流水线、可扩展最完整最简维护成本低低最低平台运维低但扩展性差适合团队规模1-10人小型项目2-20人微服务/多项目各种规模1-3人极简场景回滚方便度需自行实现流水线层面控制平台自带一般选型建议就一句话别追求“最好的工具”追求“最顺手的流程”。如果团队已经有宝塔了直接用方案一如果团队已经有Docker环境了直接看方案二如果连服务器都懒得管直接用方案三如果项目就一个人维护、不频繁迭代方案四足够。4. 手把手落地宝塔面板 Git Webhook 从配置到上线这一节把方案一的操作路径完整走一遍。我以“Gitee仓库 宝塔面板 Node.js项目”为例因为这个组合在热搜词里最典型。Java SpringBoot项目思路相同我会在关键节点补充差异处理。4.1 第一步服务器环境准备与项目目录初始化先假设你的服务器已经装了宝塔面板并且已经用自己的方式部署过一次项目比如Nginx配置好、反向代理指到某个端口、数据库装好。现在要做的是把“手动”升级成“自动”。在服务器上创建一个独立的项目目录比如/www/wwwroot/my-project。然后把这个目录初始化成Git仓库。但这里有个关键细节要提前规划好服务器上的代码目录和Git仓库目录最好是分开的。我的建议是在/www/repos下建一个裸仓库比如/www/repos/my-project.git在/www/wwwroot/my-project下作为实际部署目录从裸仓库clone代码为什么要用裸仓库因为裸仓库专门用来接收push没有工作区不会被代码文件干扰。后续Webhook往裸仓库推送时可以通过Git钩子把代码检出到部署目录。实际操作命令大概是这样的# 创建裸仓库 mkdir -p /www/repos cd /www/repos git init --bare my-project.git # 创建部署目录并做首次clone mkdir -p /www/wwwroot cd /www/wwwroot git clone /www/repos/my-project.git my-project如果你的项目已经托管在Gitee等远程仓库上那么部署目录直接从远程仓库clone即可cd /www/wwwroot git clone gitgitee.com:yourname/my-project.git my-project注意这里用了SSH方式。如果你用的是HTTP方式clone后面每次拉代码都会要求输入密码自动化就玩不转了。所以服务器上配置SSH Key并添加到Gitee/GitHub的Deploy Key或账户SSH Keys中是这一步必须做好的基础操作。4.2 第二步宝塔Webhook插件安装与脚本编写进入宝塔面板在应用商店搜索“Webhook”我这里用的是宝塔官方提供的Webhook插件。安装好后点击添加Webhook需要填一个“任务名称”和“执行脚本”脚本就是这么说的我需要给你看一个可直接抄的shell脚本它的作用是拉取最新代码、安装依赖、执行构建、重启服务。以Node.js项目为例#!/bin/bash # 部署脚本 export PATH/usr/local/node/bin:$PATH PROJECT_DIR/www/wwwroot/my-project BRANCHmaster LOG_FILE/www/wwwlogs/deploy-my-project.log echo 部署开始 $(date %Y-%m-%d %H:%M:%S) $LOG_FILE # 进入部署目录并拉取最新代码 cd $PROJECT_DIR git pull origin $BRANCH $LOG_FILE 21 if [ $? -ne 0 ]; then echo git pull 失败部署中止 $LOG_FILE exit 1 fi # 安装依赖 npm install --production $LOG_FILE 21 if [ $? -ne 0 ]; then echo npm install 失败部署中止 $LOG_FILE exit 1 fi # 构建前端静态资源如果有需要 npm run build $LOG_FILE 21 if [ $? -ne 0 ]; then echo npm run build 失败部署中止 $LOG_FILE exit 1 fi # 重启Node服务假设你使用pm2管理进程 pm2 reload my-app $LOG_FILE 21 if [ $? -ne 0 ]; then echo pm2 reload 失败请手动检查 $LOG_FILE exit 1 fi echo 部署结束 $(date %Y-%m-%d %H:%M:%S) $LOG_FILE如果你是Java SpringBoot项目把中间环节改成Maven构建cd $PROJECT_DIR git pull origin master $LOG_FILE 21 mvn clean package -DskipTests $LOG_FILE 21 # 将新构建的jar复制到运行目录 cp target/my-app.jar /opt/my-app/app.jar # 重启systemd服务 systemctl restart my-app脚本写好后在Webhook插件里保存。此时插件会给你生成一个Webhook地址形如http://你的服务器IP:端口/hook?access_keyxxxxxparamxxx这个地址很重要后面配置到Gitee仓库里。4.3 第三步在Gitee仓库中配置Webhook登录Gitee进入项目仓库的“管理”页面在左侧菜单找到“WebHooks”设置项。新建一个WebhookURL地址填宝塔Webhook插件生成的完整地址密码/密钥这一项对应宝塔Webhook插件里设置的access_key如果插件地址里已经带了签名就不需要额外填触发事件勾选“Push”即可其他如Tag Push、Issue等事件一般不需要保存之后Gitee会默认发送一次测试推送你的宝塔面板里能看到Webhook的执行记录。如果执行成功说明链路已经通了。这里有一个非常重要的排查习惯别在第一次配置时就期待一次成功先在服务器终端手动执行一次部署脚本通了再去测试Webhook。因为如果脚本本身有问题你会很难分清是“Webhook没触发”还是“脚本执行失败”排查起来绕圈子。正确顺序是手动跑通脚本 → 查看日志 → 配置Webhook → 触发验证。4.4 第四步验证自动部署链路在本地开发机上做一次代码提交并推送git add . git commit -m test auto deploy git push origin master推送完成后稍等几秒钟在宝塔的Webhook插件执行记录里应该能看到一条成功记录然后到服务器上确认代码同步和进程重启cd /www/wwwroot/my-project git log -1 --oneline pm2 list命令输出的最后提交哈希应该就是你在本地刚push的那一个pm2列表里进程状态是online。走到这一步自动化部署闭环就已经完全打通了。之后每次推送不需要再碰FTP工具服务自动更新。4.5 关键坑为什么你的Webhook每次执行都失败说实话对这个方案来说Webhook本身几乎不会出问题大多数问题都出在脚本和服务器权限上。我整理几个高频踩坑点PATH环境变量问题宝塔Webhook插件执行脚本时环境可能不是交互式Shell环境node、npm、pm2这些命令如果不在默认PATH里脚本会直接报“command not found”。解决办法是脚本开头显式export PATH或者用命令的绝对路径。文件权限问题宝塔Webhook进程默认以www用户运行而你的项目目录可能属于root所有导致git pull时无法写文件。最简单的方法是统一将项目目录与Webhook脚本运行用户保持一致并确保git config --global --add safe.directory设置了对应目录避免Git的“ dubious ownership”安全限制阻断操作。SSH权限问题如果你用SSH方式clone仓库注意服务器上执行Webhook的用户如www也需要有SSH Key。很多人只在root用户下配了SSH KeyWebhook触发时用www用户跑git pull结果一直提示权限拒绝。日志不是摆设宝塔Webhook插件的执行记录只能看到成功还是失败具体失败原因一定要在脚本里写日志。所以我上面的脚本特意把每一步的输出都追加到了LOG_FILE里。出问题先看日志能省掉大量无效排查时间。5. 如果你想要真正的“流水线”Drone CI Gitea 轻量落地指南宝塔的Webhook方案本质上是脚本自动化严格来说它不算CI持续集成没有构建缓存、没有测试阶段、没有流水线视图。如果团队的项目已经有一定规模希望push代码后自动跑单元测试、构建镜像、再部署到服务器而且不想承受Jenkins的负担那Drone CI是我目前最推荐的替代。5.1 Drone CI 的架构和为什么它对小团队友好Drone的设计哲学和Jenkins完全不同。Jenkins像一个大而全的工作台配置项多到你需要单独维护一套知识体系。Drone则把所有配置收敛到仓库里的一个.drone.yml文件里用声明式的步骤描述流水线。它的整体架构是Drone Server负责对接Git仓库提供商Gitea、GitHub等管理仓库、构建状态、用户登录。以容器方式运行。Drone Runner负责实际执行流水线中的步骤默认是Docker Runner也就是每个流水线步骤都跑在一个独立的Docker容器里环境隔离天然搞定。这种架构对小团队意味着什么意味着你不需要为“哪个项目用什么版本的Node”、“哪个项目用什么版本的Java”去维护全局配置。每个项目在自己的.drone.yml里声明用哪个镜像互不干扰新同事入职也不用在本地装一堆环境。5.2 准备 Drone Server 和 Runner 的配置过程Drone依赖Git仓库提供商做OAuth认证所以第一步是先在Gitea里创建一个OAuth应用。进入Gitea的“设置 → 应用”新建一个应用应用名称drone重定向URI填http://你的drone-server地址/login创建后会得到客户端ID和客户端密钥记下来。然后在服务器上创建docker-compose.ymlversion: 3 services: drone-server: image: drone/drone:2 ports: - 8080:80 volumes: - /var/lib/drone:/data environment: - DRONE_GITEA_SERVERhttp://your-gitea-server - DRONE_GITEA_CLIENT_ID你的客户端ID - DRONE_GITEA_CLIENT_SECRET你的客户端密钥 - DRONE_RPC_SECRET随便生成一段长随机字符串 - DRONE_SERVER_HOSTdrone.example.com - DRONE_SERVER_PROTOhttp - DRONE_USER_CREATEusername:你的Gitea管理员账号,admin:true restart: always drone-runner: image: drone/drone-runner-docker:1 volumes: - /var/run/docker.sock:/var/run/docker.sock environment: - DRONE_RPC_PROTOhttp - DRONE_RPC_HOSTdrone-server - DRONE_RPC_SECRET和上面保持一致 - DRONE_RUNNER_CAPACITY2 - DRONE_RUNNER_NAMEdocker-runner restart: always执行docker-compose up -d启动服务。然后访问Drone的Web界面用Gitea账号登录激活你想要自动部署的仓库。5.3 编写.drone.yml实现“推代码即部署”在项目仓库根目录创建.drone.yml。以Java SpringBoot项目为例kind: pipeline type: docker name: default steps: - name: maven-build image: maven:3.8-jdk-11 commands: - mvn clean package -DskipTests - name: deploy image: appleboy/drone-ssh settings: host: your-server-ip username: root key: from_secret: ssh_key port: 22 script: - cd /www/wwwroot/my-project - git pull origin master - systemctl restart my-app这个流水线有两个步骤第一个步骤在Maven容器里完成打包第二个步骤通过SSH登录到目标服务器把代码拉下来并重启服务。第二个步骤用到的私钥通过Drone的Secret管理而不是直接写在仓库文件里。配置好后把.drone.yml推送到仓库Drone会自动发现并执行流水线。在Drone界面里能看到每个步骤的实时日志。和Jenkins像不像但占用资源和维护成本差了一个数量级。5.4 Drone的劣势与取舍Drone也不是银弹。首先它要求团队对Docker基础较熟否则调试一个流水线可能要花不少时间。其次自建的CI虽然资源占用少但它毕竟还是占用资源虽然比Jenkins轻很多但如果服务器本身就1G内存跑Maven构建再加上其他服务内存还是会紧张。另外一个小遗憾是Drone官方维护的插件生态比Jenkins少虽然常用的都有但一些非常小众的需求可能找不到现成插件只能自己写脚本。不过对于小团队的常见部署场景它已经覆盖得比较踏实了。6. 用表格对比部署回滚策略别让“可以自动化”掩盖了“难以回滚”一个部署方案是否合格不是看它能不能把代码推上去而是看它能不能出问题时退回来。很多团队做完自动化部署后反而更焦虑了因为原来FTP传错了起码能手动改几行应急自动化部署一旦跑完一个错误脚本整台服务器的状态可能都变了。轻量方案的共同特点是没有Jenkins那种“按构建号回滚”的原生机制但这不代表不能做回滚只是需要自己在脚本和目录设计上加一点功夫。下面是我推荐的两种回滚策略按项目类型区分。回滚策略实现方式适用项目优点缺点基于Git的分支回滚部署脚本中记录当前commit回滚时git checkout 上个commit并重启服务所有基于Git的项目实现最简单依赖Git原生能力依赖“部署目录直接是Git工作区”的架构如果项目里有编译产物和源码混合回滚可能不干净基于目录镜像回滚每次发布前把当前目录rsync到/www/backups/app-2025xxxx新代码部署到新目录通过软链接切换前端构建产物、Java jar包、Python项目等编译/打包后运行的场景回滚极快切软链接秒级完成干净彻底需要额外磁盘空间和一点脚本设计成本目录镜像回滚的做法示意# 发布脚本 TIMESTAMP$(date %Y%m%d%H%M%S) # 把当前运行目录复制为备份 cp -r /www/wwwroot/my-app /www/backups/my-app-$TIMESTAMP # 部署新版本的代码构建后放置到 /www/releases/my-app-$TIMESTAMP # 然后切换软链接 ln -sfn /www/releases/my-app-$TIMESTAMP /www/wwwroot/my-app-current # 重启服务 systemctl restart my-app出问题时回滚命令只需要一条ln -sfn /www/backups/my-app-$TIMESTAMP /www/wwwroot/my-app-current systemctl restart my-app这种策略尤其适合前端单页应用和发布物是一个jar包的Java服务。我对小团队的实践建议是如果项目发布后的产物是若干个静态文件或一个可执行包务必用目录镜像回滚如果项目本身就是源码直接运行比如Node.js无构建流程Git分支回滚足够。另外回滚演练不是上线出事故时才做的事。建议新方案落地头一个月主动做一次回滚测试确认备份脚本和切换命令都真正有效。我见过不止一次团队因为备份脚本权限有问题需要恢复时才发现备份根本就没生成那时候再着急就晚了。7. 重要补充哪些项目不适合这种“裸奔”式轻量部署我必须说句公道话轻量部署不是万能药。如果你的团队面临下面这些信号那还是老实考虑完整CI/CD平台甚至Jenkins反而更合适多环境同时维护开发、测试、生产三套环境每次都要发布不同参数。轻量脚本最容易在这种场景里失控环境变量到处漏、配置互相覆盖反而是带环境模型的平台更舒服。发布频率极高且团队人多一天发布十几次、七八个人同时往仓库推代码如果没有构建队列和并发控制脚本并发执行会互相打架部署代码同步都成问题。这时候有个平台来串行化构建、展示状态还是必要的。需要严格的发布审批流程小团队一般没有这种诉求但如果处于交付给B端客户甚至涉密项目的场景自动化部署就需要审批和审计能力这不是写几个脚本能解决的。构建链路极其复杂涉及多个子项目联编、跨仓库引用、复杂的依赖顺序和条件化构建参数。轻量方案让构建逻辑变成“黑盒”出问题排查起来比Jenkins的Pipeline视图痛苦得多。但这并不意味着遇到这些场景就必须直接用Jenkins云效这类SaaS平台也是可选项。关键是做选择时不要以“大家都是这么干的”作为理由而是要想清楚团队当下的痛处到底是什么。8. 最后分享一下我现在的默认路线这套东西写下来我自己也顺了一遍思路。现在如果让我直接给一个小团队出部署方案我的默认决策路径基本是这样的先在团队里确认三个事实项目有多少个、服务器资源什么水位、团队对命令行的容忍度有多高。然后优先看场景——如果团队在宝塔的舒适区里直接把宝塔Webhook方案甩过去讲清楚脚本和日志就完事。如果团队有一两个懂Docker的人而且代码资产不想放第三方平台我会推荐Gitea加Drone的组合。如果团队连服务器都懒得碰那我反而推荐云效这类SaaS别为了“自己掌控一切”而自找麻烦。至于自己日常维护的个人项目我反而会用最“原始”的Git Hook加脚本方案。为什么因为它没有任何中间层出问题时我可以直接从脚本里定位不用先去想平台的某个配置哪里不对。一个部署链路里每多一个组件就多一个出故障的节点。小团队最需要的是可控而不是炫技。最后分享一个我用了很久的小习惯不管是哪种方案都要让部署脚本在开头输出当前执行的commit号到日志里。这样每次线上出问题第一件事就是看此刻跑的哪个版本再决定是回溯代码还是排查环境。这个习惯能够帮你省掉很多“线上和本地不一致”的扯皮时间。自动化的最开始那几周你有大量机会调整脚本熬过了磨合期之后就会非常稳定。
返回列表