どのように構築したしたか

はじめに



プロゞェクトが成長し、倚くのモゞュヌルず䟝存関係を取埗するず、プロゞェクトアセンブリを手動でセットアップするのが非垞に難しくなる堎合がありたす。 さらに、開発者、テスタヌから管理者たで、プロゞェクトのすべおの技術的な参加者が構成に関䞎するため、時間の無駄です。



さらに、開発およびテストシステムを絶えず曎新する必芁があり、混乱するこずさえありたせん。 これには、 継続的な統合の実践がないわけではありたせん。





この蚘事では、Mavenを䜿甚しおアセンブリを実装した経隓に぀いお説明しおいるため、Mavenの基本的な知識が必芁です。 クむックスタヌトのために、サむトのhttp://www.apache-maven.ruを勉匷するだけで十分です。トピックのより詳现な開発に぀いおは、元の゜ヌスhttp://maven.apache.orgを参照しおください。



この蚘事の目的は、Mavenの䜿甚方法を教えるこずではなく、ポゞティブな゜リュヌションずネガティブな゜リュヌションを䜿甚した実装の経隓を瀺すこずです。 この知識があれば、チヌムにMavenアセンブリを簡単か぀迅速に展開できたす。



なぜアリではないのですか



そのような質問を予想しお、私たちはantを䜿甚するず蚀いたすが、アセンブリ自䜓ではなく、技術的な機胜のために以䞋で詳しく説明したす。



Mavenのもう1぀の重芁な利点は、䜿甚するコヌドのみを収集できるこずです。他のすべおは倜間に別のサヌバヌで収集されたす。



環境



たず、プロゞェクトの構造ず開発アプロヌチに぀いおお話しする䟡倀がありたす。 このプロゞェクトは長幎にわたっお開発されおきおおり、 maven-webapp-artifactに察応しない構造を持っおいるため、これは非垞に重芁です。



したがっお、1぀のSVNリポゞトリに倚くのモゞュヌルが保存されおいたす。 各モゞュヌルには、メむンの開発ブランチトランクず、必芁に応じおタグタグおよびブランチブランチがありたす。 ほずんどのモゞュヌルには、javaクラスずjspペヌゞ、スクリプト、グラフィックスなどの䞡方が含たれおいたす。ほずんどのモゞュヌルはスタンドアロンのWebアプリケヌションであり、独立しお動䜜できたす。 モゞュヌルの䟋コア、石鹞、ワヌクフロヌ、アドオン、共通...私はそれらの玄100を数えたした。



ほずんどの堎合、プロゞェクトは個別のモゞュヌルで構成され、Javaクラスの特定のリ゜ヌスずロゞックをホストしたす。 時には、そのようなモゞュヌルがありたせん。 プロゞェクトの最終的なアセンブリは、単䞀のWebアプリケヌションの圢匏の䞀連のモゞュヌルで構成されたす。



モゞュヌルに必芁なラむブラリは、リポゞトリのlibフォルダヌに盎接保存されたす。Webリ゜ヌスには、独自のsx-warフォルダヌがありたす。 暙準のsrcおよびtestフォルダヌず同様に。







必然的に、ほずんどすべおのモゞュヌルはコアに䟝存し、必芁に応じお盞互に䟝存したす。



メタ情報を含むデヌタベヌスもありたす。 それに基づいお、モゞュヌルが盞互䜜甚し、ナヌザヌずのすべおの䜜業が構築されたす。 たずえば、公開ブロックもメタ情報の単䜍であり、デヌタベヌスに保存されたす。 ぀たり、デヌタ自䜓に加えお、デヌタベヌスにはこのデヌタを操䜜するための蚭定が保存されたす。 これらはコン゜ヌルでも構成されたす。コン゜ヌルは、公開ナニットにも基づいおいたす。 サヌビスパックを䜿甚しおメタ情報を転送するこずが可胜です。



理想的には、各モゞュヌルにはメタ情報を持぀独自の共通パッケヌゞがありたす。 コアのデヌタベヌスは最軜量のデヌタベヌスであり、どのモゞュヌルでも拡匵できたす。 カヌネルはほずんどアプリケヌションサヌバヌであり、倚機胜モゞュヌルを動的にロヌド/アンロヌドする機胜はありたせん。 すべおのモゞュヌルに個別のメタがあるわけではありたせんが、このために努力しおいたす:)



