1.背景

开发部门决定在Apache Ranger开源社区贡献代码,目标是个人国内排名Top1,世界排名Top2,并且在已经成为Ranger项目的Committer情况下,争取成为Ranger项目的PMC。同时部门投入的开发人员人力非常有限,开发人员的水平也无法和国外开发人员相比肩,大部分开发人员对于Ranger的熟悉程度也有限,在这种情况下我们不仅要提交自己的issue,还要积极review别人的issue,为了在提高效率达到目标的同时,尽量减少错误的发生,比如提交的issue补丁有问题,review别人的issue不完全,从而导致错误的代码被合入到Ranger代码库中,将会在开源社区产生非常不好的影响,不仅会使个人口碑和公司声誉受到影响,而且会影响我们达成对开源社区贡献的目标。

现在我们决定为Ranger的开源代码在所内搭建一套流水线,从代码提交到编译打包安装测试一整套流程,来保证我们向社区提交的代码不会出错,还可以帮助我们在review别人代码的时候验证相关功能,即使有其他开发临时加入,也可以很好的保证质量,尽量减少工作中可能发生的错误,特别是避免一些低级错误,从而在增加自己在社区的威信和话语权,达成开源贡献目标的同时,为以后我们部门和公司在开源社区更好的发展打下坚实的基础。

另外,虽然Ranger的所内代码是已经有了一套流水线的,但是所内Ranger是经过修改定制的,增加了一些无法合入社区的特性,并且阉割了一些用不到的功能,而且是基于DapManager开发和测试的,编写的测试用例也是强依赖DapManager的,同时所内的代码版本无法和开源的代码保持实时同步,两者在某种程度上是不兼容的,只能一定程度上借鉴,所以需要为了Ranger开源代码搭建一套新的流水线,专门用于开源。

2.Ranger

Apache Ranger能够监控和管理整个Hadoop平台的综合数据安全,它是Apache Top Level Project(TLP顶级项目),主要提供如下特性:

  • 基于策略(Policy-based)的访问权限模型
  • 通用的策略同步与决策逻辑,方便控制插件的扩展接入
  • 内置常见系统(如HDFS、YARN、HBase等12个)的控制插件,且可扩展
  • 内置基于LDAP、File、Unix的用户同步机制,且可扩展
  • 统一的中心化的管理界面,包括策略管理、审计查看、插件管理等

Ranger架构图:

3.方案

搭建Ranger开源流水线,经过研究之后,决定使用如下工具方案:

Jekins + Gerrit + Docker + RobotFramework

其中Jekins负责流水线整体流程,Gerrit负责Ranger代码,

Docker负责打包安装运行Ranger等业务组件,RobotFramework负责测试用例。

持续集成(Continuous integration,简称CI),根据敏捷大师Martin Fowler的定义,“持续集成是一种软件开发实践。在持续集成中,团队成员频繁集成他们的工作成果,一般每人每天至少集成一次,也可以多次。每次集成会经过自动构建(包括自动测试)的检验,以尽快发现集成错误。许多团队发现这种方法可以显著减少集成引起的问题,并可以加快团队合作软件开发的速度。

持续集成流程图:

下面是持续集成的图谱介绍:

1.将更改提交到代码管理仓库

2.持续集成服务器收到请求拉取变更代码

3.持续集成服务器编译代码

4.持续集成服务器跑代码相关测试

5.持续集成服务器测试结束

6.持续集成服务器对结果进行反馈

根据上面的持续集成流程图,我们会重点介绍上面选型的4个工具在持续集成中的作用:

3.1.Jekins

Jenkins是一个可扩展的持续集成引擎。

主要用于:

  • 持续、自动地构建/测试软件项目。
  • 监控一些定时执行的任务。

Jenkins拥有的特性包括:

  • 易于安装-只要把jenkins.war部署到servlet容器,不需要数据库支持。
  • 易于配置-所有配置都是通过其提供的web界面实现。
  • 集成RSS/E-mail通过RSS发布构建结果或当构建完成时通过e-mail通知。
  • 生成JUnit/TestNG测试报告。
  • 分布式构建支持Jenkins能够让多台计算机一起构建/测试。
  • 文件识别:Jenkins能够跟踪哪次构建生成哪些jar,哪次构建使用哪个版本的jar等。
  • 插件支持:支持扩展插件,你可以开发适合自己团队使用的工具。

