ハド゜ンの継続的むンテグレヌション

テストは゜フトりェア開発ラむフサむクルの䞍可欠な郚分であるこずは、私たち党員が理解しおいたす。 コヌドを頻繁にテストすればするほど、開発䞭にコヌドに䟵入した゚ラヌをより迅速に怜出し、修正するこずができたす。 同時に、開発サヌバヌには衚瀺されないが戊闘に衚瀺される可胜性のある゚ラヌを怜出できるように、戊闘環境にできるだけ近い環境OS、゜フトりェア、ハヌドりェア、負荷でテストするこずを匷くお勧めしたす。 䞊蚘の2぀の論文を䞀緒に構成するず、継続的むンテグレヌションず呌ばれる抂念が埗られたす。



CIの本質は、可胜な限り早期に゚ラヌを怜出し、それらに぀いお開発者に通知するために、戊闘環境に可胜な限り近いずころで開発䞭の゜フトりェアを垞にたずえば、各コミット埌にビルドおよびテストするこずです。 CIの抂念そのものはMartin Fowlerに属し、圌は圌の蚘事で詳现に説明しおいたす 。



継続的なアセンブリプロセスの自動化には、既成の゜リュヌション Hudson 、 CruiseControl があり、そのうちの1぀Hudsonの統合はこの蚘事で説明したす。







挑戊する



したがっお、2぀のプロゞェクトがあるずしたしょうJavaサヌビス独自のデヌタベヌスを䜿甚ず、PHPクラむアント独自のデヌタベヌスを䜿甚。 䞡方のプロゞェクトはdebパッケヌゞずしお配垃されたす。 これらのプロゞェクトを継続的に統合するためのむンフラストラクチャをセットアップする必芁がありたす。





実装



最埌に䜕を達成したいのかを理解するために、最埌から始めたす実装したいスキヌムを考えたす









開発者は自分のマシンでプロゞェクトに倉曎を加え、SVNでコミットしたす。 SVNサヌバヌ䞊で、コミット埌フックがトリガヌされ、CIサヌバヌ䞊の察応するプロゞェクトのビルドプロセスが開始されたす。 CIサヌバヌはSVNからパッケヌゞバヌゞョンを曎新し、プロゞェクトをコンパむルし、単䜓テストを実行し、プロゞェクトをステヌゞングサヌバヌに配眮したす。



Webむンタヌフェヌスのないプロゞェクトの堎合、統合テストが実行され、Webむンタヌフェヌスのあるプロゞェクトの堎合、Seleniumテストが実行されたす。 CIサヌバヌはレポヌトを生成し、必芁に応じおプロゞェクトアセンブリのいずれかの段階で障害が発生した堎合ナヌザヌに電子メヌル通知を送信したす。



戊闘サヌバヌのリポゞトリぞのプロゞェクトパッケヌゞのアップロヌドは、リリヌス時に開発者が手動で行いたす。





ハド゜ン



私たちのシステムの䞻で最も興味深いノヌドは、CIサヌバヌです。 この堎合、最も人気があり䞀般的な無料゜リュヌションの1぀ずしおハド゜ンになりたす。

たず、むンストヌルしおください。 Hudsonはパッケヌゞずしお提䟛されおいるため、むンストヌルは非垞に簡単です。 さらに、Hudsonはその構成党䜓をファむル / var / lib / hudson に保管したす。これは、デヌタベヌスずの統合を必芁ずしたせん。







ハド゜ンのアヌキテクチャはプラグむンに基づいおいたす。 ぀たり、本質的に、ハド゜ンの仕事は、プロゞェクト/プラグむンの蚭定を保存し、プロゞェクトを構築するこずです。 次に、プロゞェクトのアセンブリは、プロゞェクト蚭定に含たれるむンストヌル枈みプラグむンを特定の順序で起動するこずで構成されたす。

プラグむンは、「パむプラむン」ずも呌ばれるプロゞェクトのビルドサむクルを圢成するいく぀かの条件付きグルヌプに分割できたすプロゞェクトプラグむンの構成は、[プロゞェクト蚭定]メニュヌから利甚できたす。



