Jenkins简介

一、历史与发展

Jenkins的前身是Hudson,Hudson是由Sun公司在2004年启动,第一个版本于2005年在java.net发布。2007年开始Hudson逐渐取代CruiseControl和其他的开源构建工具的地位。在2008年的JavaOne大会上在开发者解决方案中获得杜克选择大奖(Duke’s Choice Award)。
在2010年11月期间,因为Oracle对Sun的收购带来了Hudson的所有权问题。主要的项目贡献者和Oracle之间,尽管达成了很多协议,但有个关键问题就是商标名称“Hudson”。甲骨文在2010年12月声明拥有该名称并申请商标的权利。 因此,2011年1月11日,有人要求投票将项目名称从“Hudson”改为“Jenkins”。2011年1月29日,该建议得到社区投票的批准,创建了Jenkins项目。
2011年2月1日,甲骨文表示打算继续开发Hudson,并认为Jenkins只是一个分支,不是重命名。因此,Jenkins和Hudson继续作为两个独立的项目。到2013年12月,GitHub上的Jenkins拥有567个项目成员和约1,100个公共仓库,与此相对的Hudson有32个项目成员和17个公共仓库。到现在两者的差异更多,应该说Jenkins已经全面超越了Hudson。
首先,曾经是Hudson开发人员中的99%都转向了Jenkins的开发,其中包括最初的创建者川口清子(Kohsuke Kawaguchi)。他独自写了大部分代码,并且他的经验是Hudson各种高级特性的关键来源。Jenkins的开发社区更活跃。

治理和社区
Jenkins开发社区的管理是很开放的。 有一个独立的董事会,其中包括来自Yahoo!, CloudBees,Cloudera和Apture等多家公司的长期以来的Hudson开发人员。每次会议后,他们定期举行治理会议并发表意见,征询公众意见。他们还将所有代码都捐赠给公共利益软件组织(SPI),以确保社区持续开放。
稳定性
针对Jenkins的贡献不断持续增加,Jenkins制定了新的长期支持发布线。社区定大约每三个月发布一次稳定版本的补丁。
插件的平台
Jenkins支持超过1000个插件。凭借多样而强大的插件Jenkins成了整个开发生命周期中的一个中心点。

二、定义及原理

Jenkins是一个基于Java开发的持续集成的工具,其主要目标是监控软件开发流程,快速显示问题。保证开发人员以及相关人员省时省力提高开发效率。
其分布式工作原理图():
在这里插入图片描述
工作流程大概分为以下几步:
● 开发者将新版本push到Gitlab(源代码库);
● Gitlab随后触发jenkins master结点的触发器进行一次build。(通过web hook或者定时检测);
● jenkins master结点将这个build任务分配给若干个注册的slave结点中的一个,这个slave结点根据一个事先设置好的脚本进行build。这个脚本可以做的事情很多,比如编译,测试,生成测试报告等等。这些原本需要手动完成的任务都可以交给jenkins来做;
● 我们在build中要进行编译,这里使用了分布式编译器distcc(交叉编译,资源合理利用)来加快编译速度。

三、构建方式

Jenkins构建架构分为单机构建及分布式构建。
1、单机构建比较简单,通常在单个服务器资源够用的情况下,处理构建发布等作业;
2、分布式构建是使用主/从架构来管理分布式构建
主节点:处理调度构建作业,把构建分发到从节点来进行实际执行,监视从节点,并且记录和发布构建产物。
从节点:按照被告知的工作,即主节点分派的构建作业。配置可分为如下三种情况:
● 配置一个项目总是在特定的从节点运行;
● 在某个特定类型的从节点运行;
● 让Jenkins挑选下一个可用的从节点。
一旦从节点实例运行,就会通过TCP/IP连接进行通信。
Jenkins构建模式分为:
● jenkins触发式构建:用于开发环境部署,开发人员push代码或者合并代码到gitlab项目的master分支,jenkins就部署代码到对应服务器;
● jenkins参数化构建:用于测试环境预上线环境部署,开发push代码或者合并代码到gitlab项目的master分支之后,并不会部署代码,而是需要登录到jenkins的web界面,点击构建按钮,传入对应的参数(比如参数需要构建的tag,需要部署的分支)然后才会部署;
● jenkins定时构建:用于APP自动打包,定时构建是在参数化构建的基础上添加的,开发人员可以登录jenkins手动传入tag进行打包,如果不手动打包,那么jenkins就每天凌晨从gitlab拉取最新的APP代码打包。

