私は Jenkins には精通していますが、Maven は初めてです。Jenkins の Maven ジョブがApplicationContext.xml
ファイル内の環境変数を展開するのを止める方法を見つけようとしています。
ファイル内で、Tomcat がロード/実行時に展開する (作成した) 環境変数ApplicationContext.xml
を参照します。${DeployMode}
<!-- SPRING CONTEXT static accessor -->
<beans:bean id="contextApplicationContextProvider"
class="com.dartneuroscience.compserv.rest.appcontext.AppContextProvider">
<beans:constructor-arg>
<beans:value>${DeployMode}</beans:value>
</beans:constructor-arg>
</beans:bean>
<beans:bean id="placeholderConfig"
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<beans:property name="location"
value="/WEB-INF/App_${DeployMode}.properties" />
</beans:bean>
問題は、Jenkins によって実行される Maven ビルドではWEB-INF/ApplicationContext.xml
、ビルド マシンに環境変数が設定されている場合 (この例では「Prod」としましょう)、ビルドは次のようになります。
<!-- SPRING CONTEXT static accessor -->
<beans:bean id="contextApplicationContextProvider"
class="com.dartneuroscience.compserv.rest.appcontext.AppContextProvider">
<beans:constructor-arg>
<beans:value>Prod</beans:value> <!-- Expanded env. var -->
</beans:constructor-arg>
</beans:bean>
<beans:bean id="placeholderConfig"
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<beans:property name="location"
value="/WEB-INF/App_Prod.properties" /> <!-- Expanded env. var -->
</beans:bean>
そのため、値は WAR に「ハードコード」され、ターゲット Web サーバーのDeployMode
環境変数が「Staging」などの別の値に設定されていても、常に「Prod」のように動作します。
これは、同じビルド サーバーで Maven を手動で実行した場合には発生しません。Jenkins がジョブをビルドした場合にのみ発生します。
この動作を停止するために Jenkins に渡すことができる設定はありますか?
ジョブの実行時にすべての環境変数への EnvInject プラグインなどのオプションを見てきましたがUNSET
、この動作に本当に困惑しており、その真相を突き止めたいと思っています。
ありがとうございました。
更新 1
最上位の POM で次のリソース フィルタリング ブロックを見つけ、ファイル<excludes/>
をスキップするブロックを追加しました。AppContext.xml
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>2.1.1</version>
<configuration>
<webResources>
<webResource>
<directory>${basedir}/src/main/webapp/WEB-INF</directory>
<includes>
<include>*.xml</include>
</includes>
<excludes>
<exclude>*AppContext.xml</exclude>
</excludes>
<targetPath>WEB-INF</targetPath>
<filtering>true</filtering>
</webResource>
</webResources>
しかし、これでも、Jenkins で実行すると環境変数がプロパティ リストに追加され、コマンド ラインから実行すると無視される理由はわかりません。数年前からこのハドソンの問題を見つけましたが、ハドソンから実行するとリソースフィルタリングが失敗します
また、EnvInjectPlugin はアドバタイズすることを行いますが、少なくとも PATH var を削除すると、maven がls
コマンドを見つけることができなかったため、ビルドが壊れました。
更新 2
Jenkins のジョブを「Maven 2/3 プロジェクト」から「フリー スタイル ソフトウェア プロジェクト」に変更し、Invoke top-level Maven targets
ビルド ステップを使用すると、POM を変更しなくても目的の結果が得られます。