【问题标题】:Why can't my tests see my system property when I release on Jenkins?当我在 Jenkins 上发布时,为什么我的测试看不到我的系统属性?
【发布时间】:2015-05-19 06:29:16
【问题描述】:

我编写了一些单元测试代码,打印出名为“JENKINS_BUILD”的 System.property 的值。当我在本地运行这些命令时,此属性有一个值:

mvn --batch-mode test -DJENKINS_BUILD=true
mvn test -DargLine="-DJENKINS_BUILD=true"
etc.

但是无论我做什么,当它们在 Jenkins 上运行时,我都无法将此属性纳入我的测试中。这是我在那里使用的命令行选项:

mvn -DargLine="-DJENKINS_BUILD=true" --batch-mode -Dresume=false release:prepare release:perform

略有不同,但我不明白它为什么重要。为什么 Jenkins 上的 System.getProperty("JENKINS_BUILD") 为空,但在我的本地环境中为“真”?这与使用release:prepare release:perform有关吗?

I think this is basically the same question,但我不确定。不同之处在于他试图将参数传递给发布插件,而我试图将它们传递给surefire插件。另外,我想在命令行中定义值,而不必更改我的 pom.xml。有没有办法做到这一点?

FWIW,我链接到的解决方案确实有效。

【问题讨论】:

    标签: java maven jenkins maven-release-plugin


    【解决方案1】:

    注意,如果你不fork你的JVM,你在maven命令行上设置的属性会被找到;但是,如果您确实 fork JVM,则需要将属性复制到 fork JVM 的参数列表中。

    我猜您正在分叉构建的某些方面,但没有传入新的 argline,或者传入的新 argline 没有从已启动(设置)属性中复制必要的值。

    这可能意味着您可能需要设置默认(空)属性以使您的 argline 配置在设置参数和未设置参数的两种情况下都正确。这就是您链接中的第二个“示例”(Sander Verhagen 的示例)详细说明的内容,即使它没有明确说明原因。

    至于为什么在 maven-release-plugin 中经常遇到这种情况,请记住,在 maven-release-plugin 期间,您有一个“父”maven 进程驱动两个完整的嵌套 maven 构建。未能将参数传递给子构建将意味着子运行没有所需的参数(因为它们只是父活动的参数,而不是构建发布版本和下一个快照版本的两个 maven 运行。

    【讨论】:

    • 在我看来,发布插件应该使用测试生命周期,而不是拼凑自己的解决方案来运行它。这似乎可以解决我的问题。我错了吗?例如,mvn package 将一路运行test,但发布插件正在做一些特别的事情。
    • 这实际上不是一个被破解的解决方案。它只是一种较少使用的能力,可以将 maven 构建作为 maven 构建的奴隶运行。想想看,你真的不想运行只是为了测试发布,因为那样你就不会分发(或打包)工件。您不能在主线构建中运行以进行分发,因为那时您已经在发布版本上花费了整个生命周期,并且没有任何东西可以验证下一个快照是否有效(在提交之前您确实希望这样做) )。它可能并不理想,但比大多数替代品要好。
    • maven-release-plugin 接受参数配置。我会尝试一下,将顶级参数传递给较低版本的版本。附言slave 的东西也是允许 maven 站点“编译和运行测试”的原因,即使你调用了“clean site”,尽管这是作为 maven-surefire-report 配置的扩展。
    猜你喜欢
    • 1970-01-01
    • 2020-08-06
    • 1970-01-01
    • 2016-06-12
    • 1970-01-01
    • 1970-01-01
    • 2017-06-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多