假设我有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,但我对它不够熟悉,无法推荐它。我听过很多人对它破口大骂,很多人也对它破口大骂。
下面是一个类似的问答