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}
我在 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}