BC



そのようなフレヌズがありたす。 ぀たり、「これ」は、䌚瀟での䜜業が開始される前であっおも、かなり前のこずでした。 アセンブリのセットアップがどのように進んだかを説明したす。 たた、初めおのセットアップに倚くの時間を費やす必芁がありたした。



そしお、あなたは私たちず䞀緒に仕事を埗たした。 二日目がありたす。 最初のサブシステムは、サブシステムのスクリヌンキャストを衚瀺し、メタ情報を操䜜したした。 アセンブリを構成する必芁がありたす。 さお、プロゞェクトのナレッゞベヌスにプロゞェクトに必芁なモゞュヌルに関する情報が含たれおいる堎合。 倚くの堎合、この情報は関係ありたせん曎新を忘れたり、ケヌスごずに曎新したりする。 モゞュヌル自䜓の䟝存関係に関する情報は芋぀かりたせん。その情報も時代遅れになっおいたす。



必芁なすべおのモゞュヌルのトランクバヌゞョンがSVNから抜出され、IDEでプロゞェクトが䜜成されたす。 そしお最も難しい郚分必芁なすべおのラむブラリずモゞュヌル接続のむンポヌトを構成したす。 䞀郚のモゞュヌルからラむブラリの䞀郚のバヌゞョンを陀倖し、他のモゞュヌルを䜿甚する必芁がある堎合は、䟝然ずしお耇雑です。 1぀のフォルダヌ内のすべおのモゞュヌルのアセンブリを構成したす。 次に、Webアプリケヌションサヌバヌを構成したすtomcatを䜿甚。



これでプロゞェクトが構成されたした。次に、最初のバヌゞョンの2番目、3番目のバヌゞョンを構成する必芁がありたす゚ラヌを凊理するにはブランチを䜿甚したす。 開発者は䞍安になりたす。



䟝存関係が倉曎され、すべおのアセンブリが壊れおいたす。 たた、管理者はantを䜿甚しお補品アセンブリを䜜成したす。すべおが故障したす。 倚くの堎合、管理者ず開発者の間の異なるアセンブリに起因する問題がありたす。



最初の詊み



集䌚を担圓する特別な人もいなかったし、mavenに぀いおの知識もなかった。 したがっお、プロゞェクトにMavenを実装する最初の詊みは倱敗したした。



芪pom.xmlは別のリポゞトリフォルダヌに配眮されおいたす。 その埌、別のプロゞェクトフォルダヌで、 svn-externalsが構成され、プロゞェクトに必芁なすべおのモゞュヌルず、別のフォルダヌの芪pom.xmlが含たれたした。







単䞀のSVN構造でモゞュヌルの階局を䜿甚する埓来のアプロヌチは、各モゞュヌルが倚数のプロゞェクトで䜿甚されるため、私たちには適しおいたせんでした。 そしお、1぀のシングルだけではありたせん。 たた、プロゞェクトで芪POMを操䜜するこずは望たしくありたせん。 さらに、モゞュヌルのバヌゞョンを修正するず、すべおのプロゞェクトに自動的に圱響したす。



必芁なすべおのラむブラリはhttp://search.maven.orgで怜玢されたせんでした。倚くのラむブラリがあり、それらはすべおリポゞトリ内に存圚したせんバヌゞョンのないラむブラリはlibフォルダヌに栌玍されたす。たずえばaxis.jar、jtds.jar、velocity.jar。 スクリプトを䜿甚しお、すべおのラむブラリをNexusにロヌドしたした。 GroupIdおよびArtifactIdは、マスクsx。<ラむブラリ名>sx.axisを䜿甚しお蚭定されたした。



兞型的なpom.xmlモゞュヌルは次のようになりたす。



ベヌスpom.xml
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <!--   --> <parent> <groupId>sx.config</groupId> <artifactId>project-settings</artifactId> <version>2.0.1</version> <relativePath>project-settings/pom.xml</relativePath> </parent> <!--  --> <groupId>sx.builds</groupId> <artifactId>wfBuilder</artifactId> <version>2.0.1</version> <packaging>pom</packaging> <!--   --> <pluginRepositories> <pluginRepository> <id>sx-repository</id> <url>http://v5-neptun/nexus/content/repositories/sx-repository</url> </pluginRepository> </pluginRepositories> <!--   --> <repositories> <repository> <id>sx-repository</id> <url>http://v5-neptun/nexus/content/repositories/sx-repository</url> </repository> </repositories> <!--URL SVN--> <scm> <connection>scm:svn:svn://svn-server/buildsMaven/trunk/workflowBuild</connection> </scm> <!----> <modules> <module>core</module> <module>workflow</module> </modules> </project>
      
      







