一、什么是 Jenkins
Jenkins 是一个功能强大的应用程序,允许持续集成和持续交付项目(持续部署),无论用的是什么平台。这是一个免费的源代码,可以处理任何类型的构建或持续集成。集成 Jenkins 可以用于一些测试和部署技术。
Jenkins 原名 Hudson,2011 年改为现在的名字,它是一个开源的实现持续集成的软件工具。官方网站网址:https://jenkins.io/ 。Jenkins 能实时监控持续集成过程中所存在的问题,提供详细的日志文件和提醒功能,还能通过图表的形式,形象地展示项目构建的趋势和稳定性。
Jenkins 是一个开源软件项目,是基于 Java 开发的一种持续集成工具,用于监控持续重复的工作,旨在提供一个开放易用的软件平台,使软件项目可以进行持续集成。
jenkins 提供了一种易于使用的持续集成系统,使开发者从繁杂的集成中解脱出来,专注于更为重要的业务逻辑实现上。同时 Jenkins 能实时监控集成中存在的错误,提供详细的日志文件和提醒功能,还能用图表的形式形象地展示项目构建的趋势和稳定性。
Jenkins 可以构建一个自动化的持续集成环境可以使用它来 “自动化” 编译、打包、分发部署应用,它兼容 ant、maven、gradle 等多种第三方构建工具,同时与 svn、git 能无缝集成,也支持直接与知名源代码托管网站,如 github、bitbucket 直接集成。1:为什么要用 Jenkins
目前持续集成 (CI) 已成为当前许多软件开发团队在整个软件开发生命周期内侧重于保证代码质量的常见做法。它是一种实践,旨在缓和和稳固软件的构建过程。并且能够帮助您的开发团队应对如下挑战:
(1) 软件构建自动化
配置完成后,CI 系统会依照预先制定的时间表,或者针对某一特定事件,对目标软件进行构建。
(2) 构建可持续的自动化检查
CI 系统能持续地获取新增或修改后签入的源代码,也就是说,当软件开发团队需要周期性的检查新增或修改后的代码时,CI 系统会不断确认这些新代码是否破坏了原有软件的成功构建。这减少了开发者们在检查彼此相互依存的代码中变化情况需要花费的时间和精力 (说直接一点也是钱啊,呵呵)。
(3) 构建可持续的自动化测试
构建检查的扩展部分,构建后执行预先制定的一套测试规则,完成后触发通知 (Email,RSS 等等) 给相关的当事人。
(4) 生成后后续过程的自动化
当自动化检查和测试成功完成,软件构建的周期中可能也需要一些额外的任务,诸如生成文档、打包软件、部署构件到一个运行环境或者软件仓库。这样,构件才能更迅速地提供给用户使用。
2、Jenkins 的特点
特点 描述 易安装 从官网仅需下载一个 jenkins.war 文件后,直接运行,无需额外安装,更无需安装数据库 易配置 提供友好的 GUI 配置界面 变更支持 能从代码仓库(SVN/Git)中获取并产生代码更新列表,并显示到编译输出信息中 支持永久链接 用户通过 Web 访问 Jenkins,Web 页面链接地址是永久链接地址,可在各种文档中直接使用该链接 集成 E-Mail/RSS/IM 完成一次集成后,可通过这些工具实时收取集成结果(构建集成需花费一定时间,有此功能可在等待结果时干别的事 ) JUnit/TestNG 测试报告 以图表等形式提供详细的测试报表功能 支持分布式构建 可以把集成构建等工作分发到多台计算机中完成 文件指纹信息 会保存构建集成所产生的 jars 文件、集成构建使用了哪个版本的 jars 文件等构建记录 支持第三方插件 支持第三方插件,使 Jenkins 功能变得越来越强大 二、什么是 CI/CD
持续集成 (Continuous integration) 是一种软件开发实践,即团队开发成员经常集成它们的工作,通过每个成员每天至少集成一次,也就意味着每天可能会发生多次集成。每次集成都通过自动化的构建(包括编译,发布,自动化测试)来验证,从而尽早地发现集成错误。
持续部署(continuous deployment)是通过自动化的构建、测试和部署循环来快速交付高质量的产品。某种程度上代表了一个开发团队工程化的程度,毕竟快速运转的互联网公司人力成本会高于机器,投资机器优化开发流程化相对也提高了人的效率,让 engineering productivity 最大化。
持续交付(Continuous delivery),是一种软件工程手法,让软件产品的产出过程在一个短周期内完成,以保证软件可以稳定、持续的保持在随时可以释出的状况。它的目标在于让软件的建置、测试与释出变得更快以及更频繁。这种方式可以减少软件开发的成本与时间,减少风险。
CICD 是 持续集成(Continuous Integration,简称 CI ) 和 持续交付 / 持续部署(Continuous Delivery/Continuous Deployment,简称 CD ) 的合称,是一套自动化流程体系,帮你高效、稳定地把代码变成可用的软件,下面结合你给的流程图,拆解讲讲 :
1、持续集成(CI)—— 解决 “代码整合冲突、尽早发现问题”流程逻辑:
程序员在本地开发(比如用 IDEA 写代码),写完提交到「版本控制服务器」(像 Git/SVN 这类,存着完整代码库 )。每次提交后,版本控制里的钩子程序会触发操作,给 Jenkins 发通知。Jenkins 收到通知,用 git/svn 插件 拉取最新代码,再通过 maven 插件 自动编译、打包(生成 war/jar 这些包)。这一步核心是 “频繁合并小改动,自动验证” ,比如多人开发同一个项目,每天多次提交代码,Jenkins 自动帮你整合、检查编译和单元测试是否能过,避免最后合并代码一堆冲突、问题藏到上线才爆。
价值:
早发现 bug:代码一提交就自动跑检查,有问题立刻知道,不用等到上线才返工。
减少合并痛苦:小步提交、频繁整合,比 “憋大招式开发”(很久才合并代码)冲突少太多。2、持续交付 / 持续部署(CD)—— 解决 “手动部署繁琐、发布效率低”
持续交付(Continuous Delivery):
Jenkins 打包好 war/jar 包后,会通过 Publish over SSH(远程执行命令)或 Deploy to container(比如把 war 包丢到 Tomcat 里)这些方式,把包推到测试 / 预发布环境。这一步是 “让可部署的产物随时能交付” ,测试团队可以快速拿到最新包验证,流程到这一步可能还需要人工点一下 “确认发布到生产”。
持续部署(Continuous Deployment):
是持续交付的 “升级版”,如果流程足够成熟、自动化测试足够可靠,Jenkins 打完包直接自动部署到生产环境(比如服务器 1、服务器 2… ),全程不用人工干预。这一步追求 “极致自动化,代码合并后自动上线” ,适合成熟的高频迭代项目,像互联网大厂频繁发版的业务。
结合流程图看完整 CICD 闭环:
开发侧:程序员在本地写代码(工作区 [idea] ),提交到版本控制服务器,触发 CI 流程。
集成侧:Jenkins 自动拉取、打包、验证,把 “半成品” 变成 “可部署包”,完成 CI。
发布侧:包通过自动化手段推到测试 / 生产环境,完成 CD(交付或部署 )。
反馈侧:测试、前端等最终使用人员拿到部署好的环境,发现问题又能快速反馈给开发,进入下一轮迭代,形成 “开发→集成→部署→反馈→开发” 的闭环。简单说,CICD 就是用自动化把 “写代码→上线可用” 的链路串起来,让开发更顺滑、迭代更快、问题更早暴露,特别适合团队协作、高频更新的项目(像互联网应用、 SaaS 系统 )。你可以理解成 “把手动干的‘代码整合、打包、部署’这些重复活,交给机器自动做,人只聚焦写业务逻辑” ,效率和稳定性都会飞升~
三、部署GitLab
1、基础环境配置
(1) 关闭防火墙及内核
hostnamectl set-hostname gitlab bash systemctl stop firewalld systemctl disable firewalld setenforce 0 sed -i '/^SELINUX=/s/enforcing/disabled/' /etc/selinux/config
(2) 解压并安装
tar zxf gitlab-ce-17.8.2.rpm.tar.gz cd gitlab-ce-17.8.2.rpm ls dnf -y install gitlab-ce-17.8.2-ce.0.el9.x86_64.rpm
(3) 修改配置文件
vim /etc/gitlab/gitlab.rb
external_url 'http://192.168.10.105'
是 GitLab 配置中的核心参数,用于指定 GitLab 服务对外提供访问的基础 URL
(4) 解决版本兼容问题
ln -s /usr/lib64/libcrypt.so.1 /usr/lib64/libcrypt.so.2
具体来说:
libcrypt.so
是系统中负责密码加密相关功能的共享库文件- 某些版本的 GitLab(或其依赖的组件)可能编译时依赖
libcrypt.so.2
这个库文件- 但部分 Linux 系统(如 CentOS 7 等)默认只安装了
libcrypt.so.1
(通常是glibc
提供的版本)- 通过创建从
libcrypt.so.1
到libcrypt.so.2
的软链接,可以让依赖libcrypt.so.2
的程序 “误以为” 找到了所需的库文件,从而避免因库版本不匹配导致的启动失败或功能异常这个操作本质上是一种兼容处理,在系统库版本与软件依赖版本不一致时,通过链接方式临时解决依赖问题。如果系统环境允许,更规范的做法是安装对应版本的
libcrypt
库(如libcrypt2
)。2、部署
(1) GitLib初始化
gitlab-ctl reconfigure
(2) 找到初始化密码
cat /etc/gitlab/initial_root_password EDgqXDTjQnTGv/gMKYyFBS2yfp/BHaHntPA6cQ/e3to=
(3) 登录
(4) 修改root密码
四、jenkins部署
1、资源清单
操作系统 配置 主机名 IP openEuler 24.03 2C4G jenkins 192.168.10.104 openEuler 24.03 2C4G gitlab 192.168.10.105 2、基础环境
hostnamectl set-hostname jenkins bash systemctl stop firewalld systemctl disable firewalld setenforce 0 sed -i '/^SELINUX=/s/enforcing/disabled/' /etc/selinux/config
3、安装git
dnf -y install git
4、安装字体库
dnf -y install fontconfig
5、部署JDK
(1) 解压并移动到合适位置
tar zxf jdk-11.0.16.1_linux-x64_bin.tar.gz mv jdk-11.0.16.1 /usr/local/java
(2) 设置环境变量
export JAVA_HOME=/usr/local/java export CLASSPATH=$JAVA_HOME/lib:$CLASSPATH export PATH=$JAVA_HOME/bin:$PATH
(3) 加载环境变量
source /etc/profile
(4) 查看版本
java -version
6、部署Tomcat
tar zxf apache-tomcat-8.5.56.tar.gz mv apache-tomcat-8.5.56 /usr/local/tomcat
7、部署Meven
(1) 解压并移动到合适位置
tar zxf apache-maven-3.6.0-bin.tar.gz mv apache-maven-3.6.0 /usr/local/maven
(2) 设置环境变量
export MAVEN_HOME=/usr/local/maven export PATH=$PATH:$MAVEN_HOME/bin
(3) 加载环境变量
source /etc/profile
(4) 查看版本
mvn -version
(5) 修改配置文件
将Maven仓库改为国内
vim /usr/local/maven/conf/settings.xml
<mirror><id>aliyunmaven</id><mirrorOf>*</mirrorOf><name>阿里云公共仓库</name><url>https://maven.aliyun.com/repository/public</url> </mirror>
8、部署nodejs(运行时)
(1) 部署nodejs的依赖环境
dnf -y install gcc automake autoconf libtool
(2) 解压并移动到合适位置
tar zxf node-v14.18.0-linux-x64.tar.gz mv node-v14.18.0-linux-x64 /usr/local/nodejs14
(3) 优化路径并查看版本
ln -s /usr/local/nodejs14/bin/* /usr/local/bin node -v
(4) 查看node包管理工具(构建工具)
npm -v
9、部署jenkins
mv jenkins.war /usr/local/tomcat/webapps/ cd /usr/local/tomcat/webapps/ ls /usr/local/tomcat/bin/startup.sh
10、设置Jenkins插件更新源
cd cd .jenkins/updates/ sed -i 's/https:\/\/www.jenkins.io/https:\/\/mirrors.tuna.tsinghua.edu.cn\/jenkins/g' default.json sed -i 's/https:\/\/www.google.com/https:\/\/www.baidu.com/g' default.json
11、找到初始密码
cat /root/.jenkins/secrets/initialAdminPassword
12、登录Jenkins
13、安装插件(选离线)
14、跳过在线安装插件
15、创建管理员用户生成永久链接
16、开始使用
17、后续如需安装插件
18、拉取本地插件(原先下载好的)
19、然后重启 Jenkins
/usr/local/tomcat/bin/shutdown.sh /usr/local/tomcat/bin/startup.sh
重新查看插件是否已经被添加
20、安装JDK
21、安装Maven
22、安装NodeJS
五、Jenkins角色与权限管理
我们可以利用Role-basedAuthorization Strategy 插件来管理 Jenkins 用户权限,在前面的插件安装中已经安装过此插件。
1、全局安全配置
“Dashboard”-->“ManageJenkins”-->“Security”-->“Authentication”
将授权策略修改为“Role-Based Strategy”,并保存设置。
2、创建角色
为了更方便的为用户授权,jenkins 中使用角色作为一类权限的容器。角色是一组相关权限的集合。可以为用户指定角色,而不是直接指定权限。
(1) 角色种类
Global roles:Global roles(全局角色):管理员等高级用户可以创建基于全局的角色
Item roles:针对某个或者某些项目的角色
Agent roles:节点相关的权限
(2) 设置角色
“Dashboard”-->“Manage Jenkins”-->“Manage and AssingRoles”。点击“Manage Roles”
(3) 创建全局角色
baseRole:该角色为全局角色。这个角色需要绑定 Overall 下面的 Read 权限,是为了给所有用户绑定最基本的 Jenkins 访问权限。注意:如果不给后续用户绑定这个角色,会报错误:用户名ismissing the Overall/Read permission
(4) 创建项目角色
role1:该角色为项目角色。使用正则表达式绑定"my-item01.*",意思是只能操作名称为“my-item01”开头的项目。
role2:该角色也为项目角色。绑定"my-item02.*",意思是只能操作“my-item02”开头的项目。
为角色分配权限
3、创建用户
(1) 添加用户
Dashboard”-->“Manage Jenkins”-->“Users”,在右上角点击“CreateUser”,创建用户。
添加两个用户zhangsan、lisi
(2) 用户绑定到角色
“Dashboard”-->“Manage Jenkins”-->“Manage and Assign Roles”,然后点击“Assign Roles”。
为 zhangsan 用户绑定 baseRole 和 role1 角色
4、创建项目
5、凭证管理
有许多第三方网站和应用程序可以与Jenkins 进行交互,例如程序代码仓库,云存储系统和服务等。此类应用程序的系统管理员可以在应用程序中配置凭据以专供 Jenkins 使用。通常通过将访问控制应用于这些凭据来完成这项工作,以“锁定”Jenkins 可用的应用程序功能区域。一旦 Jenkins 管理员(即管理 Jenkins 站点的 Jenkins 用户)在 Jenkins 中添加/配置这些凭据,Pipeline 项目就可以 使用凭据与这些第三方应用程序进行交互。
用管理员登录到 jenkins。
要在 Jenkins 使用凭证管理功能,需要安装 CredentialsBinding 插件,前面已经安装过此插件, 这里不再安装。
凭据可以用来存储需要密文保护的数据库密码、Gitlab 密码信息、Docker 私有仓库密码等,以便Jenkins 可以和这些第三方的应用进行交互。
凭据的种类
jenkins 提供了多种类型的凭据,适应与不同的业务需求,具体类型如下:
- Username with password:用户名和密码
- GitHub App:GitHub 应用进行身份验证
- GitLab API token:存储 Gitlab 的用户API token
- OpenShift Username and password:存储OpenShift 的用户名和密码
- SSH Username with private key: 使用 SSH 用户和密钥
- Secret file:需要保密的文本文件,使用时Jenkins 会将文件复制到一个临时目录中,再将文件路径设置到一个变量中,等构建结束后,所复制的 Secret file 就会被删除。
- Secret text:需要保存的一个加密的文本串,如钉钉机器人或Github 的 api token
- Certificate:通过上传证书文件的方式
其中,常用的凭证类型有:Username with password(用户密码)和 SSH Username with private key(SSH 密钥)。接下来以使用 Git 工具到 Gitlab 拉取项目源码为例,演示 Jenkins 的如何管理 Gitlab的凭证。
注意:为了让 Jenkins 支持从 Gitlab 拉取源码,需要安装 Git 插件以及在 CentOS7 系统上安装 Git工具。
(1) 凭据的作用范围
凭证具有与它们相关联的范围。这是一种表示它们如何才能被暴露的方式。Jenkins使用的主要范围有如下 2 种。
System(系统)
顾名思义,这个范围与根上下文,也就是Jenkins 系统相关联。此范围中的凭证只被暴露给系统和后台任务,并且一般被用于连接到构建节点或代理节点等。
全局
全局范围是默认选项,通常用来确保 Jenkins中的任务可以使用凭证。
(2) 添加用户密码类型的凭据
添加凭据
“Manage jenkins”-->“Credentials”,打开如下页面,并点击“System”,进入全局凭据管理界面,如下图所示。
在如下界面中,点击右上角的“Add Credentials”按钮,添加凭据
填写凭据参数
这里主要的内容有:
凭据类型:Username withpassword
范围:Global
用户名:root(该账号是 gitlab 中添加的账号)
密码:gitlab 中为 root 用户设置的密码(本案例此处为 pwd12345,注意不是系统的 root 密码)
ID:选填(设置凭据的唯一标识,不设置会自行分配一个唯一标识)
描述:选填(凭据名称,此处最好填写一下,使用凭据的时候便于识别,不设置就使用用户名)
6、使用凭据
(1) 账号密码模式
创建test01任务
(2) 配置源码管理
登录gitlab
创建项目
导入一个项目
设置参数
(3)添加SSH类型的凭据
SSH 类型的凭据可以使Jenkins 在拉取gitlab 中的代码时使用秘钥对的方式,不仅实现了免密连接,同时也会对数据进行加密,是一种安全可靠的凭据方式。
在 jenkins 主机上以root 身份生成密钥对
ssh-keygen cd cd .ssh/ ls cat id_ed25519.pub cat id_ed25519
公钥
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIHA8FJ6slmXppZahXmTtq/MLWLU9rBWIszNs2W7lE7EB root@jenkins
私钥
-----BEGIN OPENSSH PRIVATE KEY----- b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAAAMwAAAAtzc2gtZW QyNTUxOQAAACBwPBSerJZl6aWWoV5k7avzC1i1PawViLMzbNlu5ROxAQAAAJA1NAuONTQL jgAAAAtzc2gtZWQyNTUxOQAAACBwPBSerJZl6aWWoV5k7avzC1i1PawViLMzbNlu5ROxAQ AAAEAd5GuCXddppIoVcfLDaM4Gy3b7DznVapqX6rD2Rv8n3XA8FJ6slmXppZahXmTtq/ML WLU9rBWIszNs2W7lE7EBAAAADHJvb3RAamVua2lucwE= -----END OPENSSH PRIVATE KEY-----
将公钥存放的gitlab
用 root 用户登录 gitlab,点击右上角的头像,在下拉菜单中点“preferences”,然后在左侧列表点击“SSH Keys”。
在Jenkins种添加SSH凭据
“Manage jenkins”-->“Credentials”,打开如下页面,并点击“System”,进入全局凭据管理界
添加凭据参数
这里主要的参数有:
类型:SSH
范围:Global
ID:可选
描述:可选
Username:root(这个秘钥对是用 root 的身份生成的)
Private Key:填写 root 生成的私钥。
创建test02任务
配置源码管理
如果报一下错误可以使用Jenkins节点手动使用ssh登录一下
在使用秘钥对时,要提前在 jenkins 主机上生成 gitlab 主机的 fingerprint,否则,此处会提示错误。错误信息如下:
第一次连接的话可以看到提示: “Are yousure you want to continue connecting (yes/no)? yes”,输入 yes 并回车即可生成 gitlab 主机的 fingerprint。
发布结果