四、优点与不足

优点:
● 容易安装,不需要数据库的支持。
● 容易配置,jenkins可以完全地通过友好的web GUI来配置,且配置页面支持配置项的错误检查和很好的在线帮助。不需要手动地编辑xml的配置文件,但是jenkins也支持手动修改xml配置文件。
● 项目源码修改的检测,jenkins能够从项目的Subversion/CVS生成最近修改的集合列表,且改方式非常有效,不会增加Subversion/CVS Repository的负载。
● 可读的永久的链接生成,jenkins对于大部分pages都生成清楚的可读的永久的链接,例如’'latest build"/“latest successful build”,因此可以容易地在其他的地方引用jenkins的生成的pages。
● RSS/EMail/IM集成,可以通过RSS,EMail或IM来实时地监视build的失败。
● Build完成后仍然可以tag,支持在build完成后tag或重tag。
● Junit/TestNG 测试报告,能够很好地显示各种测试的报告,且可以生成失败的趋向图。
● 分布式build,jenkins能够分发build/test的负载到多台机器,能够更好地利用硬件资源,提高build的时间。
● 文件标识,jenkins可以标识build产生的文件,例如jars。
● 插件支持,jenkins可以通过第三方的插件来扩展。
● 跨平台,支持几乎所有的平台,例如Windows,Ubuntu/Debian,Red Hat/Fedora/CentOS,Mac OS X,openSUSE,FreeBSD,OpenBSD,Solaris/OpenIndiana.Gentoo。
缺点:
● 对服务器资源的要求比较高。所有的数据都写在了 JENKINS_HOME 目录里,在页面访问的时候,对磁盘 IO 的消耗很大,给性能带来了极大的负担。
● 没有容灾,一旦出现问题将非常致命。
● Jenkins 的调试复杂,并没有可以在本地或者 Jenkins 服务器上命令行调试的功能,每次修改配置和脚本都需要重新触发构建,如果遇到资源紧张的时候,构建更是缓慢,往往需要等上好久才能验证是否成功。
● Jenkins调度太笨拙。在 Jenkins 有多个 Slave 的时候,任务繁忙你就会发现,有些节点在空转,有些在高负载,一些任务一直会在高负载的节点上等待等,Job 的运行也没有完全发挥出分布式的优势来,导致在任务繁忙的时候,Jenkins 总是表现的非常缓慢。

五、部署

(一)官方下载地址

https://www.jenkins.io/download/
在这里插入图片描述

从Jenkins可以通过java打包的war包并且需要在jre环境下进行部署安装得知,Jenkins是基于java进行实现的;
由于linux比起window等系统来说更加稳定,大家常在linux系统上进行部署,现在来讲解一下Linux系统上的部署操作:
首先在官网上找到对应的linux安装文档:https://pkg.jenkins.io/redhat-stable/

在这里插入图片描述

官方文档上有对应的Jenkins版本所对应java环境;上面的脚本指令是安装最新的Jenkins安装包所需java11的;而我们现在最常用的是java8,所以本次是以Java8作为案例来讲;
由上面官网所述,我们在java8环境安装应该是2.164-2.357之间的Jenkins版本。

(二)首先按照官网指令首先在yum上增加Jenkins库源

sudo wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat-stable/jenkins.repo

我在操作的时候遇到报了个错误,出现
在这里插入图片描述
后面采用:

sudo wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat-stable/jenkins.repo --no-check-certificate

在这里插入图片描述

(三)导入密钥,Jenkins安装需要密钥:

sudo rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io.key

(四)安装jdk8:

yum install -y java-1.8.0-openjdk.x86_64
java - version

在这里插入图片描述

