使用Jenkins构建依赖项目

时间:2012-02-28 20:43:47

标签: 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编码?

此外,是否可以在运行ANT构建脚本之前配置jenkins进行多次检出。我正在使用CVS,并希望在运行构建之前使用不同的标记执行3次检出。

修改

我上床睡觉前昨晚发布了这个问题。今天再读一遍,我认为还不够清楚,所以我会再次澄清这个要求。我有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文件,该文件存储在项目根文件夹的“distribution”文件夹中。例如,在构建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之类的构建工具,我可以使用它来存储我需要的库,不需要外部访问,请告诉我。

提前致谢。

2 个答案:

答案 0 :(得分:3)

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

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

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

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

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

答案 1 :(得分:2)

使用Apache Ivy与proj1,proj2和proj3将他们的jar文件发布到工件库。无论何时发布proj1,proj2或proj3的新版本(例如,使用Jenkins Ivy Plugin),您都可以触发proj4。 Proj4再次使用Ivy,但这次要检索proj1,proj2和proj3 jar作为依赖项,然后用它们构建WAR(你也可以发布到你的存储库)。

如果你有信心,你也可以考虑从Ant切换到Gradle,它也使用常春藤。您也可以考虑Maven,但我不熟悉它推荐它。我听说很多人都发誓,很多人都发誓。

Here is a similar question and answer