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

《软件工程》第 14 章 - 持续集成

    在软件工程的开发流程中,持续集成是保障代码质量与开发效率的关键环节。本章将围绕持续集成的各个方面展开详细讲解,结合 Java 代码示例与可视化图表,帮助读者深入理解并实践相关知识。

14.1 持续集成概述

14.1.1 持续集成的相关概念

   持续集成(Continuous Integration,CI)是一种软件开发实践,团队成员频繁地将代码集成到共享仓库中,每次集成都会通过自动化构建和测试,以快速发现集成错误。它强调尽早发现问题、快速反馈,从而提高开发效率和代码质量。

14.1.2 持续集成的过程与管道

   持续集成的过程通常包含代码提交、构建、测试和反馈几个步骤,这些步骤构成了持续集成管道。用 绘制的持续集成管道流程图如下):

                                                          持续集成管道流程图

14.1.3 持续集成的价值

  • 减少集成问题:频繁集成使得问题能在早期被发现,避免大规模集成时出现难以排查的问题。
  • 提升代码质量:自动化测试和代码质量分析,能够及时发现代码中的缺陷和不符合规范的地方。
  • 加速交付:快速的反馈机制帮助开发人员更快修复问题,缩短软件交付周期。

14.2 版本控制

14.2.1 集中与分布式版本控制

  • 集中式版本控制:如 CVS、SVN,所有版本数据都存储在中央服务器,客户端仅保存工作副本,依赖网络连接。
  • 分布式版本控制:以 Git 为代表,每个客户端都保存完整的版本库,支持离线操作,分支管理灵活。

14.2.2 版本控制的主线与分支

在 Git 中,常见的分支策略包含主线(master)、开发线(develop)和功能分支(feature):

  • master 分支:存放稳定的、可发布的代码,仅从其他分支合并代码。
  • develop 分支:作为日常开发的主分支,所有功能分支都从这里拉出,并最终合并回 develop 分支。
  • feature 分支:用于开发具体功能,开发完成后合并到 develop 分支。

14.2.3 功能开关

    功能开关(Feature Toggle)允许在不修改代码的情况下,控制功能的可见性。在 Java 中可以通过配置文件实现简单的功能开关,示例代码如下:

import java.io.IOException;import java.io.InputStream;import java.util.Properties;public class FeatureToggle {private static final String CONFIG_FILE = "config.properties";private static Properties properties;static {properties = new Properties();try (InputStream inputStream = FeatureToggle.class.getClassLoader().getResourceAsStream(CONFIG_FILE)) {if (inputStream != null) {properties.load(inputStream);} else {throw new IOException("配置文件未找到");}} catch (IOException e) {e.printStackTrace();}}public static boolean isFeatureEnabled(String featureName) {String enabled = properties.getProperty(featureName);return "true".equalsIgnoreCase(enabled);}}

在config.properties文件中配置:

new_feature_enabled=true

使用时:


public class Main {public static void main(String[] args) {if (FeatureToggle.isFeatureEnabled("new_feature_enabled")) {System.out.println("新功能已启用");} else {System.out.println("新功能未启用");}}}

14.3 构建

   构建过程是将源代码转换为可运行软件的过程,常用的构建工具包括 Maven 和 Gradle。以 Maven 为例,在pom.xml中配置构建相关信息:

<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.example</groupId><artifactId>demo-project</artifactId><version>1.0-SNAPSHOT</version><build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.8.1</version><configuration><source>1.8</source><target>1.8</target></configuration></plugin><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-jar-plugin</artifactId><version>3.2.0</version><configuration><archive><manifest><mainClass>com.example.Main</mainClass></manifest></archive></configuration></plugin></plugins></build><dependencies><!-- 依赖配置 --></dependencies></project>

执行mvn clean install命令,即可完成编译、测试、打包等构建操作。

14.4 测试

14.4.1 单元测试自动化

   单元测试用于测试最小的可测试单元,在 Java 中常用 JUnit 框架。以一个简单的计算器类为例,编写单元测试:

