1.前言
1.1.jenkins介绍
jenkins是基于java开发的一种持续集成工具,用于监控持续重复的工作,功能包括。
1、持续的软件版本发布/测试
2、监控外部调用执行项目
Jenkins其实很早之前就有了,最近火起来的原因是,大家都在关注devops,关注如何来做持续集成,持续交付,如何来做CI/CD。Jenkins作为持续集成的工具,他其实只是一个平台或者是一个大的框架,它的工作完全就是依靠插件,也就是说你想使用什么功能,你就找到什么样的插件。
1.2.jenkins好处
1、我在工作中部署jenkins的最大好处就是每次在开发、测试环境代码,都无须运维部署
,而是相关的开发人员,测试人员登录jenkins传入需要部署的tag即可,整个部署过程无须运维参与,解放运维劳动力。
2、安卓,IOS自动打包:虽然打包和运维关系不大,但是运维实现自动打包,使得产品同学,运营和测试同学可以每日验证产品开发进度以及及时反馈开发功能的方向是否正确
,对公司贡献还是不小的。
1.3.我的jenkins实践
由于我们在使用jenkins之前,有自动化部署的shell脚本和上线流程,使用jenkins也就是让开发,测试人员可以通过一个web界面来执行脚本,实现部署。
我们公司一个产品线有四个环境,开发环境,测试环境,预上线环境,生产环境。除了生产环境之外都是通过jenkins来部署代码。
我们在生产实践中,jenkins使用到了下面三种部署方式:
jenkins触发式构建:用于开发环境部署,开发人员push代码或者合并代码到gitlab项目的master分支,jenkins就部署代码到对应服务器。
jenkins参数化构建:用于测试环境预上线环境部署,开发push代码或者合并代码到gitlab项目的master分支之后,并不会部署代码,而是需要登录到jenkins的web界面,点击构建按钮,传入对应的参数(比如参数需要构建的tag,需要部署的分支)然后才会部署。
jenkins定时构建:用于APP自动打包,定时构建是在参数化构建的基础上添加的,开发人员可以登录jenkins手动传入tag进行打包,如果不手动打包,那么jenkins就每天凌晨从gitlab拉取最新的APP代码打包。
补充一下:jenkins不光可以用来部署代码,还可以这么玩(虽然我没有这么干过,但是你有兴趣可以试试):
1、各种服务的备份也可以放到jenkins上面,每天使用jenkins定时备份,还可以在jenkins看每天备份的输出信息。
2、各种开发需要找你的工作,比如同步生产数据库到开发环境,这个也可以放到jenkins上面,开发每次需要同步,就登录jenkins找到数据库同步的job,点击构建,就自动同步了。
1.4.jenkins使用前提
(1)得到领导的支持,我在公司推动jenkins部署APP自动打包,可以说是前段,后端,移动端,测试,产品等人员都需要沟通,这种情况下得到领导的支持在推动好处还是大大的。
(2)你们公司的代码需要一个分支管理规范,代码没有一个好的分支管理规范,自动部署是玩不了的。可以参考Git 分支管理最佳实践看看那种方式适合你们公司。
(3)使用jenkins之前,你需要有通过shell实现自动化部署代码的成功经验。
(4)持续集成最好有自动化测试,没有也行,但是最好让开发人员提供一些api的监控脚本,每次构建之后验证部署是否正常。
2.jenkins部署
2.1.下面内容介绍
(1)jenkins的安装配置
(2)jenkins插件自动/手动安装
(3)jenkins触发式构建配置
(4)jenkins参数化构建配置
(5)jenkins定时构建配置
(6)jenkins用户权限配置
2.2.环境介绍
操作系统:Centos 7.2
jenkins版本:2.33
gitlab版本:8.13.6
两台服务器:
192.168.100.10:jenkins Server
192.168.100.11 :gitlab Server
2.3.jenkins安装
(1)jenkins是java编写的,所以需要先安装jdk,这里使用yum安装。
yum -y install java-1.8.0 java-devel-1.8.0
jenkins还需要从gitlab拉取代码,所以我们需要安装git命令行客户端
[root@node1 ~]# yum -y install git
(2)安装jenkins
cd /etc/yum.repos.d/ wget http://pkg.jenkins.io/redhat/jenkins.repo rpm --import http://pkg.jenkins.io/redhat/jenkins.io.key yum install -y jenkins systemctl start jenkins
(3)访问jenkins
在浏览器打开输入http://IP:8080/访问jenkins。
为了安全考虑,需要解锁jenkins,把/var/lib/jenkins/secrets/initialAdminPassword文件内容复制到administrator password下方即可。
[root@Jenkins ~]# cat /var/lib/jenkins/secrets/initialAdminPassword 2862d2ffc9aa40e1b80039e8ad9810ea
(4)选择安装的插件:只需要安装gitlab plugin,git plugin,还有ssh plugin插件即可,其他插件无须安装。
gitlab 和 git插件:我们的代码都放在gitlab上面,这两个插件用来做源码管理。
ssh插件:需要使用jenkins来执行shell命令。
创建admin用户:按照提示填写即可
密码创建完成之后就可以登录jenkins了。
3.插件安装
如果在安装jenkins的时候没有安装相关插件,可以按照如下方式安装(已经安装,则不需要)
1、安装gitlab插件,直接在系统管理>插件管理中搜索gitlab相关插件安装即可。
2、shell插件:还是刚才的位置搜索ssh 选择ssh plugin插件安装即可。
3.1.手动下载jenkins插件
插件下载地址:http://updates.jenkins-ci.org/download/plugins/
如果有插件一直安装失败的情况,可以从jenkins官网下载插件,然后导入到jenkins。
示例:我从官方下载gitlab-plugin插件到本地,然后导入到jenkins中。
在jenkins插件管理->高级选择上传插件进行安装。
4.Jenkins密钥配置
(1)jenkins生成密钥对
设置jenkins的shell终端为/bin/bash
[root@node1 ~]# grep jenkins /etc/passwd jenkins:x:993:990:Jenkins Continuous Integration Server:/var/lib/jenkins:/bin/bash
登录到jenkins用户生成密钥
[root@node1 ~]# su - jenkins bash-4.2$ ssh-keygen -t rsa bash-4.2$ cat .ssh/id_rsa.pub ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCwIdUk3+V8aL2/oMfvwCxp5AiyctL4bnYFnsKOcQz8w/MuAehy9/EEeT0HNQCSs0NQ3veFurWlKUB4tntNA7bMcZS/UWBSXh2uAJQCMcXbIWfdngaQwVVP+s5WvDbtL5Jk6mQch22aIIw4JaJh4L8dl1oyviwoBgOnscXVC/kDWgFM4BrHC4QNyzt6PdtuzX3RkMa4w7bqDvUWMqIyRBScW1fbfJeAwAK1tCQ7ZjfAoTcWpmoBlurH1P6SuWR3rYIPyhGDqjPQnlohqSX/vCrLWoHoYazETHfW2azzzBSGqMeCw3hlbSV/12kRQv0kGfnbhmnHZ1CBgX23N3ktqtzL jenkins@node1.fblinux.com
把这个密钥添加到gitlab还有jenkins服务器的root用户
为什么把jenkins公钥添加到root用户?
因为jenkins执行部署操作,会出现很多权限问题,一个一个解决比较麻烦(而且不同项目权限问题都不同),就算sudo授权也是需要授予最少10几条命令的权限,而且不能保证以后不会出现新的命令,所以我直接让jenkins用户通过root方式执行部署操作,简单粗暴。
(1)添加公钥到gitlab服务器,用来clone代码
添加完成之后从gitlab服务器clone下自己的工程,会在.ssh/known_hosts添加gitlab服务器记录
-bash-4.2$ git clone git@192.168.100.11:root/jenkins_test.git
(2)添加公钥到jenkins服务器root用户,用来执行部署脚本
-bash-4.2$ ssh-copy-id -i .ssh/id_rsa.pub root@192.168.100.10 root@192.168.100.10\'s password:
5.jenkins触发式构建
(1)准备一个测试脚本,看开发如何提交代码就执行这个构建操作。
[root@node1 ~]# cat /shell/deploy/test/jenkins_trigger.sh #!/bin/bash echo "部署脚本被执行" [root@node1 ~]# chmod +x /shell/deploy/test/jenkins_trigger.sh
注意:如果是生产配置,直接把这个脚本换成对应项目的上线脚本即可,jenkins配置无须修改。
(2)创建一个触发构建的项目,选择*软件风格即可
(3)源码管理选择git,然后只需要在repository url中输入git仓库地址即可。
(4)构建,选择execute shell,执行部署脚本即可
(5)触发器配置:即gitlab有提交操作,则自动部署,这里只需要设置一个认证的token即可,gitlab调用触发器,需要使用 JENKINS_URL/job/new_cms/build?token=TOKEN_NAME即可
(6)在系统管理–>用户管理–>查看用户id和token,需要把用户id和API Token加入触发器中,做用户验证
根据触发器验证令牌和用户id+token会生成一个下面的url,只需要访问这个URL地址jenkins就会自动部署对应项目的代码。
http://admin:984c9edf027e750f0587808fab0c3f9b@192.168.100.10:8080/job/jenkins_trigger/build?token=hehe
(7)gitlab配置webhooks,每次提交代码就访问这个url,执行构建
URL这里输入上面上面用户ID+API token+job token生成的URL地址即可。触发工作选择,push event,merge request event即可。
(8)在jenkins全局在jenkins全局安全设置中取消勾选“防止跨站点请求伪造,不然jenkins会认为gitlab的请求不合法。
(9)添加完成测试:点击test模拟提交操作,看看是否会执行自动构建
如果执行成功会返回如下显示,说明执行钩子成功
Jenkins查看,可以看到构建也是成功的。
6.jenkins参数化构建
(1)准备一个测试的脚本
#!/bin/bash git_pro(){ echo "拉取$1代码" } git_pro $1
(2)创建一个参数化构建的项目
(3)选择构建的参数:这里设置一个tag参数,就是每次执行job之前都需要传入这个tag
(4)设置执行部署的脚本
(5)选择创建的job执行构建
Tag处传入需要部署的tag即可
构建完成查看构建的结果
7.jenkins定时构建
定时构建一般用在安卓,ios打包,每天凌晨会拉取安卓,ios进行编译打包,并自动推送到共享。
示例:在上面的参数化构建示例上添加如下触发器,就是每天凌晨1:30分自动执行安卓或ios打包脚本,上面的参数化构建默认值是master就是每天从代码仓库的master分支拉取最新的代码打包。
8.Jenkins用户权限设置
现在各种job已经设置好了,但是如果开发测试人员需要部署一个tag到服务器进行测试,那么就需要登录jenkins,这个时候就需要给开发和测试人员创建一个可以执行job的用户,方法如下。
8.1.新创建一个用户
系统管理–>用户管理–>新建用户,按照提示填入信息即可