3

私は 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 を変更しなくても目的の結果が得られます。

4

1 に答える 1

2

Jenkinsは、何らかの方法でリソースフィルタリングを有効にしている可能性があります。フィルタリングを構成するための選択肢はたくさんあります。完全に無効にするか、特定の拡張子を持つファイルにフィルタリングを制限するか、フィルタにビルドプロパティを含めないように指示するか、完全にフィルタリングする別の区切り文字を選択することができます。resources:resourcesのドキュメントまたはリソースフィルタリングの概念の説明を参照してください。

于 2012-09-21T14:30:41.500 に答える