// 被测试类public class Calculator {public int add(int a, int b) {return a + b;}public int subtract(int a, int b) {return a - b;}}单元测试代码:import org.junit.jupiter.api.Test;import static org.junit.jupiter.api.Assertions.*;public class CalculatorTest {@Testpublic void testAdd() {Calculator calculator = new Calculator();assertEquals(5, calculator.add(2, 3));}@Testpublic void testSubtract() {Calculator calculator = new Calculator();assertEquals(1, calculator.subtract(3, 2));}}

14.4.2 集成测试自动化

    集成测试用于测试多个模块之间的交互,在 Spring Boot 项目中,可以使用@SpringBootTest注解进行集成测试:

import org.junit.jupiter.api.Test;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.boot.test.context.SpringBootTest;import static org.junit.jupiter.api.Assertions.*;@SpringBootTestpublic class UserServiceIntegrationTest {@Autowiredprivate UserService userService;@Testpublic void testSaveUser() {User user = new User("testUser", "123456");userService.saveUser(user);assertNotNull(userService.getUserById(user.getId()));}}

14.4.3 确认测试自动化

   确认测试用于验证软件是否满足用户需求,常使用 Selenium 进行 Web 应用的自动化测试:

import org.junit.jupiter.api.Test;import org.openqa.selenium.WebDriver;import org.openqa.selenium.chrome.ChromeDriver;import static org.junit.jupiter.api.Assertions.*;public class WebAppTest {@Testpublic void testWebAppTitle() {System.setProperty("webdriver.chrome.driver", "path/to/chromedriver");WebDriver driver = new ChromeDriver();driver.get("https://www.example.com");assertEquals("示例网站", driver.getTitle());driver.quit();}}

14.5 代码质量分析

   代码质量分析工具可以帮助检测代码中的潜在问题,提升代码质量。常见工具如 Checkstyle(检查代码格式)、PMD(检测潜在缺陷)、SonarQube(综合代码质量管理平台)。

以 Checkstyle 为例,在pom.xml中配置:

<build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-checkstyle-plugin</artifactId><version>3.1.2</version><configuration><configLocation>checkstyle.xml</configLocation></configuration><executions><execution><id>validate</id><phase>validate</phase><goals><goal>check</goal></goals></execution></executions></plugin></plugins></build>

在checkstyle.xml中定义代码格式规则,执行mvn checkstyle:check命令即可检查代码格式是否符合规范。

14.6 发布与部署

   发布与部署是将软件交付给用户的最后一步,常见的部署策略有蓝绿部署和金丝雀发布:

  • 蓝绿部署:同时运行两个完全相同的生产环境,切换流量实现无缝升级。
  • 金丝雀发布:先将新版本发布给一小部分用户,观察反馈后再逐步扩大范围。

使用 Jenkins 进行自动化部署,可在 Jenkinsfile 中编写部署脚本:

pipeline {agent anystages {stage('检出代码') {steps {git 'https://github.com/your-repository.git'}}stage('构建') {steps {sh 'mvn clean install'}}stage('部署') {steps {sh 'ssh user@server "cd /deploy/path && java -jar your-app.jar"'}}}}

14.7 小结

    本章全面介绍了持续集成的各个方面,从概念到具体实践操作。持续集成通过版本控制、自动化构建、测试和代码质量分析等环节,能够有效提升软件开发的效率和质量。在实际项目中,应根据项目需求选择合适的工具和策略,建立稳定可靠的持续集成流程。同时,持续优化和改进持续集成过程,以适应项目的不断发展。

以上内容全面覆盖了持续集成的关键知识点。你若觉得某些部分需要更深入讲解,或想补充其他内容,欢迎随时和我说。

相关文章:

《软件工程》第 14 章 - 持续集成

在软件工程的开发流程中&#xff0c;持续集成是保障代码质量与开发效率的关键环节。本章将围绕持续集成的各个方面展开详细讲解&#xff0c;结合 Java 代码示例与可视化图表&#xff0c;帮助读者深入理解并实践相关知识。 14.1 持续集成概述 14.1.1 持续集成的相关概念 持续集…...

