第三方服务依赖解耦的一种思路

持续集成是敏捷领域的一项基本实践,Jenkins是目前市面上主流的持续集成工具。关于持续集成和Jenkins可以讨论的话题很多,本文描述的是一种使用Jenkins结合Maven进行动态工程构建的思路,用于进行系统开发过程中对第三方服务依赖的解耦。

-----------------------------------分割线-----------------------------------

Linux下构建robotium+jenkins+TMTS可持续集成自动化测试

修改Ubuntu下的jenkins端口号

Linux 搭建 jenkins

jenkins服务器安装与配置

jenkins配置基于角色的项目权限管理

Ubuntu Desktop 12.04 LTS下安装jenkins

用Jenkins搭建Android自动打包环境 

-----------------------------------分割线-----------------------------------

一.  场景

在系统设计和实现过程中,尤其是涉及到多方集成的系统开发,我们经常会遇到这样的场景:即目标系统需要依赖于某些第三方的服务实现,而这些第三方的服务实现通常有其进度安排,会和目标系统平行开发,也就是说在目标系统开发调试过程中,第三方服务往往还无法使用。研发团队无法使用第三方服务,但却需要确认和验证目标系统的相关功能能否正常使用,我们就需要想办法确保在第三方服务不可用的情况下也能获取目标系统的运行过程结果,也就是要对第三方服务进行依赖解耦。这时候模拟(Mock)思想就派上了用场,基于Mock思想的系统模型可以抽象为下图:

第三方服务依赖解耦的一种思路

上图中对于同一个服务契约(Service)而言,第三方服务提供者会提供一份真实环境下的服务实现(ServiceImpl-3rdParty),而我们在模型目标系统运行时会提供一份Mock的服务实现(ServiceImpl-Mock)。在第三方服务尚未交付、而我们又想对系统进行开发调试时可以使用Mock服务实现;第三方服务一旦就绪,通过简单的开关机制我们又可以切换到3rdparty服务。这种场景下的构建需求就是可以通过一定的持续集成手段进行工程的动态构建,也即当我们需要不同的服务实现时,我们就可以构建出不同的服务。

二.  工具和技术

我们假定开发环境基于JavaEE平台,Eclipse工程项目初始化如下。这里虽然局限于某种技术实现平台,但其背后的思路都是一样的:

第三方服务依赖解耦的一种思路

 

上图中,mcs-service-3rdparty和mcs-service-mock同时实现了mcs-service中的所有服务接口,我们的目标就是要根据本次构建的具体需求(是使用mock,还是使用3rdparty),使用Jenkins动态的确定这两种实现的一种并完成系统构建。

基于以上目的,我们来看一下具体实现过程中涉及的工具和技术:

1.      Jenkins Parameterized Build

Parameterized Build即参数化构建,是Jenkins平台中一项强大的构建功能。通过参数化构建,我们可以在构建过程中为此次构建添加参数,从而灵活控制构建的过程和结果。结合本文中的场景,我们需要在每次构建前告诉Jenkins这次构建时需要使用Mock的服务实现还是使用3rdparty的服务实现,这里我们就可以抽象出一个参数以便进行参数化构建。

2.      Maven Profile

我们使用Maven进行系统构建的依赖管理和结构组织,参考系统工程项目的组织形式,可以看到我们把Mock和3rdparty的实现放在同一个主pom中,而我们的目标只想在某一个构建中获取两者当中的一个实现。要想使得一个构建不做任何修改就能在两种环境下都能运行,需要使用Maven中的Profile特性。Profile实际上就是提供了一种动态选择机制,它为每一种选项定义了一个Id,在使用Maven命令是就可以通过设置该Id从而进行构建过程中的动态选择。 

三.  具体实践 

本节我们从具体的工具入手进行构建的配置和实现:

1.      Maven的Profile管理

Maven中的Profile定义方式参考如下:

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/ffe2a5ca89696b9d0bcf354adfa5ebbd.html