Monoプラットフォヌムでの「正しい」開発プロセスの構築

サむクルの基本的な䟋は、.NETプラットフォヌムでの「正しい」開発プロセスの構築に基づいた、Jenkins CIを䜿甚したプリミティブASP.NETMonoアプリケヌションの開発です 。



提瀺された䟋は、次のように、幅広い芖聎者にずっお興味深いものです 他のプラットフォヌムの開発に簡単に適合させるこずができたす。




゚ントリヌ

この蚘事は、元の蚘事のためでなければ曞かれたこずはなかったでしょう。元の蚘事は、か぀おは開発プロセスに察する私の理解を圢成する䞊で重芁な圹割を果たしたした。 そしお、圌らが蚀うように、「私はこの機䌚を利甚したい」。 Eugeneの玠晎らしい蚘事に感謝したいず思いたす。これは初心者にずっお玠晎らしいスタヌトです どうもありがずう



この蚘事は、抂しお、根本的に新しいものではありたせん。 同じCプロゞェクト、NUnitでの同じテスト、NAntでの同じ自動化。 しかし、埮劙な違いがありたす。 第䞀に、Jenkins CIはCIサヌバヌずしお䜿甚され、第二に、アセンブリ䞭のさたざたなプロゞェクトメトリックの分析ず衚瀺にかなりの泚意が払われたす。



この蚘事では、䜜業環境をセットアップし、゜ヌスコヌドの倉曎を自動的に远跡し、プロゞェクトをコンパむルし、ナニットテストず機胜テストを実行し、コヌド行数、重耇の有無、技術的負債の゜ヌスコヌドTODO、FIXMEなどでプロゞェクトの䞭心はNAntスクリプトになりたす。NAntスクリプトは、材料が考慮されるに぀れお倧きくなりたす。 プロゞェクトはどの段階でも機胜し、完了できたす。これは、䞀床にプロゞェクト党䜓を䜜成できない堎合や、提瀺されたすべおの機胜を必芁ずしない堎合に非垞に䟿利です率盎に蚀っお、䞀郚の問題では冗長です。





ワヌクスペヌス

ワヌクスペヌスを構成するには、次のものが必芁です。
OS GNU / Linux  openSUSE 12.1、 LXDE  継続的むンテグレヌションサヌバヌが展開されるオペレヌティングシステム。
CIS ゞェンキンスCI 1.450 継続的統合サヌバヌ。
Vcs Subversion 1.6.17 集䞭型バヌゞョン管理システムSubversionの代わりに、他のVCSを䜿甚できたす
CLR モノラル 2.6.10 開発が実行されるプラットフォヌム。
テスト䞭 NUnit 2.4.8 テストを䜜成および実行するためのツヌルナニット、非ナニット-誰がテストを䜜成するかに既に䟝存しおいたす。
セレンRC 2.18.0 機胜テストを実行するためのツヌル。
静的コヌド分析 ゞェンダヌム2.10.0.0 静的コヌドアナラむザヌ。
クロヌン分析装眮 2005-05-30 重耇コヌドを芋぀けるためのナヌティリティ。
StyleCopCmd 0.2.1 静的コヌドアナラむザヌ。
その他のツヌル NAnt 0.90 プロゞェクトの自動アセンブリ甚ナヌティリティ。
Firefox 7.0.1 機胜テストを䜜成しお実行するWebブラりザヌテストは他のブラりザヌを䜿甚しお実行するこずもできたす
Selenium IDE 1.6.0 機胜テストを䜜成するためのIDE。
䜜業環境を構成するには、次の手順を実行する必芁がありたす。

1. DVDむメヌゞをダりンロヌドし 、OSをむンストヌルしたすデスクトップ環境を遞択するずきは、LXDEを指定したす。 厳密に蚀えば、別のデスクトップ環境を䜿甚するこずも、たったく䜿甚しないこずもできたす。 この䟋ではLXDEを䜿甚しお、セットアッププロセスをより簡単にしたす。

2.リポゞトリを蚭定したす。
sudo zypper ar http://download.opensuse.org/repositories/Mono/openSUSE_11.4/ Mono sudo zypper ar http://pkg.jenkins-ci.org/opensuse/ Jenkins
      
      



3.必芁なパッケヌゞをむンストヌルしたす。
 sudo zypper in jenkins mono-complete mono-nunit mono-tools nant subversion-server apache2 http://www.dwheeler.com/sloccount/sloccount-2.26-1.i386.rpm
      
      



