継続的な統合とコードメトリック

この記事では、コードメトリックを使用して継続的なプロセス統合を構成する方法について説明します。 Javaコードとライブラリで動作するはずです:junit、cobertura、findbugs。 ビルドシステムとしてantを使用し、プロセス自体はクルーズコントロールから制御されます。 scmとしてgitが少しあります。



最後に何が得られますか? antビルドスクリプトを使用したJavaプロジェクト。 アセンブリの結果は、コンパイルされたプロジェクトと一連のメトリックになります。junitテストに関するレポート、テストによるコードカバレッジの割合、および潜在的なエラーに関するレポートです。 さらに、ビルドプロセス全体が自動モードで毎日行われ、メトリックの履歴全体がグループレポート用に保存されます。

画像





ソース素材



出発点として、任意のJavaプロジェクトを取り上げます。 プロジェクトには、少なくともいくつかのクラスと、いくつかの単体テストが含まれている必要があります。 同時に、レポートで絶対値が表示されないように、コードの100%をカバーする必要はありません。

完成したプロジェクトの例はこちらからダウンロードできます



必要なものとダウンロードする場所



Javaが既にある場合は、パッケージをインストールします。

antをインストールします。 こちらをダウンロードして、解凍し、パスをant / binに追加します



JUnitはこちらからダウンロードし、ant / libにjunit.jarを配置します

Findbugsをここからダウンロード 、ant / libにfinbugs-ant.jarを解凍して追加します

コベルチュラはこちらから 、ネジで開梱してください。



ビルド設定



最初に、コマンドラインからプロジェクトを構成します。 これを行うには、プロジェクトルートにbuild.xmlを作成し、そこに配置します



<target name="compile" depends="init">

<javac destdir="bin" debug="yes">

<src path="src" />

</javac>

</target>









ターゲット「コンパイル」を定義し、コマンドラインを呼び出すことでそれを実現できます

ant compile





depend属性により、initターゲットがコンパイル前に実行されます。 予備ターゲットは、必要なすべてのディレクトリを作成します。



テストを追加する



多くの人がすでに知っているように、現代のソフトウェア開発の世界では、単体テストなしでは不可能です。 私たちのテストプロジェクトも例外ではありません。 機能の一部のためのいくつかのJUnitテストが含まれています。

自動アセンブリは、すべてのテストを実行し、レポートを作成する必要があります。テストの合計数、成功したテストの数。

大規模な顧客と協力する場合、テストでのコードカバレッジの割合についての要件があります。 このメトリックを計算するには、coberturaを使用します。

Coberturaはスタンドアロンアプリケーションとして動作し、htmlレポートを生成できます。 ただし、自動テストでは、AntプラグインとXML形式のレポートを使用します。

カバレッジ計算メカニズムに関するいくつかの言葉。

まず、2つのタイプのカバーリングがあります。コード行のカバーとブランチのカバーです。 ラインカバレッジは、プロジェクト内のラインの総数と、テストの影響を受けたラインの数を単純にカウントします。 分岐カバレッジでは、コード分岐が考慮されます。

カバレッジ統計を計算するには、特別な方法でコードをコンパイルして、coberturaがマーカーを追加する必要があります。 junitの実行中、これらのマーカーはカバレッジを計算します。

マーカーの追加は非常に簡単なプロセスで、coberturaライブラリをクラスパスに追加するだけです。

やってみましょう。

前のantターゲットは単にプロジェクトをコンパイルし、trackターゲットも同じことを行いますが、マーカーを使用してクラスを別のフォルダーに保存します。



<target name="cobertura" depends="compile">

<javac destdir="bin-cob" debug="yes">

<classpath refid="cobertura.classpath" />

<src path="src" />

</javac>

<cobertura-instrument>

<fileset dir="./bin-cob">

<include name="**/*.class" />

<exclude name="**/*Test.class" />

</fileset>

</cobertura-instrument>

</target>









さらに、テストクラスをカバレッジカウントから除外します。



次のステップはテストです:



<target name="test" depends="cobertura">

<junit fork="yes" printsummary="yes">

<sysproperty key="net.sourceforge.cobertura.datafile" file="cobertura.ser" />

<classpath refid="cobertura.classpath" />

<!-- Note! Test are run against classes compiled with cobertura marks -->

<classpath refid="classpath.bin-cob" />

<formatter type="xml"/>

<batchtest fork="yes" todir="reports">

<fileset dir="./src">

<include name="**/*Test.java"/>

</fileset>

</batchtest>

</junit>

<!-- make xml report -->

<cobertura-report srcdir="${src.dir}" destdir="reports" format="xml" />

<!-- make html report -->

<cobertura-report destdir="coveragehtml">

<fileset dir="./src">

<include name="**/*.java"/>

</fileset>

</cobertura-report>

</target>









このターゲットは2つのステップを実行します。コードをテストし、カバレッジレポートを生成します。

マーカーのおかげで、coberturaはテスト実行プロセスをcobertura.serファイルに書き込みます。 次の手順では、serを使用して、レポートフォルダーにxmlレポートを生成します。 htmlレポートも生成されます。



エラーディテクターの追加



テストとカバレッジはすでに、開発の品質について間接的に言及する非常に重要な指標です。 次のプラグインは情報レポートを提供するだけでなく、プログラミングエラーを回避するのに役立ちます。



