前言
大家好,我是老马。
“大不了就进厂打螺丝”,这大概是很多人的自嘲,或者是无奈的退路。
我们通常用“打螺丝”来指代一些简单、重复、机械繁琐的工作。
众所周知,一件事物的复杂度是固定的,任何一个零件的加工都需要很多步骤。
那么,如何让其变得简单固定呢?
工厂中的流水线
流水线是工业时代非常伟大的发明。
本质上是对一个复杂的流程进行拆解,改为标准化-简单化-可度量-可规模化的一个流水线步骤。
好处是工人的门槛降低了很多,每个人只需要专注处理其中的一个小步骤,越简单,越容易上手;越简单,也不容易出错。
当然,每一道工序是否合格,都可以在后续加一道 QA 检测,验证是否合格。
这种模式非常适合规模化的生产,可以随着投入人数的增加,效率大幅度提升,及时响应市场的需求。
缺点
甘蔗不能两头甜,流水线模式的缺点也是有的。
流水线的基础设施要求比较高,前期需要经过长期的规划+建设,投资成本比较高。
且一旦建成,工业上想随意修改的成本也会相对较高。
对工人而言,因为工作相对简单,很容易厌倦和缺乏工作激情。
软件中的流水线
工业的发展要比软件早得多,所以有很多值得学习的地方。
1970 年,瀑布式开发模型由温斯顿·罗伊斯提出,将软件生命周期划分为制定计划、需求分析、软件设计、程序编写、软件测试和运行维护等六个基本活动,规定了它们自上而下、相互衔接的固定次序。
1994 年,Grady Booch 提出持续集成。
看的出来,其实也没有多少年。大部分公司,还是停留在瀑布开发模式中。
为什么能提效?
个人理解,最主要的是 CI/CD 让我们在协作时,可以让代码保持是最新的。
每一个节点,可以添加严格的 QA 检测,比如代码是否合并了最新的分支,sonar 扫描质量是否过关,单元测试覆盖率是否满足,回归用力地通过率是否满足要求,接口文档自动更新等等。
这样可以部分功能的提测,让测试先介入进来。
测试不通过,可以打回让开发改进优化。
因为是持续部署,所以运维这一步已经提前介入了,而不用等到最后交付的时候。
编码、构建、测试、部署、监控和反馈,有些步骤的自动化减少了人工的干预,更加实时,而且错误率也更低。
如何搭建流水线呢?
说的挺好的,令人有些心动!
那么,哪里可以买到呢?(划掉)怎么自己搭建呢?
技术选型
流水线涉及到的点还是比较多的,真正转型是一个比较漫长的过程,可以逐步改进。
下面罗列一些老马比较看好的技术选型:
1. 版本控制系统 (VCS)
- Git:Git 是最常用的版本控制工具,几乎所有流水线都会与 Git 集成。推荐使用 GitHub、GitLab、Bitbucket 等托管平台,或者自己搭建 Git 服务器。
Gitlab 有可以本地部署的版本,大多数中小型公司的不二选择。
2. 持续集成工具 (CI)
-
Jenkins:Jenkins 是一个非常流行的开源 CI/CD 工具,具有丰富的插件支持,能够与 Git 集成,实现自动化构建、测试等功能。
-
GitLab CI/CD:如果你使用 GitLab,它自带 CI/CD 功能,配置较为简便,适合中小型项目。
Jenkins 到目前为止还是技术的主流。
3. 构建工具
-
Maven / Gradle(Java):如果是 Java 项目,Maven 和 Gradle 是常见的构建工具,能够处理依赖管理和项目构建。
-
npm / yarn(Node.js):对于 Node.js 项目,npm 和 yarn 是常见的包管理工具,支持构建、测试等。
-
Makefile:对于 C/C++ 项目,Makefile 是经典的构建工具。
老马是 java 开发,平时 maven 用的最多;前端小伙伴对于 npm 应该不会陌生。
4. 代码质量和测试工具
-
SonarQube:一个开源的代码质量检查工具,支持多种语言,能够检测代码的潜在问题、漏洞、重复代码等。
-
JUnit / TestNG / Mocha / Jest:根据不同的开发语言,选择合适的单元测试框架。
-
Selenium:用于 Web 应用的自动化测试,可以集成到 CI 流水线中。
-
Linting 和格式化工具(如 ESLint、Prettier):确保代码风格统一,减少人工检查的负担。
单元测试还是推荐大家写一写,当然相对较长的业务链,还是需要归回用例才更有价值。
SonarQube 是一个非常好用的 QA 工具,直接部署即可。
5. 容器化和虚拟化
-
Docker:容器化是现代软件开发的趋势,Docker 能够保证环境一致性,并简化部署。将应用和其依赖打包成镜像,使得在开发、测试、生产环境中都能得到一致的体验。
-
Kubernetes(可选):如果你的项目需要部署到集群或云环境,可以考虑使用 Kubernetes 管理容器。虽然 Kubernetes 本身较为复杂,但它能够解决微服务架构中容器编排和服务发现等问题。
容器化这一块老马一直在使用,但是实际参与建设的并不多。
不过现在很多公司的 docker 容器化还是挺成熟的,用起来也确实方便快捷。
6. 部署工具
-
Ansible:一个简单的自动化部署工具,适合管理服务器的配置和部署任务。
-
Terraform:用于管理基础设施的开源工具,适合部署到云平台。
-
Helm:如果使用 Kubernetes,可以使用 Helm 来简化 Kubernetes 应用的部署和管理。
部署工具一般推荐自建,或者二开。
核心能力就是 ssh 到指定机器,然后调度执行对应的脚本。
自建的好处是,后续可以更加灵活的定义巡检作业+监控报警自愈的流程打通。
7. 监控与日志管理
-
Prometheus + Grafana:监控工具,Prometheus 收集监控数据,Grafana 用于展示数据,适合在生产环境中使用。
-
ELK Stack(Elasticsearch, Logstash, Kibana):用于日志收集、存储和可视化,帮助开发和运维人员快速定位问题。
-
CAT:CAT 作为服务端项目基础组件,提供了 Java, C/C++, Node.js, Python, Go 等多语言客户端,已经在美团点评的基础架构中间件框架(MVC框架,RPC框架,数据库框架,缓存框架等,消息队列,配置系统等)深度集成,为美团点评各业务线提供系统丰富的性能指标、健康状况、实时告警等。
-
SQL:SQL 这一块主要是一些业务的处理,目前市面上看起来没有特别好的,主要是自研。主要就是 SQL 的分布式定时调度。
监控报警是很重要的一个环节,也是老马最近一直在重点学习的内容。
小结
后续老马准备专门用一系列专题,实践搭建一下流水线+DevOps 平台。
对于中小公司,采用这些工具既能够保证高效的开发流程,又能够通过自动化提高代码质量和交付速度。
当然,流水线的实际搭建+推广+使用确实会有很多阻力,但是收益也是巨大的。
分工提升效率,协作促进繁荣。
希望本文对你有所帮助,如果喜欢,欢迎点赞收藏转发一波。
我是老马,期待与你的下次相遇。
随笔
mongodb/redis/neo4j 如何自己打造一个 web 数据库可视化客户端?