如何在jenkins上跨多个项目构建作业管理常见的ant构建脚本?

Mar*_*kus 4 java ant continuous-integration jenkins

我有一组来自不同git存储库的java项目,我想用Jenkins构建它们.

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

目前我手动共享这个,但这对于公共部分的更改非常容易出错.

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

Mar*_*nor 6

这并不是一个不寻常的问题,因为@whiskeyspider表示它不仅限于詹金斯.在我看来,这也是阻碍大型遗留ANT构建的问题之一.随着时间的推移,由于合理地担心它会破坏依赖构建,因此更改共同逻辑变得越来越难.

将公共逻辑保存在单独的存储库或git子模块中是合理的建议,因为它可以对此逻辑进行版本控制.另一种选择是将公共逻辑打包为ANT lib

<project ... xmlns:common="antlib:com.example.commonbuild">

    <taskdef uri="antlib:com.example.commonbuild">
        <classpath>
             <fileset dir="${lib.dir}" includes="commonbuild-1.0.jar"/>
        </classpath>
    </taskdef>

    ..
    ..

    <target name="build">
        <common:compileAndPackage srcDir="${src.dir}" buildDir="${build.dir}" jarFile="${build.dir}/${ant.project.name}.jar"/>
    </target>
Run Code Online (Sandbox Code Playgroud)

虽然看起来更复杂但我维护创建这些常见任务使得构建文件更具可重用性和可读性.它还明确了您组织的定制是什么.我发现它隐藏了可能涉及令人讨厌的嵌入式脚本的实现细节特别有用.

最后,我非常喜欢使用常春藤管理我的第三方依赖项.这意味着我可以轻松地从我的存储库下载我的构建需要的任何版本的通用逻辑.

如何创建一个ANT库

??? build.xml
??? src
    ??? com
        ??? example
            ??? commonbuild
                ??? antlib.xml
Run Code Online (Sandbox Code Playgroud)

antlib.xml

<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>
Run Code Online (Sandbox Code Playgroud)

注意:

  • 此示例只有一个任务.实际上,您的公共构建逻辑将提供多个宏定义.

build.xml文件

只需将XML文件包起来:

<target name="build" description="Create jar">
    <jar destfile="${build.dir}/commonbuild-${version}.jar" basedir="${src.dir}"/>
</target>
Run Code Online (Sandbox Code Playgroud)

我的构建逻辑还会将此jar文件发布到我的存储库中,以便其他构建可以使用常春藤将其下载.也意味着公共构建逻辑可以具有单独且正式的发布管理生命周期(在大型组织中非常重要)