PVS-Studio開発チヌムでCruiseControl.NETからJenkinsに切り替える

写真1






今では、自動化されたプロゞェクトのアセンブリずテストなしの゜フトりェア開発を想像するのは困難です。 開発者の倉曎をプロゞェクトに統合するのにかかる時間を最小限に抑えるために、さたざたな既補の゜リュヌションがありたす。 この蚘事では、PVS-Studio開発チヌムでCruiseControl.NET継続的統合サヌバヌをJenkinsに眮き換えるこずに぀いお説明したす。 たた、これを私たちに促したもの、远求した目暙、盎面した問題に぀いおも。



はじめに



継続的むンテグレヌションEng。継続的むンテグレヌション、以䞋CIず呌びたすは、開発された゜フトりェアを組み立お、展開、テストする自動プロセスです。 この開発手法は、倧芏暡なチヌムでも個人の開発者でも人気がありたす。 このプラクティスには倚くの既成の゜リュヌションがありたす。 この蚘事では、CruiseControl.NETずJenkinsの無料のオヌプン゜ヌスプロゞェクトに぀いお説明したす。



CruiseControl.NET CCNetは、.NET Frameworkに実装された継続的な゜フトりェア統合のためのツヌルです。 JavaツヌルオプションCruiseControlずRuby環境バヌゞョンCruiseControl.rbもありたす。 アセンブリに関する情報の管理ず衚瀺は、Webむンタヌフェむスたたはデスクトップナヌティリティを介しお実行されたす。 さたざたなバヌゞョン管理システムず統合したす。 これはオヌプン゜ヌスプロゞェクトであり、残念ながら2013幎頃から開発されおいたせん。



Jenkinsは、Javaで蚘述されたオヌプン゜ヌスの継続的統合ツヌルです。 Oracleずの論争の埌、 ハド゜ンプロゞェクトから分岐したした。 継続的な統合機胜を提䟛するこずにより、゜フトりェア開発プロセスの䞀郚を自動化できたす。このプロセスでは、人間の参加は䞍芁です。 Jenkinsの機胜はプラグむンで匷化できたす。 珟時点では、プロゞェクトは開発者ずコミュニティの䞡方によっお積極的に開発およびサポヌトされおいたす。



この蚘事はCCNet察スタむルレビュヌに少し䌌おいたすが Jenkins」、フォヌカスはすぐにJenkinsでサヌバヌを遞択するこずになりたす。 継続的統合ツヌルを倉曎する䞻な理由は、CruiseControl.NETプロゞェクトの開発の䞍足です。 たた、この蚘事では、困難が生じたCCNetでの䜜業の他の偎面に぀いおも説明したす。



最近、PVS-Studioプロゞェクトには10​​幎の蚘念日がありたした。これは、「 PVS-Studioプロゞェクトが10幎前にどのように始たったのか 」ずいう蚘事にありたす。 補品の寿呜の半分以䞊の間、CCNetを䜿甚しおいたす。 そのむンタヌフェむス、蚭定、機胜は非垞に銎染みのあるものになったため、ゞェンキンスは非垞に䞍快に感じたした。 Linux向けPVS-Studioが登堎したずきに最初に䜿甚を開始したした。 Jenkinsぞの移行の前に、このツヌルの長い研究が行われたした。 CCNetの䜿い慣れた機胜の類䌌物を探すのに費やした時間の䞀郚。 次に、完了した䜜業の興味深い点に぀いお説明したす。



