DevOps工程技术价值流:Jenkins驱动的持续集成与交付实践

devtools/2024/11/29 15:27:48/

一、Jenkins系统概述

Jenkins:开源CI/CD引擎的佼佼者

Jenkins,作为一款基于Java的开源持续集成(CI)与持续交付(CD)系统,凭借其强大的插件生态系统,成为DevOps实践中不可或缺的核心引擎。这些插件覆盖了从构建、部署到自动化的全方位需求,使得Jenkins能够灵活适应从小型团队到大型企业级的各类项目。特别是Pipeline插件,为项目流水线的建立提供了无限可能,无论项目使用何种语言或源代码仓库,Jenkins都能轻松实现自动化构建、测试和部署。

二、Jenkins应用场景详解

2.1 持续集成:提升开发效率与质量

  • 背景:在缺乏自动化工具的时代,开发人员需要手动运行验证任务,随着代码提交频率的增加,集成错误频发且难以及时发现。

  • Jenkins解决方案:通过自动化构建触发器和与版本控制系统的紧密集成,Jenkins能够在代码提交后自动运行验证任务,迅速发现集成错误并反馈,从而显著提高开发效率和代码质量。

2.2 持续部署:实现高效、稳定的发布

  • 背景:传统的手动或通过Shell脚本进行的应用部署过程容易出错,且发布时间不稳定。

  • Jenkins解决方案:Jenkins将部署脚本集成到Pipeline中,实现了部署过程的可视化和参数化。通过复用发布步骤并传递环境参数,Jenkins能够自动化地将应用程序部署到不同环境中,大大降低了人工错误和发布时间的不确定性。

2.3 持续测试:增强测试的透明度和可追溯性

背景:测试人员在本地通过命令行运行测试用例,缺乏统一管理和可视化展示。

Jenkins解决方案:Jenkins允许将测试用例和相关脚本存储到版本控制系统中,并通过自动化运行测试用例和测试插件将测试结果展示到页面上。这不仅提高了测试的透明度和可追溯性,还有助于及时发现和修复问题。

三、Jenkins系统安装与架构解析

3.1 基础必备

3.1.1 Jenkins架构深度剖析

  • 分布式架构:Jenkins采用灵活且可扩展的分布式架构,由服务端(Master)节点和代理端(Agent/Slave)节点构成。

    • 服务端(Master)节点:负责流水线作业的调度与管理,是Jenkins的中枢神经,需保持高度稳定和可靠。

    • 代理端(Agent/Slave)节点:实际执行流水线作业中的任务,可根据需求动态添加或移除,以应对不同的工作负载。

  • 部署建议:代理端节点通常部署于靠近代码仓库或目标部署环境的位置,以减少网络延迟并提高执行效率。

3.1.2 版本选择策略

  • Jenkins LTS版本:建议选择Jenkins的LTS版本,因这些版本经过更严格的测试和验证,具有更高的稳定性和可靠性。

  • JDK版本:自Jenkins LTS 2.346.x版本起,安装部署时最低版本要求为JDK 11。为确保兼容性和稳定性,建议使用JDK 11或更高版本。

  • 避免JDK 8:尽管Jenkins在某些早期版本中支持JDK 8,但随着Jenkins和插件的不断更新,JDK 8可能会引发兼容性问题或性能下降,因此建议避免使用。

3.2 安装Jenkins

Jenkins的安装方式多样,但Docker以其轻量级、可移植性和易于管理的特性,成为现代DevOps实践中安装Jenkins的首选。本文重点介绍通过Docker安装Jenkins的优化步骤,确保安装过程既高效又稳定。

3.2.1 Docker环境准备

  1. Docker安装:

    1. 确保系统已安装Docker,并按照官方文档正确配置启动选项和网络设置。

    2. Docker安装链接:Docker官方文档

  2. Docker Compose(可选):

    1. 如需管理多个Docker容器或服务,建议使用Docker Compose。

    2. Docker Compose安装链接:Docker Compose官方文档

也可以参考: https://blog.csdn.net/heijunwei/article/details/128706198

3.2.2 Docker安装Jenkins步骤

1、拉取Jenkins镜像

docker pull jenkins/jenkins:{version}

2、编写docker-compose.yml(可选)

