我在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
它打印&#34; C:\ A&#34;
但是从安装在Jenkins CI机器上的Ant插件,它将Buildfile设置设置为&#34; B / build.xml&#34;,它打印&#34; / workspace / B&#34;
为什么它在我的本地机器上打印出我调用ant命令的文件夹,但是在Jenkins CI服务器上它打印了构建文件所在的文件夹?
非常感谢您的帮助。
保
答案 0 :(得分:1)
这是因为Jenkins Ant插件在执行之前正在将工作目录更改为包含构建文件的目录,因此导致'a'
指向该目录(user.dir
)。 / p>
在https://github.com/jenkinsci/ant-plugin/blob/master/src/main/java/hudson/tasks/Ant.java查看Ant插件的源代码,可以看出工作目录已更改为构建文件的父目录,特别是在此行中(请注意对/workspace/B
的调用:< / p>
pwd(buildFilePath.getParent())
鉴于本地和Jenkins之间的行为差异,我个人不会依赖r = launcher.launch().cmds(args).envs(env).stdout(aca).pwd(buildFilePath.getParent()).join();
属性。如果要访问Jenkins作业的当前工作空间,可以使用Jenkins提供的built-in environment variables:
user.dir
如果您不想在构建文件中显式引用<property environment="env"/>
<target name="printCWD">
<echo message="workspace=${env.WORKSPACE}"/>
</target>
env变量,则可以提供自定义属性以从外部传递它(默认值设置为WORKSPACE
) :
user.dir
然后在Jenkins工作中传递<property name="root.dir" value="${user.dir}" /> <!-- default value -->
<target name="printCWD">
<echo message="root.dir=${root.dir}"/>
</target>
。