(五)下载jenkins:由于官网是下载最新rpm包,这边找到清华大学开源软件镜像站下载适配java8的rpm包

https://mirrors.tuna.tsinghua.edu.cn/jenkins/redhat/https://mirrors.tuna.tsinghua.edu.cn/jenkins/redhat/
我这边使用的是Jenkins-2.174版本的安装包
在这里插入图片描述

(六)解压安装:

rpm -ivh jenkins-2.174-1.1.noarch.rpm

(七)解压成功之后,配置jenkins的端口以及修改用户为root及java路径:

vi /etc/sysconfig/jenkins

在这里插入图片描述
在这里插入图片描述
配置jenkins的java路径

 vi /etc/init.d/jenkins

在这里插入图片描述

(八)启动Jenkins

systemctl enable jenkins.service
systemctl daemon-reload
systemctl start jenkins.service

在浏览器访问: 404!!!! 需要在防火墙上将端口开放!

#{PORT} 是jenkins服务使用的端口
firewall-cmd --zone=public --add-port={PORT}/tcp --permanent  
##重新载入
firewall-cmd --reload 
##查看
firewall-cmd --list-all

重新访问:
在服务器对应指示路径查看生成密码并添加其生成的密码后:
在服务器对应指示路径查看生成密码并添加其生成的密码后:
低版本的Jenkins会导致很多插件下载失败!建议使用最新版的jenkins
低版本的Jenkins会导致很多插件下载失败!建议使用最新版的jenkins

六、使用

(一)集成gitlab等库

1、前置条件:gitlab服务器 jenkins服务器:git,maven,java
2、gitlab与Jenkins的交互:

·流程图:
在这里插入图片描述
·操作流程
该事务需要jenkins下载gitlab插件支持
在这里插入图片描述
安装好插件,以及Jenkins环境安装了git

1. 首先Jenkins构建一个job时在源代码管理上进行拉取对应项目操作注释:Respository url为gitlab拉取项目的地址,至于凭证是通过gitlab对应用户的Private token进行

注释:Respository url为gitlab拉取项目的地址,至于凭证是通过gitlab对应用户的Private token进行
在这里插入图片描述
在这里插入图片描述

2. 构建触发器:

在这里插入图片描述

记住上面的url地址以及点击高级配置,再点击生成键生成token

在这里插入图片描述

再在gitlab上的操作-将url以及生成的token放入,下面是对应的事务操作触发

在这里插入图片描述

进行验证:

在这里插入图片描述

当项目有push事务操作时,gitlab的状态

在这里插入图片描述

jenkins构建状态

在这里插入图片描述

(二)多节点架构搭建

1、阐述:

多节点的搭建简单来说就是指在Jenkins服务器上通过ssh等方式连接其他节点服务器,将其连接的凭证配置保存下来。使其能在Jenkins的web上进行选择节点,以及在节点上运行操作的脚本等。
一般常用于多种不同的job需要的环境不同可分别在不同节点环境进行编译部署等。
也常用于服务器资源分配方面:在需求的不断增加、业务的不断扩展时,可对合理的对资源进行调整分配。

在这里插入图片描述

2、集成节点:

流程:通过节点配置的凭证连接到slave服务器—>输出当前用户的环境变量—>检查节点服务器java版本—>开启sftp传输slave.jar到节点服务器的工作目录–>java
-jar启动节点服务器上的slave进程 ● linux: 一般用ssh进行连接,jenkins配置上要添加节点服务器用户密码,以及需要节点服务器的ssh公钥添加至指定路径的known_hosts文件上

1.首先得获取节点服务器的公钥:
     我觉得最简单的方式就是通过:
ssh 192.168.61.4   #后面接节点服务器ip
2.输入密码即可获得对应的公钥添加进对应的known_hosts文件上,如果known_hosts在连接节点的时候找不到,可以在日志中找路径,将known_hosts复制到路径上

在这里插入图片描述

3.然后在jenkins里面添加节点凭证

在这里插入图片描述
在这里插入图片描述

4.添加节点

在这里插入图片描述
在这里插入图片描述