version: "3.1" // 指定 Docker Compose 文件的版本。这里使用的是版本 3.1
services: //是一个顶级键,用于定义多个服务。每个服务都是一个独立的容器。jenkins: //是服务的名称,表示我们将创建一个名为 jenkins 的服务。image: jenkins/jenkins:{version} // 指定了要使用的 Docker 镜像。container_name: jenkins //  指定了容器的名称。这里将容器命名为 jenkins。ports:- 8080:8080 // 表示将主机的 8080 端口映射到容器的 8080 端口。Jenkins 的 Web 界面通常运行在这个端口上。- 50000:50000 // 表示将主机的 50000 端口映射到容器的 50000 端口。这个端口用于 Jenkins 的代理通信。volumes:- ./data/:/var/jenkins_home/  //定义数据卷,将主机的目录挂载到容器的目录,Jenkins 的所有配置和构建历史都会存储在这个目录中。

3、设置data目录写权限

chmod -R a+w data/

4、下载地址设置为国内镜像站

# 修改数据卷中的hudson.model.UpdateCenter.xml文件
<?xml version='1.1' encoding='UTF-8'?>
<sites><site><id>default</id><url>https://updates.jenkins.io/update-center.json</url></site>
</sites>
# 将下载地址替换为http://mirror.esuni.jp/jenkins/updates/update-center.json
<?xml version='1.1' encoding='UTF-8'?>
<sites><site><id>default</id><url>http://mirror.esuni.jp/jenkins/updates/update-center.json</url></site>
</sites>
# 清华大学的插件源也可以https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json

5、启动jenkins容器

docker-compose up -d

如果不用docker compose 用下面的命令

docker run -d --name jenkins \ -p 8080:8080 -p 50000:50000 \ --restart=always \ -v /var/jenkins_home:/var/jenkins_home \ -e JENKINS_OPTS="--prefix=/jenkins" \ jenkins/jenkins:lts

6、查看密码登录Jenkins,并登录下载插件

docker exec -it jenkins cat /var/jenkins_home/secrets/initialAdminPassword

注:此处安装插件失败概率比较大,没关系直接进入首页创建账户

3.3 Jenkins插件安装

3.3.1 常用插件简介

  • Git Plugin:与Git版本控制系统集成,允许Jenkins自动拉取代码库中的最新代码。

  • Pipeline Plugin:支持用户定义复杂的构建流程,包括分阶段构建、测试和部署等。

  • Docker Plugin:用于管理Docker容器,使应用能够在隔离的环境中运行,提高构建和部署的灵活性和安全性。

  • Blue Ocean:提供一个现代化的用户界面,简化了Jenkins的使用,改善了用户体验。

  • Parameterized Trigger:允许在不同构建任务之间传递参数,实现更灵活的构建触发和参数共享。

  • Git Parameter:基于Git的参数化构建插件,允许用户在构建时选择Git的分支、版本号、标签等参数。

  • Publish Over SSH:通过SSH连接到远程服务器,进行文件传输、执行shell脚本等操作,实现构建结果的远程部署。

  • Gitlab Plugin:基于Gitlab的WebHooks操作,可以触发Jenkins构建任务,实现Gitlab与Jenkins的自动化集成。

  • Chinese:将Jenkins界面汉化为中文,方便中文用户使用。

  • Role-based Authorization Strategy:通过基于角色的权限管理机制,支持创建全局角色、项目角色等,方便成员间的权限控制。

  • Maven Integration Plugin:支持Maven编译,方便Java项目的构建和依赖管理。

3.3.2 插件安装方法

1、设置更新站点

进入Jenkins管理界面(Manage Jenkins),选择“Manage Plugins”->“Advanced”,在最下面的“Update Site”中设置为国内镜像站点,如清华大学的镜像站点https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json,以提高插件更新的速度和稳定性。

2、修改服务器配置(可选)

如果需要进一步优化Jenkins的更新和访问速度,可以通过修改Jenkins配置文件中的默认更新站点和搜索引擎设置。这通常涉及到对Jenkins安装目录下的default.json文件的编辑,也可以用命令操作。

​
sed -i 's/updates.jenkins-ci.org/download/mirrors.tuna.tsinghua.edu.cn/jenkins/g' default.json sed -i 's/www.google.com/www.baidu.com/g' default.json​
3、通过Web界面安装插件
  • 安装最新版本:在Jenkins首页左侧选择“Manage Jenkins”->“Manage Plugins”->“Available”,通过右上角的Filter过滤相关插件后选择进行安装。

  • 安装指定版本:如果需要安装特定版本的插件,可以访问插件的wiki页面或Jenkins官方插件库,下载所需的插件版本,并通过“Manage Plugins”->“Advanced”->“Upload Plugin”进行上传安装。