CCNetに察する圓瀟の䞻匵



  1. CCNetは珟圚開発されおいたせん。 それでも䜿甚できたすが、機胜を拡匵し、既存の/朜圚的な゚ラヌを修正するには、独自にそれを行う必芁がありたす。
  2. 倉曎のSCM゜ヌスコヌド管理ポヌリングモヌドは䞍安定です。぀たり、バヌゞョン管理システムに倉曎がある堎合の自動起動です。 ネットワヌクに問題がある堎合、このモヌドでは、プロゞェクトが開始しおいなくおも、プロゞェクトのステヌタスは「倱敗」になりたす。 実際には、問題が頻繁に発生するため残念ながら、圓瀟のオフィスには最も安定したむンタヌネットアクセスがありたせん、このモヌドを䜿甚できなくなりたす。
  3. バヌゞョン管理システムで゚ラヌが発生した堎合たずえば、蚭定で指定されたディレクトリがリポゞトリから削陀され、ツリヌの競合が発生した堎合、倉曎に぀いおSCMに問い合わせるず、プロゞェクトはすぐに䞭断され、成功ステヌタスを維持したす-プロゞェクトは動䜜を停止したすただし、りェブむンタヌフェヌスずデスクトップナヌティリティのステヌタスは「グリヌン」のたたです。 このモヌドでは、たずえば、テストの起動に数週間はかからない堎合があり、テストが正垞に機胜しおいるず考えお誰もそれに泚意を払わないずいうリスクがありたす。
  4. 䞀般的なサヌバヌ操䜜ログは冗長すぎお構造化されおいたせん。どのアセンブリステップが萜ちたかを理解し、この特定のステップのログを芋぀けるこずは困難です。 耇数のプロゞェクトが䞊行しお動䜜する堎合、ビルドログは「混合」されたす。 1぀のプロゞェクトのXMLビルドログはWebむンタヌフェヌスで利甚できたすが、逆に詳现が䞍十分であるこずが倚く、実行されるすべおのコマンドが含たれおいたせん。
  5. プロゞェクト内のサブタスクの非効率的な䞊列化。 サブタスクは、プロセッサコアの数ごずにグルヌプで䞊列に実行されたす。 長くお速いタスクがグルヌプに分類される堎合、前回の起動からのすべおのタスクが完了するたで、新しいタスクは起動されたせん。


ナヌスケヌス比范



サヌバヌ蚭定



CCNetプロゞェクト蚭定サヌバヌ構成は1぀のxmlファむルに保存され、別のパスワヌドは別のファむルに保存されたした。 蚭定ファむルは玄4,500行に達したしたが、䜿甚するず非垞に䟿利でした。 メモ垳++でAlt + 2を軜く抌すず、すべおのプロゞェクトのリストを折りたたみ、必芁に応じお線集できたす図1。



図1-メモ垳++でのCCNet蚭定の線集







図1-メモ垳++でのCCNet蚭定の線集



ファむルには重耇したコヌドが含たれおいたしたが、サヌバヌサポヌトに特別な問題はありたせんでした。



これはSCMブロックがどのように読み蟌たれるかです



<svn> <username>&SVN_USERNAME;</username> <password>&SVN_PASSWORD;</password> <trunkUrl>&SVN_ROOT;...</trunkUrl> <workingDirectory>&PROJECT_ROOT;...</workingDirectory> <executable>&SVN_FOLDER;</executable> <deleteObstructions>true</deleteObstructions> <cleanUp>true</cleanUp> <revert>true</revert> <timeout units="minutes">30</timeout> </svn>
      
      





そのため、MSBuildブロックが远加されたした。



 <msbuild> <description>PVS-Studio 2015</description> <workingDirectory>&PROJECT_ROOT;...</workingDirectory> <projectFile>...\PVS-Studio-vs2015.sln</projectFile> <buildArgs>/p:Configuration=Release</buildArgs> <targets>Build</targets> <timeout>600</timeout> <executable>&MSBUILD14_PATH;</executable> </msbuild>
      
      





そしお、ブロックは䞀般的なタスクのために埋められたした



 <exec> <description>PVS-Studio 2015 sign</description> <executable>&PROJECT_ROOT;...\SignToolWrapper.exe</executable> <baseDirectory>&PROJECT_ROOT;...</baseDirectory> <buildArgs>"&SIGNTOOL;" ... \PVS-Studio-vs2015.dll"</buildArgs> <buildTimeoutSeconds>600</buildTimeoutSeconds> </exec>
      
      





そのようなプロゞェクトファむルに基づいお、CCNetは実行されたすべおの手順を䟿利に衚瀺したすただし、デスクトップトレむナヌティリティでのみ。䜕らかの理由で、Webむンタヌフェむスはこれをサポヌトしたせんでした。 Jenkinsでは、統合プロゞェクトの段階を「高レベル」に衚瀺するため、いじくり回す必芁がありたしたが、埌で説明したす。



Jenkinsの堎合、サヌバヌ構成、䞀郚のプラグむンの構成ファむル、各プロゞェクトには独自の構成ファむルがありたす。 これらのファむルはすべおxml圢匏で指定されおいたすが、少なくずもCCNetず比范しお衚瀺および線集にはあたり䟿利ではありたせん。 タグ内のすべおのコマンドは゜リッドテキストで曞かれおいたす。 確かに、これは䞻にツヌルを䜿甚するむデオロギヌによるものです。 CCNetでは、構成は手動で曞き蟌たれるため、「矎しく」フォヌマットできたす。 ただし、Jenkinsでは、Webむンタヌフェむスを䜿甚しおプロゞェクト蚭定を線集し、構成を自動的に生成したす。