3.2.Gerrit

Gerrit是一个免费、开放源代码的代码审查软件,是基于网页界面的代码评审工具,它基于git版本控制系统。

Gerrit旨在提供一个轻量级框架, 用于在代码入库之前对每个提交进行审阅。开发人员将代码更改提交到Gerrit,但实际上并不成为项目的一部分,直到它们被同一个团队的软件程序员相互审阅,决定是否能够提交,退回或者继续修改。它是标准开源过程的一个简单工具来支持提交补丁程序。Gerrit首先是一个临时区域, 由项目成员在应用到代码库之前进行评审,只有在被评审确认通过后,提交的代码才会正式成为代码库的一部分。

3.3.Docker

Docker是一个开源的引擎,可以轻松的为任何应用创建一个轻量级的、可移植的、自给自足的容器。开发者在自己机器上编译测试通过的容器可以批量地在生产环境中部署,包括VMs(虚拟机)、bare metal、OpenStack 集群和其他的基础应用平台。

Docker通常用于如下场景:

  • web应用的自动化打包和发布;
  • 自动化测试和持续集成、发布;
  • 在服务型环境中部署和调整数据库或其他的后台应用;
  • 从头编译或者扩展现有的OpenShift或Cloud Foundry平台来搭建自己的PaaS环境。

3.4.RobotFramework

Robot Framework 是一款用Python编写的通用的自动化测试框架,支持关键字驱动且可扩展性好,它具有易于使用的表格来组织测试过程和测试数据。它主要用于需要进行多次验收的系统测试,或者验收测试驱动开发,框架能够提供用例组织,生成测试报告,尤其对于一些常年需要维护的系统来说,价值更大。

Robot Framework的特点:

  • 使用简单
  • 非常丰富的库
  • 可以像编程一样写测试用例
  • 支持开发系统关键字

RIDE是一款专门用来编辑Robot Framework用例的软件,用Python编写并且开源。当我们针对一个系统编写好一套脚本后,每当我们对系统做一些更改的时候,便可以把已经写好的脚本拿出来稍作修改,通过执行这些脚本就可以检测系统的功能是否依旧完好。系统需要一个不断完善的过程,而RIDE用例也将随着系统的变更做着相应的修改。

3.5.工具集成

将上述4个工具集成到一起,完成Ranger开源流水线的搭建,整个过程可以使用如下流程图表示:

JekinsWithDocker.jpg

上图演示了Jekins + Gerrit + Docker + RobotFramework集成在一起之后的工作流程图,由于是从网上下载的图,特别说明其中Github可以等价于Gerrit,在进行itegration test的时候会调用RobotFramework编写的测试用例。

详细步骤的说明如下:

0.开发人员提交Ranger代码到Gerrit

1.触发Jenkins流水线构建操作

2.Jenkins将Ranger代码编译、打包

3.Jenkins将Ranger安装包封装在Docker镜像并上传至Docker仓库

4.Jenkins使用Docker安装Ranger及部署Ranger所需要的一系列测试环境

5.Jenkins调用RobotFramework编写的测试用例进行集成测试

6.集成测试通过,触发真实应用环境部署

7.对真实应用环境进行集成测试

8.提供外网真实用户访问

在实际使用中,我们会用到0--6这个步骤来测试Ranger,后面对外提供环境的步骤忽略。在第6步集成测试通过之后,我们的开发和测试人员也可以访问Ranger的测试环境了。

4.Docker实现方案

4.1.设计背景

采用Docker来进行Ranger环境的编译打包安装,是基于Ranger的架构设计考虑,Ranger本身的架构是由多模块组成的,各个部分相对独立,而且和其他组件有着大量的交互,不像其他组件那么单一,使用Docker能够很好的适应Ranger这种分离设计,发挥出Docker的巨大作用。

查看第二章节中提供的Ranger架构图,其中蓝色边框的圆角矩形是和Ranger相关的组成模块,主要包括UerSync, RangerAdmin, KMS, 以及12大数据组件对应的插件Plugin。

Ranger支持的大数据组件:

hdfs,hbase,hive,sqoop,storm,solr,kafka,knox,kylin,yarn,atlas,nifi

Ranger支持的元数据库和审计日志数据库,

元数据库支持5种常用的数据库:mysql, oracle, postgres, sqlanywhere, sqlserver