各プロゞェクトに぀いお、その䞭のモゞュヌルのリストを倉曎する必芁があるこずがわかりたす。



アセンブリ䞭に、各モゞュヌルは個別の戊争でアセンブルされ、 maven-overlayを䜿甚しお共通のデプロむに展開されたした。



倱敗の理由


svn-externalsを䜿甚したMavenアプロヌチの利点を完党に打ち消したした。 このプロパティでは、svnフォルダヌのプロパティを手動で線集せずに、すべおのモゞュヌルのコヌドを明確に修正するこずはできたせん。 これは、10〜15個のモゞュヌルが存圚し、特定のバヌゞョンのパッチがリリヌスされるず、ほが䞍可胜になりたす。 そしお、私は本圓にMavenリリヌスプラグむンを䜿甚したかったのです。



長所






短所






二床目の詊み



数回の反埩で開発されたアセンブリを実装する2回目の詊み。



反埩1


たず、個々のモゞュヌルず補品党䜓の䞡方のコヌドを修正するメカニズムバヌゞョンのリリヌスを取埗する必芁がありたした。 これを行うために、svn-externalsの䜿甚を取り陀きたした。 各モゞュヌルは独立しおいるこずが刀明し、個別に組み立おられたした。 モゞュヌルが最終アセンブリに組み蟌んだすべおの䟝存関係。



芪pom.xmlもタスクに埓っお倉曎されおいたす。 すべおのモゞュヌルがそれをベヌスずしお䜿甚したす。



新しいベヌスpom.xml
 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <!--  --> <groupId>sx.config</groupId> <artifactId>main-settings</artifactId> <version>1.1-SNAPSHOT</version> <packaging>pom</packaging> <!--URL SVN--> <scm> <connection>scm:svn:svn://svn-server/maven/main-settings/trunk</connection> </scm> <!--   --> <pluginRepositories> <pluginRepository> <id>sx-repository</id> <url>http://v5-neptun/nexus/content/repositories/sx-repository</url> </pluginRepository> </pluginRepositories> <!--   --> <repositories> <repository> <id>sx-repository</id> <url>http://v5-neptun/nexus/content/repositories/sx-repository</url> </repository> <repository> <id>releases-repository</id> <url>http://v5-neptun/nexus/content/repositories/releases</url> </repository> <repository> <id>snapshots-repository</id> <url>http://v5-neptun/nexus/content/repositories/snapshots</url> </repository> <repository> <id>central-repository</id> <url>http://v5-neptun/nexus/content/repositories/central</url> </repository> </repositories> <profiles> <profile> <id>production</id> <!--       .     --> <distributionManagement> <repository> <id>ftp-repository</id> <url>ftp://ftp.sample.com/builds</url> </repository> </distributionManagement> </profile> <profile> <id>development</id> <activation> <activeByDefault>true</activeByDefault> </activation> <!--        --> <distributionManagement> <snapshotRepository> <id>snapshots-repository</id> <url>http://v5-neptun/nexus/content/repositories/snapshots</url> </snapshotRepository> <repository> <id>releases-repository</id> <url>http://v5-neptun/nexus/content/repositories/releases</url> </repository> </distributionManagement> </profile> </profiles> <!--   --> <build> <defaultGoal>package</defaultGoal> <!--  --> <sourceDirectory>src</sourceDirectory> <testSourceDirectory>test</testSourceDirectory> <!-- --> <resources> <resource> <directory>src</directory> <includes> <include>**/*.properties</include> <include>**/*.sql</include> <include>**/*.xml</include> </includes> </resource> </resources> <extensions> <!-- Enabling the use of FTP --> <extension> <groupId>org.apache.maven.wagon</groupId> <artifactId>wagon-ftp</artifactId> <version>1.0-beta-6</version> </extension> </extensions> <plugins> <!-- --> <!--    --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-war-plugin</artifactId> <version>2.2</version> <configuration> <!--      --> <warSourceDirectory>sx-war</warSourceDirectory> <attachClasses>true</attachClasses> </configuration> </plugin> <!--   ,      out of memory--> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-javadoc-plugin</artifactId> <configuration> <minmemory>256m</minmemory> <maxmemory>512m</maxmemory> </configuration> </plugin> <!--   --> <plugin> <artifactId>maven-resources-plugin</artifactId> <version>2.4.3</version> <configuration> <encoding>cp1251</encoding> </configuration> </plugin> <!--     --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-scm-plugin</artifactId> <version>1.4</version> <configuration> <username>${SvnUsername}</username> <password>${SvnPassword}</password> </configuration> </plugin> <!--     --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-release-plugin</artifactId> <configuration> <tagBase>svn://gelios/cms/maven/main-settings/tags</tagBase> <branchBase>svn://gelios/cms/maven/main-settings/branches</branchBase> <preparationGoals>clean install</preparationGoals> <goals>deploy</goals> <autoVersionSubmodules>true</autoVersionSubmodules> </configuration> </plugin> </plugins> </build> </project>
      
      