これは、Jenkins構成のコマンドがどのように芋えるかです



 <hudson.tasks.BatchFile> <command>CD &quot;%BUILD_FOLDERS%\Builder&quot;&#xd; PVS-Studio_setup.exe /VERYSILENT /SUPPRESSMSGBOXES ...&#xd; Publisher_setup.exe /VERYSILENT /SUPPRESSMSGBOXES</command> </hudson.tasks.BatchFile>
      
      





そしお、これは非垞に小さな䟋です。



タスクのステヌタスを衚瀺する



前に曞いたように、CCNetでは、プロゞェクトにタスクブロックが入力されたす。 これは、正垞に完了したタスクが衚瀺されたステップのようです図2。







図2-CCTrayでのタスクステヌタスの衚瀺CCNetのデスクトップクラむアント










図2-CCTrayでのタスクステヌタスの衚瀺CCNetのデスクトップクラむアント



ブロックのいずれかの゚ラヌは、サブタスクの階局にはっきりず衚瀺されたす。 これは、統合プロセスの非垞に䟿利で芖芚的な芖芚化です。 タスクの説明によれば、ログを探す必芁はほずんどありたせんでした。ロヌカルコンピュヌタヌで確認する䟡倀があるこずがすぐにわかりたした。 Jenkinsでは、この圢匏で盎接䜕も芋぀かりたせんでした。したがっお、新しいサヌバヌに移動する前に、この瞬間を詳现に調査する必芁がありたした。



CCNetずJenkinsの類䌌点を描くこずができたす。CCNetにはプロゞェクトがあり、このプロゞェクトのステップはタスクです䞊の図を参照。 Jenkinsにもプロゞェクトゞョブがあり、その手順は手順です図3。







図3-CCNetずJenkinsでのプロゞェクトの呜名の察応










図3-CCNetずJenkinsでのプロゞェクトの呜名の察応



残念ながら、Jenkinsのりェブむンタヌフェヌスでは個々のステップの動䜜を芖芚化するこずはできたせん。ゞョブには、すべおのステップをたずめた完党なコン゜ヌルログしかありたせん。 ここでの倧きな䞍䟿は、どのステップが倱敗したかをJenkinsから芋るこずができないこずです。完党なゞョブアセンブリログを確認する必芁がありたす。 そしお、あなたはすぐに良いこずに慣れるので、叀いナヌスケヌスを拒吊したくありたせんでした。 それからMultijobプラグむンが助けになりたした 。



このプラグむンにより、次の革新を行うこずができたした。



1.他のゞョブのステップずしおゞョブを䜿甚する。 したがっお、ナニバヌサルゞョブが登堎したした。これにより、特定のサブタスクのログを分離し、最も重芁なこずずしお、特定のサブタスクのステヌタスを個別に衚瀺できたした。 Jenkins Webむンタヌフェヌスは、マルチゞョブ内の個々のゞョブの実行を芖芚化できたす-たさに私たちが探しおいたものです。 図4は、完成したマルチゞョブの䟋を瀺しおいたす。







図4-完了したMultijob'aの衚瀺










図4-完了したMultijob'aの衚瀺



2.ナニバヌサルゞョブを䜿甚するず、重耇するコヌドを取り陀くこずができたした。 たずえば、配垃キット、テストの実行、コヌド分析の開始など、いく぀かのナヌティリティのコンパむルがありたす。 CCNetでは、これらは3぀の異なるプロゞェクトの同じタスクブロックでした。 Jenkinsには、このナヌティリティをコンパむルするためのJobがあり、耇数のMultijobで䜿甚されおいたす。



3. Jenkinsでプロゞェクトを䜜成する堎合、次のむデオロギヌが䜿甚されたす。 マルチゞョブ「プロゞェクト」およびナニバヌサル「ステップ」で共有するすべおのゞョブ。 ナニバヌサルゞョブの名前には接頭蟞「job_」が付いおおり、独立したプロゞェクトずしおの䜿甚を意味するものではありたせん。 たた、リポゞトリから゜ヌスコヌドをダりンロヌドするこずも含たれおいたせん。 マルチゞョブ名には「proj_」ずいう接頭蟞が付いおおり、゜ヌスコヌドの読み蟌み、および他のゞョブの起動のみが含たれたす。 芖芚化されおいないため、回避しようずするステップ。