Findbugsは、プログラミングエラーのコードを分析するためのシステムです。コードの重複、メソッドの誤った設計などに気づきます。



別のターゲットを追加します。



<target name="findbugs" depends="test">

<findbugs home="${findbugs.home}"

output="xml"

outputFile="reports/findbugs.xml" >

<sourcePath path="./src/" />

<class location="./bin/" />

</findbugs>

</target>









作業の結果は、潜在的な問題に関するxmlレポートになります。 出力としてhtmlが指定されている場合、レポートはより読みやすい形式で表示されます。



履歴を保存する



この時点で、プロジェクトアセンブリとメトリックを含む既製のbuild.xmlが作成されました。 ビルドごとに、システムは新しいビルドを行い、レポートを書き換えます。 変更の履歴を保持するためのシステムを構成します。 これを行うには、 codemetric.org Webサービスを使用し、レポートはdemo.codemetric.orgの形式で利用できます。



画像



まず、 www.codemetric.orgに登録し、スペース、グループを作成してビルドする必要があります。 その後、ビルドの名前、ID、およびトークンがプロファイルに表示されます。 次のantプラグインを設定するには、これらの番号とIDが必要です

最初に、レポートサービスのプラグインをダウンロードし、アリのライブラリに書き込みます。

http://www.codemetric.org/codemet.jar



別のターゲットを追加します。



<taskdef name="publish" classname="org.codemetric.ant.Publish"/>

<target name="success">

<publish

user="123456"

build="234567"

token="345678"

reports="reports"

/>

</target>









プロファイルからユーザー、ビルド、およびトークンの値を指定します。 レポートは、以前に生成されたレポートへのパスです。

目標を達成する

ant success





スクリプトは、履歴がサーバーに保存されたことを確認する必要があります。その後、.codemetric.orgで履歴を確認できます



クルーズに行こう



だから。 現時点では、テストを実行し、メトリックを計算し、履歴を保存するビルドスクリプトを備えたJavaプロジェクトがあります。 唯一の不便は、これが手動モードで発生することです。

このプロセスを自動化しましょう。

継続的インテグレーションは、スケジュールに基づいて、たとえば1日に1回、プロジェクトを自動的に組み立てる方法です。 T.O. チーム全体がコミットを成功させ、サーバーは一日の終わりに競合などをチェックできます。

ウィキペディアでCIの詳細をお読みください。



プロジェクトを毎分チェックするようにCruiseControlをセットアップします。

シナリオは次のとおりです。





プロジェクトがあること、ビルドスクリプトがあること、レポートを公開する目的があることを思い出してください。 そして、私たちにはいくつかの中央リポジトリがありません。

原則として、任意のscmシステムが適していますが、gitを試します。

すでにGitがインストールされていると思われます

プロジェクトをディスクのルートにコピーします。

/ testprojectに移動して実行しましょう

git init





-これにより、新しいリポジトリが作成されます。 プロジェクトには、srcフォルダーとbuild.xmlのみを含める必要があります

すべてのプロジェクトファイルを追加します。

git add

git commit -m "init import"






これで、プロジェクトが内部にあるリポジトリが作成されました。 cruisecontrolのセットアップに移りましょう。

まず、 ここからダウンロードし解凍します。

projectsフォルダーで、gitを使用してプロジェクトの作業用コピーを作成する必要があります。 プロジェクトフォルダーで実行する

git clone /testpoject





新しい作業コピーが表示されます。 これで、クルーズの構成を直接作成できます。

cruiseフォルダー内のconfig.xmlファイルを開き、デフォルトのプロジェクトを削除またはコメント化します。 結果の構成ファイルは次のとおりです。



<cruisecontrol>



<project name="testproject">



<bootstrappers>

<gitbootstrapper localWorkingCopy="projects/${project.name}/" />

</bootstrappers>



<modificationset quietperiod="30">

<git LocalWorkingCopy="projects/${project.name}"/>

</modificationset>



<schedule interval="60">

<ant anthome="/home/andrew/temp/apache-ant-1.7.1" antWorkingDir="projects/${project.name}/"/>

</schedule>



<publishers>

<onsuccess>

<antpublisher anthome="/home/andrew/temp/apache-ant-1.7.1" target="success" antWorkingDir="projects/${project.name}/" />

</onsuccess>

</publishers>



</project>

</cruisecontrol>









各グループの役割を説明しましょう:

ブートストラップはビルドサイクルの前に実行され、ネイティブリポジトリから実際に変更をプルします。

その後、修正セットは、ローカルコピー内のファイルが修正されているかどうかを確認します。 変更がない場合、アセンブリは遅延します。

スケジュールは実際のスケジューラです。スケジュールに記載されている手順の前に、ブートストラップと修正セットが自動的に実行されます。

最後のグループは出版社です。 アセンブリの結果に依存し、成功した場合に実行されます。 理想的には、エラーを報告するためのロジック(たとえば、チームリードレター)を記述する必要があります。



PS



別のscm(cvs、svn)を使用する場合は、ブートストラップとモディフィケーションセットをマークします。



すべてのクルーズオプションの詳細については、 こちらをご覧ください



アンドリュー・ロマネンコ

www.romanenco.com



All Articles