第1章 历史演变
行话:CI/CD /持续集成/持续交付/持续部署
1.1 开发写代码的演变
1.1.1 一个开发人员单独开发
一个码农单打独斗,撸代码,开发网站,自由自在;
1.1.2 多人一起开发代码
多个开发同时开发一个网站,同时改一份代码:采用分支结构,每天上班第一件事克隆代码,下班前最后一件事合并代码,但是同时改一个文件会导致冲突。
好景不长,开发越来越多,代码文件越来越多。每天下班前合并代码时,发现很多合并失败的文件。最后每天加班3小时人工合并代码。
- 解决办法:
将合并代码的周期缩短,以前一天,现在一小时,半小时。。。(根据开发人员效率决定)
1.1.3 持续集成
持续集成(CONTINUOUS INTEGRATION,简称CI)指的是,频繁地(一天多次)将代码集成到主干。
- 它的好处主要有两个:
- 快速发现错误。每完成一点更新,就集成到主干,可以快速发现错误,定位错误也比较容易。
- 防止分支大幅偏离主干。如果不是经常集成,主干又在不断更新,会导致以后集成的难度变大,甚至难以集成。
1.2 运维上线代码的演变
1.2.1 手工测试与上线
初级运维很苦逼,刚开始开发每天合并一次代码,然后运维把代码PULL下来测试就可以了,但是后来开发引进了持续集成方法论,开发们都“弹冠相庆”。运维一天到晚不停的测试代码每天下班之后,运维拖着疲倦的身子回到宿舍,就想有没有办法自动化?
- 解决办法:
- 让开发自己进行代码测试
- 让公司招聘专职的测试人员进行代码测试
- 使用自动化运维工具JENKINS
1.3 持续交付
持续交付(CONTINUOUS DELIVERY)指的是,频繁地将软件的新版本,交付给质量团队或者用户,以供评审,如果评审通过,代码就进入生产阶段,持续交付可以看作持续集成的下一步。它强调的是,不管怎么更新,软件是随时随地可以交付的。
借助自动化部署工具JENKINS,开发上传自己的代码到GITLAB,GITLAB发消息通知JENKINS随后JENKINS从仓库拉取代码,最后全自动部署到测试服务器进行相关测试,并将测试结果通知运维和开发,或者运维直接把这个工具交给开发使用,从此就可以专注其他工作了。
1.4 持续部署
持续部署(CONTINUOUS DEPLOYMENT)是持续交付的下一步,指的是代码通过评审以后,自动部署到生产环境,持续部署的目标是,代码在任何时刻都是可部署的,可以进入生产阶段。
代码测试通过了,该到生产环境部署了,运维又该干活了,其实这是一锤子买卖了,要么成功,要么失败回滚。可以使用自动部署工具(比如ANSIBLE,SALTSTACK等),但是很多公司还是相信人工上线。
第2章 JENKINS介绍
JENKINS是一个用JAVA编写的开源的持续集成工具。在与ORACLE发生争执后,项目从HUDSON项目独立出来。
JENKINS提供了软件开发的持续集成服务。它运行在SERVLET容器中(例如APACHE TOMCAT)。它支持软件配置管理(SCM)工具(包括ACCUREV SCM、CVS、SUBVERSION、 GIT、PERFORCE、CLEARCASE和RTC),可以执行基于APACHE ANT和APACHE MAVEN的项目,以及任意的SHELL脚本和WINDOWS批处理命令。JENKINS的主要开发者是川口耕介。 JENKINS是在MIT许可证下发布的自由软件。
第3章 安装部署JENKINS
3.1 环境准备
- 准备2台安装好2系统的虚拟机。
- Linux中能发邮件的账号
3.1.1 主机名及IP地址关系表
序号 | 主机名 | 主机IP地址 | 内存大小 |
1 | gitlab | 10.0.0.211 | 2G+ |
2 | jenkins | 10.0.0.212 | 1G+ |
3.1.2 Jenkins系统主机信息
[root@jenkins ~]# cat /etc/redhat-release CentOS Linux release 7.2.1511 (Core) [root@jenkins ~]# uname -r 3.10.0-327.el7.x86_64 [root@jenkins ~]# getenforce Disabled [root@jenkins ~]# systemctl status firewalld ● firewalld.service - firewalld - dynamic firewall daemon Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: enabled) Active: inactive (dead) [root@jenkins ~]# hostname -I 10.0.0.212 172.16.1.212 [root@jenkins ~]# hostname jenkins
3.1.3 Gitlab系统主机信息
[root@gitlab ~]# [root@gitlab ~]# cat /etc/redhat-release CentOS Linux release 7.2.1511 (Core) [root@gitlab ~]# uname -r 3.10.0-327.el7.x86_64 [root@gitlab ~]# getenforce Disabled [root@gitlab ~]# systemctl status firewalld ● firewalld.service - firewalld - dynamic firewall daemon Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: enabled) Active: inactive (dead) [root@gitlab ~]# hostname -I 10.0.0.211 172.16.1.211 [root@gitlab ~]# hostname gitlab
Gitlab安装过程请参看:http://blog.leonshadow.com/763482/426.html
3.2 安装JENKINS
3.2.1 下载RPM包
RPM包下载地址:
官网下载地址:http://pkg.jenkins.io/redhat-stable/
清华源地址:https://mirrors.tuna.tsinghua.edu.cn/jenkins/redhat-stable/
3.2.2 安装OpenJDK
[root@jenkins ~]# yum -y install java-1.8.0-openjdk java-1.8.0-openjdk-devel
3.2.3 安装Jenkins RPM包
[root@jenkins ~]# cd /server/tools/ [root@jenkins tools]# rpm -ivh jenkins-2.73.1-1.1.noarch.rpm
# 查看rpm安装内容 [root@jenkins ~]# rpm -ql jenkins /etc/init.d/jenkins # 启动脚本 /etc/logrotate.d/jenkins # 日志分割 /etc/sysconfig/jenkins # Jenkins配置文件,改端口,改用户 /usr/lib/jenkins # 存放war目录 /usr/lib/jenkins/jenkins.war /usr/sbin/rcjenkins /var/cache/jenkins # 网页代码存放目录 /var/lib/jenkins # Jenkins工作目录 /var/log/jenkins # 日志
3.2.4 启动Jenkins
[root@jenkins ~]# /etc/init.d/jenkins start
# Jenkins开启了服务器8080端口 [root@jenkins ~]# netstat -lntup Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1158/sshd tcp6 0 0 :::8080 :::* LISTEN 1481/java tcp6 0 0 :::22 :::* LISTEN 1158/sshd
3.3 配置JENKINS
3.3.1 解锁JENKINS
- 查看Jenkins安装后默认的admin密码:
[root@jenkins ~]# cat /var/lib/jenkins/secrets/initialAdminPassword 9a1f734e44a542c7v57153dbf2d350cf
- Web页面解锁Jenkins:
3.3.2 安装Jenkins插件
由于安装插件要从官网(国外网站)下载大约150MB左右文件,速度较慢,所以此处我们使用已经下载好的包直接安装插件的方式,但是在企业中建议使用直接从官网下载的方式,这样可以满足Jenkins插件兼容问题,否则不同版本的的Jenkins和插件之间也许会有兼容问题。
提示:企业中安装直接选择【Install suggested plugins】即可,或者自定义安装插件。
3.3.3 完成Jenkins配置
3.3.4 离线安装插件
3.3.4.1 解压插件离线安装包
[root@jenkins ~]# ls /var/lib/jenkins/plugins/ # Jenkins插件目录路径 [root@jenkins ~]# cd /server/tools/ [root@jenkins tools]# tar xfP jenkins_plugins.tar.gz [root@jenkins tools]# /etc/init.d/jenkins restart
3.3.4.2 Web页面安装插件
第4章 优化Jenkins
4.1 更改管理员密码
4.2 配置并发执行任务数量
提示:通常情况下并发执行任务数量设置为5个。
4.3 配置邮件
第5章 使用JENKINS
5.1 创建自动测试项目
5.1.1 生成SSH认证密钥
[root@jenkins ~]# ssh-keygen Generating public/private rsa key pair. Enter file in which to save the key (/root/.ssh/id_rsa): Created directory '/root/.ssh'. Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /root/.ssh/id_rsa. Your public key has been saved in /root/.ssh/id_rsa.pub. The key fingerprint is: 76:87:ca:bd:c7:72:16:46:1f:5e:81:1f:ef:7c:0e:ed root@jenkins The key's randomart image is: +--[ RSA 2048]----+ | . | | . o | | . +| | .. ..o| | S o..o * | | o + .o + =| | o .o . +.| | ..= E| | .= | +-----------------+ [root@jenkins ~]# ls .ssh/ id_rsa id_rsa.pub
[root@jenkins ~]# cat /root/.ssh/id_rsa.pub # 公钥 ssh-rsa AACDB3NzaC1yc2EAAAAWCFABAAABAQCay+Ek17865DwmfVpOuYFGoUROOMiHSWNfc/g5e ...省略部分输出内容... yEe//cBXe4HcBSU6wV7ZF282u/d root@jenkins
[root@jenkins ~]# cat /root/.ssh/id_rsa # 私钥 -----BEGIN RSA PRIVATE KEY----- MIIEowIBAAKCAQEAmsvhJNek5DrtZn1aTrmBRqFETjjIh0ljX3P4OXkYWYhxbTwc ...省略部分输出内容... 9cnGuciLFbyGyUv+jtplMZcZy3VR7t81rmI0r8jt/VxV/qhL9RQ1 -----END RSA PRIVATE KEY-----
5.1.2 Gitlab配置公钥
5.1.3 Jenkins创建测试项目
提示:此处Repository URL地址为Gitlab项目首页下的地址,即:
5.2 项目测试
5.2.1 开始测试
5.2.2 查看测试过程详细信息
5.3 配置自动邮件通知
5.4 自动对上线的代码进行测试
5.4.1 配置Jenkins向Gitlab通信
5.4.2 配置Gitlab向Jenkins通信
5.4.3 测试Gitlab和Jenkins通信情况
5.4.4 配置Jenkins触发器
5.4.5 配置Gitlab触发动作
- 查看触发结果:
5.5 模拟实际生产环境自动测试
扩展:http://www.cnblogs.com/can-H/articles/7346724.html
https://www.abcdocker.com/abcdocker/2041
