利用Jenkins持续集成的一种方案
Jenkins是一个独立的开源软件项目,是基于Java开发的一种持续集成工具,用于监控持续重复的工作,旨在提供一个开放易用的软件平台,使软件的持续集成变成可能。
Jenkins是一款能提高效率的软件,它能帮开发人员把软件开发过程形成工作流,典型的工作流包括以下几个步骤:
1、开发
2、提交
3、编译
4、测试
5、发布
有了Jenkins的帮助,在这5步中,除了第1步,后续的4步都是自动化完成的,具体的,当开发人员完成了提交,Jenkins会自动运行开发人员的编译脚本,编译成功后,再运行测试脚本,这一步成功后,接着它会帮开发人员把新程序发布出去,特别的,在最后一步,开发人员可以选择手动发布,或自动发布,毕竟发布这件事情,还是需要人为的确认一下比较好。
Jenkins特点:
1、开源免费;
2、跨平台,支持所有的平台;
3、master/slave支持分布式的build;
4、web形式的可视化的管理页面,使用简单;
5、安装配置超级简单;
6、tips及时快速的帮助;
7、已有的200多个插件,使用方便。
这里Gitlab就给我们提供一个非常方便以及直观的Playbook management. 我们需要做的其实就是在Gitlab去建立一个对应产品或者server的playbook仓库, 然后我们在本地写好后直接commit到这个仓库, 最后在部署的时候, 去让Jenkins pull这个playbook到其workspace, 并作为一个Job去run这个playbook, 这样比较规范, 而且便于管理。
Ansible简单的说是一个配置管理系统(configuration management system)。你只需要可以使用 ssh 访问你的服务器或设备就行。它也不同于其他工具,因为它使用推送的方式,而不是像 puppet 等 那样使用拉取安装agent 的方式。你可以将代码部署到任意数量的服务器上!
ansible可以帮助我们完成一些批量任务,或者完成一些需要经常重复的工作。比如:同时在100台服务器上安装nginx服务,并在安装后启动它们;比如:将某个文件一次性拷贝到100台服务器上。比如:每当有新服务器加入工作环境时,你都要为新服务器部署某个服务,也就是说你需要经常重复的完成相同的工作。这些场景中我们都可以使用到ansible。
Ansible特性,模块化:调用特定的模块,完成特定任务。有Paramiko PyYAML,Jinja2(模板语言)三个关键模块支持自定义模块,基于Python语言实现。部署简单,基于python和SSH(默认已安装),agentless安全,基于OpenSSH支持playbook编排任务。
幂等性:一个任务执行1遍和执行n遍效果一样,不因重复执行带来意外情况
无需代理不依赖PKI(无需ssl),可使用任何编程语言写模块YAML格式,编排任务,支持丰富的数据结构较强大的多层解决方案。
Ansible工作原理
Supervisor 是python写的一个进程管理工具(主从系统),可在类UNIX操作系统上监控和控制进程,是通过fork/exec的方式将这些被管理的进程当作supervisor的子进程来启动,所以只要在supervisor的配置文件中,把要管理的进程的可执行文件的路径写进去即可。 若该子进程异常中断/挂掉,则父进程可以准确的获取子进程异常中断的信息,可以选择是否自动重启和报警。 supervisor还提供了一个功能,可以为supervisord或者每个子进程,设置一个非root的user,这个user就可以管理它对应的进程。
通过Jenkins定时任务每天从gitlab拉取指定分支最新代码,通过Maven编译并组成相应服务tar包。将安装配置推送到部署平台,更新部署平台服务及配置,重启服务,最后执行自动化测试脚本,并反馈结果。
持续集成流程
Jenkins通过GIT模块从GITLAB拉代码,拉取指定分支或标签的最新代码。
对于拉取的Java Maven工程,通过Maven插件从本地仓库Nexus编译成相应Jar包。最后,通过调用Shell脚本整合相关依赖资源和配置文件,组成服务包,并在远程服务器部署并启动相关服务
本地Maven仓库Nexus。可以让开发人员从内网更快下载Jar包,让开发人员上传自己的Jar包,便于管理归档,为项目或开发人员后期下载提供下资源。
自动化部署过程分为基础平台部署和数据服务部署。基础平台部署是将大数据平台,主要中间件(MySQL、MongoDB、Elasticsearch、Neo4j、Redis、Nginx)及调度中心、配置中心等管理服务,一次性部署到虚拟机机上,后期只更新配置和数据。数据服务自动化部署是将业务相关的Java服务、前端代码每日重新安装,以方便最新功能测试及问题检验。
大数据平台半自动化部署
由于手动部署大数据平台及准备安装环境,比较耗费时间,综合考虑到开发成本及效率,所以采用半自动化部署。即部分安装环境准备和安装包部署采用自动化部署,安装包启动及客户端服务安装采用手动安装。
图3 大数据平台自动化部署流程
自动化部署脚本采用Ansible的Playbook编写,同时对多节点部署。分为java、ntp、mysql、cm子模块,分别对应JAVA、NTP、MySQL、Cloudera Mangager服务安装。自动化部署程序执行前,需先准备CentOS 7集群,并做如下配置。
安装前准备
(1)在每个节点的/etc/hosts中配置好集群各主机IP-hostname的映射。
图2 IP主机名映射
(2)对每个节点设置root用户SSH访问权限、关闭Selinux及防火墙。
(3)对NameNode节点生成NameNode节点公钥
(4) 将 cloudera-deploy的roles程序目录,hosts、ansible.cfg文件及res资源目录放置于/etc/ansbile目录下(该主机可为安装集群之外的主机,且已装有Ansible(CentOS7可通过yum方式安装)),并修改相关配置文件。
1)在/etc/ansible/hosts中添加集群IP和SSH密码信息组如下,组名为iabigdata,供Ansible SSH远程登录集群节点
2)修改/etc/ansible/roles/add-hosts/vars/main.yml文件如下。修改nn、nn_hostname、sshkey的值分别为NameNode节点的IP、hostname和公钥(在/root/.ssh/id_rsa.pub中)
3)检查/etc/ansible/roles/add-hosts/tasks/main.yml文件,确保SSH登录组名与 /etc/ansible/hosts添加的一致
执行Ansible安装
在Ansible节点, 执行Ansible安装脚本,完成Java环境、NTP同步、MySQL安装及建表、CM安装包的部署与配置,执行命令如下。
ansible-playbook /etc/ansible/roles/add-hosts/tasks/main.yml
安装CM的bin包
登录NameNode节点的/root/soft目录执行cloudera-manager-installer.bin安装包。执行命令如下:
chomd 755 cloudera-manager-installer.bin
./cloudera-manager-installer.bin
注:如果提示要删除/etc/cloudera-scm-server/db.properties文件,则删除它。
CM安装后配置
安装完CM后默认使用的是其内嵌postgresql数据库,如果要切换成MySQL数据库需要如下配置。
- 登录NameNode节点的root/soft目录执行bigdatastep2.sh脚本。其中脚本参数123456是MySQL密码要与上一步MySQL密码一致。
chmod 755 bigdatastep2.sh
./bigdatastep2.sh 123456
- 通过浏览器登录NameNode的7180端口登录WEB客户端完成安装。
注:1)默认CM Client端用户名/密码为admin/admin。
2)数据库设置要记得切换成MySQL,默认服务库名、用户名、密码一致。
MySQL部署
通过Ansible编排相应脚本,自动化部署。
MongoDB部署
Yum手动部署。
Redis部署
Tar包手动编译部署,添加supervisor守护进程。
Neo4j部署
Tar包,手动部署。
Elasticsearch部署
Tar包手动部署,添加supervisor守护进程。
Nginx部署
Tar包手动编译部署,添加supervisor守护进程。
通过Jenkins每天拉取爬虫服务、知文用户服务、数据搜索服务、前端服务等业务服务的代码,编译并组装成最新安装包,调用Ansible发布到相应部署虚拟机上,替换原来的服务及配置,并更新服务进程。所有服务启动停止更新都是通过supervisor守护进程控制管理。
部署完成后Jenkins调用通过Ansible下发Python自动化测试脚本到相应虚拟机上执行,实现自动化测试。并打印把控制台输出到Jenkins控制台上。