2017-02-23 39 views
2

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

但是从Ant插件安装一个詹金斯CI机,其具有构建文件设置为 “B/build.xml中” 上,它打印“/工作区/ B“

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

非常感谢您的帮助。

保罗

回答

1

这是因为詹金斯蚂蚁插件是改变工作目录包含构建文件的目录只是在执行之前,因此引起user.dir指向该目录(/workspace/B)。

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

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

鉴于本地和詹金斯之间的这种行为差异,我不会亲自依靠user.dir属性如果您要访问的詹金斯作业的当前工作区,你可以使用詹金斯提供的built-in environment variables

<property environment="env"/> 

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

如果你不想显式引用WORKSPACE环境变量在构建文件,你可以提供一个自定义属性从外部通过它(设置为user.dir默认值):

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

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

然后通过-Droot.dir=${WORKSPACE}在詹金斯的工作。

+0

非常感谢! – Paul