审计日志数据库支持2中常用的大数据组件:solr, hdfs

同时Ranger还支持http和https,kerberos和非kerberos等复杂的安全配置,可见Ranger本身的实现就是有许多部分组成的,而且还需要和各种各样的其他系统组件进行交互,导致Ranger安装的时候非常复杂困难,在更新Ranger的安装包和配置的的时候也比较复杂,在进行功能验证和测试的时候也需要考虑到比较多的东西,如果Ranger所有的功能进行一遍手工验证是非常耗时且不太可靠的,所以急需一个流水线实现自动化的打包安装测试等一系列流程。

4.2.实现方案

使用Docker对Ranger代码编译打包,使用预先制作好的Docker Maven镜像即可。

使用Docker预先安装Ranger需要的5种数据库,分别制作成相应的镜像,设置为在镜像容器启动的时候,会自动把安装好的数据库启动起来,并且把提供服务的端口映射到外部的端口,从而给Docker外部的系统提供服务,在需要的时候,启动该镜像即可提供对应的数据库服务。

使用单独的Docker镜像安装UerSync, RangerAdmin, KMS,每次Ranger编译打包成功后,只要启动一个新的Linux基础镜像容器,即可全新安装RangerAdmin等服务。

使用Docker预先安装12个常用的大数据组件,分别制作成相应的镜像,然后Ranger编译打包成功后,先启动镜像容器,安装对应的Ranger插件,之后再启动组件,把插件加载起来,之后便可以测试Ranger插件的权限控制功能。

5.RobotFramework实现方案

测试框架使用RobotFramework进行自动化测试,考虑到所内的Ranger测试用例是基于DAPManger安装和改造后的Ranger编写的,无法直接使用,需要进行用例迁移,主要是去掉对DAPManger的依赖和Ranger的定制部分,然而大部分用例的测试场景是可以使用的,不需要重新设计,可以很好的覆盖Ranger目前已有的功能,同时针对所内未使用而没有对应测试用例的Ranger功能,需要进行功能分析,测试场景设计和测试用例的编写。

测试完毕之后,这些Docker环境会保留,直到下一次构建的时候,开发和测试都可以登陆环境进行进一步操作,在新的构建开始的时候,脚本会先查看是否已经有Ranger相关的Docker进程,如果有则会先杀掉这些进程,然后再启动这些Docker镜像,这样启动的镜像就是一个干净的环境,不需要进行卸载动作,后续即可以进行全新的安装进行测试。

6.总结

该方案主要工作在于Docker镜像的制作,需要制作接近20个镜像,且每个镜像制作好之后,相关Ranger的安装脚本也需要新增,但是这些工作一旦完成之后,就可以大大减少以后的重复工作,制作好的镜像直接可以拿来使用,非常方便验证Ranger的安装升级等,

只有在少量变化的时候,需要更新对应的镜像,从而大大减少了Ranger安装的复杂度。同时测试用例还需要不断完善,增加测试的覆盖范围,在流水线中执行测试用例,能够保证Ranger的功能可用,减少bug,提升了代码质量,提高了工作效率,从而大大减少了Ranger测试的复杂度。

最后,相信有了这条Ranger开源流水线的帮助,我们一定能够达成开源贡献的目标。

