Jenkins ant 插件对 ${user.dir} 工作目录有错误的值

Jenkins ant plugin has wrong value for ${user.dir} working directory

我在 C:\A\B

中有以下构建文件
<project name="demo" default="printCWD">
    <target name="printCWD">
        <echo message="user.dir=${user.dir}"/>
    </target>
</project>

和 运行 此命令在 C:\A

ant -buildfile B\build.xml

它打印 "C:\A"

但是从安装在 Jenkins CI 机器上的 Ant 插件,其 Buildfile 设置设置为 "B/build.xml",它打印“/workspace/B”

为什么它在我的本地机器上打印我调用 ant 命令的文件夹,而在 Jenkins CI 服务器上它打印构建文件所在的文件夹?

非常感谢您的帮助。

保罗

这是因为 Jenkins Ant 插件在执行之前将工作目录更改为包含构建文件的目录,因此导致 user.dir 指向该目录 (/workspace/B)。

查看 https://github.com/jenkinsci/ant-plugin/blob/master/src/main/java/hudson/tasks/Ant.java 处 Ant 插件的源代码表明工作目录已更改为构建文件的父目录,特别是在这一行中(注意对 pwd(buildFilePath.getParent()) 的调用:

r = launcher.launch().cmds(args).envs(env).stdout(aca).pwd(buildFilePath.getParent()).join();

鉴于本地和 Jenkins 之间的这种行为差异,我个人不会依赖 user.dir 属性。如果想访问Jenkins作业的当前工作空间,可以使用Jenkins提供的built-in environment variables

<property environment="env"/>

<target name="printCWD">
    <echo message="workspace=${env.WORKSPACE}"/>
</target>

如果您不想在构建文件中显式引用 WORKSPACE env 变量,您可以提供自定义 属性 从外部传递它(默认值设置为 user.dir):

<property name="root.dir" value="${user.dir}" />  <!-- default value -->

<target name="printCWD">
    <echo message="root.dir=${root.dir}"/>
</target>

然后在Jenkins作业中传-Droot.dir=${WORKSPACE}