当前位置: 首页 > news >正文

研发效能认证学员作品:快速进行持续集成应用实践丨IDCF

作者:赖嘉明 研发效能(DevOps)工程师认证学员

随着数字化转型的推进及市场竞争的加剧,越来越多的企业也意识到持续集成的重要性。

而持续集成作为一种先进的软件开发实践和工具链,可以帮助企业实现自动化构建、集成和测试,减少开发周期和风险,并提高软件质量和团队协作效率。

将通过实践经验,介绍探讨传统企业在持续集成方案的应用实践。

一、背景

1.1实现持续集成时面临一些独特的应用需求:

1)具有复杂的IT基础设施,可能包括不同的应用程序、数据库和平台、闭环部署环境

2)实施持续集成的需要考虑的到安全性和合规性,保护企业数据和客户信息

3)相对保守的公司文化和固化流程

1.2常见研发过程痛点:

大部分的传统企业在研发过程仍然使用传统的开发模式——瀑布开发,从而可能遭遇的痛点问题:

1)人为操作多、等待环节时间长

2)构建环境不一致,项目交接构建异常

3)代码质量低,后续开发和维护的困难

4)集中提交代码,问题定位难

二、持续集成技术介绍

2.1 持续集成基本概念

持续集成(Continuous Integration, CI)是一种软件开发实践,其目标是在开发过程中频繁地集成和测试代码。它旨在通过自动化构建、测试和部署的方式,帮助开发团队更快、更频繁地交付高质量的软件。

2.2 持续集成的自动化

持续集成的自动化是实现持续集成实践的关键,它包括以下几个方面的自动化:

自动化版本控制:使用版本控制工具(例如Git)来管理代码的版本,并通过自动化地进行代码的提交、分支管理和合并,保证代码的版本控制过程的自动化。

自动化代码构建:通过构建工具(例如Maven、Gradle)或持续集成工具(例如Jenkins、GitLab CI/CD)自动化执行代码构建过程,将代码编译、打包、生成可执行文件等操作自动化完成。

自动化代码检查(静态代码检查):通过使用代码质量工具(例如SonarQube、Checkstyle)对代码进行静态分析,自动检查代码质量、代码规范、潜在的缺陷和安全漏洞,并生成相应的分析报告。

自动化测试:包括单元测试、集成测试、端到端测试等不同层次的自动化测试。通过使用自动化测试框架(例如JUnit、Selenium)以及集成测试工具,自动执行测试用例并生成测试报告,验证代码的正确性和功能的稳定性。

自动化部署:将构建好的软件包或镜像自动部署到目标环境中。可以使用容器编排工具(如Docker Compose、Kubernetes)或自动部署工具(例如Ansible、Chef)来实现自动化部署的过程。

2.3 实施持续集成的优点

提高软件质量:持续集成通过频繁地将开发人员的代码进行集成和测试,及时发现和解决问题,减少代码缺陷的数量,最终提高软件的质量。

快速反馈:持续集成能够在每次代码提交后快速进行构建、测试和分析,及时提供反馈。如果出现问题,开发人员可以迅速采取行动,避免问题的扩大和滋生,加快开发效率。

减少代码集成风险:持续集成要求团队成员频繁地将代码进行集成,避免长时间独立开发导致的代码集成冲突和问题。通过持续集成,可以降低代码集成风险,减少解决代码冲突的时间和精力。

高效的团队协作:持续集成鼓励开发人员频繁提交代码,并促进团队成员之间的更紧密的协作和沟通。通过每日集成和自动化测试,团队成员可以更好地了解彼此的工作,并共同努力解决问题。

提高交付速度:持续集成将构建、测试和部署过程自动化,加快软件交付的速度。通过自动化流程,减少了手动操作和人为错误,提高了交付的效率和速度。

增强可维护性:持续集成要求代码库保持整洁和健康,注重代码质量和良好的编码实践。这有助于促进可维护性和可扩展性,降低代码维护的难度和成本。

它是一种有效的开发实践,可以提升团队的效率和软件的质量,从而为项目的成功和持续发展奠定基础。

三、持续集成应用实践

3.1工程支持应用层面

图片

3.1.1 工具链-相关应用工具介绍

3.1.1.1 Gitlab:

一个基于Git的代码托管和协作平台。它提供了强大的代码仓库管理功能,支持版本控制、分支管理、合并请求等。同时,GitLab还提供了自动化构建、持续集成、部署管道等功能,可以实现从代码提交到交付的全流程管理。

3.1.1.2 Jenkins:

一个用于构建、测试和交付软件的开源持续集成工具。它支持各种编程语言和构建工具,通过插件化的架构,可以灵活地定制构建流程。Jenkins能够自动化构建、测试和部署过程,提供实时的反馈和集成结果,加速开发团队的交付效率

3.1.1.3 Sonarqube:

一个开源的代码质量管理平台,用于静态代码分析和质量度量。它可以检测代码中的缺陷、漏洞、代码规范违规等问题,帮助开发团队改善代码质量和可维护性。SonarQube生成详细的质量报告,提供全面的代码健康分析和展示

3.1.1.4 Neuxs:

一个用于管理软件包、镜像和资产的仓库管理工具。它支持各种仓库类型,如Maven、Docker等,提供了良好的可搜索、版本控制和发布管理功能。Nexus可以帮助团队管理和分享软件组件,加快软件构建和部署流程

3.1.1.5 Harbor:

一个开源的企业级Docker镜像仓库,用于存储和分发镜像。它提供了安全的镜像托管、访问控制、镜像复制和自动化构建等功能。Harbor能够帮助团队安全地管理和交付Docker镜像,加强镜像的可追踪性和可信度

3.1.1.6 Kubernetes:

一个开源的容器编排平台,用于管理和自动化容器化应用程序的部署、扩展和管理。它提供了容器编排、服务发现、自动伸缩、故障恢复等功能。Kubernetes可以帮助团队高效地管理和运行容器化应用程序,提供弹性和可靠性。

3.2 流程改进应用层面

建立标准:在流程改进中,建立标准是关键的一步,通过建立标准,可以提高团队成员之间的协作效率,减少沟通和理解成本。同时,统一使用适当的开发工具和技术栈,也有助于提高团队的工作效率和代码质量。

搭建流程:引入自动化工具和技术来自动执行任务和流程。使用自动化流程工具来自动处理重复性的工作,或使用脚本和编程来自动执行任务。这样可以节省时间和人力资源,并减少错误的风险。

打通数据:通过集成不同的应用和系统,实现数据的无缝传递和共享,减少手动操作和信息传递的渠道,并且通过数据分析预警,驱动质量改进。

3.3 落地实践过程介绍

图片

3.3.1统一工具

3.3.1.1统一代码仓库,确定项目分支策略

1)将Gitlab作为唯一的代码存放地址,对于历史存在的SVN或多个代码库地址,根据实际情况进行迁移、合并和整合,将代码集中到GitLab中。这样可以简化代码管理,方便团队成员共享和协作。

2)根据项目的实际情况选择合适的分支策略是很重要的,而主干发布分支策略是其中一种常见的选择。这种策略主要是围绕一个主要的稳定分支(通常称为主干或主分支)进行开发和发布,该策略用于简单的项目或小型团队,能够提供简洁的开发流程和快速的迭代速度。在选择分支策略时,根据项目的需求和团队的实际情况综合考虑,选择最适合的方式。  

3.3.1.2建立NEUXS资源库

1)存储库命名规范,定义统一的存储库命名规范,包括命名约定和标准缩写,以便在企业中一致使用。

2)存储库分类和层级,确定存储库的分类和层级结构,以便有效组织和管理不同类型的构建构件和产物

3)访问控制策略,制定访问控制策略,规定上传入口和权限 例如,对于第三方引用包,仅通过管理员检测上传

3.3.1.3统一构建工具

1)使用Jenkins作为持续集成(CI)工具,并与构建工具MAVEN、Gradle集成使用

3.3.2制定自动化流水线

3.3.2.1 预提交检测流水线

在该流水线中,开发人员发送提交代码申请触发 GitLab CI 流水线。通过编写 GitLab CI 配置文件(gitlab-ci.yml),实现提交规范、代码构建和 SonarQube 静态代码检查。如果任意一项检查不达标,本次提交的代码将无法入库。

3.3.2.2 实时触发流程线

在初始阶段,如果项目需求不高或开发人员能力不足以满足要求时,可以采用实时触发流程线。该流程包括提交代码、Jenkins流水线构建、SonarQube静态代码检查和结果反馈,要求当天最后一次提交的代码必须通过构建和检查。

通过实时触发流程线,可以及时发现和解决代码质量的问题,使得开发人员能够及时调整并达到要求。这样可以保证代码的质量和项目的顺利进行。

3.3.2.3 部署测试流水线

该流水线中,当新功能开发的代码提交成功时,会触发 Jenkins 流水线。在流水线中,代码将被编译、进行单元测试,并构建成镜像后入库。接着,部署会重启 Kubernetes 中相应容器环境,并将部署结果发送给代码提交人。

