常见的情况是一个项目可能分为多个环境比如测试环境、生产环境,各个环境的MySQL地址等等其他配置不一样,而且好的部署一般都使用Jenkins自动化部署,那么怎么能够从同一个GIT拉取不同的配置文件进行Build发布呢?
进入主题:
Maven构建:mvn clean assembly:assembly -D portableConfig=”src/main/portable/localTest.xml” -U
这里能够看到构建参数有一个DportableConfig 这个文件就指定了需要替换参数值的文件
例子:applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd "
default-autowire="byName">
<!-- 阿里 druid数据库连接池 -->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"
destroy-method="close">
<!-- 数据库基本信息配置 -->
<property name="url" value="jdbc:mysql://localhost:3306/XXX?useUnicode=true&characterEncoding=UTF-8"
/>
<property name="username" value="root" />
<property name="password" value="root" />
<property name="driverClassName" value="com.mysql.jdbc.Driver" />
<property name="filters" value="stat" />
<!-- 最大并发连接数 -->
<property name="maxActive" value="20" />
<!-- 初始化连接数量 -->
<property name="initialSize" value="1" />
<!-- 配置获取连接等待超时的时间 -->
<property name="maxWait" value="60000" />
<!-- 最小空闲连接数 -->
<property name="minIdle" value="10" />
<!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 -->
<property name="timeBetweenEvictionRunsMillis" value="60000" />
<!-- 配置一个连接在池中最小生存的时间,单位是毫秒 -->
<property name="minEvictableIdleTimeMillis" value="300000" />
<property name="validationQuery" value="SELECT 'x'" />
<property name="testWhileIdle" value="true" />
<property name="testOnBorrow" value="false" />
<property name="testOnReturn" value="false" />
<property name="maxOpenPreparedStatements" value="20" />
<!-- 打开removeAbandoned功能 -->
<property name="removeAbandoned" value="true" />
<!-- 3600秒,也就是60分钟 -->
<property name="removeAbandonedTimeout" value="3600" />
<!-- 关闭abanded连接时输出错误日志 -->
<property name="logAbandoned" value="true" />
<property name="poolPreparedStatements" value="false" />
</bean>
.........
</beans>
这是MySQL的配置信息,那么我们的portableFile是:src/main/portable/localTest.xml
<?xml version="1.0" encoding="UTF-8"?>
<portable-config>
<!-- 替换xml文件 start -->
<config-file path="WEB-INF/classes/spring/applicationContext.xml">
<replace xpath="//bean[@id='dataSource']/property[@name='url']/@value">jdbc:mysql://192.168.XX.XX:3317/XXXX?useUnicode=true&amp;characterEncoding=UTF-8</replace>
<replace xpath="//property[@name='username']/@value">XXX</replace>
<replace xpath="//property[@name='password']/@value">XXXXXXX</replace>
</config-file>
</portable-config>
这里,在localTest.xml 中我们通过指定需要替换的文件 - 需要替换的Bean - 需要替换的属性这种形式替换掉了原本文件的对应的值,那么我们在发布时使用maven构建就可以自动化替换并且发布了。
相应的,如果有多个环境只需要配置多个portableFile,并且在不同环境的Jenkins里面替换对应的命令就可以了。
另外:参数index的形式:
<bean id="StockQuoteBuffer" class="com.ykk.StrategyFarm.CacheManager.Quote.StockQuoteBuffer">
<constructor-arg index="0">
<value>E:/</value>
</constructor-arg>
<constructor-arg index="1">
<value>http://119.254.153.5:2052/PlayBackService/stock/dkline.do</value>
</constructor-arg>
<constructor-arg type="java.lang.Integer" index="2" >
<value>3</value>
</constructor-arg>
</bean>
<config-file path="applicationContext.xml">
<replace xpath="//bean[@id='StockQuoteBuffer']/constructor-arg[@index='0']/value">/opt/jen/jar</replace>
<replace xpath="//bean[@id='StockQuoteBuffer']/constructor-arg[@index='1']/value">http://192.168.77.166:8082/PlayBackService/stock/dkline.do</replace>
</config-file>
另外,properties文件修改
<!-- 替换properties文件 start -->
<config-file path="WEB-INF/classes/upload_file_config.properties">
<replace key="uploadDirPath">/data/analysis_data/</replace>
<replace key="analysisResultDirPath">/data/analysisPy/result/</replace>
</config-file>
<!-- 替换properties文件 stop -->
替换set:
<set>
<value>127.0.0.1</value>
<value>127.0.0.1</value>
<value>127.0.0.1</value>
<value>127.0.0.1</value>
</set>
<replace xpath="//property[@name='trustIP']/set/value[0]">192.168.77.151 </replace>
比较遗憾的是还不知道怎么添加新行,暂时只能替换现有行。
另一种方法:
mvn package -P pro-c
在项目POM文件中添加:
<profiles>
<profile>
<id>devlop</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<build>
<filters>
<filter>
src/main/properties/develop.properties
</filter>
</filters>
</build>
</profile>
<profile>
<id>test</id>
<build>
<filters>
<filter>
src/main/properties/test.properties
</filter>
</filters>
</build>
</profile>
</profiles>
.properties文件中内容:
#log out level
log.level = info
jdbc.username=XXX
配置文件格式:
<bean id="commonDataSource" class="com.alibaba.druid.pool.DruidDataSource" destroy-method="close">
<property name="username" value="${jdbc.mycat.username}" />
<property name="password" value="${jdbc.mycat.password}" />
<!-- mysql驱动类 -->
..........
可以替换xml文件,properties文件,json文件,不知道还支持什么别的格式。