掌握Jenkins自动化部署:从代码提交到自动上线的全流程揭秘
Jenkins自动化部署是现代软件开发中不可或缺的一部分,它不仅简化了代码的发布过程,还为整个团队带来了无与伦比的效率和协作力。想象一下,开发者们可以专注于编写高质量的代码,而不是为繁琐的手动部署所烦恼;测试人员能在每次提交代码后立即看到测试结果,确保软件质量;运营团队不再需要熬夜加班来手动发布新版本,而是可以安心地看到系统自动完成一切。
Jenkins自动化部署的意义在于它赋予了开发团队一种近乎魔法般的力量,将复杂、易出错的手动操作变为简单、高效的流水线流程。通过CI/CD(持续集成/持续部署),每一次代码的提交都能触发自动化的构建、测试和部署,确保每一个版本的上线都是经过严格测试和验证的。这种无缝的工作流不仅提高了开发速度,还显著降低了风险,让软件的发布更为可靠。
可以说,Jenkins自动化部署不仅是技术上的进步,更是一种开发理念的革新。它让软件开发变得更高效、更可靠、更具创新力。只要你体验过Jenkins带来的便利,你就再也不会回到手动部署的时代,因为那种“代码一提交,系统自己搞定”的感觉,实在是太让人欲罢不能了!
这就是Jenkins的力量,它不仅改变了开发的方式,也改变了我们对软件开发的认知。如果你还没尝试过Jenkins,现在就是最好的时机,去体验一下现代开发的魅力吧!
1.Jenkins工作流程
当你提交代码后,Jenkins能够自动触发部署的背后,是一整套自动化构建和交付的流水线(Pipeline)在起作用。这里我将详细介绍Jenkins的工作流程和内部原理,包括它如何监控代码库的变化、触发构建、执行测试、打包以及最终部署到服务器的过程。
1. 源代码管理(SCM)轮询或Webhooks触发
- SCM轮询:Jenkins会定期检查(轮询)配置的源代码管理系统(如Git、SVN等)的仓库,看是否有新的提交或代码更改。如果检测到变化,就会触发构建任务。这种方法需要Jenkins定时访问代码库,可能会有一定的延迟。
- Webhooks:相比之下,Webhooks是一种更为实时的触发方式。开发者提交代码后,源代码管理系统会立即向Jenkins发送一个HTTP请求(Webhook),通知Jenkins有新提交。这使得Jenkins能够更快响应代码变化,立即启动构建过程。
2. 触发构建任务
一旦Jenkins接收到代码变更的通知,它会根据配置的Pipeline或Job来决定如何处理这次构建。Jenkins中的Pipeline是基于Groovy脚本的,它定义了从代码提交到最终部署的整个流程。
3. 流水线(Pipeline)阶段
Pipeline分为多个阶段,每个阶段都可以独立执行一组任务。这些阶段通常包括:
-
Checkout代码:Jenkins从源代码管理系统中将最新的代码拉取到构建节点上。这一步通常使用插件(如Git插件)来与代码库交互。
-
构建(Build):Jenkins根据配置的构建工具(如Maven、Gradle)对代码进行编译、打包。在这一步,代码会被转化为可执行的应用程序包(如JAR、WAR文件)或Docker镜像。
-
测试(Test):Jenkins会运行自动化测试脚本,包括单元测试、集成测试、功能测试等。这一步至关重要,因为它确保代码在引入新变更后仍然是稳定和可靠的。
-
代码质量分析(Optional):Jenkins可以执行代码质量检查,使用工具如SonarQube来分析代码的复杂度、安全性和可维护性,并生成报告。
-
部署(Deploy):当所有前面的步骤都成功完成后,Jenkins会执行部署阶段。根据配置,它可以将构建产物部署到不同的环境,如开发环境、测试环境或生产环境。这一步可以通过SSH、FTP、容器化部署(Docker、Kubernetes)或云服务API来实现。
4. 工作节点(Agent)与主节点(Master)协作
Jenkins采用主从架构,其中主节点(Master) 负责调度任务、管理工作队列、监控节点状态等。工作节点(Agent) 实际执行构建任务,如代码编译、测试和部署等。
当Pipeline被触发时,Jenkins主节点会分配一个或多个工作节点来执行具体任务。工作节点从主节点获取任务后,开始执行相应的步骤,完成后将结果返回给主节点。
5. Jenkinsfile(流水线脚本)
Jenkinsfile是定义Pipeline的脚本文件,通常存储在代码库中。这使得整个构建、测试和部署的流程代码化,并与项目代码一起版本控制。在Jenkinsfile中,你可以定义Pipeline的各个阶段、条件逻辑、并行任务等。
6. 通知与反馈
Jenkins在构建和部署过程中会生成实时的日志,并在任务完成后发送通知(如通过电子邮件、Slack)。如果构建失败,Jenkins会立即通知相关人员,以便他们能够快速响应和修复问题。
7. 持续集成与持续交付/部署(CI/CD)
整个流程的核心思想是CI/CD,通过持续集成和交付,让开发团队能够频繁地提交代码,并自动化测试、构建和部署,减少人为错误,提升软件发布的效率和质量。
可以通过一张图来直观展示Jenkins在整个流程中扮演的角色,具体如下所示:该图主要对比了人工部署与Jenkins自动化部署的过程。