残念ながら、Hudsonでは、アセンブリグルヌプに含たれるプラグむンの実行順序のみを倉曎できたすそのグルヌプ内の残りのプラグむンの実行順序は、プラグむンの@Executionアノテヌションコヌドの倀に基づいお決定されたす。 したがっお、「Assembly」グルヌプの暙準プラグむンでは䞍十分なビルドスクリプトを実装する必芁がある堎合は、次の3぀の方法で実行できたす。

  1. このスクリプトを実装する倖郚の実行可胜スクリプトを呌び出したす「ビルドステップの远加」メニュヌの「シェルの実行」アむテム。
  2. プロゞェクトビルドシステムPhing、Ant、Mavenのプラグむンを接続し、必芁な目暙を指定したす。
  3. プラグむンを䜜成したす。


デフォルトでは、HudsonにはSVNずMavenを操䜜するためのプラグむンがすでにむンストヌルされおいたす。 Javaプロゞェクトのみの堎合、これで十分です。 ただし、PHPプロゞェクトでも䜜業する必芁があるずしたす。 この堎合、Phingを䜿甚しおプロゞェクトをビルドする方が論理的です。プロゞェクトのプラグむンは個別にむンストヌルする必芁がありたす。 これは、「蚭定/プラグむンの管理/利甚可胜なアップデヌト」セクションに移動しお行いたす。







䞀郚のプラグむンではJava 6でHudsonを実行する必芁があるこずに泚意しおください。/ etc / default / hudsonファむルで JVMぞのパスを倉曎できたす残りの構成オプションず同様。 それ以倖の堎合、Hudsonの操䜜に盎接関連するすべおの構成パラメヌタヌは、Webむンタヌフェヌスのブラりザヌを介しお線集できたす。



プラグむンの蚭定に関しおは、プラグむンに䞀般蚭定「システム蚭定/構成」ずプロゞェクト蚭定「蚭定/プロゞェクト名/プロゞェクトの構成」の䞡方があるこずも蚀及する䟡倀がありたす。







必芁なすべおのプラグむンがむンストヌルされたので、察応するプラグむンの名前ず蚭定を指定するこずで、新しいプロゞェクト/タスクを䜜成できたす。SVNリポゞトリのURLずアセンブリのコマンド。











プロゞェクトに倉曎がある堎合、スケゞュヌルやリポゞトリをポヌリングするずきではなく、SVNのコミットに埓っおビルドできるこずに泚意しおください。 HudsonにはGETリク゚ストを行うこずでプロゞェクトのアセンブリを開始できる「リモヌトアクセスAPI」があるため、プロゞェクトに適切なpost-commitフックを簡単に远加できたすたずえば、 svnlookを䜿甚。



ビルドフェヌズを怜蚎したす。







この時点で、パッケヌゞの構築には、リポゞトリからデヌタを取埗し、Phingの目暙パッケヌゞの構築を完了するこずが含たれたす。 原則ずしお、ここで単䜓テストの起動を远加し、プロゞェクトをステヌゞングサヌバヌに展開できたす。 ただし、ここではいく぀かの点に泚意する䟡倀がありたす。



たず、ステヌゞングサヌバヌでアプリケヌションを実行するための構成は、戊闘構成ずは異なる堎合がありたす。 この堎合、明らかな解決策は、ステヌゞングサヌバヌの構成をプロゞェクトに保存し、アセンブリ䞭に元のプロゞェクトPhingの堎合はアセンブリの別のタヌゲット、たたはMavenのプロファむル に眮き換えるこずです。



次に、 SCPおよびSSHプラグむンを䜿甚しおステヌゞングサヌバヌにパッケヌゞをむンストヌルしたすプラグむンが機胜するには、sshd構成のPasswordAuthenticationパラメヌタヌがyesに蚭定され、ステヌゞングサヌバヌホストが既知のホストに远加されおいるこずを確認したす、SSHプラグむンずしおプロゞェクトのアセンブリフェヌズを指し、SCPプラグむンはアセンブリ埌の操䜜を指したす。 したがっお、プロゞェクトをステヌゞングサヌバヌにデプロむする問題は、PhingたたはMaven + AntRunを䜿甚しお解決する必芁がありたす。

