使用Jenkins构建依赖项目

5
假设我有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,并希望在运行构建之前执行三次检出,每次使用不同的标记。
编辑:
昨晚我发布了问题后就去睡觉了。今天再次阅读,我认为问题表述不够清晰,因此我将再次澄清要求。我有4个项目,它们都使用ANT作为构建机制,并且都存储在CVS存储库中。当构建所有4个项目时,会形成一个WAR文件,该文件部署在Tomcat应用程序服务器上。
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文件复制到工作区。项目4的ANT构建文件会从proj1、proj2和proj3中复制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个回答

4
我不完全理解您的要求,但我们试一试:
使用Parameterized Trigger Plugin作为构建步骤,从单个作业(称之为TriggerJob)开始三个作业。将TriggerJobBUILD_ID作为参数传递给它们,它们将使用该参数来存储结果(而不是使用自己的BUILD_ID;如果您仍然需要有时单独构建它们-而不是从TriggerJob触发-您可以为参数指定一些默认值,并使用Conditional BuildStep Plugin检查它是否具有默认值-使用自己的BUILD_ID,否则使用传递的参数)。
使TriggerJob等待三个作业完成,然后收集您的jar文件(TriggerJob知道它们在哪里),并继续进行第四个作业,该作业将调用您的最后一个ANT将它们归档在一起(或将其转换为TriggerJob中的ANT构建步骤,以适应更好)。
以下观察可能对您有用:每个ANT构建步骤都可以使用自己的构建文件(在“高级”按钮下)。您可以使用环境变量指定其路径。
多重检出:我不熟悉CVS插件,但是对于Subversion插件,我更喜欢手动操作:我有触发作业通过Subversion插件轮询SVN并将修订号作为参数传递给实际工作的作业。然后,这些作业使用显式的SVN调用(从shell构建步骤)更新到传递的修订版本。也许您可以使用CVS插件做同样的事情。

我已经更清楚地阐明了要求,希望现在清楚了。请参见编辑部分。TriggerJob将如何知道jar文件的位置? - ziggy
但是每个JAR文件最终都会出现在一个不相关的文件夹中 - 你是什么意思?它最终会出现在除了你在顶部指定的位置之外的某个地方(例如/output/...等)吗?那个地方是哪里? - malenkiy_scot
当Jenkins运行每个项目时,它会从CVS检出文件并将它们放在该项目的工作区文件夹中。当运行ANT脚本时,JAR文件最终会出现在工作区文件夹中。例如,proj1的JAR文件将位于workspace/proj1/distribution/proj1.jar,而proj2的JAR文件将位于workspace/proj2/distribution/proj2.jar - 除非我手动将它们复制到proj4的工作区,否则proj4无法构建WAR文件与这些文件夹中的JAR文件。 - ziggy
第二个选项:使用复制构件插件在构建后的操作中将您的jar(和其他构件)复制到任何您想要的地方。 - malenkiy_scot
只使用Jenkins似乎有些过头了。您是否建议使用构建存储库,如Maven或Ivy? - ziggy
显示剩余2条评论

2
使用Apache Ivy,将proj1、proj2和proj3的jar文件发布到一个构件库中。然后,每当您发布proj1、proj2或proj3的新版本时(例如使用Jenkins Ivy插件),都可以触发proj4。Proj4再次使用Ivy来检索proj1、proj2和proj3作为依赖项的jar文件,这些文件然后用于构建WAR(您也会将其发布到您的仓库中)。
如果您感到自信,还可以考虑从Ant切换到Gradle,它在内部也使用Ivy。您还可以考虑Maven,但我不熟悉它,无法推荐。我听说有很多人对它赞不绝口,也有很多人对它吐槽。 这里有一个类似的问题和答案

我曾考虑过使用Maven,但最终决定放弃它,因为它需要外部访问或者需要维护本地仓库。Ivy是否也是同样的工作方式,或者我可以配置它只使用我本地已有的库?如果Ivy可以被配置为仅使用我提供的库,那么我可以使用它。 - ziggy
1
你正在将jar包发布到一个共同的分发区域。Ivy可以配置为使用它作为本地存储库。这很棘手,但值得努力。最后,Ivy还有一个buildlist任务,可以通过检查模块的ivy文件中声明的相互依赖关系自动确定项目的构建顺序。 - Mark O'Connor
@MarkO'Connor 是正确的。如果您不想维护一个存储库,那么可以告诉它使用本地存储库。在发布和检索本地存储库时,Ivy 只是将 jar 存储在 ${user.home}/.ivy2/local 中(尽管可以配置为其他位置)。 - Tom Howard

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接