「研发总线」式流水线:从代码到制品的自动化实践

B站影视 2025-01-02 16:48 2

摘要:流水线起源于19世纪末的美国福特汽车公司,由创始人亨利·福特提出。他通过将复杂的汽车制造过程分解为一系列简单、重复的工序,极大提高了生产效率。这种方法成为流水线的雏形。

流水线起源于19世纪末的美国福特汽车公司,由创始人亨利·福特提出。他通过将复杂的汽车制造过程分解为一系列简单、重复的工序,极大提高了生产效率。这种方法成为流水线的雏形。

在软件开发中,流水线理念被引入并演化为将开发过程分解为需求分析、设计、编码、测试、部署等阶段,并通过并行或重叠执行提升效率。现代流水线工具进一步优化了这一流程,不仅实现了从代码到部署的自动化,还推动了研发规范的落地,显著提升开发效率并降低出错率。

以 Gitee Pipe 为例,该工具作为 DevOps 的自动化支撑平台,不仅连接研发所需的多方平台(如自动化测试、代码扫描、第三方部署),还通过研发总线式服务和可自定义插件市场,提供流程自动化、规范化、一站式服务,为开发团队带来全面支持。

流水线是研发过程中的重要「利器」,类似服务总线(ESB)整合系统的消息和服务,流水线在 DevOps 场景下将开发、运维工具及流程自动化、测试、监控等环节整合为统一框架,通过编排能力为研发人员提供高效的 CI/CD 支持。

依托流水线的自动化能力,它可以根据触发条件获取代码,执行质量和安全检测,完成编译打包,并按照环境要求发布到目标环境,全流程实现自动化,展现“软件工厂”的高效作业模式。

流水线通常以代码仓库为源,通过监听提交、PR 合并或 tag 创建等行为触发执行,也支持流水线之间的串行触发及通过制品库直接触发的 CD 操作。如 Gitee Pipe 不仅支持代码源与制品库的多样化选择,还可对接 GitLab、Jfrog 等第三方工具,为研发提供灵活高效的流水线管理方案。

确定源头及触发模式后,流水线可根据组织规范和实际需求对后续任务进行灵活编排。为缩短执行时间,代码获取后可并发执行代码扫描、覆盖率检查和单元测试等任务,随后进行编译构建,将构建物存入制品库或部署至目标环境。这部分内容将在后续实践中进一步阐述。

现代 CI/CD 流水线不仅用于代码构建和部署,还在服务治理中发挥关键作用。它可与安全检查、质量控制、数据迁移及灾备管理等服务协同,通过自动化避免人工操作的风险。在微服务架构下,流水线可管理服务的更新、扩展或降级,实现流程的可观测性与可追溯性,从而提升交付安全性与可靠性。

在「研发总线」模型中,流水线通过收集开发、测试、部署各阶段的数据,反馈至研发环节以持续优化。例如,监控关键性能指标后,流水线可自动识别性能瓶颈或资源消耗问题,触发优化流程。这种数据驱动的反馈机制有效缩短开发周期,并助力迭代更新的高效推进。

流水线不仅是持续集成和部署的得力工具,也常用于「定时调度器」场景,以满足业务中的零散需求。例如,某些数据在短期内需要定期获取,但若通过传统开发流程实现,既耗时繁琐,又需上线新功能。而通过流水线定时触发脚本,能够快速收集并传送数据,省时高效。

某客户的业务每天需要特定数据,但研发尚未完成报表功能。他们通过流水线定时触发 Python 脚本,从接口拉取数据后计算、组装成 Excel 报表,满足了业务需求,同时节省了开发时间。

此外,用户还利用流水线的调度能力定时收集版本信息,将零散数据统一整理为 README 文件,包括发布时间、版本号及功能列表等,并存放于制品库指定目录,为后续版本管理提供了极大便利。

流水线作为「研发总线」,对研发过程的规范落地起到了至关重要的作用,在日常开发中,作为管理者,往往在一遍遍的要求开发团队要遵守开发规范,阿里巴巴也曾出了多个版本的 Java 开发手册,比较著名的如华山版和嵩山版,这些手册中对编程规约、异常日志、单元测试、安全规约、MySQL数据库、工程规约、设计规约等做了详尽的描述,但我们不可能对开发人员的代码逐一与手册进行比较,在内部贯宣的同时,更需要在工具侧提供强有力的保障,为此在编程规范方面,阿里巴巴还提供了 Java 语言代码扫描规则集、阿里 P3C-PMD 工具的代码规范等可供代码扫描工具集成的规则集。

为了确保在研发过程中实现端到端的规范落地,需要建立一整套机制,并在关键环节上制定明确的规范。在此之前,我们先聊聊在研发过程中的几个关键规范:

在软件开发过程中,研发资产的管理至关重要,其中代码和制品作为核心资产,需要得到妥善的管理和规范的使用。为了确保研发流程的顺畅和高效,我们需要对代码库和制品库进行统一的管理和规范。

