服务概述
Jenkins简介
Jenkins是一个开源软件项目,是基于Java开发的一种持续集成工具,用于监控持续重复的工作,旨在提供一个开放易用的软件平台
功能介绍
- 一个自动化的周期性集成测试过程,从检出代码、编译构建、运行测试、结果记录、测试统计等都是自动化完成的,无需人工干预,有利于减少重复过程以节省时间、费用和工作量
- 它需要有代码托管工具支持,比如SVN git
- 监控软件开发流程,快速显示问题
什么是持续集成
持续集成(Continuous integration),简称CI,是指开发阶段,对项目进行持续性自动化编译、测试,以达到控制代码质量的手段。持续集成是一种软件开发实践
为什么要持续集成
- 易于定位错误。也就是当你的持续集成失败了,说明你新加的代码或者修改的代码引起了错误
- 更加充分地测试系统中的各个单元
- 有助于项目的开发数据的收集
- 便于开发流程的管理。要把一个开发的build提交给测试组作测试,测完满意了,再提交到发布组去发布
安装和运行
RPM安装
确定Java版本在1.8.0_11及以上,如果低于此版本,请按照以下步骤更新Java
tar -zxf jdk1.8.0_201.tar.gz -C /usr/local
vim /etc/profile 追加内容
export JAVA_HOME=/usr/local/jdk1.8.0_201
export JRE_HOME=/usr/local/jdk1.8.0_201/jre
export CLASSPATH=$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar
export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH
source /etc/profile
验证jdk版本: java -version
如下所示,本机版本以达到,不需要安装Java
[root@localhost ~]# java -version
java version "1.8.0_201"
Java(TM) SE Runtime Environment (build 1.8.0_201-b09)
Java HotSpot(TM) 64-Bit Server VM (build 25.201-b09, mixed mode)
安装
wget https://pkg.jenkins.io/redhat-stable/jenkins-2.138.2-1.1.noarch.rpm
rpm -ivh jenkins-2.138.2-1.1.noarch.rpm
YUM安装(需要先安装jdk)
配置Java环境如上,其他步骤如下所示
wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat-stable/jenkins.repo
rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io.key
yum -y install jenkins
初始化Jenkins
vim /etc/sysconfig/jenkins
JENKINS_PORT="9090" 因为本机还有gitlab,会占用8080端口,所以为了让两者不冲突,这个改一下端口
systemctl start jenkins
firefox 127.0.0.1:9090
出现提示页面:确保Jenkins是管理员安装的,需要验证一下管理员初始密码,路径已给出,为/var/lib/jenkins/secrets/initialAdminPassword,另开一个终端,cat一下,粘贴过来
[root@localhost ~]# cat /var/lib/jenkins/secrets/initialAdminPassword
d25e7dd3807e4e2cb25a9f8725b83685
继续上一步,填写完密码后提交,会提示Plugins extend Jenkins with additional features to support many different needs. 让你安装插件,提供两种方式,一种是安装推荐的,一种是自选进行安装的组件,我们在这里选择第一个,安装推荐的插件(Jenkins配置好之后也可以安装插件),点击之后,默默等待一会。之后会提示建立第一个管理员账号,一次填写用户名、密码、确认密码、全名和邮箱,全名和用户名写一样即可,在这里我都写admin,邮箱写自己的邮箱,填写完成之后点击页面右下角的Save and continue,之后会提醒你设置Jenkins的url,这里设置成本机IP+端口吧 http://192.168.43.74:9090/ 然后点击save and finish,再点击start using Jenkins即可进入Jenkins页面
配置全局工具
manage Jenkins—global tool configuration—在这里可以添加系统已经安装的工具,可以选择自动安装,也可以选择手动安装并指定路径的方式,在这里先把git的path改成/usr/bin/git,jdk是系统自带的,所以我们不用写路径,maven还没有学习,我们点击add maven,然后点击apply,再点击save
设置中文环境以及插件管理
管理插件
点击主页面左侧菜单manage Jenkins—点击右侧出现的manage plugins—点击available即可查看所有可安装而没安装的插件,点击installed可以查看已安装的插件
安装中文界面插件(如果需要)
在页面右上角的filter搜索框中所有Locale,检索结果会出来一个Locale插件,点击它前边的复选框,点击下边的install without restart 完成安装。之后点击主页面左侧的manage Jenkins,点击右侧的configure system,下拉页面找到Locale,在框框里输入zh_CN,并点击下面的复选框,表示忽略浏览器的默认设置而强制设置成中文显示,然后点击页面左下角的apply,之后点击页面下侧的save。中文的版面看起来其实不是很爽,所以我们还是切换回原来的英文版界面进行操作
安装gitlab插件
点击available,在右上角filter框里输入Gitlab,安装Gitlab Authentication和Gitlab,点击install without restart,出来新页面后把下面的复选框[Restart Jenkins when installation is complete and no jobs are running]勾选上,在新的页面会显示各个步骤的进度条,最后一项是restart Jenkins,默默等待一会,过一会再请求页面的时候回提醒你重新登录,安装后重启才能生效
常见插件及含义
- LDAP 这个插件允许使用LDAP对用户进行认证,LDAP服务器可以为Active Directory 或OpenLDAP
- Active Directory 这个插件允许使用Active Directory对用户进行认证,同时结合诸如Matrix Authorization Strategy插件,可以识别用户所在的所有用户组,对用户授权进行灵活配置
- Gitlab Authorization Stragegy 这个插件提供了一种基于角色的用户权限管理策略,支持创建global角色、project角色、slave角色,以及给用户分配这些角色。这款插件是最常用的Jenkins权限策略和管理插件
- Git 支持使用Github Gitlab Gerrit等系统管理代码仓库
- Subversion 支持Subversion系统管理源代码
- rigger builds remotely jenkins内置功能,远程触发构建,通过设置token可以支持远程脚本中触发Jenkins构建
- Gitlab 这个插件将Jenkins集成到gitlab web hook中,支持gitlab分支及Merge Request等相关事件触发Jenkins构建
- JIRA Trigger 这个插件将Jenkins集成到Jira WebHooks中,支持jira issue的状态等变化时触发Jenkins构建
- Workspace Clenaiup 这个插件支持在构建任务的不同阶段插入环境变量,并在构建结束导出所有的环境变量等功能
- Mailer 这个插件支持基本的邮件通知功能,比如构建失败和构建恢复陈宫可以发送邮件通知相关人员
- Email Extension 这个插件是邮件通知的扩展,支持定制邮件内容,触发条件以及邮件接收者,功能比基本邮件通知要灵活强大的多
- Backup 这个插件添加备份功能到Jenkins management
用户管理
创建用户
jenkins主页面点击左侧manage Jenkins—右侧manage users—点击左侧的create user, 依次填写username/password/confirm password/full name/e-mail address/ 本机填写信息如下: userb/beidaqingniao/beidaqingniao/uesrb/2570267208@qq.com 填写完成后点击create
权限管理
- 全局权限管理
jenkins主页面点击左侧manage Jenkins—右侧configure global security—点击下边authorization的Project-based Matrix Authorization Strategy ,这个是项目矩阵授权,可以勾选要给用户的权限。默认没有自己添加的用户,点击下边的add,输入我们刚才创建的userb点击OK,之后就出现了userb在矩阵中,userb现在并没有任何权限,我们可以根据需要给userb权限,比如给userb一个read的权限,然后点击apply,点击save
- 作业中权限管理
该策略是将前面Matrix-base安全策略应用到单个project中。Matrix-base中的权限是针对整个系统的,而Project-based是进一步设置用户在每个具体project上的权限。在这种策略下,具体project的configure界面中,会出现”Enable project-based security“复选框,选中后就可以设置用户能够对该project操作的权限。
新建项目
创建一个maven项目
需要安装Maven integration 插件 请自行安装
创建项目步骤如下:
点击作业面左侧菜单的new item,在新出来的页面输入项目名称,比如bdqnWebTest,在这里可以选择第一个自由风格来创建项目,也可以选择第二个maven项目,第四个multi-configuration project是多配置项目,一般用户多平台开发(多个作业的集合,如Android用grandel一次性编译出不同版本的apk)。我们这里选择第二个maven项目,选择完成后点击页面左下角的OK。在新弹出的页面会有很多信息,第一个是描述信息,可以根据需要自己填写。点击下边的enable project-based security,也会出现授权矩阵,可以添加用户并赋予权限,这里的矩阵授权是对于这个项目来说某个用户具备的权限。
可以看到 有很多项 我们一项一项去配置
source code management
build triggers
post steps
构建
回到主界面,点击后边的符号进行构建
左下角的构建执行状态就会显示正在构建的任务,点进去就能看到详细的信息
构建任务完成的界面如下 点击左侧的console output 可以看到终端输出信息
创建完之后 主界面的显示状态
关于创建项目的系列说明
- 构建结果
第一列是 “上次构建状态显示”,是一个圆形图标,一般分为四种:
蓝色:构建成功;
黄色:不确定,可能构建成功,但包含错误;
红色:构建失败;
灰色:项目从未构建过,或者被禁用;
注意:手动触发构建的时间与自动定时构建的时间互不影响
-
关于代码库
这里使用的示例代码用的是《Jenkins权威指南》一书,github地址:https://github.com/wakaleo/game-of-life 这是一个公共代码库,你可以在线上查看源代码,并复制自己的工作副本,如果要想修改源码的话,需要创建自己的分支,一个分支是代码库的个人副本,要创建一个分支,首先要登录GitHub账号并跳转到repository URL,之后单击Fork按钮,这会创建自己的代码副库本。
如下图,分支创建成功
分支创建成功后,上边的url加上.git就是代码仓库的地址 -
关于代码仓库的用户名和密码
用户名和密码就是自己GitHub的用户名和密码 -
关于项目中各部分的说明
build trigger 决定了什么时候做事情; source code management决定从哪里找代码仓库 ;post steps决定干什么; build now 现在就干
-
构建成功百分比
当一个Job中构建已完成并生成了一个未发布的目标构件,如果您准备评估此次构建的稳定性,Jenkins会基于一些后处理器任务为构建发布一个稳健指数 (从0-100 ),这些任务一般以插件的方式实现。它们可能包括单元测试(JUnit)、覆盖率(Cobertura )和静态代码分析(FindBugs)。分数越高,表明构建越稳定。下图中分级符号概述了稳定性的评分范围。任何构建作业的状态(总分100)低于80分就是不稳定的
-
关于构建的两个项
Build periodically:不关心源码是否发生变化,周期性的进行构建
Poll SCM:关系源码变更,定时检查源码变更,若有更新则checkout最新代码,执行构建操作
gitlab触发更新
应用场景:开发同事在提交代码到gitlab代码仓库后,自动触发Jenkins进行构建,以便验证代码和测试用例的正确性
Jenkins开启构建触发
需要安装两个插件:Gitlab Hook / Build Authorization Token
使用命令行生成token令牌
[root@localhost ~]# openssl rand -hex 12
e19b68f76353decfe60e0cb9
jenkins添加触发构建
修改上述创建的项目,在Build Triggers中选择远程触发构建,令牌输入上面的令牌。具体步骤:在主页面点击项目名称进入项目,点击左侧configure,点击右侧build triggers,选中Trigger builds remotely (e.g., from scripts),在下边输入刚才产生的token令牌,然后点击apply/save
不同版本的gitlab,钩子形式可能不一样,有的是webhooks,有的是token远程认证
gitlab配置webhook
登录gitlab,在首页点击狐狸头的图标,点击项目名称ios/ios,左侧菜单下拉到最后,鼠标移动到settings上回出现一个菜单,点击Integrations,点击Integrations进入新的页面,在url栏写入 http://192.168.43.249:8080/buildByToken/build?job=bdqnwebtest&token=58eedf09f13a27bc17da54b9,在下边勾选push events,下拉页面,去掉Enable SSL verification前边的钩,最后点击add webhook,add之后下拉页面,可以看到刚才添加的webhook,点击test后边的下拉三角号,点击push events,测试一下,如果OK 会返回“Hook executed successfully:HTTP 201”,如果报403,请检查一下是否是Jenkins没有安装Gitlab Hook 和 Build Authorization TokenL两个插件
添加完成后测试一下
gitlab配置webhook,报错 url is blocked Requests to the local network are not allowed。报错原因:gitlab 10.6 版本以后为了安全,不允许向本地网络发送webhook请求,如果想向本地网络发送webhook请求,则需要进行设置,设置步骤如下—> gitlab上点击扳手—点击左侧菜单最下边的settings—找到右侧的Outbound requests,点击expand—勾选下边的Allow requests to the local network from hooks and services 复选框,然后点击save
验证触发器正确性
在gitlab上进行文件上传,将文件上传到代码仓库上,操作如下:
往代码仓库新增一个txt文档,验证是否会自动触发Jenkins进行构建
117 git clone git@gitlab.bdqn.cn:ios/bdqnapp.git
118 cd bdqnapp/
119 ls
120 touch a.txt
121 git add a.txt
122 git commit -m "test file"
123 git push origin master
因为项目小,所以构建非常快,可以查看一下终端输出结果,如下,显示从远程主机192.168.43.101启动,而192.168.43.101就是gitlab的IP地址
Jenkins的持续集成工作原理
这里是选择Gitlab作为git server。Gitlab的功能和Github差不多,但是是开源的,可以用来搭建私有git server,也提供非常强大的web GUI,比如开发者互相review源代码的时候就会很方便。
系统的工作流程大概分为以下几步:
1> 开发者将新版本push到git server (Gitlab)。
2> Gitlab随后触发jenkins master结点进行一次build。(通过web hook或者定时检测)
3> jenkins master结点将这个build任务分配给若干个注册的slave结点中的一个,这个slave结点根据一个事先设置好的脚本进行build。这个脚本可以做的事情很多,比如编译,测试,生成测试报告等等。这些原本需要手动完成的任务都可以交给jenkins来做。
4> 我们在build中要进行编译,图中使用了分布式编译器distcc来加快编译速度。
slave集群
应用场景:公司只有一台服务器而项目过多,性能不足。多个作业同时构建时候构建速度慢。项目构建资源分配上不合,需要多个节点分配进行构建作业。
添加slave节点
添加节点之前需要做免密登录,操作如下
[root@localhost ~]# ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
/root/.ssh/id_rsa already exists.
Overwrite (y/n)?
[root@localhost ~]# ssh-copy-id -i /root/.ssh/id_rsa.pub root@192.168.43.249
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"
The authenticity of host '192.168.43.249 (192.168.43.249)' can't be established.
ECDSA key fingerprint is SHA256:AAVS/5ORVvMlEZUxXtGwVCj39bPYFHcSmoIrBwgEU4w.
ECDSA key fingerprint is MD5:2f:57:89:03:9d:52:91:0d:9d:b5:6d:f9:ff:1b:2f:3d.
Are you sure you want to continue connecting (yes/no)? yes
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
root@192.168.43.249's password:
Number of key(s) added: 1
Now try logging into the machine, with: "ssh 'root@192.168.43.249'"
and check to make sure that only the key(s) you wanted were added.
其他步骤如下所示
添加完节点之后,可以看到主从的状态
manage jenkins—点击右侧manage nodes—点击左侧菜单的new node—node name 填写192.168.43.249-slave1并勾选下边的permanent agent,点击OK—在新出来的页面里已经有了nodename了,填写下一项description,这一项可以写上slave的ip,remote root directory填写/var/lib/jenkins,lable可以写个webitem,usage选择only build jobs with lable expressions matching this node,launch method就选择launch agent agents via SSH,下边的host写slave的ip,在credentials后边点击add,再点击Jenkins,在新弹出的页面里输入username为root,密码为slave开机密码,id为1,这个id是这边主给slave的序号而已,描述信息随便写,填写完成后点击add,出来之后在前边点击下拉三角号选择刚才添加的root***。 Host Key Verification Strategy选择manually trusted key Verification startegy,之后点击页面下侧的save,之后刷新一下页面,就可以看到主和从的状态
指定从节点运行作业
在主节点的jekins首页点击项目名称进入项目,然后点击左侧菜单的configure,点击右侧的general,往下拉找到Restrict where this project can be run并勾选,在新出现Label Expression框里输入192.168.43.249-slave1
报错说明
It appears that your reverse proxy set up is broken.
进入管理界面就提示这个错误,这是因为Jenkins的URL没有写对,如果本机端口没有修改的话就是8080,那么Jenkins的URL就是本机ip:8080 修改过来就好了 修改方法: manage jenkins — configure system