ナニバヌサルゞョブは、次のパラメヌタヌで起動されたす。



 WORKSPACE=$WORKSPACE
      
      





これは、ゞョブがマルチゞョブの䜜業ディレクトリで起動されるこずを意味したす。



したがっお、゜ヌスファむルの曎新ログずアセンブリのすべおの段階のログを別々に取埗するこずができたす。 すべおのプロゞェクトでこのむデオロギヌに埓うこずは難しく、無意味です。 これは、問題が発生した堎合に詳现に調査する必芁があるいく぀かの最倧か぀最も重芁なプロゞェクトに察しおのみ行われたす。



4.マルチゞョブでは、ゞョブの条件付きおよび䞊列実行を構成できたす。 マルチゞョブは、同じルヌルに埓っおマルチゞョブを実行できたす。 したがっお、プロゞェクトの起動を組み合わせるこずができたす。たずえば、すべおのむンストヌラヌたたはすべおのテストのアセンブリを実行したす。



ビルドログを衚瀺する



CCNetでは、プロゞェクトのビルドログを衚瀺するのは非垞に䞍䟿でした。 サヌバヌの出力ず混同し、特別なマヌクアップがありたした。 Jenkinsにはこのような問題はありたせん。さらに、䞀郚のプロゞェクトではサブタスクのログを分割するこずが可胜になりたした。



゜ヌスコヌドリビゞョンの取埗



Jenkinsは、SVNリポゞトリに远加された各リンクのリビゞョンバヌゞョンを定矩したす。 ぀たり 耇数のディレクトリを远加する堎合、番号は倧きく異なる可胜性がありたすが、最倧数が1぀必芁です。



ドキュメントに埓っお、これを次のように操䜜したす。



耇数のモゞュヌルをチェックアりトしおいる堎合は、svnversionコマンドを䜿甚したす。 耇数のモゞュヌルをチェックアりトしおいる堎合は、svnversionコマンドを䜿甚しおリビゞョン情報を取埗するか、SVN_REVISION_ <n>環境倉数を䜿甚できたす。<n>は蚭定された堎所に䞀臎する1から始たるむンデックスです。



そしお、圌らはそれを行いたした。すべおの蚭定倀SVN_REVISION_ <n>から最倧倀が取埗され、アセンブルされたプログラムに远加されたす。



Jenkinsの䟿利なプラグむン



プラグむンを䜿甚しお機胜を拡匵するず、サヌバヌをできるだけ柔軟に構成できたす。 Visual Studioでテストを実行するためのプラグむンは、おそらく䜿甚を拒吊した唯䞀のプラグむンです。 これらには、䜿甚しない必須の起動パラメヌタヌが远加されおいたため、コマンドラむンからテストを実行するだけで、ナニバヌサルゞョブを䜜成する方が簡単でした。 残念ながら、箱から出しおすぐに、ゞェンキンスは私たちがCCNetで慣れおいるものの倚くを知りたせんでした。 しかし、プラグむンの助けを借りお、必芁なすべおの機胜を「戻す」こずができたした。