Jenkins的工作流程是通过SCM轮询或Webhooks来实时监控代码变化,使用Pipeline将构建、测试、打包、部署等步骤串联起来,自动化地将应用程序从开发环境推送到生产环境。其主从架构、可配置的Pipeline、广泛的插件支持,使得Jenkins成为了自动化部署的强大工具,让整个软件开发生命周期变得更加高效和可靠。
下面,让我们一起踏入使用Jenkins自动部署Spring Boot项目的奇妙之旅!
2.搭建Jenkins
1.创建一个数据目录
# 创建 jenkins 目录
mkdir /data/jenkins_home/
# 修改目录的所有者,以便于 Jenkins 容器能够操作该目录
chown -R 1000:1000 /data/jenkins_home/
2.拉取jenkins镜像
docker pull jenkins/jenkins:lts
3.启动jenkins容器
为了防止与 Spring Boot 默认使用的 8080 端口发生冲突,我选择将 Jenkins 服务器的访问端口配置为 8088。此外,在确保 Jenkins 可以从外部网络访问的同时,也需要在云服务器的安全组中配置防火墙规则来开放 8088 端口,这样外部客户端才能通过此端口访问到 Jenkins 服务器。
docker run -d --name jenkins -p 8088:8080 -p 50000:50000 -v /data/jenkins_home:/var/jenkins_home jenkins/jenkins:lts
这样的配置不仅能够确保 Jenkins 服务与其他可能运行在同一服务器上的服务(如 Spring Boot 应用)之间不会产生端口冲突,还能通过精细控制防火墙规则来提高系统的安全性。
在云服务器的安全组设置中,你需要添加一条入站规则,允许来自特定 IP 地址或 IP 范围的流量通过 8088 端口进入服务器。这样既能保证 Jenkins 的可用性,也能限制不必要的网络访问,从而提升整体安全性。
4.访问Jenkins
一旦Jenkins容器启动,你可以通过访问http://localhost:8088来访问Jenkins界面。(注意:这里的localhost对应的你的云服务器IP地址!)
首次访问时,系统会要求你输入初始管理员密码。

5.获取管理员密码
可以直接去宿主机的 /data/jenkins_home/secrets/initialAdminPassword 位置查看初始化密码,具体如下所示:(这里的/data/jenkins_home/是前面你自己设置的Jenkins工作目录)。
获取管理员密码之后就可以直接使用admin账户进行登录,登录之后的界面如下所示:

3.安装Maven
在Jenkins自动化部署中,Maven被安装在服务器上是为了执行项目的构建任务,包括代码编译、依赖管理、测试执行和打包操作。通过Maven,Jenkins能够自动化地将源代码转换为可部署的应用程序包(如JAR或WAR文件),确保项目按需构建并满足所有依赖。
-
下载Maven
访问Maven官方下载页面,选择需要的版本,复制下载链接。使用wget命令下载Maven。例如下载Maven 3.8.8版本:
wget https://dlcdn.apache.org/maven/maven-3/3.8.8/binaries/apache-maven-3.8.8-bin.tar.gz -
解压文件
将下载的文件解压到你想要安装的位置,例如/opt目录:sudo tar -zxvf apache-maven-3.8.8-bin.tar.gz -C /opt -
配置环境变量
为了方便使用Maven,需要配置环境变量。编辑/etc/profile文件:sudo vi /etc/profile在文件末尾添加以下内容:
export M2_HOME=/opt/apache-maven-3.8.8 export PATH=$M2_HOME/bin:$PATH -
使环境变量生效
保存文件并退出编辑器,然后使环境变量生效:source /etc/profile -
验证安装
现在可以通过以下命令验证Maven是否安装成功:mvn -version如果安装成功,你将看到Maven的版本信息。

4.安装插件
在Jenkins启动成功后,安装以下三个插件能够增强其功能,满足特定的项目需求:
1. Gitee
- 功能:Gitee插件允许Jenkins与Gitee代码仓库集成,支持从Gitee仓库中拉取代码、触发构建任务。这对于使用Gitee进行源代码管理的团队非常有用,能简化CI/CD流程。
- 安装:在“插件管理”界面,搜索“Gitee”插件并安装。安装后,可以在Jenkins的项目配置中添加Gitee仓库的访问信息,配置Webhook以便代码提交时自动触发构建。
2. Maven Integration
- 功能:Maven Integration插件允许Jenkins与Maven无缝集成,使得Jenkins可以直接调用Maven进行项目的构建、测试和打包。这对于Java项目尤其重要,因为Maven能够自动管理项目依赖、编译代码,并生成可部署的包(如JAR、WAR)。
- 安装:在Jenkins管理界面中,导航到“插件管理” -> “可选插件”,搜索“Maven Integration”并点击“安装”。
3. Publish Over SSH
- 功能:Publish Over SSH插件允许Jenkins通过SSH将构建生成的文件(如JAR、WAR包)安全地传输到远程服务器上。这对于部署过程至关重要,尤其是当需要将构建产物自动部署到生产或测试服务器时。
- 安装:同样在“插件管理”界面,搜索“Publish Over SSH”并安装。安装后,你可以在“系统管理”中配置SSH服务器的连接信息。
通过安装这些插件,Jenkins能够更好地支持项目构建、打包、部署和代码管理,大大提高自动化部署的效率和灵活性。
具体的安装步骤如下所示:点击左边的系统管理,然后选择右边的插件管理,进行配置。

之后在可选插件中,搜索 Maven Integration 和 Publish Over SSH 以及 Gitee 三个插件安装即可:

全部插件安装完成之后,最好登录服务器,重启Jenkins容器以更新插件!具体命令如下:
docker restart jenkins
5.全局工具配置
在使用Jenkins进行自动化部署之前,进行一些全局工具的配置是必要的,这样可以确保Jenkins能够正确调用这些工具来完成构建、测试和部署任务。

以下是Jenkins通常需要配置的全局工具:
1. JDK(Java Development Kit)
- 为什么需要:Jenkins本身是基于Java的应用,并且许多构建工具(如Maven、Gradle)也依赖JDK。因此,配置JDK是必不可少的。
- 配置方法:在Jenkins的“系统管理” -> “全局工具配置”中,找到JDK配置部分,点击“添加JDK”,指定JDK的安装路径,或者选择自动安装。
2. Maven
- 为什么需要:Maven是Java项目构建的标准工具,用于依赖管理、代码编译、测试和打包。通过配置Maven,Jenkins可以调用Maven进行项目构建。
- 配置方法:在“全局工具配置”中找到Maven配置部分,点击“添加Maven”,指定Maven的安装路径,或者选择自动安装。