5.记好标签,因为标签是在job上指定节点的标识,再到job上指定对应的节点进行工作

在这里插入图片描述

6.点击构建即可在指定节点进行构建操作。

● Windows:差不多一致,连接方式会有点区别
在这里插入图片描述
其他基本一致

(三)编译构建及部署操作

如何构建job,在Jenkins上编译构建及部署自己的项目。

1、新建任务:

可以复制原有job配置,也可按照所需要的搭建自定义job。

在这里插入图片描述

构建自由风格的项目,这个是jenkins的基础功能,可以用它来执行各种构建任务,他只能构建在一个电脑上,如果没有太多的需求,这个job基本够用了,它包含了所有基础功能。
构建MAVEN项目,需要指定POM文件,扫描里面的配置简化maven项目的开发。

2、Job配置界面:

在这里插入图片描述

1.General:一般设置

Description:项目描述,多人协作请一定要加上
● Discard old builds:该选项配置如何抛弃旧的构建,每次构建相关的文件都会保存下来,将会渐渐耗光磁盘空间,为此提供两种方式供选择:
○ Days to keep builds:如果其值为非空的N,就留N天之内的构建文件
○ Max # of builds to keep:如果#为非空,就公保留最多#个最近构建的相关文件
○ days to keep artifcts 产品保留时间,但是log,历史记录会保留
○ builds to keep with artifacts 保留最近几个构建的产品
● This project is parameterized:可以设置用户可输入的参数,没有输入则使用默认值,有字符串,多行字符串,布尔值等可以设置.点击了解更多
● Throttle builds:设置两个build任务之间最小间隔和同一个时间内最大任务数量
● Disable this project:停止这个job,当例如源码不可用时,可以暂时勾选这个停止build
● Execute concurrent builds if necessary: 如果可以会并发执行build.勾选上后.如果有足够的线程池则会并发,否则不会.并发构建会在不同的workspace中.如果用户自己设置的workspace则不会分开,这个是有风险的.
● Restrict where this project can be run: 设置是否必须在某个机器上运行.如果是分布式部署或者迁移job,注意移除或修改此项配置
● Quiet period:配置等待未发生提交变化的时间. 由于 jenkins检测到代码变化时,就自动立即构建,但是有些情况下, 需要多次提交代码到版本控制系统上,此时,可能发生代码还没完整提交就开始构建,造成构建失败,为防止此种情况发生,可以配置值X,则jenkins会在代码变化后等待X秒,如果没在发生代码提交,才开始构建,保证稳定性。
● Block build when downstream project is building:该选项当多个相关联的项目由一个提交所影响,但是它们必须以一个指定的顺序进行构建的时候非常有用。当你选择这个选项的时候,Jenkins将会在启动这个构建之前,完成任何上游构建Job; 例如使用pipes的时候

2.Source Code Management:源码管理

在这里插入图片描述

这里设置源码管理路径,通过该路径拉去源码,该配置需要有git环境,这个与后面的轮询源码变化触发编译是成对的.不想设置或者后面有脚本可以自主管理可以选择none,
其详细配置请看上面的八、使用-> 2、gitlab与Jenkins的交互 ->操作流程->1

3.Build Triggers:构建触发器

在这里插入图片描述

其详细配置请看上面的八、使用-> 2、gitlab与Jenkins的交互 ->操作流程->2

● Trigger builds remotely (e.g., from scripts):外部通过url命令触发,拼接token和url就可以进行远程触发了
● Build after other projects are built:监控其他job的构建状态,触发此job.如监听代码提交,然后触发UITest,静态分析等.
● Build periodically:定时触发.选择 Build periodically,在 Schedule 中填写 0 * * * _.第一个参数代表的是分钟 minute,取值 0~59;第二个参数代表的是小时 hour,取值 0~23;第三个参数代表的是天 day,取值 1~31;第四个参数代表的是月 month,取值 1~12;最后一个参数代表的是星期 week,取值 0~7,0 和 7 都是表示星期天。所以 0 _* * * 表示的就是每个小时的第 0 分钟执行一次构建。举个例子:每周六10点构建 0 10 * * 6,0-0分钟, 10-10点 _-任意天 _-任务月份 6-周六, 0可以改为H.
● Poll SCM:定时感知代码分支是否有变化,如果有变化的话,执行一次构建.示例:H/5 * * * * 每五分钟去检查一下远程仓库,看代码是否发生变化。
GitHub hook trigger for GITScm polling:hookplugin检测到源码的push操作触发构建,感觉Poll SCM更方便些,如果提交频繁,则这个触发就会频繁,看业务需要设置