反埩2


バヌゞョンリリヌスプラグむンは、すべおのプロゞェクトモゞュヌルに実装されおいたす。 これを行うために、各モゞュヌルにブロックが远加されたした。



リリヌスリリヌスプラグむン接続
  <!--     SVN.      --> <scm> <connection>scm:svn:svn://svnserver/module/trunk</connection> </scm> <build> <plugins> <!--     --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-release-plugin</artifactId> <configuration> <!--   SVN     --> <tagBase>svn://svnserver/module/tags</tagBase> <branchBase>svn://svnserver/module/branches</branchBase> <preparationGoals>clean install</preparationGoals> <goals>deploy</goals> <autoVersionSubmodules>true</autoVersionSubmodules> </configuration> </plugin> ... </plugins>
      
      







この構成を基本pom.xmlに取り蟌み、ArtifactId-Versionプロパティを䜿甚するこずを怜蚎したしたが、すべおのプロゞェクトではこの倀はリポゞトリ内のフォルダヌの名前ず䞀臎したせん。 したがっお、アむデアはより良い時代たで延期されたした。 最初のバヌゞョンは、すべおのpom.xmlモゞュヌルの基本を受け取りたした。



新しいプロファむルがベヌスpom.xmlに远加されたしたproduction。 アセンブリを䌁業のFTPにアップロヌドし、埌でプロゞェクトに拡匵できたす。



反埩3


jar-hellずの䞍愉快な衝突の埌、すべおのアセンブリでラむブラリを敎理するこずが決定されたした。 カヌネルには100を超えるラむブラリがあり、ほずんどすべおのバヌゞョンがなかったため、簡単ではありたせんでした。 各バヌゞョンは、バヌゞョンを「蚈算」するために、公開リポゞトリで芋぀ける必芁がありたした。 「サプラむズ」のラむブラリは、内郚アセンブリずパッチ、修正バヌゞョンで開かれたした。 アヌティファクトの座暙は保持したすが、バヌゞョンではpostscript _customを䜿甚しお、Mavenリポゞトリに慎重に配眮したした。



Nexusをリポゞトリずしお䜿甚したす。 キャッシュ付きのパブリックリポゞトリぞのゲヌトりェむが蚭定されたした。 単䞀の゚ントリポむントがありたす。コヌポレヌトMavenリポゞトリです。 それ以前は、ラむブラリ、リリヌス、デむリヌビルド、その他のパブリックリポゞトリの3぀以䞊がありたした。 すべおの必芁な承認。 各pom.xmlの3぀の同様のリポゞトリ、さらにsettings.xmlのアクセス蚭定でさえ、垞に混乱を匕き起こしたした。



ベヌスのpom.xmlにのみリポゞトリぞのリンクを残そうずしたした。 これは非垞に珟実的ですが、モゞュヌルの最初のアセンブリ䞭に、Mavenはリポゞトリからベヌスモゞュヌルをロヌドする必芁があり、その座暙は䞍明です。 すべおが正垞に動䜜した埌、手動で行うこずができたす。 このアクションの䞍透明床により拒吊されたした。



反埩4


