当前位置: 首页 > 知识库问答 >
问题:

如何阻止Maven扩展环境。变量w/詹金斯?

颛孙喜
2023-03-14

我对Jenkins很熟悉,但对Maven很陌生,我正试图找出如何阻止我们在Jenkins中的Maven工作在Application ationContext.xml文件中扩展环境变量。

在我们的应用程序ontext.xml文件中,我们引用了一个环境变量${DeployMode},Tomcat在加载/运行时扩展该环境变量:

<!-- 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/Application ationContext.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构建作业时才会发生。

有没有一个设置我可以传递给詹金斯来阻止这种行为?

我已经研究过像EnvInject插件这样的选项,在作业运行时取消设置所有环境变量,但我对这种行为感到困惑,并想了解到底。

非常感谢。

我在顶级POM中找到了以下资源过滤块,并添加了

  <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运行时会将环境变量添加到属性列表中,而从命令行运行时会忽略环境变量;虽然我确实在几年前发现了Hudson的问题:从Hudson运行时,资源过滤失败

此外,EnvInjectPlugin做了它宣传的事情,但是在删除PATH var时,构建失败了,因为maven找不到ls命令。

将Jenkins中的作业从“Maven 2/3项目”更改为“自由风格软件项目”,并使用调用顶级Maven目标构建步骤生成所需的结果,而无需修改POM。


共有1个答案

哈沛
2023-03-14

詹金斯可能以某种方式启用了资源过滤。您有很多选择来配置筛选。您可以完全禁用它,将筛选限制为具有特定扩展名的文件,告诉它不要在筛选器中包含生成属性,或者选择要完全筛选的不同分隔符。请参阅参考资料:资源文档或资源筛选概念的说明。

 类似资料:
  • 问题内容: 我对Jenkins很熟悉,但是对Maven还是陌生的,并且我试图弄清楚如何阻止Jenkins中的Maven作业扩展文件内部的环境变量。 在文件内,我们引用了一个(我们创建的)环境变量,Tomcat在加载/运行时对其进行了扩展: 问题在于,在由詹金斯(Jenkins)运行的Maven构建中,如果在构建机器上设置了环境变量,则构建看起来像这样(在本示例中为’Prod’): 因此,该值现在已

  • 问题内容: 我希望能够执行以下操作: 并安排詹金斯。 Jenkins中的“ 环境变量” 部分不这样做。而是设置了。 如何让Jenkins评估Shell命令并将输出分配给环境变量? 最终,我希望能够将作业的执行者分配给可以传递到其他脚本或由其他脚本使用的环境变量。 问题答案: 可以通过以下方式通过EnvInject插件完成此操作: 创建一个运行的“执行外壳”构建步骤: 创建一个“ 注入”环境变量 构

  • 问题内容: 我想在詹金斯中设置很多变量。我试图把他们的,和该的用户,但是当构建正在发生詹金斯无法找到他们。 唯一可行的方法是将所有env变量放入其中,如下所示: 但是我不认为这是个好方法。 在詹金斯中设置环境变量的正确方法是什么? 问题答案: 在我看来,这很正常。并且应被视为文本凭据,您可以使用 指令添加环境变量。 如果你需要保持环境变量分开,你可以创建一个包含所有的常规文件,然后将该文件加载到使

  • 我正在做一个Jenkins的工作,它接受来自用户的一些参数。我遇到了一个不希望的行为:在我的脚本有机会读取环境变量之前,Jenkins似乎在参数环境变量中扩展了环境变量引用。 如果用户输入 作为参数,我的脚本实际看到的是 的内容;环境变量已展开。如果输入的值包含 我的脚本只能看到一个 。但是,如果它包含环境中不存在,则该值将保持不变(不会引发任何类型的错误)。 这很不方便,因为它甚至出现在密码字段

  • 问题内容: 在我的.sh文件中,我有此文件,而$ SOME_PATH导出为。但是,当我运行此.sh文件时,出现了错误消息,例如不存在这样的“〜/ path / to / path /”。 我将〜替换为$ HOME,然后错误消失了。那么代字号在这儿呢? 提前致谢。 问题答案: 采用 如果路径中有空格,请引用它

  • 我猜这是因为它没有$app_vol_dir,但为什么会这样呢?如果docker compose扩展了另一个定义Environment:variables的compose文件