浏览 7987 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2014-03-25
之前的配置管理方式无外乎两种: 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 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2014-03-31
hudson比这个好用,我觉得
|
|
返回顶楼 | |
发表时间:2014-03-31
cywhoyi 写道 hudson比这个好用,我觉得
Jenkins 还是 Hudson 没有关系,我这种方式都可以使用(他们都有相似的插件)。 |
|
返回顶楼 | |