使用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个项目在构建时形成一个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文件复制到其工作区中。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的简单构建工具,我可以用来存储我需要的库,而不需要外部访问,那么请告诉我。

提前谢谢。

我不完全理解您的要求,但让我们试一试:

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

TriggerJob等待三个作业完成,然后收集你的罐子(TriggerJob知道它们在哪里),然后继续执行第四个作业,该作业将调用你的最后一个ANT来将它们归档在一起(或者在TriggerJob中使其成为ANT构建步骤,无论什么更合适)。

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

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

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

如果你感到自信,你也可以考虑从Ant换成Gradle,后者也在背后使用Ivy。你可能也会考虑Maven,但我对它不够熟悉,无法推荐它。我听过很多人对它破口大骂,很多人也对它破口大骂。

下面是一个类似的问答

相关内容

  • 没有找到相关文章

最新更新