论坛首页 Java企业应用论坛

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

浏览 7986 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2014-03-25  
项目中的配置管理一直是一件麻烦的事情,就比如数据库来说:开发时要连接开发库,测试人员需要连接测试库,可能集成测试的时候又是另外的库,上公网可能还分alpha版、beta版等等。

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

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

首先我们先做个Maven插件玩玩

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

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

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

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

这个插件的工作原理是,在当前项目下查找指定的配置文件(默认是 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>



然后在项目中使用这个Maven插件

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



用Jenkins插件实现多个环境中配置文件的替换

根据上面说的步骤,你在执行使用这个插件的项目时已经可以将配置替换成代码中 ci_props.xml 中的内容,我们可以将这个环境看成是开发环境。
当你部署测试环境或者公网时,我们可以在Jenkins中安装一个插件
https://wiki.jenkins-ci.org/display/JENKINS/Config+File+Provider+Plugin


通过这个插件,我们创建各个环境不同的 ci_props.xml 文件。例如:


在Jenkins的Job中的 Pre Step 中添加下图所示内容,这样就将 ci_props.xml 替换成不同的环境了。



如何解决多套配置可能产生的不同步

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

例如 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


  • 大小: 13 KB
  • 大小: 2.9 KB
  • 大小: 7.6 KB
  • 大小: 6.5 KB
   发表时间:2014-03-31  
hudson比这个好用,我觉得
0 请登录后投票
   发表时间:2014-03-31  
cywhoyi 写道
hudson比这个好用,我觉得


Jenkins 还是 Hudson 没有关系,我这种方式都可以使用(他们都有相似的插件)。
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics