Jenkins Ant插件对于$ {user.dir}工作目录的价值错误



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

最新更新