这样,开发人员可以快速将代码部署到测试环境,并进行集成验证。根据公司实际情况,可以根据需求调整工具,例如,在初始阶段如果不具备单元测试能力,可以去掉该节点,并直接使用服务器进行 Docker 部署。

3.3.2.4 发布流水线

发布流水线用于代码合并和自动化发布过程。在测试通过后,触发流水线进行代码合并,并自动生成发布标签。这样可以实现持续集成和自动化的发布,提高发布的效率和准确性。通过这样的流水线,可以在确保代码通过测试后,自动进行代码合并和生成发布标签。这样可以实现持续集成和自动化地发布过程,并提高发布的效率和准确性。

3.3.3 应用集成数据打通

对于在实施初始阶段阶段,可以通过以下方式来获取构建结果、静态检测结果等数据,并进行展示和分析:

1.数据自动收集,通过集成和Jenkins和sonarqube工具,自动收集构建结果、静态检测结果,生成相应的邮件报告和日志

2.数据存放与管理:将收集到的数据存放在数据库表中,通过定义合适的表结构和字段,可以将不同类型的数据进行存储和管理。

3.内部管理系统集成:将数据库中的数据与内部管理系统进行集成,将数据从数据库中提取并导入到内部管理系统中。这样可以实现数据的展示、查询和分析,形成质量大屏展示。

4.数据可视化和报表展示:通过在内部管理系统中使用数据可视化工具可以对数据进行可视化展示和分析。可以创建各种类型的图表、指标和报表,以直观地展示构建结果、静态检测结果等数据,并方便用户进行数据分析和决策。

获取构建结果、静态检测结果等数据,都自动收集并存放在数据库表中,并通知内部管理系统形成质量大屏展示,这样可以帮助团队及时了解项目的质量状况,及时发现和解决问题,提高开发效率和软件质量。同时,通过数据可视化和报表展示,可以提供直观、清晰的数据分析,帮助决策者作出准确的决策。

结论和展望

持续集成是一种先进的软件开发实践,可以通过自动化构建、集成和测试来减少开发周期和风险,提高软件质量和团队协作效率。在实施持续集成时,传统企业可能面临一些独特的应用需求和研发过程痛点,例如复杂的IT基础设施、安全性和合规性要求、保守的公司文化和固化流程等。

持续集成的技术包括自动化版本控制、代码构建、静态代码检查、自动化测试和自动化部署等方面。通过使用相关工具和技术,可以实现持续集成的自动化,提高软件质量、快速反馈、减少代码集成风险、高效的团队协作和提高交付速度。

在应用实践方面,可以从工程支持应用层面和流程改进应用层面进行探讨。在工程支持应用层面,可以使用统一的代码仓库、建立NEUXS资源库、统一构建工具和应用集成数据打通等方法来支持持续集成的实施。在流程改进应用层面,可以制定自动化流水线来实现持续集成的各个阶段,例如预提交检测流水线、实时触发流水线和发布流水线等。

在实践过程中,需要建立标准、搭建流程、打通数据和统一工具等来推动实施持续集成。同时,通过数据的自动收集、存放和展示,可以及时了解项目的质量状况并做出准确的决策。

总之,持续集成是一种有效的开发实践,可以提高团队的效率和软件的质量。在实施持续集成时,需要根据具体情况进行定制化的实践,并逐步优化和调整以适应不断变化的需求和技术发展。

持续集成实施拓展

根据1.1章节中提到的一些独特的应用需求,以下是一些建议实施建议:

1. 对于具有复杂的IT基础设施的闭环部署环境:

a) 标准化部署:制定明确的部署策略,包括清晰的部署流程、规范的环境配置和详细的部署文档。尽量规范化流程,减少文档化的规范说明。

b) 自动化部署:在标准化部署工作完成后,优化可自动化的节点,逐步实现自动化部署。虽然无法实现一键持续部署,但可以快速完成部署并形成标准化工序过程。

2. 在考虑安全性和合规性、保护企业数据和客户信息时:

a) 安全控制措施:采取安全措施,如数据库权限安全设置、权限控制管理、集成工程能力平台和制品库权限保持一致等。代码仓库与项目管理系统集成,并由项目/技术经理进行代码权限管控,实现代码自动建库授权。

b) 第三方包管理:建立私服仓库,限制持续集成编译过程只允许使用私服仓库的包。制定入口规范,并在上传过程中进行质量和安全漏洞检查,不允许上传不达标的第三方包,并将上传记录入库管理。

c) 漏洞扫描和安全评估:使用工具如SonarQube进行静态质量扫描,检查漏洞。

3. 在面对相对保守的公司文化和固化流程时:

a) 渐进式实施:选择简化的持续集成流程开始,例如只引入实时触发构建流程,并选择一个重要的项目作为标杆。逐渐增加持续集成的范围和复杂度,增加信心和经验,然后再全面推广。

b) 培训和支持:提供培训和宣讲材料,增加团队成员对持续集成的理解。分享成功案例,并提供培训来帮助团队成员掌握工具和技术的使用。

c) 灵活使用持续集成原则:根据团队项目现状,制定适合的流水线。例如,在企业项目编译通过率低于50%的情况下,可以先不要求项目必须进行单元测试。  

参考文献:

1.《DevOps IT 效能新基建》--顾黄亮编著

2.《企业级DevOps技术与工具实践》--刘淼 张笑梅编著

相关文章:

  • 使用pycharm远程连接到Linux服务器进行开发
  • ES6中数值扩展
  • 论文-分布式-并发控制-并发控制问题的解决方案
  • 【面试经典150 | 栈】最小栈
  • 2023辽宁省赛E
  • 【QT】其他常用控件1
  • 【网络协议】聊聊UDP协议
  • 从InnoDB索引的数据结构,去理解索引
  • 调试记录 单片机GD32F103C8T6(兆易创新) 程序烧写完成但是没有现象 (自己做的板子)
  • Netty优化-rpc
  • idea 提升效率的常用快捷键 汇总
  • Kafka KRaft模式探索
  • 帆软report JS实现填报控件只能填写一次
  • mac电脑怎么永久性彻底删除文件?
  • 二十三种设计模式全面解析-抽象工厂模式:创造无限可能的工厂之道
  • [rust! #004] [译] Rust 的内置 Traits, 使用场景, 方式, 和原因
  • 【159天】尚学堂高琪Java300集视频精华笔记(128)
  • Akka系列(七):Actor持久化之Akka persistence
  • Flannel解读
  • PhantomJS 安装
  • SegmentFault 技术周刊 Vol.27 - Git 学习宝典:程序员走江湖必备
  • Stream流与Lambda表达式(三) 静态工厂类Collectors
  • vue从创建到完整的饿了么(11)组件的使用(svg图标及watch的简单使用)
  • 基于 Babel 的 npm 包最小化设置
  • 解析 Webpack中import、require、按需加载的执行过程
  • 快速构建spring-cloud+sleuth+rabbit+ zipkin+es+kibana+grafana日志跟踪平台
  • 理解在java “”i=i++;”所发生的事情
  • 扫描识别控件Dynamic Web TWAIN v12.2发布,改进SSL证书
  • 再次简单明了总结flex布局,一看就懂...
  • MPAndroidChart 教程:Y轴 YAxis
  • Redis4.x新特性 -- 萌萌的MEMORY DOCTOR
  • ​Distil-Whisper:比Whisper快6倍,体积小50%的语音识别模型
  • ​io --- 处理流的核心工具​
  • ​Java并发新构件之Exchanger
  • ​一帧图像的Android之旅 :应用的首个绘制请求
  • #鸿蒙生态创新中心#揭幕仪式在深圳湾科技生态园举行
  • (01)ORB-SLAM2源码无死角解析-(66) BA优化(g2o)→闭环线程:Optimizer::GlobalBundleAdjustemnt→全局优化
  • (C#)Windows Shell 外壳编程系列9 - QueryInfo 扩展提示
  • (done) NLP “bag-of-words“ 方法 (带有二元分类和多元分类两个例子)词袋模型、BoW
  • (Forward) Music Player: From UI Proposal to Code
  • (二)【Jmeter】专栏实战项目靶场drupal部署
  • (附源码)计算机毕业设计ssm电影分享网站
  • (六)什么是Vite——热更新时vite、webpack做了什么
  • (十五)devops持续集成开发——jenkins流水线构建策略配置及触发器的使用
  • (十五)Flask覆写wsgi_app函数实现自定义中间件
  • (提供数据集下载)基于大语言模型LangChain与ChatGLM3-6B本地知识库调优:数据集优化、参数调整、Prompt提示词优化实战
  • (一)WLAN定义和基本架构转
  • (转)C语言家族扩展收藏 (转)C语言家族扩展
  • .md即markdown文件的基本常用编写语法
  • .net 开发怎么实现前后端分离_前后端分离:分离式开发和一体式发布
  • .NET 中的轻量级线程安全
  • .net图片验证码生成、点击刷新及验证输入是否正确
  • .pub是什么文件_Rust 模块和文件 - 「译」
  • /dev下添加设备节点的方法步骤(通过device_create)
  • [.net 面向对象程序设计进阶] (19) 异步(Asynchronous) 使用异步创建快速响应和可伸缩性的应用程序...