4、手动安装插件

将下载好的.hpi.jpi插件文件保存到Jenkins插件目录(如/var/lib/jenkins/plugins),然后重启Jenkins服务。这种方法通常用于解决插件无法通过Web界面安装或更新的问题。

3.4 jenkins配置

由于Jenkins需要从Git拉取代码、需要本地构建、甚至需要直接发布自定义镜像到Docker仓库,所以Jenkins需要配置大量内容。

3.4.1 Agent节点配置(如果是小型项目,建议用Publish over SSH 方式)

jenkins的代理端主要用于运行Jenkins服务端所调度的流水线作业。它的部署方式与服务端一样是跨平台的。

1 配置节点

配置节点单击左侧“系统管理”进入“管理Jenkins”页面,在页面中可以看到“节点管理”选项

进入节点管理页面,可以看到已经在线的服务端master节点。单击左侧菜单中的“新建节点“

进入新建节点页面后,填写要创建的节点名称和Type(节点类型)。

单击Create按钮创建节点并进入节点的详细配置页

各个配置项的说明如下。

  • 名字:填写节点的名称。

  • 描述:填写节点的描述信息。

  • Number of executors:执行器的数量,默认每一个Jenkins作业会分配一个执行器。

  • 远程工作目录:Agent节点的工作目录。

  • 标签:可以对节点进行分组,便于流水线调度。

  • 用法:哪些作业可以使用这些节点,选择“只允许运行绑定到这台机器的Job”或者“经常使用该节点”即可运行任意作业。

在Jenkins的生产环境中,常用的启动方式为SSH和JNLP。JNLP对应中文为“通过Java Web启动代理”。

提示:如果遇到“Either WebSocket mode is selected, or the TCP port for inbound agents must be enabled”错误提示,是因为在Jenkins新版本中,默认禁用了TCP端口。我们需要导航到“系统管理>管理Jenkins >安全>全局安全”配置开启TCP端口。

此端口作为后续Agent节点启动时与Server节点通信使用。

2 从节点上启动代理

以“Java Web”方式设置的代理节点,需要下载启动程序。参考下图单击节点进入节点信息页面,获取agent.jar的下载链接。启动节点的步骤如下。

# 创建工作目录(与页面新建节点时填写的一致)
mkdir -p /data/jenkins-agent
cd /data/jenkins-agent/
# 下载 openjdk-11 并解压,解压后的目录名为 jdk-11
wget https://d6.injdk.cn/openjdk/openjdk/11/openjdk-11+28_linux-x64_bin.tar.gz
tar -zxvf openjdk-11+28_linux-x64_bin.tar.gz
rm -rf openjdk-11+28_linux-x64_bin.tar.gz
# 通过 Jenkins 页面提供的命令下载 agent.jar
curl -sO http://192.168.1.125:8080/jnlpJars/agent.jar
# 启动 Java Web 代理
# 注意:jdk11没有配置环境变量,所以写全路径
/data/jenkins-agent/jdk-11/bin/java -jar agent.jar -jnlpUrl http://192.168.1.125:8080/manage/computer/worker2/jenkins-agent.jnlp -secret 2007cfd52553e6927c4a41966bd85ecf3acda559beda2a3d5e4ffd106fe01db1 -workDir "/data/jenkins-agent/"

注意:curl -sO http://192.168.1.125:8080/jnlpJars/agent.jar出现问题的概率很高。大部分情况都是网络问题导致的,例如检查Agent节点与Jenkins Server节点的50000端口和8080端口的连通性是否正常。当出现“Connected”关键字时查看节点管理页面,可以看到该Agent已经连接成功。刷新节点页面,如图所示。

3 将 Java Web 代理安装为系统服务

上一步中,我们通过 java -jar的方式成功启动了agent.jar,但是这种方式在SSH连接断开后,应用也会停止,所以我们还需要将java -jar agent.jar ……安装为系统服务。

一键安装脚本install-jenkins-agent.sh,只需要修改CMD=''Jenkins页面给出的启动命令后上传到服务器并执行即可