4.Build Environment(设置构建环境)

在这里插入图片描述

● Delete workspace before build starts:默认删除所有的,也可以设置删除特定的文件
■ Patterns for files to be deleted:正则匹配删除哪些文件
■ Apply pattern also on directories:规则是否也应用到文件夹
■ Check parameter:是否删除,是个bool值,true则删除,false不删除.为毛感觉这个有点鸡肋
■ External Deletion Command:执行外部删除命令
● Use secret text(s) or file(s) 使用密文,用于全局性的管理密码等,勾选后会在下方出现Binding,输入需要的用户名,密码证书等就可以了
● Provide Configuration files 提供配置文件
● Send files or execute commands over SSH before the build starts 构建前通过ssh发送文件或命令脚本
● Send files or execute commands over SSH after the build runs 构建后通过ssh发送文件或命令脚本
● Abort the build if it’s stuck:构建阻塞的时候,根据超时策略处理.
■ Time-out strategy:超时策略,有绝对时间,相对时间,根据以前的构建时间判断等
■ Time-out variable:超时时间
■ Time-out actions:超时后的处理,如终结,faile调或者写描述
● Add timestamps to the Console Output:在输出界面添加时间戳
● Execute shell script on remote host using ssh:使用ssh连接远程出局发送shell脚本
● Inspect build log for published Gradle build scans:检查已发布的Gradle构建扫描的构建日志。
● Provide Node & npm bin/ folder to PATH 每次build,都会首先执行环境构建,环境构建无误后,才会开始真正的构建过程 会下载nodejs并安装配置,并把node添加到当前PATH环境变量中,这样就支持node和npm命令
● With Ant:用 Ant。

5.Build (构建)

这部分是jenkins的核心功能,里面带有多种脚本环境等。

Execute NodeJS script: 执行nodejs脚本,配置环境变量路径等;
执行windows批处理命令: windows命令;
执行shell: shell命令-linux系统指令
Execute shell script on remote host using ssh: 使用ssh远程主机应用shell脚本
Invoke Ant:Ant是一款java项目构建工具,当然也能用来构建php。
Send files or execute commands over SSH:发送文件到远程主机或执行命令(脚本)
这里面是配置构建所需要的环境变量和脚本等

6.Build After(构建后操作)

对project构建完成后的一些后续操作,比如生成相应的代码测试报告。

在这里插入图片描述

常用的有:
Publish JUnit test result report:测试结果报告
Publish Javadoc:发布文档
Set GitHub commit status:发送状态结果到github
Publish HTML reports:发布代码覆盖率的HTML报告。
E-mail Notification: 邮件通知,构建完成后发邮件到指定的邮箱。

七、总结

Jenkins对于开发人员来说,还是比较友好的,虽然在新建Jenkins任务时做校验配置及脚本是比较麻烦,一但做好这些操作,便可以节约大家不少时间,并且能够监控构建过程,生成构建报告结果等。
我们在对jenkins进行了进一步的了解后,更重要的是要把学到的东西能学以致用。比如在我们目前的项目中就可以很好的利用其分布式构建的特性来解决不同项目的构建环境的差异性。也可以在持续集成这一套上面做好一套流程规范,如图:

在这里插入图片描述

目前Jenkins还是对云原生不是很友好,Jenkins集成docker,在插件上面多的有点分不清,但并没有很好的一个自动化解决方法。往往还需要手动操作很多步骤,不过目前可以使用JenkinsX很好的解决这一方面,有兴趣的同学也可以进一步了解一下。

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