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

news2024/11/29 15:25:09

一、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 ]];then
    echo "开始配置jenkins-agent服务"
else
    echo "ERROR:请将节点连接jenkins的java启动命令填入脚本CMD=''的引号中"
    exit 1
fi
mkdir -p $WORKDIR
wget ${JNLPURL%%manage*}jnlpJars/agent.jar -P ${WORKDIR}
chmod 755 ${WORKDIR}/agent.jar

cat>/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.target

EOF

cat>/usr/local/bin/jenkins-agent<<EOF
#!/bin/bash

start()
{
    ${CMD/agent.jar/$WORKDIR/agent.jar}
}

case "\$1" in
start)
    start
    ;;
stop)
    stop
    ;;
restart)
    stop
    start
    ;;
*)
    echo "usage: \$0 start|stop|restart"
    exit 0;
esac
exit
EOF

chmod 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' ]];then
        echo "success"
else
        nohup ${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.coloradmin.cn/o/2249832.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

apache实现绑定多个虚拟主机访问服务

1个网卡绑定多个ip的命令 ip address add 192.168.45.140/24 dev ens33 ip address add 192.168.45.141/24 dev ens33 在linux服务器上&#xff0c;添加多个站点资料&#xff0c;递归创建三个文件目录 分别在三个文件夹下&#xff0c;建立测试页面 修改apache的配置文件http.…

【css实现收货地址下边的平行四边形彩色线条】

废话不多说&#xff0c;直接上代码&#xff1a; <div class"address-block" ><!-- 其他内容... --><div class"checked-ar"></div> </div> .address-block{height:120px;position: relative;overflow: hidden;width: 500p…

启动SpringBoot

前言&#xff1a;大家好我是小帅&#xff0c;今天我们来学习SpringBoot 文章目录 1. 环境准备2. Maven2.1 什么是Maven2.2 创建⼀个Maven项⽬2.3 依赖管理2.3.1 依赖配置2.3.2 依赖传递2.3.4 依赖排除2.3.5 Maven Help插件&#xff08;plugin&#xff09; 2.4 Maven 仓库2.6 中…

ERROR CoarseGrainedExecutorBackend: RECEIVED SIGNAL TERM

如果你的spark on yarn任务正常运行&#xff0c;能得到结果&#xff0c;但是日志中出现了如下的报错 看见这个报错不要慌张&#xff0c;这个是你开启了动态伸缩容器&#xff0c;且当这个容器触发了空闲关闭的阈值&#xff0c;默认是60秒&#xff0c;这时候该容器会被删除掉&a…

SpringBoot实战(三十二)集成 ofdrw,实现 PDF 和 OFD 的转换、SM2 签署OFD

目录 一、OFD 简介1.1 什么是 OFD&#xff1f;1.2 什么是 版式文档&#xff1f;1.3 为什么要用 OFD 而不是PDF&#xff1f; 二、ofdrw 简介2.1 定义2.2 Maven 依赖2.3 ofdrw 的 13 个模块 三、PDF/文本/图片 转 OFD&#xff08;ofdrw-conterver&#xff09;3.1 介绍&#xff1a…

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

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

C++:用红黑树封装map与set-2

文章目录 前言一、红黑树封装map与set中const迭代器1. 框架的搭建2. set实现const迭代器3. map实现const迭代器 二、operator[ ]1. operator[ ]要达成的样子2. insert的改变 三. 解决insert里set中的问题四. 解决map中的operator[ ]总结用红黑树封装map与set代码 前言 前面我们…

微信小程序下拉刷新与上拉触底的全面教程

微信小程序下拉刷新与上拉触底的全面教程 引言 在微信小程序的开发中,用户体验至关重要。下拉刷新和上拉触底是提高用户交互体验的重要功能,能够让用户轻松获取最新数据和内容。本文将详细介绍这两个功能的实现方式,结合实际案例、代码示例和图片展示,帮助开发者轻松掌握…

【博主推荐】C#中winfrom开发常用技术点收集

文章目录 前言1.打开文件夹并选中文件2.窗体之间传参3.异步调用&#xff1a;让数据处理不影响页面操作4.创建一个多文档界面(MDI) 应用程序5.在WinForms中使用数据绑定6.在WinForms中后台使用控件的事件处理7.在WinForms中窗体跳转的几种方式8.后台处理方法中&#xff0c;调用窗…

第四十二篇 EfficientNet:重新思考卷积神经网络的模型缩放

文章目录 摘要1、简介2、相关工作3、复合模型缩放3.1、 问题公式化3.2、扩展维度3.3、复合比例 4、EfficientNet架构5、实验5.1、扩展MobileNets和ResNets5.2、EfficientNet的ImageNet结果5.3、EfficientNet的迁移学习结果 6、讨论7、结论 摘要 卷积神经网络(ConvNets)通常在固…

【Android】MMKV—高性能轻量化存储组件

【Android】MMKV—高性能轻量化存储组件 本文参考以及学习文档&#xff1a; Android存储&#xff1a;轻松掌握MMKV通过学习本文&#xff0c;轻松掌握腾讯开发的 MMKV 组件&#xff0c;尽早在项目中替换掉SharedPr - 掘金 MMKV——Android上的使用(替换SP存储)MMKV 是基于 mmap …

python+django自动化平台(一键执行sql) 前端vue-element展示

一、开发环境搭建和配置 pip install mysql-connector-pythonpip install PyMySQL二、django模块目录 dbOperations ├── __init__.py ├── __pycache__ │ ├── __init__.cpython-313.pyc │ ├── admin.cpython-313.pyc │ ├── apps.cpython-313.pyc │ …

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

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

[保姆式教程]使用labelimg2软件标注定向目标检测数据和格式转换

定向目标检测是一种在图像或视频中识别和定位对象的同时&#xff0c;还估计它们方向的技术。这种技术特别适用于处理有一定旋转或方向变化的对象&#xff0c;例如汽车、飞机或文本。定向目标检测器的输出是一组旋转的边界框&#xff0c;这些框精确地包围了图像中的对象&#xf…

C语言刷题笔记3(7)

7.1 数组处理斐波那契数列 题目描述:用数组来处理Fibonacci数列并输出。 输入:一个不超过40且大于2的整数n&#xff0c;表示需要处理并输出的Fibonacci数个数。 输出:输出前n个Fibonacci数&#xff0c;每行输出5个值&#xff0c;按每12位向右对齐的方式输出。请注意不要在第…

PHP 去掉特殊不可见字符 “\u200e“

描述 最近在排查网站业务时&#xff0c;发现有数据匹配失败的情况 肉眼上完全看不出问题所在 当把字符串 【M24308/23-14F‎】复制出来发现 末尾有个不可见的字符 使用删除键或左右移动时才会发现 最后测试通过 var_dump 打印 发现这个"空字符"占了三个长度 &#xf…

构建 LLM (大型语言模型)应用程序——从入门到精通(第七部分:开源 RAG)

通过检索增强生成 (RAG) 应用程序的视角学习大型语言模型 (LLM)。 本系列博文 简介数据准备句子转换器矢量数据库搜索与检索大语言模型开源 RAG&#xff08;本帖&#xff09;评估服务LLM高级 RAG 1. 简介 我们之前的博客文章广泛探讨了大型语言模型 (LLM)&#xff0c;涵盖了其…

linux基础2

声明&#xff01; 学习视频来自B站up主 泷羽sec 有兴趣的师傅可以关注一下&#xff0c;如涉及侵权马上删除文章&#xff0c;笔记只是方便各位师傅的学习和探讨&#xff0c;文章所提到的网站以及内容&#xff0c;只做学习交流&#xff0c;其他均与本人以及泷羽sec团队无关&#…

智能产品综合开发 - 手势识别

1 实训选题目的 本次实训选择的题目是“基于树莓派的手势识别系统”&#xff0c;旨在为人们提供一种便捷的交互方式&#xff0c;使用户能够通过手势控制智能设备&#xff0c;摆脱传统的物理按键操作。通过本项目&#xff0c;我们希望能实现快速、灵活的手势识别&#xff0c;提升…

Qt常用控件之显示类控件

目录 QLabel 文本格式 设置图片 文本对齐/自动换行/边距/缩进 设置伙伴 QLCDNumber 倒计时功能 QProgressBar 进度条 QCalendarWidget QLabel QLabel 同样是 QWidget 的子类&#xff0c;所以前面博客中 QWidget 中的属性方法也是适用的 QLabel可以用来显示文本和图…