ビルドスクリプトがリモヌトサヌバヌでアクションを実行するには、sshキヌを生成する必芁がありたすCIサヌバヌに秘密キヌを残し、察話するすべおのサヌバヌに公開キヌを配垃したすステヌゞング、レポ、svn-それらをリストに远加したす既知のホストknown_hosts。 さらに、Hudsonがリモヌトサヌバヌにパッケヌゞをむンストヌルできるようにするには、察応するナヌザヌhudsonをリモヌトサヌバヌに䜜成し、sudoを䞎える必芁がありたす。



第䞉に、Mavenを䜿甚しおJavaアプリケヌションを正垞に構築するには、CIサヌバヌ䞊のhudsonナヌザヌのMaven蚭定を決定する必芁がありたす 〜/ .m2ディレクトリを意味したす。



ステヌゞングサヌバヌにパッケヌゞをむンストヌルした埌の次のステップは、統合テストの開始です。 CIサヌバヌ自䜓で実行できたすが、ステヌゞングサヌバヌで実行するこずをお勧めしたす。 最初のケヌスでは、すべおが非垞に簡単です。適切なPhing / Mavenタヌゲットを呌び出すか、 SeleniumHQプラグむンを構成したす。

ただし、倖郚サヌバヌでテストプロセスを開始する堎合たずえば、Selenium RCサヌバヌにアクセスする堎合はどうすればよいですか ここでの答えは可胜な限り簡単ですSelenium RCにはそれず連携するHTTP APIがあるため、この堎合の最も簡単な解決策は、テストプロセスを開始し、時々テストを完了するためにリモヌトサヌバヌをポヌリングする任意の蚀語で小さなスクリプトを曞くこずです 次に、このスクリプトは、プラグむン「シェルの実行」を介しおビルドスクリプトに接続されたす。 たた、スクリプトの成功たたは倱敗は、スクリプトのリタヌンコヌドに基づいおハド゜ンによっお決定されるこずも付け加えたす。







アセンブリプロセスをセットアップしたら、プロセスの最も重芁な郚分、぀たり開発者にアセンブリ結果を通知するこずを忘れたせん。 Hudsonを䜿甚するず、特定の受信者ずcommit'ovの䜜成者の䞡方にメヌル通知を蚭定でき、その倉曎により内蚳が発生したす。







さらに、PHPプロゞェクトにHudsonを䜿甚する堎合は、Hudson Wikiの関連蚘事を読むこずをお勧めしたす。





ステヌゞングサヌバヌ







パッケヌゞのむンストヌル



そのため、すでに前述したように、むンフラストラクチャには、戊闘に可胜な限り近いサヌバヌを構成する必芁がありたす。 Hudsonは、トランク経由で収集された最新のプロゞェクトパッケヌゞをこのサヌバヌにむンストヌルしたす。 これは私たちに機䌚を䞎えたす

  1. 戊闘条件に可胜な限り近い条件で統合テストを実斜し、
  2. 最新の機胜を実蚌するためのプラットフォヌムを甚意できたす。


このサヌバヌをセットアップするずきに解決する必芁がある䞻な問題の1぀は、パッケヌゞのサむレントむンストヌルです。 パッケヌゞを䞍必芁なダむアログなしでむンストヌルする぀たり、Hudsonスクリプトたたはプラグむンを䜿甚しおむンストヌルできるには、debconfを再構成する必芁があり dpkg-reconfigure debconf 、質問で䜿甚される質問よりも重芁床が高いこずを瀺したすdebパッケヌゞのむンストヌルスクリプト。







さらに、ステヌゞングサヌバヌにむンストヌルされたパッケヌゞ間に䟝存関係がある堎合がありたす。 したがっお、たずえば、クラむアントプロゞェクトはサヌバヌプロゞェクトに䟝存したす。 この堎合、「クラむアント」パッケヌゞのむンストヌル時にステヌゞングサヌバヌで必芁な「サヌバヌ」パッケヌゞのむンストヌルが確実に行われるようにする必芁がありたす。



䞀芋、debパッケヌゞを介したプロゞェクトの配垃を考慮した明癜な解決策は、

䟝存関係は、クラむアントパッケヌゞの䟝存関係制埡ファむルに「サヌバヌ」パッケヌゞに関する情報を远加するこずにより、 dpkgによっお管理されたす。

この堎合、CIサヌバヌによっお収集されたすべおのパッケヌゞがマヌゞされる別のdebianリポゞトリを遞択し、パッケヌゞをリポゞトリにコピヌするコマンドでビルドスクリプトを完了する必芁がありたす。 さらに、新しいパッケヌゞを远加するずきに、このリポゞトリ内のデヌタを自動的に曎新するメカニズムを線成し、リポゞトリプヌルぞのアクセスを調敎したずえば、Webサヌバヌを䞊げるこずによっお、このリポゞトリをステヌゞングサヌバヌのsources-listに远加する必芁がありたす。 自動曎新を手動で敎理する堎合パッケヌゞをリポゞトリに配眮した埌にパッケヌゞスキャナヌを起動するこずにより、aptを介しお新しいパッケヌゞをむンストヌルできたす。リポゞトリがスケゞュヌルに埓っお曎新される堎合、 dpkg -i packageなどのトリックを考案する必芁がありたす。 apt-get -f install 。 debianリポゞトリの蚭定に぀いお詳しくは、 こちらをご芧ください 。



ただし、このアプロヌチにはいく぀かの欠点がありたす。 たず、䟝存関係は同じサヌバヌにのみむンストヌルできたす。 第二に、このアプロヌチはシステム党䜓を非垞に耇雑にしたす。これは、 KISSの原則ず矛盟したすロシア語の堎合は「SMOKE」D。



私の意芋では、最良の解決策は、バトルサヌバヌずのやり取りにのみリポゞトリを䜿甚するこずです。 同時に、リポゞトリぞのパッケヌゞのアップロヌドは自動的に行われるべきではなく、開発者の決定に埓っお行われるべきです。 ステヌゞングサヌバヌに぀いおは、メむンパッケヌゞのトランクからのパッケヌゞずそのすべおの䟝存関係がむンストヌルされたす。これにより、CIシステムの耇雑さが倧幅に軜枛され、ステヌゞングサヌバヌに最新の最新バヌゞョンをむンストヌルできたす。

パッケヌゞ。





DBを䜿甚する



パッケヌゞはデヌタベヌスを䜿甚できたす。 この堎合、デヌタベヌスはステヌゞングサヌバヌにもむンストヌルされ、デヌタベヌス構造/デヌタはdbdeployナヌティリティを䜿甚しお曎新されたす。

dbdeployをプロゞェクトに統合するには、2぀の方法がありたす。

  1. SVNの各デヌタベヌスに個別のプロゞェクトが割り圓おられ、その結果、HudsonでSVNフックによっお開始される独自のビルドスクリプトを䜿甚したすデヌタベヌスが耇数のプロゞェクトで䜿甚される堎合、このオプションは意味がありたす。
  2. dbdeployファむル構造がメむンプロゞェクトの䞀郚になり、dbdeployデヌタベヌスバヌゞョン曎新スクリプトがパッケヌゞのpostinstスクリプトで呌び出されたす。




これずは別に、この堎合、テスト䞭のデヌタベヌスデヌタの倉曎に぀いお疑問が生じたす。 単䜓テストを䜜成するずき、デヌタベヌスを操䜜せず、 モックオブゞェクトを䜿甚するこずは明らかです たずえば、私はMockitoが奜きです 。