3. Git
- 为什么需要:大多数项目都使用Git进行源代码管理。通过配置Git,Jenkins可以从Git仓库中拉取代码并进行构建。
- 配置方法:在“全局工具配置”中找到Git配置部分,添加Git安装路径,或者选择自动安装。确保Jenkins可以访问正确版本的Git(由于 Jenkins 容器中已经存在 git 了,所以这里不需要额外安装 git,默认即可)。

4. Gradle(可选)
- 为什么需要:对于使用Gradle构建的项目,配置Gradle工具是必要的。Gradle是另一个流行的构建工具,尤其在Android开发中被广泛使用。
- 配置方法:在“全局工具配置”中,找到Gradle配置部分,点击“添加Gradle”,指定Gradle的安装路径或选择自动安装。
全局工具配置是确保Jenkins能够顺利执行构建、测试和部署任务的基础。通过配置JDK、Maven、Git等工具,Jenkins可以与这些构建工具无缝集成,自动化地完成从代码拉取到部署的整个流程。这些配置不仅提高了Jenkins的灵活性和适用性,还简化了每个项目的具体配置工作。
6.系统配置
在Jenkins中进行系统配置时,Publish Over SSH 和 Gitee 的配置是实现代码部署和与代码仓库集成的关键步骤。以下是详细的配置步骤介绍:
1. Publish Over SSH 配置
Publish Over SSH 插件允许Jenkins通过SSH将构建生成的文件(如JAR、WAR包)安全地传输到远程服务器上。以下是配置步骤:
步骤 1: 安装 Publish Over SSH 插件
- 如果前面已经安装请忽略步骤1
- 登录Jenkins的管理界面。
- 在Jenkins首页,点击左侧菜单中的“系统管理”或“Manage Jenkins”。
- 在管理页面中,选择“插件管理”或“Manage Plugins”。
- 在“可选插件”或“Available Plugins”选项卡中,搜索
Publish Over SSH。 - 勾选插件并点击“安装”,等待插件安装完成。
步骤 2: 配置 SSH 服务器
-
插件安装完成后,返回“系统管理”页面,选择“系统配置”或“Configure System”。
-
向下滚动页面,找到
Publish Over SSH部分。 -
点击“添加”按钮,配置一个新的SSH服务器:
- Name: 为服务器配置一个易记的名称。
- Hostname: 输入目标服务器的IP地址或主机名。
- Username: 输入用于登录到目标服务器的用户名。
- Remote Directory: 指定在远程服务器上的默认目录,Jenkins将把构建产物传输到此目录。
- Use password authentication, or use a different key: 选择是使用密码认证,还是提供私钥文件进行认证。
- 如果使用密钥认证,配置私钥文件路径或直接粘贴私钥内容。
-
点击“测试配置”或“Test Configuration”按钮,验证Jenkins是否能够成功连接到目标服务器。

步骤 3: 保存配置
- 配置完成后,点击页面底部的“保存”或“应用”按钮,以确保你的设置被保存。
2. Gitee 配置
通过配置Gitee,Jenkins能够与Gitee代码仓库集成,实现代码的自动拉取和构建。以下是配置步骤:
步骤 1: 安装 Gitee 插件
- 同样在Jenkins的插件管理中,搜索
Gitee并安装该插件。
步骤 2: 获取 Gitee API Token
- 登录到Gitee账户,点击链接。
- 在“私人令牌”部分,点击“生成新的令牌”。
- 根据需要选择令牌的权限,例如“repo”(代码仓库相关操作)和“user_info”(用户信息查看)。
- 生成令牌后,复制并保存。

