Java 如何在jenkins上跨多个项目构建作业管理通用ant构建脚本?

Java 如何在jenkins上跨多个项目构建作业管理通用ant构建脚本?,java,ant,jenkins,continuous-integration,Java,Ant,Jenkins,Continuous Integration,我有一组来自不同git存储库的java项目,我希望与Jenkins一起构建这些项目 它们都共享相同的ant构建脚本,该脚本通过ant导入机制使用特定于项目的配置部分(例如编译类路径) 目前,我是手动进行共享的,但在更改公共部分时,这很容易出错 所以我的问题是:在jenkins服务器上跨多个构建作业管理共享ant构建脚本的好方法是什么?有几个想法 将Ant脚本存储在工件存储库中,您的各个项目可以从中提取,就像任何其他依赖项一样 创建包含构建脚本的父Git项目。在父项目中,将每个单独的子项目作为一个

我有一组来自不同git存储库的java项目,我希望与Jenkins一起构建这些项目

它们都共享相同的ant构建脚本,该脚本通过ant导入机制使用特定于项目的配置部分(例如编译类路径)

目前,我是手动进行共享的,但在更改公共部分时,这很容易出错

所以我的问题是:在jenkins服务器上跨多个构建作业管理共享ant构建脚本的好方法是什么?

有几个想法

  • 将Ant脚本存储在工件存储库中,您的各个项目可以从中提取,就像任何其他依赖项一样
  • 创建包含构建脚本的父Git项目。在父项目中,将每个单独的子项目作为一个整体下拉。您可能需要对脚本进行一些小的修改,以便在构建脚本中参数化子项目引用

  • 这个答案并不特定于Jenkins,应该可以移植到其他构建服务器。

    这不是一个罕见的问题,因为@Whiskyspider声明它并不局限于Jenkins。在我看来,这也是阻碍大型遗留ANT构建的问题之一。随着时间的推移,改变通用逻辑变得越来越困难,因为有理由担心它会破坏依赖的构建

    将公共逻辑保存在单独的存储库或git子模块中是一个明智的建议,因为它支持对该逻辑的版本控制。另一种选择是将公共逻辑打包为

    antlib.xml
    。这也意味着通用构建逻辑可以有一个单独的正式发布管理生命周期(在大型组织中非常重要)

    我自己也找到了另一个选择:

    将公共构建脚本中的“可重写”部分声明为“中性”元素,例如,对于路径定义,定义空路径:

    <path id="additional-classpath" />
    
    
    
    (可选)在中性定义之后导入另一个生成脚本,使其覆盖现有脚本:

    <import file="compile-classpath.xml" optional="true" />
    
    
    

    在导入的文件中,您现在可以定义元素以满足要构建的项目的个人需求。

    我认为选项1更适合我。jenkins有一个配置文件提供程序插件,可以为每个作业插入构建脚本。git子模块通常是一条通向撕裂的路径。子树合并似乎工作得更好,但我还没有遇到真正不应该是一次回购的实现。
    <antlib>
        <macrodef name="compileAndPackage">
            <attribute name="srcDir"/>
            <attribute name="buildDir"/>
            <attribute name="jarFile"/>
            <sequential>
                <mkdir dir="@{buildDir}/classes"/>
                <javac srcdir="@{srcDir}" destdir="@{buildDir}/classes" includeantruntime="false"/>
                <jar destfile="@{jarFile}" basedir="@{buildDir}/classes"/>
            </sequential>
        </macrodef>
    </antlib>
    
    <target name="build" description="Create jar">
        <jar destfile="${build.dir}/commonbuild-${version}.jar" basedir="${src.dir}"/>
    </target>
    
    <path id="additional-classpath" />
    
    <import file="compile-classpath.xml" optional="true" />