利用Jenkins持续集成的一种方案

  1. 主要工具介绍
    1. 持续集成工具——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多个插件,使用方便。

    1. 代码管理工具——Gitlab

这里Gitlab就给我们提供一个非常方便以及直观的Playbook management. 我们需要做的其实就是在Gitlab去建立一个对应产品或者server的playbook仓库, 然后我们在本地写好后直接commit到这个仓库, 最后在部署的时候, 去让Jenkins pull这个playbook到其workspace, 并作为一个Job去run这个playbook, 这样比较规范, 而且便于管理。

    1. 自动化配置工具——Ansible

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工作原理

利用Jenkins持续集成的一种方案

    1. 后台进程管理工具-Supervisor

Supervisor 是python写的一个进程管理工具(主从系统),可在类UNIX操作系统上监控和控制进程,是通过fork/exec的方式将这些被管理的进程当作supervisor的子进程来启动,所以只要在supervisor的配置文件中,把要管理的进程的可执行文件的路径写进去即可。 若该子进程异常中断/挂掉,则父进程可以准确的获取子进程异常中断的信息,可以选择是否自动重启和报警。 supervisor还提供了一个功能,可以为supervisord或者每个子进程,设置一个非root的user,这个user就可以管理它对应的进程。

  1. 方案总体介绍

通过Jenkins定时任务每天从gitlab拉取指定分支最新代码,通过Maven编译并组成相应服务tar包。将安装配置推送到部署平台,更新部署平台服务及配置,重启服务,最后执行自动化测试脚本,并反馈结果。

 

持续集成流程

    1. 代码获取

Jenkins通过GIT模块从GITLAB拉代码,拉取指定分支或标签的最新代码。

    1. 代码编译

对于拉取的Java Maven工程,通过Maven插件从本地仓库Nexus编译成相应Jar包。最后,通过调用Shell脚本整合相关依赖资源和配置文件,组成服务包,并在远程服务器部署并启动相关服务

本地Maven仓库Nexus。可以让开发人员从内网更快下载Jar包,让开发人员上传自己的Jar包,便于管理归档,为项目或开发人员后期下载提供下资源。

    1. 自动化部署

    自动化部署过程分为基础平台部署和数据服务部署。基础平台部署是将大数据平台,主要中间件(MySQL、MongoDB、Elasticsearch、Neo4j、Redis、Nginx)及调度中心、配置中心等管理服务,一次性部署到虚拟机机上,后期只更新配置和数据。数据服务自动化部署是将业务相关的Java服务、前端代码每日重新安装,以方便最新功能测试及问题检验。

      1. 基础平台部署

大数据平台半自动化部署

由于手动部署大数据平台及准备安装环境,比较耗费时间,综合考虑到开发成本及效率,所以采用半自动化部署。即部分安装环境准备和安装包部署采用自动化部署,安装包启动及客户端服务安装采用手动安装。

图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数据库需要如下配置。

  1. 登录NameNode节点的root/soft目录执行bigdatastep2.sh脚本。其中脚本参数123456是MySQL密码要与上一步MySQL密码一致。

chmod 755 bigdatastep2.sh

./bigdatastep2.sh 123456

  1. 通过浏览器登录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守护进程。

 

      1. 数据服务部署

通过Jenkins每天拉取爬虫服务、知文用户服务、数据搜索服务、前端服务等业务服务的代码,编译并组装成最新安装包,调用Ansible发布到相应部署虚拟机上,替换原来的服务及配置,并更新服务进程。所有服务启动停止更新都是通过supervisor守护进程控制管理。

    1. 自动化测试

    部署完成后Jenkins调用通过Ansible下发Python自动化测试脚本到相应虚拟机上执行,实现自动化测试。并打印把控制台输出到Jenkins控制台上。