@whiskeyspiderは、Jenkinsに限定されていないと述べているため、珍しい問題ではありません。私の意見では、これは大規模なレガシーANTビルドを妨げる問題の1つでもあります。時間の経過とともに、依存するビルドを壊すという正当な恐れがあるため、共通論理を変更することはますます難しくなります。
共通ロジックを別のリポジトリまたはgitサブモジュールに保持することは、このロジックのバージョン管理を可能にするため、適切なアドバイスです。別のオプションは、共通論理をANTlibとしてパッケージ化することです。
<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>
より複雑に見えますが、私はこれらの種類の一般的なタスクを作成し続けることで、より再利用可能で読みやすいビルドファイルを作成します。また、組織のカスタマイズが何であるかが明らかになります。厄介な埋め込みスクリプトを含む可能性のある実装の詳細を非表示にする場合に特に便利です。
最後に、サードパーティの依存関係を管理するためにivyを使用するのが大好きです。これは、ビルドに必要な共通ロジックのバージョンをリポジトリから簡単にダウンロードできることを意味します。
ANTlibを作成する方法
├── build.xml
└── src
└── com
└── example
└── commonbuild
└── antlib.xml
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>
ノート:
- この例には単一のタスクがあります。実際には、一般的なビルドロジックは複数のmacrodefを提供します。
build.xml
XMLファイルをjarファイル化するだけです。
<target name="build" description="Create jar">
<jar destfile="${build.dir}/commonbuild-${version}.jar" basedir="${src.dir}"/>
</target>
私のビルドロジックはさらにこのjarファイルを私のリポジトリに公開し、他のビルドがivyを使用してそれをプルダウンできるようにします。また、共通のビルドロジックは、個別の正式なリリース管理ライフサイクルを持つことができることを意味します(大規模な組織では非常に重要です)