步骤 3: 添加 Gitee配置
- 在“系统配置”页面,找到Gitee 配置。
- 配置你的Gitee仓库信息:
- 链接名: 输入你的Gitee仓库的URL(HTTPS)。
- Gitee域名URL: 输入Gitee域名完整URL地址。
- 证书令牌: 选择Gitee API令牌。

步骤 4: 添加凭据
- 在Gitee配置页面 -> 点击添加Jenkins。
- 在弹出的对话框中选择“Gitee API令牌”,在“Gitee APIV5私人令牌”字段中粘贴你刚刚生成的API Token。
- 为该凭据提供一个名称,并点击“添加”保存。

通过上述步骤,就已经在Jenkins中完成了Publish Over SSH和Gitee的配置。这些配置使得Jenkins能够安全地将构建产物部署到远程服务器,同时自动拉取和构建Gitee上的代码,为CI/CD流程提供了基础支持。
7.构建项目
在Jenkins中新建一个Maven项目的步骤如下:
1. 登录Jenkins控制台
首先,访问Jenkins的Web界面,使用你的管理员账户登录。
2. 新建项目
- 在Jenkins首页,点击左侧菜单中的“新建任务”或“New Item”。
- 在弹出的窗口中,为项目输入一个名称,然后选择“构建一个Maven项目”或“Maven Project”。
- 点击“确定”进入项目配置页面。
3. 配置源码管理(Source Code Management, SCM)
- 在项目配置页面,找到“源码管理”部分。
- 选择你使用的版本控制系统(如Git),并输入项目的代码仓库URL。
- 如果仓库需要认证,配置相应的凭证(Credentials),如用户名和密码或SSH密钥。
- 设置仓库中触发构建的分支代码(*/release表示release分支有代码提交则自动触发构建)。

4. 构建触发器
- 配置构建触发器,这可以是轮询SCM(Poll SCM)、Webhook触发、定时构建等。
- 例如,如果你希望在每次代码提交时触发构建,可以选择“GitHub hook trigger for GITScm polling”或“Poll SCM”,并设置合适的时间间隔。

5.Gitee中配置WebHook
在Gitee中配置WebHook时,首先进入仓库的“管理”页面,选择“Webhooks”并添加新WebHook。在请求URL中输入Jenkins的WebHook地址(如),选择触发事件(如推送事件),然后保存配置。这样,每当代码提交时,Gitee将自动通知Jenkins触发相应的构建任务。

上图中所需的URL将在设置Jenkins的Webhook触发器时指定,这个URL用于接收外部触发信号以启动构建流程。由于 Jenkins 是要登录之后才可以操作的,处于公网的 Jenkins 我们也不能降至设置为匿名访问,所以这里我们将 Jenkins 的用户名密码放在请求地址中,最终地址类似这样:http://username:password@IP:8088/xxxx。而Jenkins系统中生成的URL是不包含用户名和密码的,需要你自己手动添加!
此外,为了安全起见,Jenkins系统会自动生成一个密码或密钥,用于验证Webhook请求的有效性,确保只有授权方能触发构建任务。

对应的URL和密码输入并新建WebHook即可,注意,因为Gitee中的bug,就算配置成功了,测试WebHook也会出现404错误。因此如果测试出现404错误不要着急,可以尝试构建项目看看效果再来确定问题!

6. 构建设置
- 在“构建”部分,你需要输入Maven构建的根POM文件的路径,通常是
pom.xml。 - 在“Goals and options”中,输入你希望执行的Maven命令,如
clean install或package,根据项目需求选择合适的构建目标。

7. 构建后操作(Post Steps)
- 你可以在“构建后操作”部分添加一些后续步骤,如“发送邮件通知”或“部署到服务器”。
- 如果你使用Publish Over SSH插件,可以配置将构建产物上传到远程服务器的步骤。