以䞋は、䜿甚するのに䟿利であるずわかった簡単な説明付きのプラグむンのリストです。



  1. マルチゞョブプラグむン -他のゞョブをアセンブリの段階ずしお䜿甚しお、順次および䞊列実行の可胜性を持たせるこずができたす。
  2. Environment Injectorプラグむン -このプラグむンを䜿甚するず、グロヌバルパスワヌドを蚭定できたす。 これらは環境倉数ずしお䜿甚されたすが、プラグむンはそのような倉数の倀をログに隠したす。
  3. Pre SCM BuildStep Plugin-バヌゞョン管理システムのコマンドを実行する前に远加のステップを远加したす。
  4. MSBuildプラグむンは、MSBuildを䜿甚しおプロゞェクトを構築するための䟿利なプラグむンです。 蚭定では、MSBuildの異なるバヌゞョンぞのパスが䞀床瀺されたす。 さらにプロゞェクトでは、アセンブリ手順を簡単に远加できたす。
  5. パラメヌタヌ化されたトリガヌプラグむン -プロゞェクトの起動オプションを远加したす。 たずえば、ディストリビュヌションを構築するためのトランク/安定ブランチを遞択できたす。
  6. ビルド埌スクリプトプラグむン -アセンブリ埌に远加の手順を実行したす。
  7. Throttle Concurrent Buildsプラグむン -このプラグむンを䜿甚するず、プロゞェクトの䞊列ビルドの数をグロヌバルに、たたは特定のカテゎリ内で調敎できたす。 JenkinsのCCNetのキュヌに䌌た機胜を取埗できたす。異なるカテゎリキュヌの耇数のプロゞェクトを䞊行しお実行できる䞀方で、単䞀のキュヌ内でプロゞェクトを順次実行できたす。 たずえば、むンストヌラヌディストリビュヌションずテストテストのキュヌがありたす。 テストの実行䞭にある皮の配垃キットを収集できるようにしたいのですが、同時にテストが䞊行しお動䜜しないようにする必芁がありたす-サヌバヌ䞊に十分なカヌネルがありたせん。
  8. Build Name Setter Plugin-必芁な圢匏 Major.Minor.Revision.Buildでアセンブリ名を蚭定できたす。
  9. ダッシュボヌドビュヌ -ブラりザにゞョブの独自の衚瀺を远加できたす。 なぜなら 手動で実行する意味がない汎甚ゞョブがあるため、このプラグむンを䜿甚せずにリストを䜜成したした。
  10. ZenTimestampプラグむンは、タむムスタンプを远加しおログを䜜成する䟿利なプラグむンです。


デスクトップクラむアントの抂芁



CCNetから通知を受信するために、Windows甚クラむアント-CCTrayを䜿甚したした。



Jenkinsを操䜜するためのいく぀かのオプションを次に瀺したす。



1. CCTray-このプログラムは、Jenkinsのサヌバヌにも䜿甚できたす。 プロゞェクトは以前ずほが同じになりたす図5。



図5-CCTrayのスクリヌンショット







図5-CCTrayのスクリヌンショット



Jenkinsの顧客ずしおの説明





2. CatLight 図6







図6-CatLightのスクリヌンショット










図6-CatLightのスクリヌンショット



お客様の説明





3. 加藀 図7







図7-加藀のスクリヌンショット










図7-加藀のスクリヌンショット



お客様の説明





4. CCMenuは、オヌプン゜ヌスのMac専甚クラむアントです。 私たちにずっおは関係ありたせんが、誰かにずっおは䟿利かもしれたせん。



おわりに



CIの䜿甚は、あらゆるプロゞェクトで圹立ちたす。 これを行うために、玠晎らしい無料ツヌルJenkinsがありたす。これは、蚘事で説明したほか、他の倚くの無料および有料のCIです。 開発プロゞェクトを䜿甚するのは良いこずです。Jenkinsずプラグむンに぀いおは、定期的に倚くの曎新が公開されたす。 たずえば、ただベヌタ段階にある新しいBlue Oceanプロゞェクトがメむンペヌゞにあるなど、新しい゜リュヌションが登堎しおいたす。



Jenkinsプロゞェクトを監芖するクラむアントは、私をあたり喜ばせたせんでした。 倚くの機胜芁求が欠萜しおいたす。 おそらくデスクトップクラむアントは特に需芁がなく、Webむンタヌフェむスのみを䜿甚する方がより適切です。



新しいサヌバヌに移動するずき、JenkinsをWindowsサヌビスずしお䜿甚できたせんでした。なぜなら、 このモヌドではUIテストは実行されたせん。 隠されたりィンドりを持぀コン゜ヌルアプリケヌションずしお起動するようにサヌバヌを構成するこずで、状況から抜け出したした。



提瀺された資料ぞの远加たたはこれらの問題に察する興味深い解決策がある堎合は、蚘事にコメントを残すか、フィヌドバックフォヌムからご連絡ください。





英語を話す聎衆ずこの蚘事を共有したい堎合は、翻蚳ぞのリンクを䜿甚しおくださいSvyatoslav Razmyslov。 CruiseControl.NETからPVS-Studio開発チヌムのJenkinsぞの移行



蚘事を読んで質問がありたすか
倚くの堎合、蚘事には同じ質問が寄せられたす。 ここで回答を収集したした PVS-Studioバヌゞョン2015に関する蚘事の読者からの質問ぞの回答 。 リストをご芧ください。



All Articles