持续集成是敏捷领域的一项基本实践,Jenkins是目前市面上主流的持续集成工具。关于持续集成和Jenkins可以讨论的话题很多,本文描述的是一种使用Jenkins结合Maven进行动态工程构建的思路,用于进行系统开发过程中对第三方服务依赖的解耦。
在系统设计和实现过程中,尤其是涉及到多方集成的系统开发,我们经常会遇到这样的场景:即目标系统需要依赖于某些第三方的服务实现,而这些第三方的服务实现通常有其进度安排,会和目标系统平行开发,也就是说在目标系统开发调试过程中,第三方服务往往还无法使用。研发团队无法使用第三方服务,但却需要确认和验证目标系统的相关功能能否正常使用,我们就需要想办法确保在第三方服务不可用的情况下也能获取目标系统的运行过程结果,也就是要对第三方服务进行依赖解耦。这时候模拟(Mock)思想就派上了用场,基于Mock思想的系统模型可以抽象为下图:
上图中对于同一个服务契约(Service)而言,第三方服务提供者会提供一份真实环境下的服务实现(ServiceImpl-3rdParty),而我们在模型目标系统运行时会提供一份Mock的服务实现(ServiceImpl-Mock)。在第三方服务尚未交付、而我们又想对系统进行开发调试时可以使用Mock服务实现;第三方服务一旦就绪,通过简单的开关机制我们又可以切换到3rdparty服务。这种场景下的构建需求就是可以通过一定的持续集成手段进行工程的动态构建,也即当我们需要不同的服务实现时,我们就可以构建出不同的服务。
我们假定开发环境基于JavaEE平台,Eclipse工程项目初始化如下。这里虽然局限于某种技术实现平台,但其背后的思路都是一样的:
上图中,mcs-service-3rdparty和mcs-service-mock同时实现了mcs-service中的所有服务接口,我们的目标就是要根据本次构建的具体需求(是使用mock,还是使用3rdparty),使用Jenkins动态的确定这两种实现的一种并完成系统构建。
基于以上目的,我们来看一下具体实现过程中涉及的工具和技术:
Parameterized Build即参数化构建,是Jenkins平台中一项强大的构建功能。通过参数化构建,我们可以在构建过程中为此次构建添加参数,从而灵活控制构建的过程和结果。结合本文中的场景,我们需要在每次构建前告诉Jenkins这次构建时需要使用Mock的服务实现还是使用3rdparty的服务实现,这里我们就可以抽象出一个参数以便进行参数化构建。
本节我们从具体的工具入手进行构建的配置和实现:
Maven中的Profile定义方式参考如下:
<profiles> <profile> <id>mock</id> <activation> <activeByDefault>true</activeByDefault> </activation> <dependencies> <dependency> <groupId>com.test</groupId> <artifactId>mcs-service-mock</artifactId> </dependency> </dependencies> </profile> <profile> <id>3rdparty</id> <dependencies> <dependency> <groupId>com.test</groupId> <artifactId>mcs-service-3rdparty</artifactId> </dependency> </dependencies> </profile> </profiles>
上面这段配置的意思非常明确,我们定义了两个Profile分别对应Mock服务和3rdparty服务,指定它们的唯一性Id为Mock和3rdparty并关联到具体的artifact,并通过activeByDefault属性确定默认情况下的Profile为mock。
在执行Maven命令时,我们可以通过-P参数动态设置某一个Profile,如-P mock代表使用mock这个Profile,-P 3rdparty表示使用3rdparty这个Profile。
注意上图中参数名为“ServiceImpl”,参数的值范围为[mock,3rdparty]。参数的值范围需要与上面配置的Profile一一对应,而参数名我们在设置Maven命令时需要用到:
设置完参数化构建过程之后,平时的”立即构建”按钮就会变成“Build withParameters”,点击构建时就需要我们确定构建选项,效果如下:
通过选择不同的构建参数,我们就能构建出不同的服务,从而动态实现同一套代码和配置完成不同服务构建过程。
四. 小结
本文使用Jenkins和持续集成理念为系统开发过程中如何进行第三方服务的依赖解耦提供了一种思路,这种思路基于Jenkins的参数化构建功能和Maven中的Profile特性,在某些特定的场景下非常有用。
Jenkins+Maven动态工程构建--第三方服务依赖解耦的一种思路
原文地址:http://blog.csdn.net/lantian08251/article/details/40975905