1 为什么要引入jenkins
- 人都向往自由,自由是舒服的,但自由是无序的,混乱的,也是低效的。管理就是要让无序、混乱、低效变的有序、齐整和高效。但管理需要成本,需要制定规则,需要去推行和实施这个规则,对任何人来说都是痛苦的。映射到开发中就是不能让开发流程处于自由的状态,应该是一个有序的集合,需要有相关的规则去阻止一些混乱的行为,这样才能产出高效,责任清晰。
- 对项目组公共代码仓库中的代码,是否有经常下下来编译不通过的情景,也不知道是那一次谁提交的,什么时候提交的,你还要回到历史的提交点一个个去确认是那个提交编译出问题了,在去找相关的提交者去修复,如果提交者休假或者离职了你才发现这个问题,而现在却要等着用程序,作为项目管理者这就是你的失职。为了避免出现这种情况,你只能定期的去监控代码仓库,发现有改动就下载下来进行编译,确认是否有问题,并通知相关责任人,这些虽然简单但是还是很耗人精力的,不做就有风险,做就是管理的成本在里面。
-
项目代码你可能可以编译通过,但是运行的时候却出错了,你这时又要追溯到历史的提交点一个个去确认那个提交是最终正常的版本,在让相关责任人去修复代码,为了阻止这种情况发生你只能制定相应的规则,强制要求提交者在提交之前都必须进行冒烟测试(系统能正常运行的最低测试)
上面提到的场景,很大一部分是可以通过工具进行自动化进行的。所以我们需要这样的一些工具来管理开发的一些流程。让无序变的有序,让混乱变的齐整,让重复和可以自动化的事情交给机器去做,解放你的时间,让有限的时间去做更多无限的事。 - Jenkins就是这样的一个工具能让项目管理的一些流程自动化,它可以自动构建项目源码,自动进行单元测试,自动部署等。它可以监控代码仓库的变化,并根据变化进行自动的编译,如果编译不通过它会发邮件通知项目管理者和出错提交的责任者,可以及时对出错进行跟进,避免出现风险。同时它也可以进行自动化的单元测试,并生成测试报告,如果测试出现问题,也会及时邮件通知相关人员。
- 所以我肯定只要你有在做项目源码的管理,就一定需要像jenkins这样的工具,因为它能解决日常开发流程中出现的一些尖锐问题,解放项目管理者的时间,用不大的代价(学习jenkins的管理成本),来提升开发的效率,降低开发管理的成本。
2 jenkins安装
我安装的机器软件环境是
Ubuntu 14.04.4 LTS trusty
按下面jenkins官网的命令进行安装,有些问题(我这边系统的默认ppa源有点旧无法自动安装依赖的Java8环境)
wget -q -O - https://pkg.jenkins.io/debian/jenkins.io.key | sudo apt-key add -
sudo sh -c 'echo deb http://pkg.jenkins.io/debian-stable binary/ >/etc/apt/sources.list.d/jenkins.list'
sudo apt-get update
sudo apt-get install jenkins
2.1 软件手动安装
需要提取预装Java 8或者更高版本的的JRE或者JDK都可以
我这边安装的是oracle的JDK
1)添加ppa
$sudo add-apt-repository ppa:webupd8team/java
$sudo apt-get update
2)安装jdk8
$sudo apt-get install oracle-java8-installer
安装器会询问你是否同意oracle的服务条款,同意即可
因为我这边下载速度很慢,我中断了安装,去oracle官网下载JDK包
jdk-8u151-linux-x64.tar.gz
放在/var/cache/oracle-jdk8-installer,删除上一次安装的锁和缓存数据,重新安装就会用下载好的包进行安装
$sudo rm -f /var/lib/dpkg/lock
$sudo rm -f /var/cache/apt/archives/lock
$sudo rm -f /var/cache/debconf/*
$sudo dpkg --configure -a
$sudo apt-get install oracle-java8-installer
3)设置系统默认jdk版本
$sudo update-java-alternatives -s java-8-oracle
查看jdk看是否安装成功
$java -version
4)安装jenkins的安装包
直接在官网下载最新的安装包jenkins_2.73.3_all.deb,用dpgk安装不会自动安装依赖的软件,如果提示需要依赖其他软件用apt-get install自行安装
$sudo dpkg -i jenkins_2.73.3_all.deb
5)其他问题
如果你不是按步骤2进行安装JDK而是解压进行安装JDK的话,配置并启用JDK的相关环境变量之后,进行deb包的安装提示用的还是旧的JDK环境,需要进行下面设置(使用解压安装JDK的话,Ubuntu的包管理器并不清楚我们已经安装了最新的jdk,因此我们需要将我们安装的jdk信息加入到Ubuntu的包管理器当中)
$sudo apt-get update
$sudo apt-get remove default-jre default-jdk
$sudo apt-get update
$sudo apt-get install default-jre default-jdk
6)测试jenkins安装是否成功
在安装的机器上使用浏览器登录http://localhost:8080/(如果在其他机器上登录,需要把localhost替换成安装机器的具体IP,我这边安装jenkins机器的IP是172.16.1.143,我的win7机器上进行登录直接输入:http://172.16.1.143:8080/)
如果能出现jenkins的相关界面说明安装已经成功。
2.2 简易安装
-
如果你嫌2.1的安装过程太麻烦,或者对linux环境也不熟,安装遇到一些问题也不知道什么去解决的话,可以直接用BitNami stacks提供的大安装包进行安装。BitNami stacks除了包含应用程序本身,还包含了用以运行该应用程序所需的其它软件(当然不是所有的软件都是必须的,既然你选择了它的简单就要忍受它对你机器空间的浪费,手动安装,一些不需要的软件就可以精简不安装比如docker容器)。用这种方式进行安装它的安装环境和系统中的其他软件是隔离开来的,也就是说不会污染到现有系统的工作环境,如果你当心用手动进行安装的话会破坏现在机器上的软件工作环境的话用这种方式进行安装也是一种很好的选择。下面是BitNami stacks提供的jenkins的下载界面:
https://bitnami.com/stack/jenkins/installer
3 jenkins配置
3.1 初次使用的基本配置
安装成功之后,会有一个jenkins用户,jenkins的home目录默认在
/var/lib/jenkins
1)解锁jenkins
登录http://localhost:8080/,如果是第一次登陆会要求你进行解锁,按提示到对应的目录去拷贝解锁密码(初始管理员密码),填入提示框。
2)插件安装
完成解锁之后,继续进行插件安装提示,有默认和自定义,一般用默认也就可以了,如果你对jenkins比较熟也可以自定义进行安装,只选择自己需要的插件进行安装。
3)注册新管理员
插件安装完之后需要注册一个新的管理员账号,按提示进行注册就好,注册成功之后就可以用该管理员帐户进行登录了。
4)和git服务器通信的公钥密码生成
- 我这边的源码是用gitolite+git进行管理的走的是SSH协议,需要用公钥密码对访问者进行认证。需要生成公钥密码对。
- 第一次使用jenkins账号需要先配置一下密码,切换到root,用passwd对jenkins设置密码,切换到jenkins账号,使用RSA算法作为公钥密码
$su root
#passwd jenkins
#exit
$su jenkins
$ssh-keygen -t rsa
生成的密钥默认存放位置jenkins home目录下的.ssh
~/.ssh
生成两个密钥id_rsa(私钥)和id_rsa.pub(公钥)
公钥需要提供给需要登录的服务器(这里是gitolite)做授权用
5)把公钥提交到gitolite服务器
把公钥改名为jenkins.pub并给gitolite的管理员让他提交到对应的key目录,我这边gitolite和jenkins安装在同一台服务器上,所以服务器地址直接是127.0.0.1,操作如下
$su zgk
$git clone git@127.0.0.1:gitolite-admin
$cp jenkins.pub gitolite-admin/keydir
$git add .
$git commit -m “add user jenkins”
$git push
添加完之后切换到jenkins账号,测试下连接是否正常,我这边提供了一个testing的测试仓库(对所有用户权限全开),如果能正常clone下来说明和git服务器的连接已经配置好了,我这边环境测试如下:
$su jenkins
$cd ~
$git clone git@127.0.0.1:testing
3.2 系统管理
在http://localhost:8080/ 主界面,系统管理,可以对系统进行设置,安全配置等
1)系统设置
我这边的环境只是设置了一个系统管理员邮件地址,如果任务构建失败的话,有指定邮件通知责任人和相关人员时需要通过该邮件地址进行发送出去。
2)全局安全配置
- 这一版本的jenkins启用了一些默认安全特性,默认情况下不允许新用户注册,启用防止跨站点请求伪造(如果仅在在局域网内使用,关掉也没关系)
-
如果你想要登录界面可以进行注册用户的话,勾选下面圈起来的选项
-
下面对登录的用户权限进行管理进行介绍
一般选择安全矩阵或者项目矩阵授权策略就行,两者的差别后者可以单独对某个项目进行权限配置(但是我没找到配置的地方),这里我用安全矩阵进行设置,下面是我test账号的设置例子,圈起来的部分
- Overall: read的权限打开,否则登录之后什么都看不到
- Job(就是你要管理的项目): read,build,cancel,Discover,Read,Workspace
- view: Read
3)其他介绍
其他一些比较常用如,管理插件,系统信息,管理用户如下图圈起来部分,界面都有介绍也比较好理解,其中系统信息包含的环境变量,可能在你编写项目构建脚本时会用到相关的变量
4 创建一个自动构建的任务
1)新建
点击新建,如下图所示
2)填写任务名称并选择类型
如下图所示,一般选择自由风格的也就够用了,如果你的项目比较复杂可以使用pipeline来自定义一个任务模型,pipeline有相应的语法结构,可以编写从构建,测试,到部署的所有环节,可以按阶段,按步骤执行。
3)一般配置
进入配置界面,包含六部分,如下图圈起来的部分
其中General是一些通用的配置,可以对项目进行简要介绍
4)源码管理
我这边使用git仓库,URL使用git clone用的地址就可以,编译的分支选择你需要监测的分支(如果你的源码仓库有好多分支,每个分支都要监测的话,这一格留空就好了)配置一切正常的话是如下图所示
如果出现下图的情况
可能有下面几个原因
(1)你URL的格式不对或者对应的仓库不存在
(2)你jenkins的公钥密码没有提交到gitolite的服务器(可以参考第3部分相应配置介绍)
(3)Jenkins访问的仓库对jenkins没有开放权限(至少是读的权限,一般对应的代码仓库给jenkins开放读的权限也就够了)
5)构建触发
一般使用Poll SCM轮询源码仓库的方式,也就是说定时去检查源码仓库是否有变化有变化的就会去执行构建脚本,下面日程表代表:每两分钟去执行一次检查
日程表的语法结构和linux的cron 命令语法非常相似,稍微有点差别。
日程表主要有5个域,每个域用空格或者TAB键隔开
从左到右分别代表:“分钟 小时 天 月 周”
分钟 | 0–59 |
---|---|
小时 | 0–23 |
天 | 1–31 |
月 | 1–12 |
周 | 0–7, 0 和7代表星期天 |
还有一些特殊的字符
- *:星号,代表所有的值都是有效的,也就是说出现在对应的域就代表着每分钟/每小时/每天/每月/每周的每天都有效。
- M-N:减号,代表一个从M到N的一个值范围。
- /X :斜杠,代表每隔X间隔(单位为对应域的单位,比如出现在小时域,每隔X小时)
- ,:逗号,用来穷举同一个域的所有有效值,比如A,B,C 代表A,B,C三个值都有效
- H:hash,代表一个范围内的随机值,主要是为了负载均衡考虑的
6)构建环境
我这边选择在构建之前先清空工作空间
7)构建
-
可以根据自己的项目情况去编写构建的脚本。如果你的构建脚本经常变的话,也可以考虑直接写成脚本文件放在源码仓库进行管理,构建的时候只要直接调用项目代码里面的脚本文件去执行就好了。
当然构建过程可以分多步进行,你可以按上面方式继续增加构建步骤。
8)构建后操作
-
构建失败或者构建状态发生变化可以发邮件通知相关人员和提交者,我这边用的是jenkins默认的邮件通知系统,如果你需要制定更丰富的邮件通知模板可以使用扩展的邮件通知(这个需要使用插件,默认已经安装)
-
需要注意的是:
如果提交者之前没有在jenkins上进行注册,提交之后会自动生成一个帐号,但是如果编译出错jenkins不会发送邮件给该提交者,解决的方法,最好提前给所有提交者都注册一个jenkins的帐号,当然如果之前没有注册的话,你需要给该提交者设置一下密码该提交者就会成为合法用户。具体密码设置可在主界面的用户->“对应帐号”->设置,如下图所圈位置重置下密码就可以正常发送邮件了。
5 创建好的项目界面说明
1)项目主界面
进入相应的项目主要界面如下
2)修改记录
如下图所示,可以观察到源码仓库提交的修改记录
3)工作空间
如下图所示,工作空间就是jenkins从git仓库下载源码到自己的构建目录的区域,可以查看对应的文件,也可以直接下载全部的文件
4)立即构建
可以手动触发项目进行构建,在你初步创建构建项目之后,进行构建测试时比较有用。
5)删除Project
可以直接删除这个项目
6)配置
可以对你的项目进行配置修改
7)构建历史
可以查看你项目过往的构建情况,如下图所示红色的表示构建失败,蓝色的表示构建成功
你可以点击对应的按钮去查看该次构建输出信息,如下图所示
6 后记
- 上面记录我从安装,配置,使用的过程及该过程遇到的一些问题,基本上也能满足中小型项目日常的持续集成,自动构建,自动测试,自动部署过程。当然也可以用pipeline来构建更复杂的项目,目前jenkins的blue ocean插件也把pipeline语法界面化了,让使用pipeline自定义模型更友好。
- 为什么选择jenkins而不是其他持续集成工具,对我来说选择的标准是,开源免费,文档丰富,使用简单,学习成本低,能够很好的解决我现在遇到的实际问题,这些就已经够了(当然肯定有更好的工具,但评估和测试一个工具也需要花大量的时间,而且不一定有正向的产出)。
参考资料
[1] https://jenkins.io/doc/
[2] http://www.cnblogs.com/a2211009/p/4265225.html