#!/bin/bash
CMD='将启动命令写到这里'
JNLPURL=$(echo $CMD | sed 's/.*jnlpUrl \(.*\)/\1/'|  cut -d ' ' -f1 )
WORKDIR=$(echo $CMD | sed 's/.*workDir \(.*\)/\1/'|  cut -d ' ' -f1 |  sed 's/"//g')
if [[ "$CMD" =~ java &&  "$CMD" =~ jnlpUrl &&  "$CMD" =~ secret && "$CMD" =~ workDir ]];thenecho "开始配置jenkins-agent服务"
elseecho "ERROR:请将节点连接jenkins的java启动命令填入脚本CMD=''的引号中"exit 1
fi
mkdir -p $WORKDIR
wget ${JNLPURL%%manage*}jnlpJars/agent.jar -P ${WORKDIR}
chmod 755 ${WORKDIR}/agent.jarcat>/usr/lib/systemd/system/jenkins-agent.service<<EOF
[Unit]
Description=The Jenkins Agent Server[Service]
User=root
ExecStart=/usr/local/bin/jenkins-agent start
ExecReload=/usr/local/bin/jenkins-agent restart
ExecStop=/usr/local/bin/jenkins-agent stop
Restart=always[Install]
WantedBy=multi-user.targetEOFcat>/usr/local/bin/jenkins-agent<<EOF
#!/bin/bashstart()
{${CMD/agent.jar/$WORKDIR/agent.jar}
}case "\$1" in
start)start;;
stop)stop;;
restart)stopstart;;
*)echo "usage: \$0 start|stop|restart"exit 0;
esac
exit
EOFchmod 755 /usr/local/bin/jenkins-agent
systemctl daemon-reload
systemctl start jenkins-agent
systemctl enable jenkins-agent
result=$(systemctl is-active jenkins-agent)
if [[ $result == 'active' ]];thenecho "success"
elsenohup ${CMD/agent.jar/$WORKDIR/agent.jar} > /dev/null 2>&1 &
fi

查看jenkins-agent系统服务状态并查看日志

# 查看服务状态 systemctl status jenkins-agent # 查看服务日志 journalctl -u jenkins-agent -f
3.4.2 从GitLab拉取、编译并通过SSH推送代码
1 构建任务

准备好GitLab仓库中的项目,并且通过Jenkins配置项目的实现当前项目的DevOps基本流程。

  • 构建Maven工程发布到GitLab(Gitee、Github均可)

  • Jenkins点击左侧导航新建任务

  • 选择自由风格构建任务

2 配置源码拉取地址

Jenkins需要将Git上存放的源码存储到Jenkins服务所在磁盘的本地

  • 配置任务源码拉取的地址

  • Jenkins立即构建

3 配置Maven构建代码

代码拉取到Jenkins本地后,需要在Jenkins中对代码进行构建,这里需要Maven的环境,而Maven需要Java的环境,接下来需要在Jenkins中安装JDK和Maven,并且配置到Jenkins服务。

  • 准备JDK、Maven压缩包通过数据卷映射到Jenkins容器内部

  • 解压压缩包,并配置Maven的settings.xml

<!-- 阿里云镜像地址 -->
<mirror>  <id>alimaven</id>  <name>aliyun maven</name>  <url>http://maven.aliyun.com/nexus/content/groups/public/</url><mirrorOf>central</mirrorOf>          
</mirror>
<!-- JDK11编译插件 -->
<profile><id>jdk-11</id><activation><activeByDefault>true</activeByDefault><jdk>11</jdk></activation><properties><maven.compiler.source>11</maven.compiler.source><maven.compiler.target>11</maven.compiler.target><maven.compiler.compilerVersion>11</maven.compiler.compilerVersion></properties>        
</profile>
  • Jenkins配置JDK&Maven并保存

  • 配置Jenkins任务构建代码

  • 立即构建测试,查看target下的jar包

4 配置Publish发布&远程操作

jar包构建好之后,就可以根据情况发布到测试或生产环境,这里需要用到之前下载好的插件Publish Over SSH。

  • 配置Publish Over SSH连接测试、生产环境

  • 配置任务的构建后操作,发布jar包到目标服务

  • 立即构建任务,并去目标服务查看

5 基于Docker服务运行

为了让程序代码可以自动推送到测试环境基于Docker服务运行,需要添加Docker配置和脚本文件让程序可以在集成到主干的同时运行起来。

  • 添加Dockerfile文件

  • 添加docker-compose.yml文件

  • 追加Jenkins构建后操作脚本命令