大模型 Agent 中的通用 MCP 机制详解

1. 引言 大模型(Large Language Model,LLM)技术的迅猛发展催生了一类全新的应用范式:LLM Agent(大模型 Agent)。简单来说,Agent 是基于大模型的自治智能体,它不仅能理解和生成自然语言,还能通过调用工具与环境交互,从而自主地完成复杂任务。ChatGPT 的出现让人们看到…...

Navicat 17 SQL 预览时表名异常右键表名,点击设计表->SQL预览->另存为的SQL预览时,表名都是 Untitled。

&#x1f9d1;‍&#x1f4bb; 用户 Navicat 17 SQL 预览时表名异常右键表名&#xff0c;点击设计表->SQL预览->另存为的SQL预览时&#xff0c;表名都是 Untitled。 &#x1f9d1;‍&#x1f527; 官方技术中心 了解到您的问题&#xff0c;这个显示是正常的&#xff0c…...

Orpheus-TTS:AI文本转语音,免费好用的TTS系统

名人说&#xff1a;博观而约取&#xff0c;厚积而薄发。——苏轼《稼说送张琥》 创作者&#xff1a;Code_流苏(CSDN)&#xff08;一个喜欢古诗词和编程的Coder&#x1f60a;&#xff09; 目录 一、Orpheus-TTS&#xff1a;重新定义语音合成的标准1. 什么是Orpheus-TTS&#xff…...

Python爬虫实战:研究Goose框架相关技术

一、引言 随着互联网的迅速发展,网络上的信息量呈爆炸式增长。从海量的网页中提取有价值的信息成为一项重要的技术。网络爬虫作为一种自动获取网页内容的程序,在信息收集、数据挖掘、搜索引擎等领域有着广泛的应用。本文将详细介绍如何使用 Python 的 Goose 框架构建一个完整…...

webpack优化方法

以下是Webpack优化的系统性策略&#xff0c;涵盖构建速度、输出体积、缓存优化等多个维度&#xff0c;配置示例和原理分析&#xff1a; 一、构建速度优化 1. 缩小文件搜索范围 module.exports {resolve: {// 明确第三方模块的路径modules: [path.resolve(node_modules)],// …...

STM32 Keil工程搭建 (手动搭建)流程 2025年5月27日07:42:09

STM32 Keil工程搭建 (手动搭建)流程 觉得麻烦跳转到最底部看总配置图 1.获取官方标准外设函数库 内部结构如下: 文件夹功能分别为 图标(用不上)库函数(重点) Libraries/ ├── CMSIS/ # ARM Cortex-M Microcontroller Software Interface Standard…...

MyBatis 框架使用与 Spring 集成时的使用

MyBatis 创建项目mybatis项目&#xff0c;首先需要使用maven导入mybatis库 poml.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema…...

OpenGL Chan视频学习-7 Writing a Shader inOpenGL

bilibili视频链接&#xff1a; 【最好的OpenGL教程之一】https://www.bilibili.com/video/BV1MJ411u7Bc?p5&vd_source44b77bde056381262ee55e448b9b1973 函数网站&#xff1a; docs.gl 说明&#xff1a; 1.之后就不再整理具体函数了&#xff0c;网站直接翻译会更直观也会…...

顶会新方向:卡尔曼滤波+目标检测

卡尔曼虑波&#xff0b;目标检测创新结合&#xff0c;新作准确率突破100%! 一个有前景且好发论文的方向:卡尔曼滤波&#xff0b;目标检测! 这种创新结合&#xff0c;得到学术界的广泛认可&#xff0c;多篇成果陆续登上顶会顶刊。例如无人机竞速系统 Swift&#xff0c;登上nat…...

数据库相关问题

1.保留字 1.1错误案例&#xff08;2025/5/27&#xff09; 报错&#xff1a; java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near condition, sell…...