4. rpmパッケヌゞずしお提䟛されおいない必芁なナヌティリティStyleCopCmdおよびCloneAnalyzerをダりンロヌドしおむンストヌルしたす。 いく぀かのニュアンスがありたす。

たず、Linuxですぐに䜿甚できるバむナリを䜿甚するこずはできたせん。 アプリケヌションは党䜓ずしお機胜したすが、ReportBuilder.csファむルの460行目にハヌドパスで蚭定されたパス区切り蚘号があるため、レポヌトファむルは予期した堎所にはありたせん。
  private static string GetViolationsFile(string outputXmlFile) { var offp = Path.GetFullPath(outputXmlFile); var f = string.Format( CultureInfo.CurrentCulture, "{0}\\{1}.violations.xml", // String No 460, wrong separator here! Path.GetFullPath(Path.GetDirectoryName(offp)), Path.GetFileNameWithoutExtension(outputXmlFile)); return f; }
      
      



修正されたバヌゞョンず構成ファむルは、 ここからダりンロヌドできたす 。

第二に、DRYプラグむンはCloneAnalyzeナヌティリティのレポヌトを認識しないため、CloneAnalyzeレポヌトを明確なJenkins'yのいずれかに倉換する必芁がありたす私はCPDを遞択したした。 レポヌトの䟋、および゜ヌスコヌドを䜿甚したホむップアップコンバヌタヌは、 ここから入手できたす 。

远加のナヌティリティ甚のディレクトリを䜜成したす。
 sudo mkdir -p /var/lib/jenkins/tools/{StyleCop,CloneAnalyzer,SeleniumRC} # 1.   SlyleCop    StyleCopCmd. # ... # 2.  CloneAnalyzer cd /var/lib/jenkins/tools/CloneAnalyzer sudo wget http://sourceforge.net/projects/cloneanalyzer/files/latest/download?source=files sudo unzip CloneAnalyzerPluginInstall_20050530.zip sudo mv eclipse/plugins/CloneAnalyzer . rm -rf eclipse # 3.     CloneAnalyzer   . # ... # 4.  Selenium Remoute Control. cd /var/lib/jenkins/tools/SeleniumRC sudo wget http://selenium.googlecode.com/files/selenium-server-standalone-2.19.0.jar
      
      



5. JenkinsのプラグむンをむンストヌルしたすJenkins-> Manage Jenkins-> Manage Plugins-> Available

必須
転芆 svnリポゞトリから゜ヌスコヌドを取埗する操䜜を自動化できたすデフォルトでむンストヌルされたす
ナニット NUnitの結果に関するレポヌトを䜜成できたす。
Nnt Jntkinsプロゞェクトのアセンブリ目暙ずしおNAntスクリプトを蚭定できたす。
静的コヌド分析 DRYプラグむンに必芁です。
タスクスキャナヌ コヌドで芋぀かったタグに関するレポヌトを䜜成できたすTODOなど。
SLOCCount ナヌティリティSLOCCountの結果に関するレポヌトを䜜成できたす控えめなコヌドメトリックを衚瀺したす。
Doclinks プロゞェクトのメむンペヌゞに、プロゞェクトのドキュメントぞのリンクを配眮できたす。
違反 さたざたなナヌティリティの結果に関するレポヌトを䜜成できたす。 この䟋は、GendarmeずStyleCopCmdの結果を衚瀺するために䜿甚されたす。
ドラむ 芋぀かった重耇コヌドに関するレポヌトを䜜成できたす。
セレニりム Seleniumレポヌトぞのリンクを投皿したす。
è­Šå‘Š コンパむラの譊告を衚瀺しおレポヌトを䜜成できたす。
掚奚
Jobconfighistory プロゞェクト蚭定ぞの倉曎の履歎を保持したす。
バックアップ サヌバヌバックアップの䜜成プロセスを簡玠化できたす。
オプションで
緑色のボヌル 青いボヌルを緑に眮き換えたす。
次のビルド番号 任意のアセンブリ番号を蚭定できたす。
サむドバヌリンク サヌバヌのメむンペヌゞずプロゞェクトのペヌゞにリンクを䜜成できたす。




デモプロゞェクトの説明

残念ながら、私は単玔なものを思い付くこずができたせんでしたが、同時に䞻題領域のロゞックで過負荷にならず、プロゞェクトのテストに䟿利です。 提瀺されたプロゞェクトは単玔です-2぀の入力フィヌルド、2぀のボタン「合蚈」および「連結」および結果。
アプリケヌションを䜜成するために、3぀のプロゞェクトを含む゜リュヌションが䜜成されたした。






アセンブリスクリプトを䜜成し、ツヌルを構成する

たず、Jenkinsプロゞェクトを䜜成する必芁がありたす。これは、http// localhost8080Jenkinsがロヌカルコンピュヌタヌにむンストヌルされおいる堎合で利甚可胜なWebむンタヌフェむスから必芁です。NewJobリンクをクリックし、プロゞェクトタむプBuild a free-スタむル゜フトりェアプロゞェクト、プロゞェクトの名前を入力しお䜜成したす。 プロゞェクトが䜜成されたす。

前述のように、アセンブリプロゞェクトのコアはNAntスクリプトになりたす。そのため、スクリプトを呌び出すビルドセクションで目暙を䜜成する必芁がありたす。 䞀般に、長所ず短所があるプロゞェクト組織ぞのアプロヌチがいく぀かありたす。 この䟋では、すべおのアクションが1぀のNAntスクリプトに配眮され、Jenkinsプロゞェクトの単䞀のコマンドによっお呌び出されたす。 これは、Jenkinsなしでアセンブリを実行するのが非垞に簡単で、NAntスクリプトを実行するだけであるずいう点で䟿利です。 ただし、アセンブリプロセスを倉曎するこずは必ずしも䟿利ではありたせん最初にNAntスクリプトを倉曎しおからコミットする必芁があり、その埌でのみビルドプロセスが曎新されたす。 このアプロヌチずは察照的に、Jenkinsプロゞェクトでbashスクリプトを実行するための倚くの目暙を䜜成し、それらにすべおのアセンブリロゞックを配眮できたす。 この堎合、ビルドプロセスを線集するず䟿利ですが、Jenkins以倖ではビルドできたせん。

次の圢匏のNant-scriptの䜜成を始めたしょう。

 <?xml version="1.0"?> <project name="Example" default="cis" basedir="."> <!-- Property --> <!--Targets --> <target name="cis" description="Execute all targets in CIS."> <call target="clean" /> <call target="build" /> <call target="documentation" /> <call target="utest" /> <call target="gendarme" /> <call target="stylecop" /> <call target="sloccount" /> <call target="cloneanalyze" /> <call target="ftest" /> </target> </project>
      
      



぀たり 最初のプロパティPropertyが宣蚀され、次にタヌゲットTargetが宣蚀され、最終的に䞻な目暙が宣蚀されその名前はスクリプトのデフォルトプロパティで瀺されたす、それが以前に宣蚀されたものを呌び出したす。 説明した方法が唯䞀ではなく、他の人を呌び出す目暙を䜜成する代わりに、他の人ぞのいく぀かの目暙の䟝存関係を登録するだけで、目暙が自動的に呌び出されたす。

次に、cisタヌゲットが呌び出すすべおの目暙が実装されたす。 どの段階でもスクリプトを実行できたすが、そのためには、未達成の目暙ずメむンの目暙cisの未䜿甚のプロパティに぀いおコメントする必芁がありたす。



簡単にするために、コヌドをさらに削枛するプロパティを宣蚀したす。

Jenkins環境倉数
  <property name="work.d" value="${environment::get-variable('WORKSPACE')}" />
      
      



ツヌルが収集されるディレクトリ
  <property name="tools.d" value="/var/lib/jenkins/tools" />
      
      



名前から明らかなように、さたざたなディレクトリの゚むリアス
  <property name="bin.d" value="${build.conf}/bin"/> <property name="deploy.d" value="/home/vm/public_html" /> <property name="test.res.d" value="test-results" /> <property name="report.d" value="${work.d}/reports" /> <property name="doc.d" value="${work.d}/doc" /> <property name="core.d" value="${work.d}/ExampleCore" /> <property name="gui.d" value="${work.d}/ExampleGUI" /> <property name="utest.d" value="${work.d}/ExampleUTest" /> <property name="ftest.d" value="${work.d}/ExampleFTest" />
      
      



バむナリファむルずStyleCopCmd蚭定ファむルの゚むリアス
  <property name="style.exe" value="${tools.d}/StyleCop/Net.SF.StyleCopCmd.Console.exe" /> <property name="style.conf" value="${tools.d}/StyleCop/Settings.StyleCop" />
      
      



実行可胜ファむル、コンバヌタヌ、および構成ファむルCloneAnalyzerの゚むリアス
  <property name="clone.jar" value="${tools.d}/CloneAnalyzer/CloneAnalyzer.jar" /> <property name="clone.conf" value="${tools.d}/CloneAnalyzer/comments.conf" /> <property name="clone.conv" value="${tools.d}/CloneAnalyzer/ca2cpd.exe" />
      
      



実行可胜ファむル、ラッパヌスクリプト、およびテストスむヌトずSeleniumRCのアプリケヌションがデプロむされおいるホスト名を含むファむルの゚むリアス
  <property name="selen.jar" value="${tools.d}/SeleniumRC/selenium-server-standalone-2.18.0.jar" /> <property name="selen.sh" value="${tools.d}/SeleniumRC/selenium.sh" /> <property name="selen.host" value="http://192.168.56.210" /> <property name="selen.suite" value="${ftest.d}/Main.html" />
      
      





目暙の䜜成を始めたしょう。

1.最初に、叀いアヌティファクトからアセンブリディレクトリを削陀し、必芁なディレクトリを䜜成するずいう目暙を䜜成したす。
  <target name="clean" description="Remove binary files, recreate report directory."> <echo message="Target starded at: ${datetime::now()}."/> <delete failonerror="false" dir= "${core.d}/${bin.d}"/> <delete failonerror="false" file="${core.d}/ExampleCore.pidb"/> <delete failonerror="false" dir= "${utest.d}/${bin.d}"/> <delete failonerror="false" dir= "${utest.d}/${test.res.d}"/> <delete failonerror="false" file="${utest.d}/ExampleUTest.pidb"/> <delete failonerror="false" dir= "${gui.d}/${bin.d}"/> <delete failonerror="false" dir= "${gui.d}/${test.res.d}"/> <delete failonerror="false" file="${gui.d}/ExampleGUI.pidb"/> <delete failonerror="false" dir= "${report.d}"/> <delete failonerror="false" dir= "${doc.d}"/> <delete failonerror="false" file="${work.d}/stylecop.report"/> <delete failonerror="false" file="${work.d}/stylecop.violations.xml"/> <mkdir dir="${report.d}"/> <mkdir dir="${report.d}/gendarme"/> <mkdir dir="${report.d}/sloccount"/> <mkdir dir="${report.d}/cloneanalyzer"/> <mkdir dir="${report.d}/selenium"/> <mkdir dir="${doc.d}/xml"/> <mkdir dir="${doc.d}/html"/> <echo message="Target completed at: ${datetime::now()}."/> </target>
      
      





2. 2番目のステップは、リポゞトリから曎新を取埗するこずです。 この操䜜はJenkinsによっお実行されるため、この䟋ではNAntスクリプトには含たれおいたせんが、必芁な堎合はその堎所がここにありたす。

Subversionリポゞトリを䜜成しお構成したす。
 su a2enmod dav a2enmod dav_svn a2enmod mod_authz_svn cd /srv/www/htdocs wget http://tortoisesvn.googlecode.com/svn/trunk/contrib/svnindex/menucheckout.ico wget http://tortoisesvn.googlecode.com/svn/trunk/contrib/svnindex/svnindex.css wget http://tortoisesvn.googlecode.com/svn/trunk/contrib/svnindex/svnindex.xsl mkdir -p /srv/svn/{repos,user_access,html} cat > /etc/apache2/conf.d/subversion.conf << EOF <IfModule mod_alias.c> Alias /repos "/srv/svn/html" </IfModule> <Directory /srv/svn/html> Options +Indexes +Multiviews -FollowSymLinks IndexOptions FancyIndexing \ ScanHTMLTitles \ NameWidth=* \ DescriptionWidth=* \ SuppressLastModified \ SuppressSize order allow,deny allow from all </Directory> <Location /repos/Example> DAV svn SVNListParentPath on SVNPath /srv/svn/repos/Example SVNIndexXSLT "/svnindex.xsl" AuthType Basic AuthName "Subversion" AuthUserFile /srv/svn/user_access/passwdfile AuthGroupFile /srv/svn/user_access/groupfile AuthzSVNAccessFile /srv/svn/user_access/accessfile Require valid-user </Location> EOF cd /srv/svn/repos svnadmin create --fs-type fsfs Example mkdir -p /srv/svn/repos/Example/dav chown -R wwwrun:www Example/{dav,db,locks} touch /srv/svn/user_access/passwdfile chown root:www /srv/svn/user_access/passwdfile chmod 640 /srv/svn/user_access/passwdfile touch /srv/svn/user_access/groupfile cat > /srv/svn/user_access/groupfile << EOF Example_commiters: Admin User Example_readers: Admin User CIS touch /srv/svn/user_access/accessfile cat > /srv/svn/user_access/accessfile << EOF [groups] admin = Admin user = User cis = CIS [/] * = @admin = rw [Example:/] @user = rw @cis = r /sbin/service apache2 restart exit
      
      





その埌、Subversionプラグむンを構成したす。



たた、アセンブリの頻床も蚭定したす曎新がある堎合にアセンブルするために、その存圚が平日の1時間ごずにチェックされたす。



3. xmlサブプロゞェクトExampleCoreおよびExampleGUIのドキュメントの生成でコンパむルする目暙を䜜成したす。
  <target name="build" description="Compiles the source code."> <echo message="Target starded at: ${datetime::now()}."/> <echo message="Building ExampleCore."/> <csc codepage="utf8" target="library" output="${core.d}/${bin.d}/${build.conf}/ExampleCore.dll" doc="${doc.d}/xml/ExampleCore.xml"> <sources> <include name="${core.d}/**.cs"/> </sources> </csc> <copy file="${core.d}/${bin.d}/${build.conf}/ExampleCore.dll" tofile="${gui.d}/${bin.d}/${build.conf}/ExampleCore.dll" /> <copy file="${core.d}/${bin.d}/${build.conf}/ExampleCore.dll" tofile="${utest.d}/${bin.d}/${build.conf}/ExampleCore.dll" /> <echo message="Building ExampleGUI."/> <csc codepage="utf8" target="library" output="${gui.d}/${bin.d}/${build.conf}/ExampleGUI.dll" doc="${doc.d}/xml/ExampleGUI.xml"> <sources> <include name="${gui.d}/**.cs" /> </sources> <references> <include name="System.Web.dll" /> <include name="${gui.d}/${bin.d}/${build.conf}/ExampleCore.dll" /> </references> </csc> <echo message="Target completed at: ${datetime::now()}." /> </target>
      
      





コンパむラメッセヌゞがJenkinsによっお凊理されるように、譊告プラグむンを構成したす。



将来的には、コンパむラ譊告に関するこれらのレポヌトを受け取るこずができるようになりたす



4. html圢匏のドキュメントを生成したす。
  <target name="documentation" description="Generation documentation."> <echo message="Target starded at: ${datetime::now()}."/> <exec program="monodocer" commandline=" -pretty -i:${doc.d}/xml/ExampleCore.xml -assembly:${core.d}/${bin.d}/${build.conf}/ExampleCore.dll -path:${doc.d}/xml"/> <exec program="monodocer" commandline=" -pretty -i:${doc.d}/xml/ExampleGUI.xml -assembly:${gui.d}/${bin.d}/${build.conf}/ExampleGUI.dll -path:${doc.d}/xml"/> <exec program="mdoc" commandline="export-html ${doc.d}/xml -o=${doc.d}/html"/> <echo message="Target completed at: ${datetime::now()}." /> </target>
      
      





DocLinksプラグむンをセットアップしたす。 その結果、ドキュメントぞのリンクがプロゞェクトのメむンペヌゞに䜜成されたす。



5.単䜓テストを収集しお実行したす。
  <target name="utest" description="Test the source code."> <echo message="Target starded at: ${datetime::now()}."/> <echo message="Building ExampleUTest."/> <csc codepage="utf8" target="library" output="${utest.d}/${bin.d}/${build.conf}/ExampleUTest.dll"> <sources> <include name="${utest.d}/**.cs" /> </sources> <references> <include name="System.Web.dll" /> <include name="${gui.d}/${bin.d}/${build.conf}/ExampleCore.dll" /> <include name="nunit.core.dll" /> <include name="nunit.framework.dll" /> </references> </csc> <echo message="Launch NUnit." /> <nunit2 haltonfailure="false"> <formatter type="Xml" usefile="true" extension=".xml" outputdir="${utest.d}/${test.res.d}" /> <formatter type="Plain" usefile="false" /> <test assemblyname="${utest.d}/${bin.d}/${build.conf}/ExampleUTest.dll" /> </nunit2> <echo message="Target completed at: ${datetime::now()}." /> </target>
      
      





NUnitプラグむンをセットアップしたす。



NUnitプラグむンレポヌトは次のようになりたす。



6. Gendarmeを䜿甚しお静的コヌド分析を実行したす。
  <target name="gendarme"> <echo message="Target starded at: ${datetime::now()}."/> <echo message="Check code by Gendarme."/> <exec program="gendarme" failonerror="false" commandline=" --config GendarmeRules.xml ${core.d}/${bin.d}/${build.conf}/ExampleCore.dll --xml ${report.d}/gendarme/ExampleCore.gendarme.xml --severity medium+ --confidence total"/> <exec program="gendarme" failonerror="false" commandline=" --config GendarmeRules.xml ${gui.d}/${bin.d}/${build.conf}/ExampleGUI.dll --xml ${report.d}/gendarme/ExampleGUI.gendarme.xml --severity medium+ --confidence total"/> <echo message="Target completed at: ${datetime::now()}." /> </target>
      
      



...およびStyleCopCmd
  <target name="stylecop"> <echo message="Target starded at: ${datetime::now()}."/> <exec program="mono" commandline=" ${style.exe} -r -sc ${style.conf} -d ${work.d} -of ${work.d}/stylecop/stylecop.report"/> <echo message="Target completed at: ${datetime::now()}." /> </target>
      
      



StyleCopCmdによっお匕き起こされる゚ラヌを取り陀くには
 While saving registry data at /etc/mono/2.0/../registry/last-btime: System.UnauthorizedAccessException: Access to the path "/etc/mono/registry/last-btime" is denied. at System.IO.FileStream..ctor (System.String path, FileMode mode, FileAccess access, FileShare share, Int32 bufferSize, Boolean anonymous, FileOptions options) [0x00000] in <filename unknown>:0 at System.IO.FileStream..ctor (System.String path, FileMode mode, FileAccess access, FileShare share) [0x00000] in <filename unknown>:0 at (wrapper remoting-invoke-with-check) System.IO.FileStream:.ctor (string,System.IO.FileMode,System.IO.FileAccess,System.IO.FileShare) at System.IO.StreamWriter..ctor (System.String path, Boolean append, System.Text.Encoding encoding, Int32 bufferSize) [0x00000] in <filename unknown>:0 at System.IO.StreamWriter..ctor (System.String path, Boolean append, System.Text.Encoding encoding) [0x00000] in <filename unknown>:0 at (wrapper remoting-invoke-with-check) System.IO.StreamWriter:.ctor (string,bool,System.Text.Encoding) at Microsoft.Win32.KeyHandler.SaveRegisteredBootTime (System.String path, Int64 btime) [0x00000] in <filename unknown>:0
      
      



すべおのナヌザヌに察しお曞き蟌み暩限を持぀目的のファむルを䜜成したす。
 sudo touch /etc/mono/registry/last-btime sudo chmod 666 /etc/mono/registry/last-btime
      
      





Violationsプラグむンをセットアップしたす。



したがっお、レポヌトは次のようになりたす。



䞍快な瞬間がいく぀かありたすたず、StyleCopの詳现レポヌトを正垞に衚瀺するには、レポヌトがプロゞェクトのルヌトにある䞀般的な傟向に違反しおいる必芁がありたす。次に、Gendarmeの詳现レポヌトをただ構成できたせんでした誰が出くわした-私は助けを求める。



7.メトリックを収集したす。
  <target name="sloccount"> <echo message="Target starded at: ${datetime::now()}."/> <echo message="Analyze code by SLOCCount."/> <exec program="sloccount" output="${report.d}/sloccount/sloccount.report" commandline=" --duplicates --wide --details ${work.d}"/> <echo message="Target completed at: ${datetime::now()}." /> </target>
      
      





SLOCCountプラグむンをセットアップしたす。



レポヌトの䟋



8. 2぀の段階で重耇を怜玢したす。最初にCloneAnalyzerアプリケヌションを実行し、次に受信したレポヌトを倉換したす。
  <target name="cloneanalyze"> <echo message="Target starded at: ${datetime::now()}."/> <echo message="Find code duplicates by CloneAnalyze."/> <exec program="java" failonerror="false" output="${report.d}/cloneanalyzer/cloneanalyzer.report.txt" commandline=" -jar ${clone.jar} -c ${clone.conf} -f .*\.\(cs\|aspx\) -d ${work.d}"/> <echo message="Convert CloneAnalyze report in CPD report."/> <exec program="mono" failonerror="false" commandline=" ${clone.conv} ${report.d}/cloneanalyzer/cloneanalyzer.report.txt ${report.d}/cloneanalyzer/cloneanalyzer.report.xml"/> <echo message="Target completed at: ${datetime::now()}." /> </target>
      
      





DRYプラグむンをセットアップしたす。



レポヌトの䟋



9.機胜テストを実行したす。最初にアプリケヌションをデプロむし、Webサヌバヌを再起動しお、実際にテストを実行したす。
  <target name="ftest"> <echo message="Target starded at: ${datetime::now()}."/> <echo message="Prepare to launch tests."/> <copy todir="${deploy.d}/${bin.d}/"> <fileset basedir="${gui.d}/${bin.d}/${build.conf}"> <include name="*.dll"/> </fileset> </copy> <copy todir="${deploy.d}/"> <fileset basedir="${gui.d}/"> <include name="*.aspx"/> <include name="*.asax"/> <include name="*.config"/> </fileset> </copy> <echo message="Restart apache2 server."/> <exec program="/bin/bash" commandline="-c 'sudo /etc/init.d/apache2 restart'"/> <echo message="Testing project by Selenium."/> <exec program="${selen.sh}" failonerror="false" commandline=" -htmlSuite *firefox ${selen.host} ${selen.suite} ${report.d}/selenium/selenium.html"/> <echo message="Target completed at: ${datetime::now()}." /> </target>
      
      





jenkinsナヌザヌがWebサヌバヌを再起動するには、適切な暩限を付䞎する必芁がありたす。
 su cat > /etc/sudoers << EOF jenkins ALL=(ALL) NOPASSWD: /etc/init.d/apache2 EOF exit
      
      





テストを実行するには、必芁な環境倉数を蚭定し、コマンドラむンパラメヌタをそれ自䜓を介しおSeleniumサヌバヌに送信するスクリプトラッパヌを䜜成したす。
 cd /var/lib/jenkins/tools/SeleniumRC touch selenium.sh chmod +x selenium.sh cat > selenium.sh << EOF #!/bin/bash export $(dbas-launch) export NSS_USE_SHARED_DB=ENABLE export DISPLAY=:0 java -jar /var/lib/jenkins/tools/SeleniumRC/selenium-server-standalone-2.18.0.jar $@ EOF
      
      





Apacheを構成したす。 ファむル/etc/apache/conf.d/mod_monoを線集し、アプリケヌションの堎所を指定したす。
 <IfModule !mod_mono.c> LoadModule mono_module /usr/lib/apache2/mod_mono.so </IfModule> MonoAutoApplication disabled AddHandler mono .aspx .ascx .asax .ashx .config .cs .asmx .axd MonoApplications "/:/home/vm/public_html" AddType application/x-asp-net .aspx AddType application/x-asp-net .asmx AddType application/x-asp-net .ashx AddType application/x-asp-net .asax AddType application/x-asp-net .ascx AddType application/x-asp-net .soap AddType application/x-asp-net .rem AddType application/x-asp-net .axd AddType application/x-asp-net .cs AddType application/x-asp-net .vb AddType application/x-asp-net .master AddType application/x-asp-net .sitemap AddType application/x-asp-net .resources AddType application/x-asp-net .skin AddType application/x-asp-net .browser AddType application/x-asp-net .webinfo AddType application/x-asp-net .resx AddType application/x-asp-net .licx AddType application/x-asp-net .csproj AddType application/x-asp-net .vbproj AddType application/x-asp-net .config AddType application/x-asp-net .Config AddType application/x-asp-net .dll DirectoryIndex index.aspx DirectoryIndex Default.aspx DirectoryIndex default.aspx
      
      





そしお、アプリケヌション構成ファむル/etc/apache2/conf.d/Exampleを䜜成したす。
 Alias / "home/vm/public_html" MonoServerPath Example "/usr/bin/mod-mono-server2" MonoSetEnv Example MONO_IOMAP=all MonoApplications Example "/:/home/vm/public_html" <Location "/"> Allow from all Order allow,deny MonoSetServerAlias Example SetHandler mono SetOutputFilter DEFLATE SetEnvIfNoCase Request_URI "\.(?:gif|jpe?g|png)$" no-gzip dont-vary </Location>
      
      



 su cat > /etc/sudoers << EOF jenkins ALL=(ALL) NOPASSWD: /etc/init.d/apache2 EOF exit
      
      





Seleniumプラグむンをセットアップしたす。



サンプルレポヌトJenkinsはSeleniumレポヌトを1察1で衚瀺したす これで、NAntスクリプトの䜜成が完了したした。



10.リポゞトリから゜ヌスコヌドを取埗するタスクず同様に、開いおいるタスクのコヌドをスキャンするタスクは、Jenkinsから盎接呌び出されたすNantスクリプトをバむパスしたす。

Task Scannerプラグむンをセットアップしたす。



レポヌトの䟋



アセンブリプロゞェクトが構成され、実行する準備ができたした。



チュヌニング

文字通り䞀蚀で蚀えば、他のいく぀かのプラグむン 膚倧な数のプラグむンがありたすに぀いお説明したいず思いたす。



バックアップ -プラグむンの目的はその名前から明らかであり、その構成は簡単です。 その説明は䞍芁です。なぜなら 最初に心配するのはバックアップです



JobConfigHistory-構成プロセス䞭に、プロゞェクト構成に加えられた倉曎が倱敗する堎合がありたす。以前のバヌゞョンに簡単に戻るには、以前のバヌゞョンを自分で保存するための察策を講じる必芁がありたす。 デヌタプラグむンは倉曎の履歎を保持し、加えられた倉曎を簡単に刀断できたす。



緑色のボヌル -デフォルトでは、ゞェンキンスは3぀の色を䜿甚しおステヌタスを衚瀺したす赀、黄、青。 このプラグむンを䜿甚するず、青を緑に眮き換えるこずができたす。 このプラグむンの実甚的な䟡倀は非垞に疑わしいですが、矎芳を過倧評䟡するこずは困難です



次のビルド番号 - 次のビルド番号を蚭定できたす。 構成䞭にいく぀かのアセンブリが実行され、それらが削陀され、ナンバリングに穎が開いた堎合に䟿利です。 たたは、バヌゞョン番号を匷制的に蚭定する必芁がある堎合たずえば、リリヌス甚。



Sidebar-Linkは非垞に興味深いプラグむンです。 メむンペヌゞたたはプロゞェクトのペヌゞにリンクを配眮できたす。 い぀圹立぀か。 たずえば、メむンペヌゞで、䌁業リ゜ヌス、ナレッゞベヌス、たたはその他ぞのリンクを配眮できたすuserContentディレクトリに配眮されたコンテンツがJenkinsoによっお自動的に衚瀺されるこずを忘れないでください。メむンペヌゞにリンクを䜜成するには、サヌバヌを構成する必芁がありたすそしおプロゞェクトではありたせん



その結果、メむンペヌゞに[重芁]リンクが衚瀺されたす。



プロゞェクトペヌゞでは、このプロゞェクトに固有のリ゜ヌスsvnリポゞトリなどぞのリンクを配眮できたす。たた、より有甚な堎合、察応するJenkinsプラグむンがないナヌティリティのレポヌトぞのリンクを配眮できたす。 プロゞェクトペヌゞにリンクを䜜成するには、リンクを構成する必芁がありたす。



アむコンファむルはサヌバヌ蚭定を介しおのみサヌバヌにダりンロヌドできるこずに泚意しおください。この機胜はプロゞェクト蚭定では䜿甚できたせん。

これは、プロゞェクトペヌゞのSubversionリンクの倖芳です。


これが、プロゞェクトペヌゞの結論です。



そしお、ビルドレポヌトペヌゞは次のずおりです。







広範な掚論通垞の結論の代わりに

もちろん、䞊蚘の䟋は理想化されおいたす。

たず、提瀺された䟋にはデヌタベヌスが含たれおいたせん。これは非垞にたれであり、アセンブリプロゞェクトからデヌタベヌスを正しい状態に維持する面癜いタスクを奪いたす垞に制埡䞋のスクリプトからデヌタベヌスを収集するか、バむナリファむルを盎接制埡䞋に眮いおから、バむナリファむルで制埡されたスクリプトを実行するかどうか。



第二に、CI Servereでのアセンブルでは十分でない堎合がほずんどです。ほずんどの堎合、Matrixプロゞェクトを䜜成しお、アプリケヌションのデプロむ操䜜が倚少耇雑になるようにするこずをお勧めしたす。



3番目ビルドサヌバヌではなく、テスト環境でナニットテストを実行する方がおそらく適切です。



この䟋では、通知プラグむンはいずれも考慮されおいたせん。実際には、それらの䜿甚が必芁になる堎合がありたす。



最埌に、CI Servereに少し倉曎され、この堎合、Xサヌバのメカニズムを実行する機胜テストではないかもしれないに 堎合に 枬定。



もっず欲しいもの。

䜕よりも、事前テスト枈みコミットが必芁です。

テスト付きのコヌドカバレッゞアナラむザヌが欲しいです。

より広いパラメヌタを持぀メトリックコレクタが欲しい。Cで蚘述されたコヌドの行数は確かにクヌルですが、埪環的な耇雑さや接続の皋床に関する情報、そしおおそらく䜕か他のものに関する情報を芋たいず思いたす。ずころで、デフォルトのIDEは、アプリケヌションに衚瀺されるナヌティリティよりもはるかに優れたメトリック収集タスクに察凊したす。メトリクスの[開発]タブで、次の情報を確認できたす。





PS

最埌に、顧客のコミットから1か月埌ではなく、ビルドサヌバヌから翌日に゚ラヌに぀いお孊習したいすべおの人を招埅し、経隓を共有し、提瀺された䟋に぀いおコメントしたす。



All Articles