通过Maven和Jenkins插件解决Java项目的配置管理

1 篇文章 0 订阅
项目中的配置管理一直是一件麻烦的事情,就比如数据库来说:开发时要连接开发库,测试人员需要连接测试库,可能集成测试的时候又是另外的库,上公网可能还分alpha版、beta版等等。

之前的配置管理方式无外乎两种:
1、在不同的环境上维护一套不同的配置文件,部署到上面后做个替换。
2、在同一个地方集中维护配置文件,然后做个工具在不同的环境对配置文件做替换。

方式1遇到的问题是:要替换的文件一旦做修改,要在各个环境中同样修改这个文件,容易漏掉。
方式2遇到的问题是:虽然在一个统一的地方维护文件,但公网和内网可能有物理的隔离,要做到通用的方式很麻烦。
通过摸索,我找到一种通过maven插件与jenkins插件结合的方式来解决这个问题。

[b][size=x-large]首先我们先做个Maven插件玩玩[/size][/b]

这个插件的源代码在 [url]https://github.com/bookong/cooly[/url]

下面我就这个插件的几个关键点解释一下:

类 net.bookong.maven.plugin.ConfigReplace 是 replace 这个目前唯一的 goal 的实现 (这个插件项目以后我可能加上更多实用功能),它默认的阶段我设置为 process-test-classes 因为这个阶段是在执行单元测试之前,如果执行跳过单元测试的构建(mvn install -Dmaven.test.skip=true)也可以触发我这个插件。

想知道神秘的内部变量project.build.directory 是怎么来的,你可以参考[url]http://docs.codehaus.org/display/MAVENUSER/MavenPropertiesGuide[/url]

这个插件的工作原理是,在当前项目下查找指定的配置文件(默认是 ci_props.xml ),这个配置文件中以 key 和 value 的形式保存一组配置(和项目在一起提交到代码库中的就是开发环境的配置);然后对指定目录下递归查找指定特征的文件(默认是后缀为 . ci_tmpl 的文件);如果找到这样的文件,就对文件内容中用指定前后缀拼出的内容进行替换(例如对所有 ${XX} 替换为 ci_props.xml 中 XX 变量对应的内容);最后将替换的内容保存成去掉扩展名 ci_tmpl 的文件(例如 app.ini.ci_tmpl 在替换后会变成 app.ini)。

安装插件到本地只需要签出代码后本地执行mvn install 。如果你搭建过 nexus ,首选在 settings.xml 文件中添加有部署权限用户的用户名和密码


<servers>
<server>
<id>snapshots</id>
<username>deployment</username>
<password>deploymentPassword</password>
</server>
<server>
<id>releases</id>
<username>deployment</username>
<password>deploymentPassword</password>
</server>
</servers>


然后修改插件的 pom.xml 中下面内容,指向你自己的 nexus

<distributionManagement>
<repository>
<id>releases</id>
<url>http://172.16.12.12:8081/nexus/content/repositories/releases</url>
</repository>
<snapshotRepository>
<id>snapshots</id>
<url>http://172.16.12.12:8081/nexus/content/repositories/snapshots</url>
</snapshotRepository>
</distributionManagement>



[b][size=x-large]然后在项目中使用这个Maven插件[/size][/b]

插件部署好之后我们就可以在项目中使用了。使用的例子可以参考项目下自带的测试例子 test-replace 。

[img]http://dl2.iteye.com/upload/attachment/0095/3217/afc945f2-fccb-3973-a5e7-f7ab6108c4ee.png[/img]

[b][size=x-large]用Jenkins插件实现多个环境中配置文件的替换[/size][/b]

根据上面说的步骤,你在执行使用这个插件的项目时已经可以将配置替换成代码中 ci_props.xml 中的内容,我们可以将这个环境看成是开发环境。
当你部署测试环境或者公网时,我们可以在Jenkins中安装一个插件
[url]https://wiki.jenkins-ci.org/display/JENKINS/Config+File+Provider+Plugin[/url]
[img]http://dl2.iteye.com/upload/attachment/0095/3219/20b2295d-fb58-3c73-a091-1e0272c69443.png[/img]

通过这个插件,我们创建各个环境不同的 ci_props.xml 文件。例如:
[img]http://dl2.iteye.com/upload/attachment/0095/3221/4c8d124a-3f96-3ded-8013-1eaa03611ca6.png[/img]

在Jenkins的Job中的 Pre Step 中添加下图所示内容,这样就将 ci_props.xml 替换成不同的环境了。
[img]http://dl2.iteye.com/upload/attachment/0095/3223/493efc78-c58a-31fc-be9a-ed818d0289f9.png[/img]


[b][size=x-large]如何解决多套配置可能产生的不同步[/size][/b]

这个问题我只能部分的解决,我在插件中增加了一个功能,假如替换后的文件还发现了疑似未替换的配置,就会抛出异常导致构建失败。

例如 ci_prop.xml 中没有定义 abc 这个变量。要替换的文件app.properties.ci_tmpl 中有这样的内容 you.set=${abc} 插件执行后会报下面错误,并导致构建失败。


[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 6.126s
[INFO] Finished at: Tue Mar 25 20:33:39 CST 2014
[INFO] Final Memory: 10M/123M
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal net.bookong.maven.plugin:cooly-plugin:0.1:replace (default) on project test-replace: Fail to execute cooly:replace, Message: Missing property "${abc}" in ./ci_props.xml, when handle D:\CodeRepository\git\cooly\test-projects\test-replace\target\classes\app.properties -> [Help 1]
[ERROR]
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR]
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoExecutionException

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值