我正在尝试迁移我编写的 Ant 脚本,以从 Jenkins 框架内构建和部署项目(而不是从 SVN 提交后 Hook 触发,这是我们最初处理事情的权宜之计)。一切都很好,除了我需要为部署步骤暂存文件并且我想将它们填充到 Jenkins 为该工作创建的“构建”目录中(并且由于我的 build.xml 位于非项目特定的位置,${ basedir} 和 ${user.dir} 不指向所需的位置)。
在 Jenkins 配置中,我设置了以下内容:
[ Jenkins ]
构建记录根目录:E:/builds/${ITEM_FULLNAME}
[特定工作]
构建文件:C:\vc-tools\shadow\build.xml
运行构建时,会适本地启动脚本并创建特定于作业的构建目录,例如
E:\builds\Test\2012-08-07_12-51-21
我想从构建脚本中获取这个目录,但不知道如何。我尝试过的一些事情:
[echo] ${basedir}: C:\vc-tools\shadow
[echo] ${user.dir}: C:\vc-tools
[echo] ${env.workspace}: C:\Program Files (x86)\Jenkins\workspace\Test
[echo] ${env.build_id}: 2012-08-07_12-51-21
[echo] ${jenkins_home}: C:\Program Files (x86)\Jenkins
[echo] ${BuildDir}: E:/builds/${ITEM_FULLNAME}
注意:对于最后一个,我尝试传入:
BuildDir=E:/builds/${ITEM_FULLNAME}
作为从 Jenkins 中的作业配置的属性(显然 ${} 扩展不会在这种情况下发生)。
根据documentation ,没有设置为完整构建目录路径的特定环境变量——我可以通过硬编码 E:\builds root 并添加 ${env.build_id} 来伪造它,但希望有一种更简单的方法来从 Jenkins 公开的内容(Ant 属性和环境变量)中访问完整路径,以使脚本更加灵活。
我正在使用 Jenkins 版本 1.476。
谢谢
最佳答案
对于您的项目来说,在源代码旁边包含其构建逻辑的副本总是一个好主意。它使您的构建更易于跨机器移植。
话虽如此,设置包含通用共享构建逻辑的构建文件也很常见。 ANT 定义了以下任务来支持此类事件:
因此,一个可能的解决方案是在项目目录的根目录中存储一个简单的 build.xml 文件:
<project name="my project" default="build">
<include file="C:\vc-tools\shadow\common-build-1.0.xml" as="common"/>
<target name="build" depends="common.build"/>
</project>
备注:
更新
当 Jenkins 运行作业时设置了 environment variables .
以下 ANT 逻辑将打印 Jenkins 工作区目录的位置:
<property environment="env"/>
<target name="run">
<echo message="Jenkins workspace: ${env.WORKSPACE}"/>
<echo message="Job directory: ${env.WORKSPACE}../../jobs/${env.JOB_NAME}"/>
<echo message="Build data: ${env.WORKSPACE}../../jobs/${env.JOB_NAME}/build/${env.BUILD_ID}"/>
</target>
关于ant - 如何从 Ant 确定 Jenkins 构建目录?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11851128/