6 选取指定的发行版本
  • 下载Git Parameter插件

  • 设置项目参数化构建

  • 任务构建时,采用Shell方式构建,拉取指定tag版本代码

  • 基于Parameter构建任务,任务发布到目标服务器

四、 jenkins系统设置

4.1用户管理

Jenkins提供了多种用户管理方式,以适应不同规模和复杂度的企业团队需求。在小规模团队中,使用Jenkins本地用户管理是一个简单直接的选择。然而,当团队规模扩大时,本地用户管理可能会带来诸多不便,如维护成本增加、账号密码跨平台同步困难等。因此,对于大规模用户场景,推荐使用LDAP(轻量级目录访问协议)进行用户认证。

4.1.1 Jenkins本地用户管理

  • 在Jenkins初始化时,会创建第一个管理员用户。

  • 导航至全局安全配置,默认使用“Jenkins专有用户数据库”管理用户。

  • 在管理用户页面,可新建用户,需填写用户名、密码、全名等信息。

4.1.2 LDAP认证集成

对于拥有大量用户的企业团队,LDAP认证集成是一个更加高效和安全的解决方案。以下是配置LDAP认证的步骤:

  1. 获取LDAP组织信息

  • 与您的LDAP管理员或IT部门联系,获取LDAP集成所需的参数信息。

  • 这些参数通常包括LDAP服务器的地址、用户组织信息(如域名、组织单元等)以及一个具有查询权限的用户账号。

  1. 插件配置

  • 安装LDAP插件

  • 启用LDAP认证

在“全局安全配置”页面中,将“Security Realm”设置为“LDAP”。然后,根据之前获取的LDAP参数信息,填写相关的配置字段,如LDAP服务器地址、用户搜索基础DN(Distinguished Name)、用户搜索过滤器等。

  • 配置用户组

如果希望根据LDAP用户组来分配Jenkins角色,还需要配置LDAP用户组映射。这通常涉及到在Jenkins中定义一个或多个角色,并将这些角色与LDAP用户组相关联。

4.2权限管理

Jenkins的权限管理是一项至关重要的安全实践,旨在精确控制平台上不同租户对Jenkins项目的访问范围。当企业中有多个项目组共享同一个Jenkins实例进行CI/CD流程时,为每个项目组配置独立的权限显得尤为重要,以减少误操作和风险。

4.2.1安装Role-based插件

安装Role-based Authorization Strategy插件,并重启Jenkins。

4.2.2全局安全配置

在全局安全配置中,启用Role-based策略

4.2.3 创建角色

  1. 在“Manage Jenkins”页面中点击“Manage Roles”(管理角色)链接。

  2. 将看到三种角色类型:Global roles(全局角色)、Item roles(项目角色)和Node roles(节点角色)。

  • 创建Global roles:

    • 点击“Global roles”下的“Add role”(添加角色)按钮。

    • 输入角色名,如“devopsdev”。

    • 在“Permissions”部分选择开发人员常用的权限,如“Build”(构建)、“Configure”(配置)等。

    • 保存角色。

  • 创建Item roles:

    • 点击“Item roles”下的“Add role”(添加角色)按钮。

    • 输入角色名,如“devops”。

    • 在“Pattern”字段中使用正则表达式设置权限作用范围,如^devops-.*以匹配所有以“devops-”开头的项目。

    • 在“Permissions”部分选择所需的权限,如“Build”、“Cancel”、“Configure”、“Read”等。

    • 保存角色。

4.2.4授权角色

完成角色创建后,需要将角色分配给相应的用户或用户组。

  1. 在“Manage Jenkins”页面中点击“Assign Roles”(分配角色)链接。

  2. 根据需要选择“Grant roles to users”(将角色授予用户)或“Grant roles to groups”(将角色授予用户组)。

  3. 在“Roles to assign”(要分配的角色)部分选择之前创建的角色。

  4. 在“Users/groups”(用户/用户组)部分选择要将角色分配给的用户或用户组。

  5. 保存分配。

4.2.5测试权限

最后,通过测试账号登录Jenkins来验证权限配置是否成功。

  1. 使用测试账号(已分配特定角色的用户)登录Jenkins。

  2. 检查该用户只能看到与其角色相关的项目。

  3. 尝试进行构建、配置等操作,确保权限正确分配且有效。

4.3凭据管理