此外,这里还需要上传并执行构建后的deploy.sh脚本文件,具体脚本如下所示:
# 设置jdk路径
export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-11.0.23.0.9-2.el7_9.x86_64
export PATH=$JAVA_HOME/bin:$PATH# 设置jar路径和文件名
JAR_PATH=/root/deploy_data
JARFILE=webserver-1.0.0-SNAPSHOT.jar# kill掉正在运行的java进程
ps -ef | grep $JARFILE | grep -v grep | awk '{print $2}' | xargs kill -9# 开启一个新的java进程
nohup java -jar -Xms512m -Xmx1024m $JAR_PATH/$JARFILE > out.log 2>&1 &if [ $? -eq 0 ]; thensleep 30tail -n 50 out.log
fi
这个脚本文件需要根据服务器中jdk的路径以及jar的路径和名称进行修改!
8. 保存配置并构建
- 配置完成后,点击页面底部的“保存”或“应用”按钮。
- 返回项目主页,点击“立即构建”或“Build Now”按钮,启动第一次构建。

9. 查看构建结果
- 构建过程会在Jenkins的控制台输出中显示,你可以点击项目主页左侧的“控制台输出”查看构建日志。
- 如果构建成功,Jenkins会显示一个绿色的“成功”标记,如果失败,则显示红色“失败”标记。