Ranger开源流水线docker化实践案例的更多相关文章

  1. CI Weekly #9 | 揭秘阿里 Docker 化实践之路

    2017年悄然而至,对 flow.ci 你有什么新的期待呢?新的一年,flow.ci会越来越强大好用,希望继续得到你的支持与反馈.最近,我们做了如下的「功能优化」与「问题修复」,看看有没有你想要的: ...

  2. Docker+Kubernetes(k8s)微服务容器化实践

    第1章 初识微服务微服务的入门,我们从传统的单体架构入手,看看在什么样的环境和需求下一步步走到微服务的,然后再具体了解一下什么才是微服务,让大家对微服务的概念有深入的理解.然后我们一起画一个微服务的架 ...

  3. 测试环境docker化—容器集群编排实践

    本文来自网易云社区 作者:孙婷婷 背景 在前文<测试环境docker化-基于ndp部署模式的docker基础镜像制作>中已经详述了docker镜像制作及模块部署的过程,按照上述做法已可以搭 ...

  4. Docker学习总结(14)——从代码到上线, 云端Docker化持续交付实践

    2016云栖大会·北京峰会于8月9号在国家会议中心拉开帷幕,在云栖社区开发者技术专场中,来自阿里云技术专家罗晶(瑶靖)为在场的听众带来<从代码到上线,云端Docker化持续交付实践>精彩分 ...

  5. DCOS实践分享(2):基于Docker Compose和Swarm的Docker化之路

    2016 年1 月 23 日,北京史上气温最低的一天. 在下午 1 点半的时候,由 DaoCloud 赞助的 2016 年度首次 Docker Meetup 准时开始. 在这次Meetup中,我分享了 ...

  6. 微服务实战(四):服务发现的可行方案以及实践案例 - DockOne.io

    原文:微服务实战(四):服务发现的可行方案以及实践案例 - DockOne.io 这是关于使用微服务架构创建应用系列的第四篇文章.第一篇介绍了微服务架构的模式,讨论了使用微服务架构的优缺点.第二和第三 ...

  7. docker化java web应用

    一.简介 Docker是一个使用Go语言开发的开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的机器上.Docker的发展速度和火爆程度着实令人惊叹,一 ...

  8. docker最佳实践-----美团点评的分享

    美团点评容器平台简介 本文介绍美团点评的Docker容器集群管理平台(以下简称“容器平台”).该平台始于2015年,是基于美团云的基础架构和组件而开发的Docker容器集群管理平台.目前该平台为美团点 ...

  9. Docker化运维方式讲解

    应用迁移需求 应用运维需要考虑的一个重要问题就是迁移, 在不同机器.机房.环境间迁移.迁移的原因有很多, 比如硬件过保(硬件故障), 机房迁移, 应用扩缩容等. 应用迁移的核心需求是: 简单.迁移操作 ...

随机推荐

  1. What all is inherited from parent class in C++?

    派生类可以从基类中继承: (1)基类中定义的每个数据成员(尽管这些数据成员在派生类中不一定可以被访问): (2)基类中的每个普通成员函数(尽管这些成员函数在派生类中不一定可以被访问): (3)The ...

  2. 初始化Linux数据盘、磁盘分区、挂载磁盘(fdisk)

    1.操作场景 2.前提条件 3.划分分区并挂载磁盘 4.设置开机自动挂载磁盘分区 1.操作场景 本文以云服务器的操作系统为"CentOS 7.4 64位"为例,采用fdisk分区工 ...

  3. Linux:find命令中

    默认情况下, find 每输出一个文件名, 后面都会接着输出一个换行符 ('\n'), 因此我们看到的 find 的输出都是一行一行的: ls -l total 0 -rw-r--r-- 1 root ...

  4. shell脚本下载网页图片

    和大家分享一个shell脚本写的图片抓取器.使用方法:img_downloader.sh.使用时在shell下输入:./img_downloader.sh www.baidu.com -d image ...

  5. 使用beanFactory工厂实例化容器的方式实现单例模式

    //配置文件bean.properties(注意书写顺序) accountService=com.itheima.service.impl.AccountServiceImplaccountDao=c ...

  6. 【力扣】95. 不同的二叉搜索树 II

    二叉查找树(Binary Search Tree),(又:二叉搜索树,二叉排序树)它或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值: 若它的 ...

  7. 从一次解决Nancy参数绑定“bug”开始发布自己的第一个nuget包(上篇)

    起因 最近,同事跟我说,他们负责的一个Api程序出现了一些很奇怪的事情.这个Api是为环保局做的一个扬尘质控大屏提供数据的,底层是基于Nancy做的.因为发现有些接口的数据出现异常,他就去调试了一下, ...

  8. for循环中的变量泄漏

    经典的案例 let arr = [] for(var i =0;i<=5;i++){ arr[i]= function fn(){ console.log(i) } } arr[0]() //6 ...

  9. 新建日历(Project)

    <Project2016 企业项目管理实践>张会斌 董方好 编著 默认的标准日历设置好了以后,问题又来了:出现某些特殊的原因,可能还需要一个与标准日历设置不同的日历,这个可怎么弄? 没关系 ...

  10. 当动态桌面遇上 HTML5

    DreamScene2 + HTML5 = 无限可能.时隔一周,DreamScene2 动态桌面经过几个小版本的迭代,修复了一些问题并且功能也得到了增强.欢迎 Star 和 Fork https:// ...