8

我正在尝试迁移我编写的 Ant 脚本,以从 Jenkins 框架内构建和部署项目(而不是从 SVN 提交后挂钩触发,这是我们最初处理事情的权宜之计)。一切都很好,除了我需要为部署步骤暂存文件,并且我想将它们填充到 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 中的作业配置的属性(显然 ${} 扩展不会在这种情况下发生)。

根据文档,没有设置为完整构建目录路径的特定环境变量——我可以通过硬编码 E:\builds 根目录并添加 ${env.build_id} 来伪造它,但希望会有一种从 Jenkins 公开的内容(Ant 属性和环境变量)访问完整路径的更简单方法,以使脚本更加灵活。

我正在使用 Jenkins 版本 1.476。

谢谢

4

2 回答 2

12

对于您的项目来说,在源代码旁边包含其构建逻辑的副本总是一个好主意。它使您的构建更易于跨机器移植。

话虽如此,设置包含通用共享构建逻辑的构建文件也很常见。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 运行作业时会设置许多环境变量

以下 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>
于 2012-08-07T19:59:43.517 回答
5

这些天(Jenkins v. 1.484)上面答案中的“运行”目标应该如下所示:

<target name="run">
    <echo message="Jenkins workspace: ${env.WORKSPACE}"/>
    <echo message="Job directory: ${env.WORKSPACE}/../../${env.JOB_NAME}"/>
    <echo message="Build data: ${env.WORKSPACE}/../../${env.JOB_NAME}/builds/${env.BUILD_ID}"/>
</target>
于 2012-10-02T09:25:28.713 回答