我在c: a b
中具有以下构建文件<project name="demo" default="printCWD">
<target name="printCWD">
<echo message="user.dir=${user.dir}"/>
</target>
</project>
并在c: a
中运行此命令ant -buildfile Bbuild.xml
它打印" c: a"
但是,从安装在Jenkins CI计算机上的Ant插件中,该机器的设置设置为" B/build.xml",它打印为"/workspace/b"
为什么在我的本地计算机上它打印了我调用ant命令的文件夹,但是在jenkins CI服务器上它打印了buildfile在?
中的文件夹非常感谢您的任何帮助。
Paul
这是因为jenkins ant插件正在执行之前将工作目录更改为包含构建文件的目录,因此导致 user.dir
指向该目录( /workspace/B
)。
查看https://github.com/jenkinsci/ant-plugin/blob/master/src/main/java/java/hudson/hudson/tasks/ant.java,查看ANT插件的源代码已更改为构建文件的父,特别是在此行中(请注意呼叫pwd(buildFilePath.getParent())
:
r = launcher.launch().cmds(args).envs(env).stdout(aca).pwd(buildFilePath.getParent()).join();
鉴于本地和詹金斯之间的行为差异,我个人不会依靠user.dir
属性。如果要访问Jenkins作业的当前工作区,则可以使用Jenkins提供的内置环境变量:
<property environment="env"/>
<target name="printCWD">
<echo message="workspace=${env.WORKSPACE}"/>
</target>
如果您不想在buildfile中明确引用WORKSPACE
ENV变量,则可以提供自定义属性以从外部传递(将默认值设置为user.dir
):
<property name="root.dir" value="${user.dir}" /> <!-- default value -->
<target name="printCWD">
<echo message="root.dir=${root.dir}"/>
</target>
然后通过詹金斯作业中的 -Droot.dir=${WORKSPACE}
。