java - 使用 Jenkins 构建依赖项目

标签 java ant build continuous-integration jenkins

假设我有 3 个 ANT 项目,每个项目的 build.xml 脚本都位于顶层文件夹

proj1
 file1.java
proj2
 file2.java
proj3
 file3.java

我配置 Jenkins 来构建这 3 个项目,它构建它们并将输出存储在三个单独的文件夹中。

/output/proj1/2012-02-28_20-11-06/proj1/distribution/proj1.jar
/output/proj2/2012-02-28_20-11-08/proj2/distribution/proj2.jar
/output/proj3/2012-02-28_20-11-09/proj3/distribution/proj3.jar

ANT 脚本是将 jar 文件放入分发文件夹的脚本。我想在另一个生成 war 文件的项目中使用这些 jar 文件。

每个项目中生成的 jar 文件用于构建 WAR 文件。有什么方法可以配置 Jenkins 来构建 proj1、proj2、proj3,然后将 jar 文件复制到一个特定位置,该位置将包含另一个 ANT 项目,该项目在运行时会产生一个 war 文件?还是必须用 ANT 编码?

此外,是否可以将 jenkins 配置为在运行 ANT 构建脚本之前进行多次 checkout 。我正在使用 CVS,并希望在运行构建之前使用不同的标签分别进行 3 次检查。

编辑

我昨晚 sleep 前发布了这个问题。今天又看了一遍,觉得不够清楚,所以我会再次澄清要求。我有 4 个项目使用 ANT 作为构建机制,并且都存储在 CVS 存储库中。所有 4 个项目在构建时都形成一个部署在 Tomcat 应用程序服务器上的 WAR 文件。

proj1
 - file1.java
 - file2.java

proj2
 - file3.java
 - file4.java

proj3
 - file3.java
 - file4.java

proj4
  - jsp
    - home.jsp
 - css
    - home.css
  - WEB-INF
     - lib
     - classes 
    - web.xml

每个项目(proj4 除外)都有一个 ANT 构建文件,该文件构建项目并生成一个 JAR 文件,该文件存储在项目根文件夹的“分发”文件夹中。例如,在构建 proj1 之后,它将看起来像这样

proj1
 - file1.java
 - file2.java
 - distribution
      - classes
           - file1.class
           - file2.class
      - proj1.jar

Proj4 依赖于 proj1、proj2 和 proj3,因为在构建 war 文件之前,它首先需要将所有 jar 文件复制到其工作区中。 project4 的 ANT 构建文件从 proj1、2 和 3 复制 JAR 文件并构建 WAR 文件。生成的 WAR 文件包含以下结构

proj4
  - jsp
    - home.jsp
 - css
    - home.css
  - WEB-INF
    - lib
       - proj1.jar
       - proj2.jar
       - proj3.jar
    - classes 
    - web.xml  

现在要自动执行上述操作,我需要以某种方式配置 Jenkins 和 ANT 以执行以下操作(按照显示的顺序)

- Checkout proj1 from CVS using RELEASE1.1 tag
- Build proj1

- Checkout proj2 from CVS using RELEASE1.2 tag
- Build proj2

- Checkout proj3 from CVS using RELEASE1.1 tag
- Build proj3

- Checkout proj4 from CVS using RELEASE1.1 tag
- Copy the proj1.jar, proj2.jar, proj3.jar from the previous 3 builds and copy them to the proj4 WEB-INF/lib folder.
- Build proj4
- Deploy the WAR file. 

我昨天玩弄了 Jenkins 并设法配置它来构建每个项目,但每个 jar 文件最终都在一个不相关的文件夹中。我如何配置 Jenkins 来构建我上面描述的项目?

环境具有以下属性

Build tool - ANT
OS - Solaris

Maven 可能会使用它,但目前还没有引入 Maven 的计划。如果有一个简单的类似 Maven 的构建工具,我可以使用它来存储我需要的不需要外部访问的库,那么请告诉我。

提前致谢。

最佳答案

我不明白你的具体要求是什么,但让我们试一试:

使用 Parameterized Trigger Plugin 从一个作业(我们称之为 TriggerJob)开始您的三个作业作为构建步骤。给他们 TriggerJobBUILD_ID 作为参数,他们将使用它来存储结果(而不是使用他们自己的 BUILD_ID;如果您有时仍然需要单独构建它们- 无需从 TriggerJob 触发 - 您可以为参数指定一些默认值,并使用 Conditional BuildStep Plugin 检查它,当它具有默认值时 - 使用自己的 BUILD_ID,否则使用传入的参数).

TriggerJob 等待三个作业完成,然后收集你的 jar(TriggerJob 知道它们在哪里),然后继续执行第四个作业,它将调用你的最后一个作业ANT 将它们一起存档(或将其放入 TriggerJob 中的 ANT 构建步骤,无论哪种更合适)。

以防万一以下观察可能对您有用:每个 ANT 构建步骤都可以使用自己的构建文件(它位于 ADVANCED 按钮下)。您可以使用环境变量来指定其路径。

多次 checkout :我不熟悉 CVS 插件,但使用 Subversion 插件我更喜欢手动操作:我有触发作业,通过 Subversion 插件轮询 SVN,并将修订号作为参数传递给执行实际工作的作业。这些作业然后使用显式 SVN 调用(从 shell 构建步骤)来更新作为参数传递的修订。也许您可以使用 CVS 插件做同样的事情。

关于java - 使用 Jenkins 构建依赖项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9489405/

相关文章:

java - contains() 不起作用,但 getAbsolutePath() 起作用

android - proguardFile 问题,返回 null : 1

TFS 2013 : Multiple build controller on the same machine

android - Android Gradle依赖关系与com.android.support:appcompat-v7发生冲突

安卓构建环境

JavaFX 从不同类启动应用程序

java - Libgdx 阶段问题

java - MongoDB实现保存历史对象变化的数据库结构

bash - 如何从 ant 脚本连接文件的所有行?

android - com.android.dx.util.DexException : Multiple dex files define