【问题标题】:Jenkins ant plugin has wrong value for ${user.dir} working directoryJenkins ant 插件的 ${user.dir} 工作目录值错误
【发布时间】:2017-07-14 11:32:54
【问题描述】:

我在 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 jenkins-plugins


    【解决方案1】:

    这是因为 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 环境变量,您可以提供自定义属性以从外部传递它(默认值设置为 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}

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-10-15
      • 2012-02-28
      • 1970-01-01
      • 2013-06-13
      • 1970-01-01
      • 1970-01-01
      • 2016-12-14
      • 1970-01-01
      相关资源
      最近更新 更多