深入理解 CICD 与 Jenkins 流水线:从原理到实践
前言:在当今数字化飞速发展的时代,软件开发行业的竞争日益激烈。为了能够快速响应市场需求,及时交付高质量的软件产品,开发团队们不断探索和采用新的开发模式与工具。CICD(持续集成、持续交付 / 部署)作为一种先进的软件开发实践理念,应运而生并迅速得到了广泛应用。它致力于打破开发、测试与运维之间的壁垒,实现软件从代码提交到生产部署的全流程自动化,从而提高开发效率、缩短交付周期、提升软件质量以及增强团队的协作能力。
Jenkins 作为目前最受欢迎的 CICD 工具之一,凭借其强大的插件生态、灵活的配置方式和丰富的功能特性,为众多企业和开发团队提供了极具价值的自动化解决方案。从简单的项目构建到复杂的多环境部署,Jenkins 都能够出色地完成任务,助力团队轻松实现持续集成、持续交付与持续部署的目标,进而在激烈的市场竞争中脱颖而出。
本篇博客将深入浅出地为大家解析 CICD 的核心概念、发展历程以及 Jenkins 流水线的原理、功能和实际应用。无论您是软件开发领域的初学者,还是希望进一步优化团队开发流程的专业人士,本文都旨在为您提供全面且实用的知识与案例,帮助您更好地理解和运用 CICD 与 Jenkins 流水线,开启高效软件交付之旅。接下来,让我们一同走进 CICD 与 Jenkins 的精彩世界。
一、CICD 发展历史
CICD(持续集成、持续交付 / 部署)的概念起源于 20 世纪 90 年代,随着软件开发从瀑布模型向敏捷开发、DevOps 的转变而逐渐发展起来。在早期的软件开发中,团队成员各自在自己的环境中进行开发,代码集成往往在项目后期才进行,这导致了大量的集成问题和延误。1991 年,Kent Beck 在极限编程(XP)中提出了持续集成(CI)的概念,强调开发人员频繁地将代码集成到共享仓库中,通过自动化构建和测试来快速发现集成错误。这一概念的提出,标志着 CICD 发展的开端。随着互联网的发展和软件产品的快速迭代,持续交付(CD)的概念应运而生。持续交付要求将软件构建成可以随时发布的状态,通过自动化的部署流程,将代码快速、可靠地交付到生产环境。而持续部署则是持续交付的进一步延伸,实现了代码变更的自动部署到生产环境,无需人工干预。在 CICD 的发展过程中,出现了许多优秀的工具,如 Jenkins、Travis CI、CircleCI 等。其中,Jenkins 凭借其强大的插件生态和灵活的配置,成为了最受欢迎的 CICD 工具之一。
二、Jenkins 发展历史
Jenkins 的前身是 Hudson 项目,由 Kohsuke Kawaguchi 在 2004 年开发。Hudson 最初是为了满足 Sun 公司内部的持续集成需求而创建的,后来开源并迅速获得了广泛的应用。2011 年,由于 Oracle 对 Hudson 项目的管理方式引起了社区的不满,社区决定分叉 Hudson 项目,创建了 Jenkins 项目。Jenkins 继承了 Hudson 的代码和社区资源,并在之后的发展中不断壮大。经过多年的发展,Jenkins 已经成为了一个功能强大的 CICD 平台,支持各种编程语言和开发环境,拥有丰富的插件生态,可以满足不同项目的需求。
三、CICD 原理
(一)持续集成(CI)
持续集成的核心思想是让开发人员频繁地将代码提交到共享仓库,每次提交后自动触发构建和测试流程。通过这种方式,可以尽早发现代码中的集成错误和缺陷,提高代码质量。
具体来说,持续集成包括以下几个步骤:
- 代码提交 :开发人员将代码提交到版本控制仓库,如 Git、SVN 等。
- 自动构建 :触发构建工具,如 Maven、Gradle 等,对代码进行编译、打包等操作。
- 自动测试 :运行单元测试、集成测试等,验证代码的正确性和稳定性。
- 结果反馈 :将构建和测试的结果反馈给开发人员,如果出现问题,及时进行修复。
(二)持续交付(CD)
持续交付是在持续集成的基础上,将构建好的软件包部署到预生产环境进行进一步的测试和验证,确保软件可以随时发布到生产环境。
持续交付的关键在于实现自动化的部署流程,包括环境配置、依赖安装、数据库迁移等。通过自动化部署,可以提高部署效率和可靠性,减少人工干预带来的错误。
(三)持续部署(CD)
持续部署是持续交付的最高阶段,实现了代码变更的自动部署到生产环境。在持续部署模式下,只要代码通过了所有的测试和验证,就会自动部署到生产环境,无需人工审批。
持续部署需要建立完善的监控和反馈机制,及时发现和处理生产环境中的问题,确保系统的稳定性和可用性。
四、Jenkins 流水线原理
Jenkins 流水线是一种用代码定义的自动化流程,它可以将整个 CICD 过程以脚本的形式定义下来,实现流程的可视化和可维护性。
Jenkins 流水线基于 Groovy 语言,通过 Pipeline 插件来实现。Pipeline 插件支持两种语法:声明式(Declarative)和脚本式(Scripted)。声明式语法更加简洁、易读,适合定义简单的流水线;脚本式语法则更加灵活,适合处理复杂的逻辑。
Jenkins 流水线的工作原理如下:
- 定义流水线脚本 :开发人员使用声明式或脚本式语法编写流水线脚本,定义各个阶段的任务和流程。
- 提交流水线脚本 :将流水线脚本提交到版本控制仓库,与代码一起管理。
- 触发流水线 :通过 Jenkins 的 Web 界面、API 或其他触发机制,触发流水线的执行。
- 执行流水线 :Jenkins 根据流水线脚本的定义,依次执行各个阶段的任务,如拉取代码、构建、测试、部署等。
- 监控和反馈 :在流水线执行过程中,Jenkins 提供了可视化的界面,实时显示各个阶段的执行状态和结果。如果出现问题,开发人员可以及时进行排查和修复。
五、CICD 功能
(一)持续集成功能
- 代码集成自动化 :自动拉取版本控制仓库中的代码,进行构建和测试,减少人工干预。
- 快速反馈 :及时发现代码中的错误和缺陷,让开发人员能够快速修复。
- 提高代码质量 :通过自动化测试,确保代码的正确性和稳定性,提高代码质量。
(二)持续交付功能
- 自动化部署 :将构建好的软件包自动部署到预生产环境,进行进一步的测试和验证。
- 环境一致性 :确保不同环境(开发、测试、生产)的配置和依赖一致,减少环境差异带来的问题。
- 可追溯性 :记录每个版本的构建和部署过程,方便进行版本管理和问题追溯。
(三)持续部署功能
- 快速发布 :实现代码变更的自动部署到生产环境,加快发布速度,满足快速迭代的需求。
- 减少人工干预 :避免人工部署带来的错误和延误,提高部署的可靠性和效率。
- 实时监控 :对生产环境进行实时监控,及时发现和处理问题,确保系统的稳定性和可用性。
六、Jenkins 流水线功能
(一)自动化流程定义
通过流水线脚本,可以定义从代码拉取到部署的整个自动化流程,实现流程的标准化和可重复化。
(二)可视化管理
Jenkins 提供了可视化的界面,展示流水线的执行状态和结果,方便开发人员进行监控和管理。
(三)插件扩展
Jenkins 拥有丰富的插件生态,可以通过安装插件来扩展其功能,如支持不同的版本控制工具、构建工具、测试框架等。
(四)并行执行
支持并行执行多个阶段或任务,提高流水线的执行效率。
(五)条件判断和分支处理
可以根据不同的条件(如代码分支、构建结果等),执行不同的任务或流程,实现灵活的流程控制。
七、具体流水线工作流程逻辑图
八、实例:基于 Jenkins 流水线的 Java Web 项目部署
(一)项目背景
我们有一个 Java Web 项目,使用 Spring Boot 框架,采用 Maven 进行构建,数据库使用 MySQL,部署环境为 Tomcat 服务器。
(二)流水线脚本(声明式)
pipeline {agent anytools {maven "Maven 3.8.6" // 指定Maven工具}stages {stage('拉取代码') {steps {git 'https://github.com/your-username/your-project.git', branch: 'main' // 拉取代码}}stage('构建项目') {steps {sh 'mvn clean package -DskipTests' // 构建项目,跳过测试}}stage('运行单元测试') {steps {sh 'mvn test' // 运行单元测试}post {always {junit '**/target/surefire-reports/TEST-*.xml' // 收集测试报告}}}stage('部署到预生产环境') {steps {sh 'scp target/your-project.jar user@pre-prod-server:/opt/tomcat/webapps/' // 复制jar包到预生产服务器sh 'ssh user@pre-prod-server /opt/tomcat/bin/restart.sh' // 重启Tomcat服务}}}post {success {slackSend channel: '#dev-notifications', message: '流水线执行成功!' // 发送成功通知到Slack}failure {slackSend channel: '#dev-notifications', message: '流水线执行失败!' // 发送失败通知到Slack}}
}
(二)流水线脚本(脚本式)
node {// 定义工具def mvnHomedef tomcatHomestage('拉取代码') {git 'https://github.com/your-username/your-project.git', branch: 'main'}stage('构建项目') {// 设置 Maven 环境mvnHome = tool name: 'Maven 3.8.6', type: 'org.jenkinsci.plugins.maven.tools.Maven'env.PATH = "${mvnHome}/bin:${env.PATH}"sh 'mvn -version'// 构建项目,跳过测试sh 'mvn clean package -DskipTests'}stage('运行单元测试') {// 运行测试sh 'mvn test'// 收集测试报告step([$class: 'JUnitResultArchiver', testResults: '**/target/surefire-reports/TEST-*.xml'])}stage('部署到预生产环境') {// 复制 JAR 包到预生产服务器sh 'scp target/your-project.jar user@pre-prod-server:/opt/tomcat/webapps/'// 重启 Tomcat 服务sh 'ssh user@pre-prod-server /opt/tomcat/bin/restart.sh'}// 发送通知try {currentBuild.result = 'SUCCESS'slackSend channel: '#dev-notifications', message: '流水线执行成功!'} catch (Exception e) {currentBuild.result = 'FAILURE'slackSend channel: '#dev-notifications', message: '流水线执行失败!'}
}
(三)执行流程
- 开发人员将代码提交到 main 分支,触发 Jenkins 流水线。
- Jenkins 拉取代码后,使用 Maven 进行构建,生成可执行的 jar 包。
- 运行单元测试,收集测试报告,如果测试不通过,发送失败通知。
- 测试通过后,将 jar 包复制到预生产服务器的 Tomcat webapps 目录,并重启 Tomcat 服务,完成预生产环境的部署。
九、声明式和脚本式脚本说明
(一)声明式脚本
- 语法结构 :声明式脚本以 pipeline 块开始,包含 agent、tools、stages、post 等部分。agent 指定执行流水线的节点,tools 指定使用的工具,stages 定义各个阶段的任务,post 定义阶段执行后的操作。
- 特点 :语法简洁、易读,适合定义简单的流水线。提供了丰富的内置步骤和语法糖,减少了代码量。支持声明式的语法,如参数化构建、并行执行等。
- 适用场景 :适合小型项目或流程相对简单的流水线,开发人员可以快速定义和维护流水线脚本。
(二)脚本式脚本
- 语法结构 :脚本式脚本基于 Groovy 语言的语法,使用 node 块指定执行节点,通过 stage 块定义各个阶段,每个阶段包含具体的步骤。
- 特点 :灵活性高,可以处理复杂的逻辑,如条件判断、循环等。可以直接使用 Groovy 语言的特性,如变量、函数、类等。对于熟悉 Groovy 语言的开发人员来说,更容易实现复杂的流水线逻辑。
- 适用场景 :适合大型项目或流程复杂的流水线,需要处理更多的逻辑和条件判断。
十、常用脚本实例
(一)拉取代码
// 声明式
git 'https://github.com/your-username/your-project.git', branch: 'main'
// 脚本式
stage('拉取代码') {git url: 'https://github.com/your-username/your-project.git', branch: 'main'
}
(二)构建项目(Maven)
// 声明式
sh 'mvn clean package -DskipTests'// 脚本式
stage('构建项目') {sh 'mvn clean package -DskipTests'
}
(三)运行测试(JUnit)
// 声明式
sh 'mvn test'
post {always {junit '**/target/surefire-reports/TEST-*.xml'}
}
// 脚本式
stage('运行测试') {sh 'mvn test'junit '**/target/surefire-reports/TEST-*.xml'
}
(四)部署到服务器(SSH)
// 声明式
sh 'scp target/your-project.jar user@server:/opt/deploy/'
sh 'ssh user@server /opt/deploy/restart.sh'
// 脚本式
stage('部署到服务器') {sh 'scp target/your-project.jar user@server:/opt/deploy/'sh 'ssh user@server /opt/deploy/restart.sh'
}
(五)发送邮件通知
// 声明式
post {success {mail to: 'dev-team@example.com', subject: '流水线执行成功', body: '流水线执行成功!'}failure {mail to: 'dev-team@example.com', subject: '流水线执行失败', body: '流水线执行失败!'}
}
// 脚本式
stage('发送邮件通知') {if (currentBuild.result == 'SUCCESS') {mail to: 'dev-team@example.com', subject: '流水线执行成功', body: '流水线执行成功!'} else {mail to: 'dev-team@example.com', subject: '流水线执行失败', body: '流水线执行失败!'}
}
十一、进阶开发指南
(一)性能优化策略
- 构建缓存 :使用 sccache 加速二次编译。
- 资源隔离 :通过 Docker in Docker 技术。
- 分布式执行 :配置 Jenkins Agent 集群。
(二)安全防护方案
```groovy
// 凭据管理示例
withCredentials([usernamePassword(
credentialsId: ‘aws-key’,
usernameVariable: ‘AWS_ACCESS_KEY’,
passwordVariable: ‘AWS_SECRET_KEY’
)]) {
sh ‘aws s3 cp build/*.jar s3://deploy-bucket/’
}
```
十二、总结
通过以上对 CICD 和 Jenkins 流水线的介绍,相信大家对其有了更深入的理解。Jenkins 流水线作为 CICD 的重要实现工具,能够帮助我们实现自动化的软件开发流程,提高开发效率和软件质量。在实际项目中,我们可以根据项目的需求选择合适的脚本类型,并利用丰富的插件和功能来构建适合自己项目的 CICD 流水线。
实践建议:从简单的声明式流水线入手,逐步过渡到复杂脚本开发,同时建立完善的监控告警体系。最新趋势显示,2024 年全球约65%-75%的企业已采用 GitOps 模式优化 CI/CD 流程。
如果在阅读过程中遇到任何问题,或者对某些部分有疑问,欢迎在评论区留言交流。希望这篇文章能为大家在 CICD 与 Jenkins 流水线的学习和实践中提供有价值的参考。
相关文章:
深入理解 CICD 与 Jenkins 流水线:从原理到实践
前言:在当今数字化飞速发展的时代,软件开发行业的竞争日益激烈。为了能够快速响应市场需求,及时交付高质量的软件产品,开发团队们不断探索和采用新的开发模式与工具。CICD(持续集成、持续交付 / 部署)作为一…...
1.Vue自动化工具安装(Vue-cli)
目录 1.node.js 安装: 2 npm 安装 3 安装Vue-cli 4总结: 一般情况下,单文件组件,我们运行在 自动化工具vue-CLI中,可以帮我们编译单文件组件。所以我们在学习时一般需要在系统中先搭建vue-CLI工具 下面就是一些我…...
前端亮点:大文件上传技术详解及问题解析
大片文件上传 文件上传 大片文件上传需考虑问题 一、核心实现步骤 分片唯一标识计算 (优化比较时间) • Hash生成:使用SparkMD5或crypto.subtle.digest计算文件整体Hash(秒传依据)及分片Hash(断点续传依据)。 • 优化:通过Web Worker多线程计算,避免主线程阻塞(如…...
每日一题——最小测试用例集覆盖问题
最小测试用例集覆盖问题(C语言实现) 问题描述 假设我们有一系列测试用例,每个测试用例会覆盖若干个代码模块。 我们使用一个二维数组来表示这些测试用例的覆盖情况: 如果某个测试用例 i 能覆盖代码模块 j,则数组中…...
React 文章 分页
删除功能 携带路由参数跳转到新的路由项 const navigate useNavigate() 根据文章ID条件渲染...
【技术派后端篇】Redis实现统计计数
在互联网项目中,计数器有着广泛的应用场景。以技术派项目为例,诸如文章点赞数、收藏数、评论数以及用户粉丝数等都离不开计数器的支持。在技术派源码中,提供了基于数据库操作记录实时更新和基于 Redis 的 incr 特性实现计数器这两种方案&…...
NHANES指标推荐:RFM
文章题目:Higher relative fat mass was associated with a higher prevalence of gallstones in US adults DOI:10.1186/s12876-025-03715-3 中文标题:在美国成年人中,相对脂肪质量越高,胆结石患病率就越高 发表杂志&…...
嵌入式人工智能应用-第三章 opencv操作 4 灰度处理
嵌入式人工智能应用 嵌入式人工智能应用-第三章 opencv操作 4 灰度处理 嵌入式人工智能应用1 灰度处理2 算法2.1 均值方法2.2 最大值法2.3 分量法2.4 加权平均法(Weighted Average Method)2.5 系统自带方法 3 总结 1 灰度处理 图像灰处理即是将一幅彩色…...
AI Agent破局:智能化与生态系统标准化的颠覆性融合!
Hi!好久不见 云边有个稻草人-个人主页 热门文章_云边有个稻草人的博客-本篇文章所属专栏~ 目录 一、引言 二、AI Agent的基本概念 2.1 定义与分类 2.2 AI Agent的工作原理 2.3 示例代码:AI Agent的基本实现 三、AI Agent在企业数字化转型中的应用 …...
UniFlash以串口方式烧录MSPM0G3507(无需仿真器)
材料:MSPM0G3507黑钢版,只要有UART的其他版本亦可(PA14需接LED) 下载软件:UniFlash 9.1.0.5175,网址:UNIFLASH 软件编程工具 | 德州仪器 TI.com.cn 测试文件:MSPM0G30…...
坐标轴刻度QCPAxisTicker
一、QCPAxisTicker 概述 QCPAxisTicker 是 QCustomPlot 中控制坐标轴刻度生成和显示的基类,负责计算刻度位置和生成刻度标签。 二、主要派生类 类名描述QCPAxisTickerFixed固定步长的刻度生成器QCPAxisTickerLog对数坐标刻度生成器QCPAxisTickerPi专门显示π倍数…...
Spring Boot 版本与对应 JDK 版本兼容性
Spring Boot 版本与对应 JDK 版本兼容性 以下是 Spring Boot 主要版本与所需 JDK 版本的对应关系,以及长期支持(LTS)信息: 最新版本对应关系 (截至2024年) Spring Boot 版本发布日期支持的 JDK 版本备注3.2.x (最新)2023-11JDK 17-21推荐使用 JDK 173…...
【MySQL】MySQL的基础语法及其语句的介绍
1、基础语法 mysql -h【主机名】 -u【用户名】 -p //登录MySQL exit或quit; //退出MySQL show database; //查看MySQL下的所有数据库 use 【数据库名】; //进入数据库 show tables; //查看数据库下的所有表名 *MySQL的启动和关闭 &am…...
《汽车理论》第四章作业MATLAB部分
1.计算并绘制利用附着系数曲线和制动效率曲线 clc close all %空载(no load)-1 ;满载(full load)-2 m14080; m29290; hg10.845; hg21.170; L3.950; a12.100; a22.950; b1L-a1; b2L-a2; beta0.38; %利用附着系数与制动强度的关系曲线 z0:0.01:1; phi_f1L*beta.*z./(b1z*hg1);%前…...
SpringCloud实战
环境准备: 1. 一台虚拟机,部署好centos7操作系统、安装好docker 2. 使用docker安装mysql数据库且启动mysql容器 3. IDEA配置的JDK版本是11 4. 前端代码启动Nginx 一、单体架构和微服务的区别? 1. 单体架构 将业务的所有功能集中在一个项目中…...
Cribl 对Windows-xml log 进行 -Serialize-05
The Serialize Function Description The Serialize Function is designed to transform an events content into a predefined format. Steps - Adding a Serialize Function important Select the Add Function<...
鸿蒙ArkUI之布局实战,线性布局(Column,Row)、弹性布局(Flex)、层叠布局(Stack),详细用法
本文聚焦于ArkUI的布局实战,三种十分重要的布局,线性布局、弹性布局、层叠布局,在实际开发过程中这几种布局方法都十分常见,下面直接上手 线性布局 垂直布局(Column) 官方文档: Column-行列…...
缓存 --- 内存缓存 or 分布式缓存
缓存 --- 内存缓存 or 分布式缓存 内存缓存(In-Memory Cache)分布式缓存(Distributed Cache)内存缓存 vs 分布式缓存 内存缓存和分布式缓存是两种常见的缓存策略,它们在存储位置、访问速度和适用场景上有所不同。下面分…...
【Qt】QMainWindow类
🌈 个人主页:Zfox_ 🔥 系列专栏:Qt 目录 一:🔥 QMainWindow 概述 🦋 菜单栏🎀 具体使用🎀 综合案例 🦋 工具栏🦋 状态栏🦋 窗口布局&a…...
缓存 --- 缓存击穿, 缓存雪崩, 缓存穿透
缓存 --- 缓存击穿, 缓存雪崩, 缓存穿透 缓存击穿(Cache Breakdown)概念原理实际场景代码实现(互斥锁方案) 缓存雪崩(Cache Avalanche)概念原理实际场景代码实现(随机过期时间) 缓存…...
第五章 SQLite数据库:5、SQLite 进阶用法:ALTER 命令、TRUNCATE 操作、视图创建、事务控制和子查询的操作
1. SQLite ALTER 命令 SQLite 的 ALTER TABLE 命令允许在不完全重建表的情况下修改现有的表结构。通过 ALTER TABLE,您可以执行如重命名表名、添加新列等操作,但无法执行复杂的修改,如删除列或修改列的数据类型。 语法 重命名表 用于重命名…...
【2】Kubernetes 架构总览
Kubernetes 架构总览 主节点与工作节点 主节点 Kubernetes 的主节点(Master)是组成集群控制平面的关键部分,负责整个集群的调度、状态管理和决策。控制平面由多个核心组件构成,包括: kube-apiserver:集…...
【数据结构】红黑树
红黑树( R e d B l a c k T r e e Red\ Black\ Tree Red Black Tree)是一种自平衡二叉搜索树,也可以看作一种特化的 A V L AVL AVL 树(通过颜色规则来实现自平衡功能),都是在进行插入和删除操作时通过特定…...
ThreadLocal - 原理与应用场景详解
ThreadLocal 的基础概念 在 Java 的多线程世界里,线程之间的数据共享与隔离一直是一个关键话题。如果处理不当,很容易引发线程安全问题,比如数据混乱、脏读等。而 ThreadLocal 这个工具类,就像是为线程量身定制的 “私人储物柜”…...
VS Code 远程连接服务器:Anaconda 环境与 Python/Jupyter 运行全指南。研0大模型学习(第六、第七天)
VS Code 远程连接服务器:Anaconda 环境与 Python/Jupyter 运行全指南 在使用 VS Code 通过 SSH 远程连接到服务器进行开发时,尤其是在进行深度学习等需要特定环境的工作时,正确配置和使用 Anaconda 环境以及理解不同的代码运行方式非常关键。…...
chili3d调试6 添加左侧面板
注释前 一个一个注释看对应哪个窗口 无事发生 子方法不是显示的窗口 注释掉看看 没了 注释这个看看 零件页面没了 这个浏览器居然完全不用关的,刷新就重载了 注释看看 无工具栏版本 sidebar: 往框框里面加入 div({ className: style.input }, user_…...
Python变量全解析:从基础到高级的命名规则与数据类型指南
一、变量基础与内存机制 1.1 变量的三元构成 每个Python变量由三个核心要素构成: 标识(Identity):对象的内存地址,通过id(obj)获取(如id(name)输出0x5a1b2c3d)类型(Type&am…...
组装一台intel n95纯Linux Server服务器
前言 笔者自己的电脑是macmini m4,平时都是使用虚拟机来充当Linux服务器(系统Ubuntu Server),但是毕竟是ARM CPU,而且黄金内存,开不了几个虚拟机(加内存不划算),所以组装…...
计算机网络中的网络层:架构、功能与重要性
一、网络层概述 在计算机网络的分层模型中,网络层(Network Layer)位于 数据链路层 之上,传输层 之下。网络层的主要任务是处理数据包的路由选择、转发以及分段,使得信息能够从源设备传送到目标设备。它还通过 IP协议&…...
Transformer系列(一):NLP中放弃使用循环神经网络架构
NLP中放弃使用循环神经网络架构 一、符号表示与概念基础二、循环神经网络1. 依赖序列索引存在的并行计算问题2. 线性交互距离 三、总结 该系列笔记阐述了自然语言处理(NLP)中不再采用循环架构(recurrent architectures)的原因&…...
(学习总结34)Linux 库制作与原理
Linux 库制作与原理 库的概念静态库操作归档文件命令 ar静态库制作静态库使用 动态库动态库制作动态库使用与运行搜索路径问题解决方案方案2:建立同名软链接方案3:使用环境变量 LD_LIBRARY_PATH方案4:ldconfig 方案 使用外部库目标文件ELF 文…...
【QT】 QT中的列表框-横向列表框-树状列表框-表格列表框
QT中的列表框-横向列表框-树状列表框-表格列表框 1.横向列表框(1)主要方法(2)信号(3) 示例代码1:(4) 现象:(5) 示例代码2:加载目录项在横向列表框显示(6) 现象: 2.树状列表框 QTreeWidget(1)使用思路(2)信号(3)常用的接口函数(4) 示例代码&am…...
使用DeepSeek的AIGC的内容创作者,如何看待陈望道先生所著的《修辞学发凡》?
目录 1.从修辞手法的运用角度 2.从语言风格的塑造角度 3.从提高创作效率角度 4.从文化传承与创新角度 大家好这里是AIWritePaper官方账号,官网👉AIWritePaper~ 《修辞学发凡》是陈望道 1932 年出版的中国第一部系统的修辞学著作,科学地总…...
使用 GitHub Actions 和 Nuitka 实现 Python 应用(customtkinter ui库)的自动化跨平台打包
目录 引言前置准备配置文件详解实现细节CustomTkinter 打包注意事项完整配置示例常见问题 引言 在 Python 应用开发中,将源代码打包成可执行文件是一个常见需求。本文将详细介绍如何使用 GitHub Actions 和 Nuitka 实现自动化的跨平台打包流程,支持 W…...
【Part 2安卓原生360°VR播放器开发实战】第一节|通过传感器实现VR的3DOF效果
《VR 360全景视频开发》专栏 将带你深入探索从全景视频制作到Unity眼镜端应用开发的全流程技术。专栏内容涵盖安卓原生VR播放器开发、Unity VR视频渲染与手势交互、360全景视频制作与优化,以及高分辨率视频性能优化等实战技巧。 📝 希望通过这个专栏&am…...
【1】云原生,kubernetes 与 Docker 的关系
Kubernetes?K8s? Kubernetes经常被写作K8s。其中的数字8替代了K和s中的8个字母——这一点倒是方便了发推,也方便了像我这样懒惰的人。 什么是云原生? 云原生: 它是一种构建和运行应用程序的方法,它包含&am…...
基于Redis实现RAG架构的技术解析与实践指南
一、Redis在RAG架构中的核心作用 1.1 Redis作为向量数据库的独特优势 Redis在RAG架构中扮演着向量数据库的核心角色,其技术特性完美契合RAG需求: 特性技术实现RAG应用价值高性能内存存储基于内存的键值存储架构支持每秒百万级的向量检索请求分布式架构…...
trivy开源安全漏洞扫描器——筑梦之路
开源地址:https://github.com/aquasecurity/trivy.git 可扫描的对象 容器镜像文件系统Git存储库(远程)虚拟机镜像Kubernetes 在容器镜像安全方面使用广泛,其他使用相对较少。 能够发现的问题 正在使用的操作系统包和软件依赖项…...
pnpm确认全局下载安装了还是显示cnpm不是内部或外部命令,也不是可运行的程序
刚开始是正常使用的。突然开始用不了了一直报错 1.在确保自己node和npm都一直正常使用并且全局安装pnpm的情况下 打开cmd查看npm的环境所在位置 npm config get prefix 2.接着打开高级系统设置 查看自己的path配置有没有问题 确认下载了之后pnpm -v还报错说明没有查询到位置 …...
基于 pnpm + Monorepo + Turbo + 无界微前端 + Vite 的企业级前端工程实践
基于 pnpm Monorepo Turbo 无界微前端 Vite 的企业级前端工程实践 一、技术演进:为什么引入 Vite? 在微前端与 Monorepo 架构落地后,构建性能成为新的优化重点: Webpack 构建瓶颈:复杂配置导致开发启动慢&#…...
软考高级系统架构设计师-第15章 知识产权与标准化
【本章学习建议】 根据考试大纲,本章主要考查系统架构设计师单选题,预计考3分左右,较为简单。 15.1 标准化基础知识 1. 标准的分类 分类 内容 国际标准(IS) 国际标准化组织(ISO)、国际电工…...
MySQL 视图
核心目标: 学习如何创建和使用视图,以简化复杂的查询、提供数据访问控制、实现逻辑数据独立性,并通过 WITH CHECK OPTION 保证数据一致性。 什么是视图? 视图(View)是一种虚拟表,其内容由一个 …...
[操作系统] 信号
信号 vs IPC 板书最后提到了 “信号 vs IPC”,暗示了信号也是一种进程间通信 (Inter-Process Communication, IPC) 的机制。虽然信号的主要目的是事件通知,但它也可以携带少量的信息(即信号的类型)。 初探“信号”——操作系统的“…...
网络基础(协议,地址,OSI模型、Socket编程......)
目录 一、计算机网络发展 二、协议 1.认识协议 2.OSI七层模型 3.TCP/IP 五层(或四层)模型 4.协议本质 三、网络传输流程 1.MAC地址 2.协议栈 3.IP地址 IP地址 vs MAC地址 1. 核心区别 2. 具体通信过程类比 3. 关键总结 为什么需要两者? 4.协议栈图解…...
产品经理学习过程
一:扫盲篇(初始产品经理) 阶段1:了解产品经理 了解产品经理是做什么的、产品经理的分类、产品经理在实际工作中都会接触什么样的岗位、以及产品经理在实际工作中具体要做什么事情。 二:准备篇 阶段2:工…...
深入理解Java包装类:自动装箱拆箱与缓存池机制
深入理解Java包装类:自动装箱拆箱与缓存池机制 对象包装器 Java中的数据类型可以分为两类:基本类型和引用类型。作为一门面向对象编程语言, 一切皆对象是Java语言的设计理念之一。但基本类型不是对象,无法直接参与面向对象操作&…...
Linux中的信号量
目录 信号量概念 定义 操作 类型 应用 信号量封装 一、创建信号量 头文件 函数原型 参数说明 返回值 示例 二、设置信号量初始值 头文件 函数原型 参数解释 返回值 示例 三、信号量的P操作 头文件 函数原型 参数解释 返回值 示例 四、信号量的V操作 示…...
深入理解linux操作系统---第15讲 Web 服务器 Nginx
15.1 Nginx 概述 核心特性与历史背景 Nginx由俄罗斯工程师Igor Sysoev于2002年开发,2004年正式发布,旨在解决传统服务器(如Apache)的C10K问题(即单机万级并发连接处理)。其采用事件驱动(Event…...
深度解析算法之前缀和
25.【模版】一维前缀和 题目链接 描述 输入描述 输出描述 输出q行,每行代表一次查询的结果. 示例 输入: 3 2 1 2 4 1 2 2 3 复制 输出: 3 6 这个题的话就是下面的样子,我们第一行输入 3 2的意思即是这个数组是3个元素大小的数组&…...
混合精度训练中的算力浪费分析:FP16/FP8/BF16的隐藏成本
在大模型训练场景中,混合精度训练已成为降低显存占用的标准方案。然而,通过NVIDIA Nsight Compute深度剖析发现,精度转换的隐藏成本可能使理论算力利用率下降40%以上。本文基于真实硬件测试数据,揭示不同精度格式的计算陷阱。…...