一起学数据结构和算法(二)| 数组(线性结构)

数组&#xff08;Array&#xff09; 数组是最基础的数据结构&#xff0c;在内存中连续存储&#xff0c;支持随机访问。适用于需要频繁按索引访问元素的场景。 简介 数组是一种线性结构&#xff0c;将相同类型的元素存储在连续的内存空间中。每个元素通过其索引值&#xff08;数…...

Linux基本指令篇 —— touch指令

touch是Linux和Unix系统中一个非常基础但实用的命令&#xff0c;主要用于操作文件的时间戳和创建空文件。下面我将详细介绍这个命令的用法和功能。 目录 一、基本功能 1. 创建空文件 2. 同时创建多个文件 3. 创建带有空格的文件名&#xff08;需要使用引号&#xff09; 二、…...

【后端高阶面经:消息队列篇】23、Kafka延迟消息:实现高并发场景下的延迟任务处理

一、延迟消息的核心价值与Kafka的局限性 在分布式系统中,延迟消息是实现异步延迟任务的核心能力,广泛应用于订单超时取消、库存自动释放、消息重试等场景。 然而,Apache Kafka作为高吞吐的分布式消息队列,原生并不支持延迟消息功能,需通过业务层或中间层逻辑实现。 1.1…...

Mac安装MongoDB数据库以及MongoDB Compass可视化连接工具

目录 一、安装 MongoDB 社区版 1、下载 MongoDB 2、配置环境变量 3、配置数据和日志目录 4、启动MongoDB服务 5、使用配置文件启动 6、验证服务运行 二、MongoDB可视化工具MongoDB Compass 一、安装 MongoDB 社区版 1、下载 MongoDB 大家可以直接在官方文档下安装Mo…...

城市地下“隐形卫士”:激光甲烷传感器如何保障燃气安全?

城市“生命线”面临的安全挑战 城市地下管网如同人体的“血管”和“神经”&#xff0c;承载着燃气、供水、电力、通信等重要功能&#xff0c;一旦发生泄漏或爆炸&#xff0c;将严重影响城市运行和居民安全。然而&#xff0c;由于管线老化、违规施工、监管困难等问题&#xff0…...

MySQL推出全新Hypergraph优化器,正式进军OLAP领域!

在刚刚过去的 MySQL Summit 2025 大会上&#xff0c;Oracle 发布了一个用于 MySQL 的全新 Hypergraph&#xff08;超图&#xff09;优化器&#xff0c;能够为复杂的多表查询生成更好的执行计划&#xff0c;从而优化查询性能。 这个功能目前只在 MySQL HeatWave 云数据库中提供&…...

飞牛fnNAS手机相册备份及AI搜图

目录 一、相册安装应用 二、手机开启自动备份 三、开始备份 四、照片检索 五、AI搜图设置 六、AI搜图测试 七、照片传递 现代的手机,已经成为我们最亲密的“伙伴”。自从手机拍照性能提升后,手机已经完全取代了简单的卡片相机,而且与入门级“单反”相机发起了挑战。在…...

消费类,小家电产品如何做Type-C PD快充快速充电

随着快充技术的快速发展现在市场上的产品接口都在逐渐转为Type-C接口&#xff0c;Type-C可以支持最大20V100W的功率。未来Type-C大概会变成最通用的接口&#xff0c;而你的产品却还是还在用其他的接口必然会被淘汰, 而要使小家电用到PD快充&#xff0c;就需要使用到Type-C快充诱…...

连接表、视图和存储过程

1. 视图 1.1. 视图的概念 视图&#xff08;View&#xff09;&#xff1a;虚拟表&#xff0c;本身不存储数据&#xff0c;而是封装了一个 SQL 查询的结果集。 用途&#xff1a; 只显示部分数据&#xff0c;提高数据访问的安全性。简化复杂查询&#xff0c;提高复用性和可维护…...

人工智能赋能教育:重塑学习生态,开启智慧未来