在实施DevOps流程中,Jenkins作为核心自动化引擎,经常需要与其他系统(如代码仓库、构建工具、部署环境等)进行集成和交互。这些交互通常要求Jenkins提供目标系统的认证信息,例如用户名和密码、API密钥等。为了确保这些敏感信息的安全存储和便捷使用,Jenkins提供了凭据管理功能。

4.3.1安装凭据插件

4.3.2创建凭据

  • 在凭据存储中,点击“添加凭据”。

  • 选择凭据类型(如用户名和密码)。

  • 填写凭据信息(如GitLab仓库的用户名和密码),并添加描述。

  • 创建后,将生成凭据ID,供Pipeline引用。

五、Jenkins Pipeline实战

Jenkins Pipeline使用Groovy脚本语言来定义流水线,这些脚本可以访问Jenkins管理员配置的插件,并与外部系统(如版本控制系统、云平台等工具系统)集成。通过Jenkins Pipeline,用户可以在Jenkins环境中实现CI/CD工作流,并可以通过定义多个阶段和任务来实现自动化流程。具体可以参考https://jenkins.xfoss.com/pipeline.html


http://www.ppmy.cn/devtools/137951.html

相关文章

Linux入门系列--用户与权限

一、前言 1.注意&#xff1a; 【】用户是Linux系统工作中重要的一环&#xff0c;用户管理包括 用户 与 组账号 的管理 【】在Linux系统中&#xff0c;不论是由本机或是远程登录(SSH)系统&#xff0c;每个系统都必须拥有一个账号&#xff0c;并且对于不同的系统资源拥有不同的使…

vue3 tinymce7版本 完美适配基本需求(特殊需求外)

直接上代码 然后根据自己需求来调整代码内的toolbar功能设置 另外添加两个没有plugin的插件 首行缩进 以及调整段落大小 &#xff08;目前没有太细看文档 不入门也不太好看懂&#xff5e;&#xff09; 我这是从版本4升级到6的 已解决弹窗上使用问题 后面会出个相关配置文档的 …

质数——acwing

素数几种方法&#xff08;区间筛&#xff09;-CSDN博客 之前做的笔记&#x1f446;&#x1f446;&#x1f446; 题目一&#xff1a;试除法判定质数 866. 试除法判定质数 - AcWing题库 代码 #include<bits/stdc.h> using namespace std;bool isprime(int x) {if(x 1…

C++学习日记---第13天(类和对象---封装)

笔记复习 1.类和对象 c面向对象的三大特性为&#xff1a;封装&#xff0c;继承&#xff0c;多态 c认为万事万物都皆为对象&#xff0c;对象上有其属性和行为 具有相同性质的对象&#xff0c;我们可以抽象为称为类 2.封装 作用&#xff1a;将属性和行为作为一个整体&#xf…

arm Rk1126 编译Qt工程报错: Could not find qmake spec

首先修改qmake.conf文件&#xff0c;配置好正确的交叉编译工具&#xff1a; 然后执行编译&#xff1a; /opt/Rv1126/Rv1126-盒子代码/rv1126-qt5-sdk/bin/qmake untitled.pro 报错。 原因&#xff1a;中文路径。修改路径为英文路径即可

【R库包安装】R库包安装总结:conda、CRAN等

【R库包安装】R库包安装总结&#xff1a;conda、CRAN等 方法1&#xff1a;基于 R 的 CRAN 仓库安装CRAN库包查询从 CRAN 安装 方法2&#xff1a;使用conda安装库包确保已安装 R 和 Conda 环境使用 Conda 官网浏览是否存在相应库包Conda 安装 R 库 方法3&#xff1a;从 GitHub 安…

Linux进程基础

前言&#xff1a;并行和并发 1.并发&#xff1a;在操作系统中是指一个时间段中有几个进程都处于正在运行到运行完毕之间&#xff0c;且它们都是在同一个处理器上运行的&#xff0c;抢占了共享的这个CPU资源 在用户的视角上&#xff0c;这些进程看似同时进行&#xff0c;但不是…

QT6学习第四天 感受QT的文件编译

QT6学习第四天 感受QT的文件编译 使用纯代码编写程序新建工程 使用其他编辑器纯代码编写程序并在命令行运行使用 .ui 表单文件生成界面使用自定义 C 窗口类使用现成的QT Designer界面类 使用纯代码编写程序 我们知道QT Creator中可以用拖拽的方式在 .ui 文件上布局&#xff0c…