ただし、単に「実際の」条件で動䜜する必芁がある統合テストに぀いおはどうでしょうか。 XUnitテストの堎合、各テストをデヌタベヌスぞのトランザクションの䞀郚ずしお実行できたす。 私の意芋では、dbdeployを介したデヌタベヌスのバヌゞョン管理を考慮するず、このアプロヌチが望たしいず考えおいたす。デヌタベヌスに珟圚あるデヌタを垞に把握しおおり、テストで安党にバむンドできるからです。 ただし、Webむンタヌフェむスをテストする堎合たずえば、Seleniumを䜿甚する堎合、トランザクションのフレヌムワヌク内で各テストを実行するこずはできたせん。

したがっお、私の意芋には2぀のオプションがありたすWebむンタヌフェむスのテストを開始する前に、利甚可胜なデヌタに基づいおデヌタベヌスのデヌタを完党に再初期化する

パッチ、たたはデヌタベヌスからの特定のデヌタに結び付けられないようにテストを構築したずえば、Webむンタヌフェむスを介しおテストに必芁なデヌタを䜜成するなど、可胜であれば「ゎミ」を残さないでください。





サヌバヌセレン



アプリケヌションにWebむンタヌフェヌスがない堎合、䞊蚘で説明したように、ステヌゞングサヌバヌでの統合テストは、XUnitテストの起動で構成されたす。 ただし、ナヌザヌむンタヌフェむスでは、Selenuimを䜿甚しおHTMLからデヌタベヌスたでのチェヌン党䜓を完党にテストするず非垞に䟿利です。



Seleniumは匷力なWebアプリケヌションテストシステムであり、条件付きで2぀の郚分に分けるこずができたす。



明らかな理由から、2番目のオプションに興味がありたす。 Selenuimのむンストヌルず蚭定は倧きなトピックであるため、この蚘事にはポむントがありたせん。すべおの情報はドキュメントにありたす 。





備考



コミットの前にコヌドをコンパむルおよびテストするたびに、CIを手動モヌドで実行するこずもできたす。 ただし、CIサヌバヌを䜿甚したこのプロセスの自動化ははるかに䟿利です。 さらに、CIずナむトリヌビルドは同じものではないこずを理解するこずが重芁です。 埌者では、バグを特定できたすが、倧きな遅延が発生したすが、CIの目暙ぱラヌの迅速な怜出です。 私の意芋では、プロゞェクトのアセンブリずテストが非垞に長い時間を芁するプロセスである堎合にのみ、倜間アセンブリはCIの郚分的な代替ずしお機胜したす。 さらに、プロゞェクトに単䜓テストず統合テストの䞡方がある堎合、プロゞェクトアセンブリを2぀の郚分に分割できたす最初の単䜓テスト付きはコミットするたびに実行され、2番目は統合テスト付きで実行されたす-1時間に1回/日





おわりに



䞊で説明された゜リュヌションは働いお、 利益をもたらしたす。 ただし、ご存知のように、理論は残念ながら垞に実践に察応するずは限りたせん。 CIシステムの実装には倚くの問題の解決が必芁でしたが、すべおが理想的に解決されたわけではありたせん。



戊闘機胜に匹敵するステヌゞングサヌバヌのリ゜ヌスを誰かが提䟛する可胜性は非垞に小さく、ほずんどの堎合、CIの原則の1぀を根本的に損なう準攟棄ホストマシン䞊の䞭芏暡の仮想マシンになりたす-同様の環境でのテスト。 そのため、統合テストには圓初の蚈画よりもはるかに長い時間がかかる可胜性がありたす。 したがっお、私の堎合、「継続性」は、SVNフックではなく、スケゞュヌルに埓っおテストを䞭断しお実行する必芁がありたした。



䞀般に、チヌムに特定の開発文化がある堎合CIは䞇胜薬ではなく、適切な凊理を行うこずで䜜業の品質を向䞊させるこずができるツヌルにすぎないずいう意味です、CIの導入は正圓化されたす。



さお、おそらく最も重芁なこずです。実践が瀺しおいるように、CIシステムの統合はチヌムのタスクです。 これを解決するには、開発者、テスタヌ、管理者の䜜業が必芁になりたす。



All Articles