随着软件开发复杂度的不断提高,团队成员之间如何更好地协同工作以确保软件开发的质量,已经慢慢成为开发过程中不可回避的问题。Jenkins 自动化部署可以解决集成、测试、部署等重复性的工作,工具集成的效率明显高于人工操作;并且持续集成可以更早的获取代码变更的信息,从而可以更早的进入测试阶段;并且能够更早的发现问题,这样解决问题的成本就会显著下降。
持续集成缩短了从开发、集成、测试、部署各个环节的时间,从而也缩短了中间出现的等待时间。持续集成也意味着开发、集成、测试、部署得以持续。所以,当配置完 Jenkins 持续集成持续交付环境后,就可以把发布的任务交给集成服务器去处理了。本章将使用Maven(Ant)等来实现 Java 项目自动化构建发布部署。这些工具可以帮助在构建过程中实现自动化发布、回滚等动作。
一、什么是 Jenkins
Jenkins 是一个功能强大的应用程序,允许持续集成和持续交付项目(持续部署),无论用的是什么平台。这是一个免费的源代码,可以处理任何类型的构建或持续集成。集成 Jenkins 可以用于一些测试和部署技术。
Jenkins 原名 Hudson,2011 年改为现在的名字,它是一个开源的实现持续集成的软件工具。官方网站网址:https://jenkins.io/。Jenkins 能实时监控持续集成过程中所存在的问题,提供详细的日志文件和提醒功能,还能通过图表的形式,形象地展示项目构建的趋势和稳定性。
Jenkins 是一个开源软件项目,是基于 Java 开发的一种持续集成工具,用于监控持续重复的工作,旨在提供一个开放易用的软件平台,使软件项目可以进行持续集成。
jenkins 提供了一种易于使用的持续集成系统,使开发者从繁杂的集成中解脱出来,专注于更为重要的业务逻辑实现上。同时 enkins 能实时监控集成中存在的错误,提供详细的日志文件和提醒功能,还能用图表的形式形象地展示项目构建的趋势和稳定性。
Jenkins 可以构建一个自动化的持续集成环境可以使用它来“自动化”编译、打包、分发部署应用,它兼容 ant、maven、gradle 等多种第三方构建工具,同时与 svn、git 能无缝集成,也支持直接与知名源代码托管网站,如 github、bitbucket 直接集成。
1.为什么要用 Jenkins
目前持续集成(CI)已成为当前许多软件开发团队在整个软件开发生命周期内侧重于保证代码质量的常见做法。它是一种实践,旨在缓和和稳固软件的构建过程。并且能够帮助您的开发团队应对如下挑战:
(1)软件构建自动化
配置完成后,CI系统会依照预先制定的时间表,或者针对某一特定事件,对目标软件进行构建。
(2)构建可持续的自动化检查
CI系统能持续地获取新增或修改后签入的源代码,也就是说,当软件开发团队需要周期性的检查新增或修改后的代码时,CI系统会不断确认这些新代码是否破坏了原有软件的成功构建。这减少了开发者们在检查彼此相互依存的代码中变化情况需要花费的时间和精力(说直接一点也是钱啊,呵呵)。
(3)构建可持续的自动化测试
构建检查的扩展部分,构建后执行预先制定的一套测试规则,完成后触发通知(Emai1,Rss 等等)给相关的当事人。
(4)生成后后续过程的自动化
当自动化检查和测试成功完成,软件构建的周期中可能也需要一些额外的任务,诸如生成文档、打包软件、部署构件到一个运行环境或者软件仓库。这样,构件才能更迅速地提供给用户使用。
2.Jenkins 的特点
Jenkins 包含以下几个特点:
- 易安装:从官网仅需要下载一个 jenkins.war 文件后,直接运行,无需额外的安装,更无需安装数据库;
- 易配置:提供友好的 GUI 配置界面;
- 变更支持:Jenkins 能从代码仓库(SVN /Git)中获取并产生代码更新列表,并显示到编译输出信息中:
- 支持永久链接:用户是通过 web 来访问 Jenkins 的,而这些 web 页面的链接地址都是永久链接地址,可以在各种文档中直接使用该链接;
- 集成 E-Mai1/RSS/IM:当完成一次集成后,可通过这些工具实时收取集成结果(构建一次集成需要花费一定时间,有了这个功能,就可以在等待结果过程中,干别的事情);
- JUnit/TestNG 测试报告:是以图表等形式提供详细的测试报表功能;
- 支持分布式构建:Jenkins 可以把集成构建等工作分发到多台计算机中完成:
- 文件指纹信息:Jenkins 会保存构建集成所产生的 jars 文件、集成构建使用了哪个版本的jars 文件等构建记录;
- 支持第三方插件:Jenkins 支持第三方插件,这使得enkins 功能变得越来越强大
3.什么是 CI/CD
持续集成(Continuous integration)是一种软件开发实践,即团队开发成员经常集成它们的工作,通过每个成员每天至少集成一次,也就意味着每天可能会发生多次集成。每次集成都通过自动化的构建(包括编译,发布,自动化测试)来验证,从而尽早地发现集成错误。
持续部署(continuous deployment)是通过自动化的构建、测试和部署循环来快速交付高质量的产品。某种程度上代表了一个开发团队工程化的程度,毕竟快速运转的互联网公司人力成本会高于机器,投资机器优化开发流程化相对也提高了人的效率,让 engineering productivity 最大化。
持续交付(Continuous delivery),是一种软件工程手法,让软件产品的产出过程在一个短周期内完成,以保证软件可以稳定、持续的保持在随时可以释出的状况。它的目标在于让软件的建置、测试与释出变得更快以及更频繁。这种方式可以减少软件开发的成本与时间,减少风险。
4.持续集成的特点
持续集成是一个自动化的、周期性的集成测试过程,检出代码、编译构建、运行测试、结果记录、测试统计等过程都是自动完成的,无需人工干预。持续集成需要有专门的集成服务器来执行集成构建操作,同时需要有代码托管工具的支持。
5.持续集成的工作原理
Jenkins 的工作原理是先将源代码从 SVN/Git 版本控制系统中拷贝一份到本地,然后根据设置的脚本进行 build(构建)。整个系统的关键就是 build 脚本,build 脚本告诉 Jenkins 在一次集成中需要执行的任务。如下图所示。
二、Jenkins的部署
1.设备列表
2.案列拓扑
三、Jenkins 基本环境的安装与设置
1.安装docker
Jenkins 持续集成环境可以和 Harbor 镜像仓库、docker 主机、kubernetes 等共同建立一个流水线环境,在这种环境下,Jenkins 可以将 maven 项目打包为镜像,并将镜像推送至 Harbor,考虑到如果需要在 Jenkins 主机上生成镜像并推送至 Harbor,Jenkins 主机就需要有一个 docker 环境。
具体安装步骤,参考 docker 相关课程。如果已有 docker 环境,此步骤可以略过。
2.操作系统设置
[root@localhost ~]# hostnamectl set-hostname jenkins
[root@localhost ~]# bash
systemctl stop firewalld && systemctl disable firewalld
systemctl stop NetworkManager && systemctl disable NetworkManager
sed -i '/^SELINUX=/s/enforcing/disabled/' /etc/selinux/config
setenforce 0
3.安装git
为了让 Jenkins 支持从 Gitlab 拉取源码,需要安装 Git 插件以及在 centos7 上安装 Git 工具。
[root@jenkins ~]# yum -y install git
4. 安装 java 环境
(1)安装java
[root@jenkins ~]# yum -y install fontconfig
[root@jenkins ~]# tar zxvf jdk-11.0.23_linux-x64_bin.tar.gz
[root@jenkins ~]# mv jdk-11.0.23 /usr/local/java
注意:
Fontconfig 是一款字体配置工具,它允许用户在 Linux、macOs 和 windows 等操作系统上配置字体。Fontconfig,的设计目标是提供一个易于使用的命令行工具,用于管理字体文件和配置字体。这个包是Jenkins 的依赖包,必须安装,否则,Jenkins 无法启动。
(2)设置 java 的环境变量
[root@jenkins ~]# vim /etc/profile
export JAVA_HOME=/usr/local/java
export CLASSPATH=$JAVA_HOME/lib:$CLASSPATH
export PATH=$JAVA_HOME/bin:$PATH
[root@jenkins ~]# source /etc/profile
(3)查看java版本
[root@jenkins ~]# java -version
java version "11.0.23" 2024-04-16 LTS
Java(TM) SE Runtime Environment 18.9 (build 11.0.23+7-LTS-222)
Java HotSpot(TM) 64-Bit Server VM 18.9 (build 11.0.23+7-LTS-222, mixed mode)
5.安装tomcat
[root@jenkins ~]# tar zxvf apache-tomcat-9.0.8.tar.gz
[root@jenkins ~]# mv apache-tomcat-9.0.8 /usr/local/tomcat
6. 为 Jenkins 安装 maven 环境
(1)安装maven
[root@jenkins ~]# tar zxvf apache-maven-3.8.6-bin.tar.gz
[root@jenkins ~]# mv apache-maven-3.8.6 /usr/local/tomcat
(2)设置 java 和 maven 的环境变量
[root@jenkins ~]# vim /etc/profile
export JAVA_HOME=/usr/local/java
export CLASSPATH=$JAVA_HOME/lib:$CLASSPATH
export PATH=$JAVA_HOME/bin:$PATH
export MAVEN_HOME=/usr/local/maven
export PATH=$PATH:$MAVEN_HOME/bin
[root@jenkins ~]# source /etc/profile
(3)查看maven 版本
[root@jenkins ~]# mvn -version
Apache Maven 3.8.6 (84538c9988a25aec085021c365c560670ad80f63)
Maven home: /usr/local/maven
Java version: 11.0.23, vendor: Oracle Corporation, runtime: /usr/local/java
Default locale: zh_CN, platform encoding: UTF-8
OS name: "linux", version: "6.8.7-1.el7.elrepo.x86_64", arch: "amd64", family: "unix"
(4)修改 maven 更新源
[root@jenkins ~]# vim /usr/local/maven/conf/settings.xml
#修改maven的仓库<mirrors>
<mirror><id>aliyunmaven</id><mirrorOf>*</mirrorOf><name>阿里云公共仓库</name><url>https://maven.aliyun.com/repository/public</url>
</mirror><mirrors>
备注:
阿里提供了 maven 更新源,可访问阿里官方网站査看详细信息。
https://maven.aliyun.com
7.为jenkins 安装 NodeJs
在对 Nodes 项目进行构建的时候,需要 g++的编译环境,不同的项目 Node]s 的版本也不一样,在进行部署的时候要根据项目的依赖版本进行选择。
[root@jenkins ~]# yum -y install gcc automake autoconf libtool make
[root@jenkins ~]# yum -y install gcc*
[root@jenkins ~]# tar zxvf node-v14.18.0-linux-x64.tar.gz
[root@jenkins ~]# mv node-v14.18.0-linux-x64 /usr/local/nodejs14
[root@jenkins ~]# ln -s /usr/local/nodejs14/bin/* /usr/local/bin/
四、Jenkins的安装与初始化设置
1.安装Jenkins
[root@jenkins ~]# cp jenkins.war /usr/local/tomcat/webapps
[root@jenkins ~]# cd /usr/local/tomcat/bin/
[root@jenkins bin]# sh startup.sh
Using CATALINA_BASE: /usr/local/tomcat
Using CATALINA_HOME: /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME: /usr/local/java
Using CLASSPATH: /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
Tomcat started.
[root@jenkins bin]# netstat -anpt | grep java
tcp6 0 0 :::8009 :::* LISTEN 6286/java
tcp6 0 0 :::8080 :::* LISTEN 6286/java
tcp6 0 0 127.0.0.1:8005 :::* LISTEN 6286/java
将 jenkins.war 文件保存到Tomcat 服务的 /usr/local/tomcat/webapps 目录下。启动 Tomcat就会自动部署 Jenkins。
2.设置 jenkins 插件更新源
cd /root/.jenkins/updates
[root@jenkins updates]# sed -i 's/https:\/\/www.jenkins.io/https:\/\/mirrors.tuna.tsinghua.edu.cn\/jenkins/g' default.json
[root@jenkins updates]# sed -i 's/https:\/\/www.google.com/https:\/\/www.baidu.com/g' default.json
注意:
default.json 文件需要 jenkins 初始化结束才能出来。此处需要稍等片刻。
[root@jenkins updates]# cat /root/.jenkins/secrets/initialAdminPassword
3. Jenkins 初始化
(1)登录Jenkins
访问网址:http://192.168.10.104:8080/jenkins
查看初始密码:
cat /root/.jenkins/secrets/initialAdminPassword
(2)选择插件安装方式
注意:
此处是在安装 Jenkins 过程中添加插件,也可以使用“选择插件安装”选项,跳过插件安装过程,等待 Jenkins 安装好后,登录到 Jenkins 再安装插件。
(3)创建管理员账号
本案例将初始的管理员账号和密码都设置为 admin
(4)结束安装
五、Jenkins 插件管理
1.修改 Jenkins 插件安装为国内源地址
在安装 Jenkins 时,选择默认安装插件会很慢,甚至会失败,因此安装时可以取消所有插件安装,跳过这一步,待 Jenkins 启动后,修改插件安装地址,安装插件。
(1)设置国内插件源
进入 Manage Jenkins->Plugins->Advanced settings 最下面有 Update site(升级站点),设置为如下链接,并点“提交”按钮。
https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json
(2)重启 Jenkins 服务
[root@jenkins ~]# /usr/local/tomcat/bin/shutdown.sh
[root@jenkins ~]# /usr/local/tomcat/bin/startup.sh
2.安装插件
点击“Manage jenkins”-->“Plugins”-->“Avalable plugins”,输入要安装的插件,并勾选列出来的插件,然后点安装。
在本课程内,可能会用的插件如下所示:
Git Parameter
Git Pipeline for Blue Ocean
GitLab
Blue Ocean
Blue Ocean Pipeline Editor
Blue Ocean core Js
Pipeline SCM API for Blue ocean
Dashboard for Blue Ocean
Build with Parameters
extended Choice ParameterKubernetes
Kubernetes CLI
Kubernetes credentials
Image Tag Parameter
Active choices
SSH
ansible
Maven IntegrationPublish over ssH
Role-based Authorization strategy
Nodejs
Git
Credentials
Credentials Binding
Dynamic Extended Choice Parameter Plug-InDynamic Parameter Plug-In
Pipeline
Pipeline:Declarative
Localization:Chinese(simplified)
注意:
红色的在初始化过程中已经安装上去的,此处可以不用再安装,如果在初始过程中没有安装,或安装不完全,此处可以都安装上去,为其他项目的实施提供可用功能。
提示:可以在此处做一个快照,方便后续实验
六、Jenkins 角色与权限管理
我们可以利用 Role-based Authorization strategy 插件来管理 Jenkins 用户权限,在前面的插件安装中已经安装过此插件。
1.开启权限全局安全配置
“Dashboard”-->“Manage Jenkins”-->“Security”-->“Authentication"
将授权策略修改为“Role-Based strategy”,并保存设置。
2.创建角色
为了更方便的为用户授权,jenkins 中使用角色作为一类权限的容器。角色是一组相关权限的集合。可以为用户指定角色,而不是直接指定权限。
(1)角色种类
Global roles:Global roles(全局角色):管理员等高级用户可以创建基于全局的角色
Item roles:针对某个或者某些项目的角色
Agent roles:节点相关的权限
(2)设置角色
“Dashboard”-->“Manage Jenkins”-->“Manage and Assing Roles”。点击“Manage Roles"
本案例中我们添加三个角色:
- baseRole:该角色为全局角色。这个角色需要绑定0verall 下面的 Read 权限,是为了给所有用户绑定最基本的 Jenkins 访问权限。注意:如果不给后续用户绑定这个角色,会报错误:用户名ismissing the overall/Read permission
- role1:该角色为项目角色。使用正则表达式绑定"my-item01.*",意思是只能操作名称为“my-item01”开头的项目。
- role2:该角色也为项目角色。绑定"my-item02.*",意思是只能操作“my-item02”开头的项目。
(3)添加 baseRole 角色到 Global roles
(4)添加role1和role2 角色到 Item roles
在“Role to add”中填写角色名称“role1”;“Pattern”中填写“my-item01.*”,表示 role1 的角色只能管理“my-item01.*”开头的项目添加好后点 Save 保存。
3.创建用户
(1)添加新用户
“Dashboard”-->“Manage Jenkins”-->“Users”,在右上角点击“create User”,创建用户。
(2)填写账号信息
(3)创建好后的效果
4.给用户分配角色
“Dashboard”-->“Manage Jenkins”-->“Manage and Assign Roles”,然后点击“Assign Roles”进入到分配角色的界面。
(1)为zhangsan用户绑定 baseRole 和role1 角色
在“Global roles”中点击“Add User”按钮,在弹框中输入用户 zhangsan,确定后勾选角色 baseRole:在“Item roles”中点击“Add User”按钮,在弹框中输入用户 zhangsan,确定后勾选角色 role1。
(2)为lisi 用户绑定 baseRole 和 role2 角色
用同样的方法为 1isi 设置角色。
在“Global roles”中点击“Add user”按钮,在弹框中输入用户 1isi,确定后勾选角色 baseRole:在“Item roles”中点击“Add user”按钮,在弹框中输入用户 lisi,确定后勾选角色 role2.设置好后,点击 save 保存。
5.创建项目测试权限
(1)创建项目
用管理员的权限创建两个项目,名字分别是 my-item01-zhangsan 和 my-item02-lisi
(2)分别用 zhangsan 和 lisi 的身份登录系统
可以发现,每个用户只能管理属于自己角色范围内的项目。
七、Jenkins 凭证管理
有许多第三方网站和应用程序可以与 Jenkins 进行交互,例如程序代码仓库,云存储系统和服务等
此类应用程序的系统管理员可以在应用程序中配置凭据以专供 Jenkins 使用。通常通过将访问控制应用于这些凭据来完成这项工作,以“锁定”Jenkins 可用的应用程序功能区域。一旦 Jenkins 管理员(即管理 Jenkins 站点的 Jenkins 用户)在 Jenkins 中添加/配置这些凭据,Pipeline 项目就可以使用凭据与这些第三方应用程序进行交互。
用管理员登录到 jenkins。
要在 Jenkins 使用凭证管理功能,需要安装 Credentials Binding插件,前面已经安装过此插件,这里不再安装。
凭据可以用来存储需要密文保护的数据库密码、Gitlab 密码信息、Docker 私有仓库密码等,以便Jenkins 可以和这些第三方的应用进行交互。
1.凭据的种类
jenkins 提供了多种类型的凭据,适应与不同的业务需求,具体类型如下:
- Username with password:用户名和密码
- GitHub App: GitHub 应用进行身份验证
- GitLab API token: 存储 Gitlab 的用户 API token
- OpenShift Username and password:存储 0penshift 的用户名和密码
- SSH Username with private key:使用 SSH 用户和密钥
- Secret file:需要保密的文本文件,使用时 Jenkins 会将文件复制到一个临时目录中,再将文件路径设置到一个变量中,等构建结束后,所复制的Secret file 就会被删除。
- Secret text:需要保存的一个加密的文本串,如钉钉机器人或 Github 的 api token
- Certificate:通过上传证书文件的方式
其中,常用的凭证类型有:Username with password(用户密码)和SSH Username with privatekey(SSH 密钥)。接下来以使用 Git 工具到 Gitlab 拉取项目源码为例,演示 Jenkins 的如何管理 Gitlab的凭证。
注意: 为了让 Jenkins 支持从 Gitlab 拉取源码,需要安装 Git 插件以及在 Centos7 系统上安装 Git工具。
2.凭据的作用范围
凭证具有与它们相关联的范围。这是一种表示它们如何才能被暴露的方式。Jenkins 使用的主要范围有如下 2种。
(1)system(系统)
顾名思义,这个范围与根上下文,也就是 enkins 系统相关联。此范围中的凭证只被暴露给系统和后台任务,并且一般被用于连接到构建节点或代理节点等。
(2)全局
全局范围是默认选项,通常用来确保 Jenkins 中的任务可以使用凭证。
3.添加用户密码类型的凭据
(1)添加凭据
“Manage jenkins”-->“credentials”,打开如下页面,并点击“System”,进入全局凭据管理界面,如下图所示。
在如下界面中,点击右上角的“Add credentials”按钮,添加凭据
(2)填写凭据参数
这里主要的内容有:
凭据类型:Username with password
范围:Global
用户名:root(该账号是 gitlab 中添加的账号)密码:gitlab 中为root 用户设置的密码(本案例此处为 pwd12345,注意不是系统的 root 密码)ID:选填(设置凭据的唯一标识,不设置会自行分配一个唯一标识)描述:选填(凭据名称,此处最好填写一下,使用凭据的时候便于识别,不设置就使用用户名)
点击 create 创建此凭据,添加结果如下:
(3)测试凭据
1)到 gitlab 中添加一个项目
登录到 gitlab,导入项目(本案例使用root 用户登录)。导入gitee 上的项目,访问级别使用私有类
型,链接如下:
https://gitee.com/kgc-wjq/league.git
2)复制出HTTP的仓库URL
http://192.168.10.105/root/league.githttp://192.168.10.105/root/league.git
3)创建测试项目 test01
创建一个 Freestyle 项目:新建 Item->Freestyle Project->确定
4)源码管理中设置仓库 URL 和凭据
在源码管理中点“Git”,代码仓库的 URL为 http://192.168.10.105/root/league.git
并选择 Gitlab 中 root 的凭据。最后保存设置。
5)测试代码拉取
点击 Build Now,立即构建此项目。可以在控制台输出査看构建日志。
6)查看拉取到 jenkins 主机中的代码
在 jenkins 主机的工作空间目录下,已经能够看到代码拉取到了 jenkins 主机本地。
[root@jenkins ~]# ls .jenkins/workspace/
test01 test01@tmp
4. 添加 SSH 类型的凭据
SSH类型的凭据可以使 Jenkins 在拉取 gitlab 中的代码时使用秘钥对的方式,不仅实现了免密连接。同时也会对数据进行加密,是一种安全可靠的凭据方式。
(1)在jenkins 主机上以 root 身份生成密钥对
(2)复制公钥
[root@jenkins ~]# cd .ssh/
[root@jenkins .ssh]# ls
id rsa id rsa.pub
其中 id rsa 为私钥文件,id rsa.pub 为公钥文件。
(3)将公钥存放到 gitlab
用 root 用户登录 gitlab,点击右上角的头像,在下拉菜单中点“preferences”,然后在左侧列表点击“SSH Keys”。
添加成功后的效果如下如图所示:
(4)在 jenkins 中添加 SSH 凭据
“Manage jenkins”-->“Credentials”,打开如下页面,并点击“System”,进入全局凭据管理界
(5)填写 SSH 凭据参数
这里主要的参数有:
类型:SSH
范围:Global
ID:可选
描述:可选
Username:root(这个秘钥对是用root 的身份生成的)Private Key:填写 root 生成的私钥。
(6)添加好的状态如下
(7)测试凭据
1)到 gitlab 中查看 SSH 的仓库链接,并复制下来
以 root 的身份登录到 gitlab,并复制出 SSH 的仓库 URL。
git@192.168.10.105:root/league.git
2)创建测试项目test02
3)在源码管理中设置 git 参数
将仓库的 ssh 链接粘贴到仓库 URL 处,并在下面选择 ssh 凭据。
4)构建项目测试
点击“Build New”,查看构建结果。
5)查看工作区域
[root@jenkins ~]# ls .jenkins/workspace/
test01 test01@tmp test02 test02@tmp
此处已经将 gitlab 中的项目拉取到了 Jenkins 本地。