许多组织因为历史原因,各团队搭建了自己的代码管理工具,内部有各个版本的SVN、GitLab等开源工具,导致代码分散,难以统一管理。为解决此问题,首先需要建立统一的代码管理平台,确保组织内的代码资产集中管理,并落实以下几项关键策略:

高可用架构:部署采用主从架构以提高系统的高可用性,同时支持代码增量和全量冷备,定期备份数据,确保代码资产的安全性和可靠性。落盘加密:在系统架构上,通过驱动级加密策略实现代码落盘加密,防止因硬盘丢失或安全事件导致代码泄露。分支规范:使用代码管理工具自带的企业级分支规范功能,为不同团队定制分支策略,并确定各分支间的合并权限,以实现操作一致性。需求绑定分支:开发人员在开发需求时可自主创建针对该需求的代码分支,并将分支与需求绑定,确保需求与代码交付物的一致性。需求ID校验:开发人员提交代码时需提供需求ID,平台会自动校验ID的有效性,确保每次提交记录都关联到对应需求,方便后续追溯。代码质量扫描:代码提交至开发分支后,系统自动触发代码质量扫描和CI流水线,完成代码质量检查及持续集成,保证代码质量符合标准。PR合并与评审:开发人员完成模块开发后,通过平台的PR合并功能提交合并请求,触发PR门禁流水线检查。通过检查后,进入人工评审环节,确保代码符合上线要求。在线冲突解决与cherry-pick:当代码发生冲突或某一功能临时不上线时,可通过平台提供的在线冲突解决功能或cherry-pick操作,有效管理代码分支内容,避免版本混乱。

制品作为研发团队的又一个资产,也需要进行严格的管理和规范的使用。我们将制品管理分为依赖管理和业务制品管理,依赖管理主要是针对系统研发过程中需要的二方库和三方库管理,而业务制品管理主要是最终需要发布到生产环境的系统包的管理。

自动存入制品库:制品由流水线执行编译构建产生,编译构建生成的制品包自动存入制品库,确保每次构建结果可追溯。多环境制品库划分:制品库根据环境划分为开发、测试和生产库,通过流水线自动实现制品晋级,消除人为搬运,保障各环境的制品一致性。安全扫描:制品包在进入开发制品库时进行SCA扫描,确保制品符合安全标准。权限控制:仅管理员具有制品库的访问权限,其他人员无法手动访问,制品的存入和读取均通过工具自动化完成,保障制品的安全性和一致性。

我们定义代码库和制品库的一些规范,那么对于流水线来说,基于代码库的分支规范和制品管理要求,需要建立不同职能的流水线模版,这些模版也是组织级的,流水线中的关键节点不允许开发团队擅自修改,确保研发规范的落地,如有不能满足开发需求,可向组织(一般是效能团队)提出要求。

以某一位客户为例,他的代码库使用了 AoneFlow 模型,结合他的业务需要,我们推荐从开发到测试环节的7条组织级流水线:

CI流水线:在开发人员将代码提交到代码库后,由代码库自动触发该流水线,完成代码质量扫描、编译构建过程,确保代码无基础的质量问题;PR门禁流水线:在进行项目级代码合并时自动触发该流水线,完成代码质量扫描、单元测试、编译构建等过程,确保代码符合基础功能;开发CD流水线:在完成功能开发后,由开发人员手工触发(或由PR门禁流水线自动触发,如采用此种方式,则可取消编译构建环节),完成编译构建、部署等过程,确保部署自动化;提测流水线:在开发提测前,由开发人员手工触发该流水线,完成编译构建、部署、人工卡位、制品入库等环节,由测试人员确认测试通过与否,通过后制品入库;安全流水线:定时或手工触发该流水线,自动完成代码安全扫描,并形成报告,供提测使用;测试CD流水线:测试人员在集成交付工具中确认提测内容后,自动触发该流水线,获取开发制品完成部署过程;非功能流水线:手动执行该流水线,完成应用性能和应用安全扫描过程。

流水线在高并发运行场景下,需具备支持频繁构建和发布的高性能表现。云原生架构为流水线提供了弹性和可扩展性,借助 Kubernetes 的资源自动调度能力,有效提升了并发处理性能。在安全性方面,通过明确角色权限(如管理员、开发者、测试人员等)和设定流水线的执行、编辑、查看权限,确保操作的可控性,避免未经授权的修改。

为降低使用难度,可通过插件体系构建涵盖编译、扫描、测试等环节的工具集,开发人员无需编写复杂脚本,仅需简单配置即可实现功能。同时,通过对编译构建次数、部署次数等数据的采集与分析,可为研发流程优化提供数据支持,助力持续改进。

「研发总线」式流水线整合了开发与运维流程,从代码编写到制品部署实现高效自动化,显著提升效率和质量,降低出错率与成本。此外,作为定时调度器和规范落实工具,流水线为业务需求和研发流程提供了强有力的支持。未来,随着技术的演进,流水线工具将持续优化,推动软件研发行业的发展,为企业数字化转型与创新赋能。

来源:码云Gitee

相关推荐