通过以上步骤,你就可以在Jenkins中成功新建并配置一个Maven项目,实现自动化构建。
相关文章:
掌握Jenkins自动化部署:从代码提交到自动上线的全流程揭秘
Jenkins自动化部署是现代软件开发中不可或缺的一部分,它不仅简化了代码的发布过程,还为整个团队带来了无与伦比的效率和协作力。想象一下,开发者们可以专注于编写高质量的代码,而不是为繁琐的手动部署所烦恼;测试人员能…...
糟糕界面集锦-控件篇09
目前我们还无法确定该把这个问题划到哪个类别中,但是如图所示,在一个列表框中只显示3 个项目无疑是愚蠢的。 这是微软的文件管理器提供的文件关联界面,用户需要把某一个特定类型的文件与一个应用程序关联时会弹出该对话框。如示例:…...
喵喵蓝牙热敏打印机(下)
目录 前言一、电量、温度、缺纸检测1.电量检测2.针头温度检测3.缺纸检测 二、蓝牙APP通信打印1.蓝牙初始化2.APP通信打印 三、FreeRTOS任务整合 前言 喵喵蓝牙热敏打印机(上) 内容有点多,就分为了上下两篇。 一、电量、温度、缺纸检测 先启…...
软件测试第1章 软件测试是什么
目录 内容说明 一、软件测试与质量概览需要熟悉什么 二、如何理解质量保证 三、软件测试的误区-程序员和测试的关系 四、软件测试是什么? 五、软件测试的目的 六、软件测试与软件质量保证 七、软件测试的必要性 八、软件测试的基本概念分析 …...
【技术分享】 hysteria2从服务端到客户端部署教程
hysteria2从服务端到客户端部署教程 前言 在如今的网络环境中,尤其是涉及跨国访问的场景中,hysteria2作为一个新兴的传输协议工具,凭借其高效的传输能力和灵活的配置方式,受到了越来越多用户的青睐。本教程将带您一步步完成hyst…...
C++入门基础知识16
C 的关键字(接上一篇博文!!!) 54. typeid 指出指针或引用指向的对象的实际派生类型。 55. typename typename(类型名字)关键字告诉编译器把一个特殊的名字解释成一个类型。在下列情况下必须对一…...
浏览器调试工具-Chrome Dev Tools
浏览器调试模式下的各个调试工具是常用的工具集,能够帮助开发者理解、调试和优化网页。 1.打开方式 直接在浏览器中按下F12键右键点击页面上的任一元素,选择“检查”(Inspect)在浏览器右上角点击菜单按钮,选择“更多…...
基于车联网大数据平台的用户驾驶习惯行为画像分析
近年来,新能源汽车行业的迅速发展推动了汽车智能化的趋势。新能源汽车上配备了成千上万的传感器,这些传感器采集了大量的行车数据被用于车辆运行状况的监控与分析。另一方面,采集到的大量行车数据,也能很好地体现用户的驾驶习惯。…...
Ubuntu24.04搭建maxkb开发环境
接上文:windows10搭建maxkb开发环境(劝退指南) 上文在windows10环境搭建maxkb开发环境遇到各种坑,后面就转战ubuntu平台,果然比较顺利的完成开发环境搭建。当然遇到相关的问题还是可以参考上文《windows10搭建maxkb开发…...
C++ 指针和引用的区别
1.引用在定义时必须初始化,而指针没有要求 2.引用一旦引用了一个实体就不能在引用其它实体,指针可以在任何时候指向同一类型的指针 3.没有空引用,但是有空指针 4.在sizeof中含义不同:引用结果为引用类型的大小,但指…...
python绘制蕨菜叶分形
一花一叶一世界,一草一木一浮生. 使用了四个不同的线性变换,根据概率选择其中一个变换并更新 x 和 y 坐标。然后将生成的绿色点绘制出来,形成一片蕨菜叶。 import numpy as np import matplotlib.pyplot as pltdef fern_fractal(num_points):# 初始化坐…...
1分钟了解pandas
Pandas 是一个强大的 Python 库,用于数据分析和数据处理。它为 Python 提供了高效的数据结构和数据分析工具,使得数据操作变得简单而直观。Pandas 由 Wes McKinney 在 2008 年创建,并迅速成为数据科学领域中最受欢迎的库之一。 安装 Pandas …...
django-celery应用-定时执行测试cases
1、celery周期性任务 简介-----celery beat 是一个调度程序,它定期启动任务,然后由集群中的可用工作节点执行这些任务。 django-celery-beat celery默认的调度程序是 celery.beat.PersistentScheduler ,它简单地跟踪本地 shelve 数据库文件中…...
【C++深度探索】unordered_set、unordered_map封装
🔥 个人主页:大耳朵土土垚 🔥 所属专栏:C从入门至进阶 这里将会不定期更新有关C/C的内容,欢迎大家点赞,收藏,评论🥳🥳🎉🎉🎉 文章目录…...
CSS——字体背景(Font Background)
一、字体族 1、字体的相关样式: ① color 用来设置字体颜色(前景颜色) ② font-size 字体的大小 和font-size相关的单位: em 相对于当前元素的一个font-size rem 相对于根元素的一个font-size ③ font-family 字体族&#x…...
秋招突击——8/15——知识补充——Socket通信
文章目录 引言正文基于TCP协议的Socket通信基于UDP协议的Socket通信服务端如何接收更多项目多进程多线程IO多路复用select轮询IO多路复用epoll事件通知 使用Socket实现同一个机器上的多线程通信服务端创建对应socket监听端口客户端发起对应的连接请求 总结 引言 上次面试腾讯的…...
Qt第十四章 模型视图
Model/View(模型/视图)结构 文章目录 Model/View(模型/视图)结构简介视图组件Model/View结构的一些概念项目控件组(item Widgets)模型/视图 如何使用项目视图组设置行的颜色交替变换拖拽设置编辑操作其他操作 选择模型自定义选择多…...
硬件工程师必须掌握的MOS管详细知识
MOS管,全称为金属-氧化物半导体场效应晶体管(Metal-Oxide-Semiconductor Field-Effect Transistor,MOSFET),是一种重要的半导体器件,广泛应用于电子工业中各种电路的开关、放大、调制、数字电路和模拟电路等…...
希尔排序,详细解析(附图解)
1.希尔排序思路 希尔排序是一种基于插入排序的算法,通过将原始数据分成若干个子序列,然后对子序列进行插入排序,逐渐减小子序列的间隔,最后对整个序列进行一次插入排序。 1.分组直接插入排序,目标接近有序--------…...
【C语言篇】编译和链接以及预处理介绍(下篇)
文章目录 前言#和###运算符##运算符 命名约定#undef命令⾏定义条件编译#if和#endif多个分支的条件编译判断是否被定义嵌套指令 头文件被包含头文件被包含的方式本地文件包含库文件的包含 嵌套文件包含 其他预处理指令 写在最后 前言 本篇接前一篇【C语言篇】编译和链接以及预处…...
shell脚本--常见案例
1、自动备份文件或目录 2、批量重命名文件 3、查找并删除指定名称的文件: 4、批量删除文件 5、查找并替换文件内容 6、批量创建文件 7、创建文件夹并移动文件 8、在文件夹中查找文件...
Java如何权衡是使用无序的数组还是有序的数组
在 Java 中,选择有序数组还是无序数组取决于具体场景的性能需求与操作特点。以下是关键权衡因素及决策指南: ⚖️ 核心权衡维度 维度有序数组无序数组查询性能二分查找 O(log n) ✅线性扫描 O(n) ❌插入/删除需移位维护顺序 O(n) ❌直接操作尾部 O(1) ✅内存开销与无序数组相…...
【磁盘】每天掌握一个Linux命令 - iostat
目录 【磁盘】每天掌握一个Linux命令 - iostat工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景 注意事项 【磁盘】每天掌握一个Linux命令 - iostat 工具概述 iostat(I/O Statistics)是Linux系统下用于监视系统输入输出设备和CPU使…...
css3笔记 (1) 自用
outline: none 用于移除元素获得焦点时默认的轮廓线 broder:0 用于移除边框 font-size:0 用于设置字体不显示 list-style: none 消除<li> 标签默认样式 margin: xx auto 版心居中 width:100% 通栏 vertical-align 作用于行内元素 / 表格单元格ÿ…...
AI,如何重构理解、匹配与决策?
AI 时代,我们如何理解消费? 作者|王彬 封面|Unplash 人们通过信息理解世界。 曾几何时,PC 与移动互联网重塑了人们的购物路径:信息变得唾手可得,商品决策变得高度依赖内容。 但 AI 时代的来…...
【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的“no matching...“系列算法协商失败问题
【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的"no matching..."系列算法协商失败问题 摘要: 近期,在使用较新版本的OpenSSH客户端连接老旧SSH服务器时,会遇到 "no matching key exchange method found", "n…...
Selenium常用函数介绍
目录 一,元素定位 1.1 cssSeector 1.2 xpath 二,操作测试对象 三,窗口 3.1 案例 3.2 窗口切换 3.3 窗口大小 3.4 屏幕截图 3.5 关闭窗口 四,弹窗 五,等待 六,导航 七,文件上传 …...
基于PHP的连锁酒店管理系统
有需要请加文章底部Q哦 可远程调试 基于PHP的连锁酒店管理系统 一 介绍 连锁酒店管理系统基于原生PHP开发,数据库mysql,前端bootstrap。系统角色分为用户和管理员。 技术栈 phpmysqlbootstrapphpstudyvscode 二 功能 用户 1 注册/登录/注销 2 个人中…...
Leetcode33( 搜索旋转排序数组)
题目表述 整数数组 nums 按升序排列,数组中的值 互不相同 。 在传递给函数之前,nums 在预先未知的某个下标 k(0 < k < nums.length)上进行了 旋转,使数组变为 [nums[k], nums[k1], …, nums[n-1], nums[0], nu…...
WEB3全栈开发——面试专业技能点P4数据库
一、mysql2 原生驱动及其连接机制 概念介绍 mysql2 是 Node.js 环境中广泛使用的 MySQL 客户端库,基于 mysql 库改进而来,具有更好的性能、Promise 支持、流式查询、二进制数据处理能力等。 主要特点: 支持 Promise / async-await…...