在科技浪潮风起云涌的当下&#xff0c;人工智能&#xff08;AI&#xff09;如同一颗璀璨的新星&#xff0c;正以前所未有的速度和深度融入社会生活的各个领域。教育&#xff0c;作为塑造未来、传承文明的核心领域&#xff0c;自然也未能置身事外。人工智能与教育的结合&#xf…...

银河麒麟V10×R²AIN SUITE:用AI重构安全,以国产化生态定义智能未来

前言 银河麒麟是由国防科技大学研发、现由麒麟软件运营的国产操作系统&#xff0c;旨在打破国外技术垄断&#xff0c;保障国家信息安全。自2002年国家“863计划”启动以来&#xff0c;历经技术迭代与生态整合&#xff0c;现为国产操作系统领军品牌。其应用覆盖党政、国防、能源…...

JavaScript- 3.2 JavaScript实现不同显示器尺寸的响应式主题和页面

本系列可作为前端学习系列的笔记&#xff0c;代码的运行环境是在HBuilder中&#xff0c;小编会将代码复制下来&#xff0c;大家复制下来就可以练习了&#xff0c;方便大家学习。 HTML和CSS系列文章 已经收录在前端专栏&#xff0c;有需要的宝宝们可以点击前端专栏查看&#xff…...

15.进程间通信(一)

一、进程间通信介绍 进程间通信目的&#xff1a; 数据传输&#xff1a;一个进程需要将它的数据发送给另⼀个进程 资源共享&#xff1a;多个进程之间共享同样的资源。 通知事件&#xff1a;一个进程需要向另一个或一组进程发送消息&#xff0c;通知它&#xff08;它们&#xf…...

AI 数据采集实战指南:基于 Bright Data 快速获取招标讯息

AI 数据采集实战指南&#xff1a;基于Bright Data快速获取招标讯息 在招标行业中&#xff0c;快速、准确地获取招标公告、项目详情、投标截止日期和其他关键招标信息&#xff0c;是投标企业提高竞标成功率的核心竞争力。然而&#xff0c;招标信息往往分散在不同的平台和网页&a…...

cursor使用mcp

问题说明 mcp就相当于给AI安装了工具包&#xff0c;它可以调用获取接口文档&#xff0c;网页&#xff0c;数据库等&#xff0c;基本上所有的mcp都是node程序&#xff0c;少数需要python环境 使用说明 使用mcp-mysql举例&#xff0c;下面是配置json "mysql": {&qu…...

小白成长之路-计算机网络(四)

文章目录 前言一、网络连接查看1.netstat2.ss3.bond绑定3.1准备好这三个文件3.2添加bond配置文件3.3关闭网络图形化服务3.4重启 4.Linux下的抓包工具Wireshark 5、web压力测试工具6、路由追踪命令 二、[练习题](https://blog.csdn.net/m0_70730767/article/details/148262716?…...

【Agent】MLGym: A New Framework and Benchmark for Advancing AI Research Agents

arxiv: https://arxiv.org/pdf/2502.14499 简介 Meta 推出的 MLGym 框架及配套基准 MLGym-Bench&#xff0c;为评估和开发LLM Agent在 AI 研究任务中的表现提供了全新工具。作为首个基于 Gym 的机器学习任务环境&#xff0c;MLGym 支持强化学习等算法对代理的训练&#xff0c…...

5.27 打卡

知识点回顾&#xff1a; Dataset类的__getitem__和__len__方法&#xff08;本质是python的特殊方法&#xff09;Dataloader类minist手写数据集的了解 作业&#xff1a;了解下cifar数据集&#xff0c;尝试获取其中一张图片 import torch import torchvision from torchvision im…...

Web安全测试-文件上传绕过-DVWA

Web安全测试-文件上传绕过-DVWA 很多网站都有上传资源(图片或者文件)的功能&#xff0c;资源上传后一般会存储在服务器的一个文件夹里面&#xff0c;如果攻击者绕过了上传时候的文件类型验证&#xff0c;传了木马或者其他可执行的代码上去&#xff0c;那服务器就危险了。 我用…...