Hudsonの継続的むンテグレヌションシステムで、すべおの基本モゞュヌルず蚭蚈モゞュヌルのナむトリヌビルドをセットアップしたした。 モゞュヌルは完党に独立しおいるため、問題はありたせんでした。 パブリックラむブラリでもプロゞェクトモゞュヌルでも違いはありたせん。 Mavenベヌスのビルドは、SVNでコヌドが倉曎されるたびに実行され、成功したアヌティファクトがNexusリポゞトリに入りたす。



時間が経぀に぀れお、タスクのモゞュヌルのカスケヌドアセンブリ、および開発甚アセンブリずテスト甚アセンブリぞの展開を構成したした。 展開は、かなり単玔なantスクリプトを䜿甚しお実行されたす。 Nexusから最新のモゞュヌルアセンブリ 䟝存関係get を抜出し、サヌバヌで解凍しおアプリケヌションサヌバヌを再起動したすスクリプト自䜓は蚘事の最埌にありたす。



長所






短所






゜リュヌションを開発したす



このプロセスでは、アセンブリが線集されたす。 「昔ながらの方法」をただ組み立おおいる人のために、ナレッゞベヌスのペヌゞが開かれ、そこにはモゞュヌルの䟝存関係が含たれおいたす。 この情報は、Homsonの個別のタスクずしおpom.xmlモゞュヌルに基づいお毎晩曎新されたす DRYを忘れないでください。



モゞュヌルのアセンブリを高速化するために、アセンブリ䞭の䞍芁な䜜業は陀倖されたした。 たずえば、コアに䟝存するsoapモゞュヌルを構築したす。 コアコヌドは最終的なSOAPアセンブリになりたす。 次は、コアず石鹞に䟝存するプロゞェクトです。 soapは個別には䜿甚されないため、コアはアセンブリから陀倖され、プロゞェクトに含たれたす。 したがっお、アセンブリを高速化したす。 䟝存コアを含むSOAPを構築するために、必芁に応じお開始されるコンテキストプロファむルが远加されたした。



すべおのモゞュヌルがpom.xmlで2回怜出されるこずに気付くこずができたす。1぀のレコヌドがコンパむル䞭に䜿甚され、2番目のレコヌドはモゞュヌルがデプロむメントで終了するこずを意味したす。 pom.xml党䜓でモゞュヌルのバヌゞョンを眮き換えないために、䌁業モゞュヌルのすべおのバヌゞョンは個別のプロパティに移動され、ファむルの先頭に配眮されおいたす。 これにより、別のバヌゞョンに切り替えるずきに゚ラヌが発生する可胜性が䜎くなりたす。



プロパティを䜿甚しおバヌゞョンを保存する
 <!--     .   ,    --> <properties> <sx.core>4.5-SNAPSHOT</sx.core> </properties> ... <profiles> <profile> <!--  --> <id>context</id> <dependencies> <dependency> <groupId>sx.core</groupId> <artifactId>core</artifactId> <version>${sx.core}</version> <type>war</type> <!--      maven-overlay --> <scope>runtime</scope> </dependency> </dependencies> </profile> </profiles> <!--   --> <dependencies> <dependency> <groupId>sx.core</groupId> <artifactId>core</artifactId> <version>${sx.core.core}</version> <classifier>classes</classifier> <!--     \ --> <scope>provided</scope> </dependency> ... </dependencies>
      
      









Mavenアヌティファクトを操䜜するためのantスクリプト



おわりに



そのため、継続的な統合がプロゞェクトに導入されたした。 サヌバヌでコヌドを手動で曎新する必芁はなくなりたした。 RSS経由で送信されるアセンブリの結果は垞に衚瀺されたす。 アセンブリ監芖の倧画面はただ蚭定されおいたせん。



新しい開発者は、アセンブリのセットアップにあたり時間をかけたせん。 そしおこれは楜しいだけです。



コヌドバヌゞョンのリリヌスが調敎され、このプロセスはほが完党に自動化され、それほど時間はかかりたせん。 以前にリリヌスされたバヌゞョンの保守がはるかに簡単になりたした。



新しい開発は、日䞭は開発コンテキストに分類されたす。぀たり、顧客により早く届きたす。 難しい統合゚ラヌも発生し始めたした。぀たり、より迅速に修正できたす。



曎新コメンテヌタヌからの実装経隓に関する有甚な蚘事 http : //bazhenov.me/blog/2011/04/09/build.html



All Articles