私は、作業中のプロジェクトでCIサーバーを起動することについて長い間考えていました。 単体テストのベースはすでにかなり印象的であり、プロジェクトの人数はわずかに増加しています。 コードテストによるカバレッジがどのように変化し、コーディング標準が尊重されるかを観察することができます。 そして、有罪を罰します。 冗談です。
しばらく前に、 継続的インテグレーションの本が読まれました。 ソフトウェアの品質の向上とリスクの低減、および出発点として役立ったPHPの品質保証ツールの記事。
継続的インテグレーションサーバーは、一定の間隔でプロジェクトリポジトリの変更をポーリングします。 変更が見つかった場合、彼は
- phpdoc形式のドキュメントを生成します
- コードをコーディング標準と照合します
- テストを実行する
- テストとコード分析の結果、およびこれらのメトリックの変化のダイナミクスからメトリックを構築します
- アセンブリの成功または失敗に関心のあるすべての人に通知します
CruiseControlは、phpのプラグイン-http://phpundercontrol.org/とともに統合サーバーとして選択されました。
debianのようなマシンにCruiseControlをインストールする
CruiseControlを別のオペレーティングシステムにインストールする場合、手順はほぼ同じです。javaをインストールし、CruiseControlを解凍し、サーバーを起動および停止するためのスクリプトを作成します。
CruiseControl自体を起動するには、Javaマシンをインストールする必要があります。
sudo apt-get install sun-java6-bin
それを環境変数に書きます:
export JAVA_HOME = / usr / lib / jvm / java-6-sun
まず、CruiseControlを起動するシステムにユーザーを作成します。
sudo adduser cruisecontrol
残念ながら、CruiseControlで新しい.debパッケージは見つかりませんでしたが、まだ手に入れていないので、必要に応じて最新バージョンをダウンロードし、ディレクトリに展開します。
s.galkin@java-galkin:/ opt $ sudo wget http://sourceforge.net/projects/cruisecontrol/files/CruiseControl/2.8.2/cruisecontrol-bin-2.8.2.zip/download s.galkin@java-galkin:/ opt $ sudo unzip cruisecontrol-bin-2.8.2.zip s.galkin@java-galkin:/ opt $ sudo mv cruisecontrol-bin-2.8.2 cruisecontrol
ユーザーディレクトリの所有者を作成します。
s.galkin@java-galkin:/ opt $ sudo chown cruisecontrol / opt / cruisecontrol -R
UNIXのCruiseControlのインストールガイドからシェルスクリプトを取得します。 ファイル/etc/init.d/cruisecontrolに保存します。
これで、CCを実行して、動作することを確認できます。
s.galkin@java-galkin:/ opt $ sudo /etc/init.d/cruisecontrol start
Webインターフェイスはhttp:// yourhostname:8080 /でアクセスできる必要があります
それに応じてサーバーを停止できます。
s.galkin@java-galkin:/ opt $ sudo /etc/init.d/cruisecontrol stop
phpパーツのインストールに進みます。
おそらく既にxdebugとpearを持っていますが、そうでない場合:
sudo apt-get php5-xdebugをインストール sudo apt-cache search php pear
たくさんのコードとテストがある場合は、phpプロセスに割り当てるメモリの量を増やす必要があります。
max_execution_time = 0 memory_limit = 512M
PHPパッケージをインストールする
次に、コードとphpUnderControl自体を文書化、テスト、評価するためのパッケージをインストールします。
ppDocumentorをインストールする PHP_CodeSnifferをインストールする pearチャンネル検出pear.phpunit.de pear install phpunit / PHPUnit 梨チャネル発見コンポーネント。ez.no pear install --alldeps phpunit / phpUnderControl-beta
すべてを別のマシンに配置する場合は、プロジェクトが依存するすべてのライブラリを配置することを忘れないでください。 同時に、build.xmlで指定されたパラメーターセットを使用して、phpunit、phpcs、phpdocが実行されることを確認できます。
phpUnderControlをCruiseControlプラグインにし、引数として後者がインストールされているディレクトリを指定します。
phpuc install / opt / cruisecontrol
プロジェクトのセットアップ
CruiseControlのルートディレクトリにあるconfig.xml構成ファイルを開き、次のファイルに置き換えます。
<cruisecontrol >
<プロパティ 名 = "ant.dir" 値 = "apache-ant-1.7.0" />
<プロパティ 名 = "work.dir" 値 = "/ opt / cruisecontrol" />
<プロパティ 名 = "logs.dir" 値 = "$ {work.dir} / logs / $ {project.name}" />
<プロパティ 名 = "artifacts.dir" 値 = "$ {work.dir} / artifacts / $ {project.name}" />
<プロパティ 名 = "project.dir" 値 = "$ {work.dir} / projects / $ {project.name}" />
<プロパティ 名 = "project.code.dir" 値 = "$ {project.dir} / source" />
<プロパティ 名 = "project.build.dir" 値 = "$ {project.dir} / build" />
<プロパティ 名 = "project.logs.dir" 値 = "$ {project.build.dir} / logs" />
<プロパティ 名 = "project.coverage.dir" 値 = "$ {project.build.dir} / coverage" />
<プロパティ 名 = "project.api.dir" 値 = "$ {project.build.dir} / api" />
<プロパティ 名 = "project.build.file" 値 = "$ {project.code.dir} /misc/ci/build.xml" />
<プロパティ 名 = "status.file" 値 = "$ {logs.dir} / $ {project.name} /status.txt" />
<プロジェクト 名 = "yourProjectName" >
<リスナー>
<currentbuildstatuslistener ファイル = "$ {status.file}" />
</リスナー>
<ブートストラップ>
<svnbootstrapper localWorkingCopy = "$ {project.code.dir}" />
</ブートストラップ>
<modificationset >
<svn localWorkingCopy = "$ {project.code.dir}" />
</修正セット>
<スケジュール 間隔 = "300" >
<ant anthome = "$ {ant.dir}" buildfile = "$ {project.build.file}" >
<プロパティ 名 = "project.code.dir" 値 = "$ {project.code.dir} /" />
<プロパティ 名 = "project.build.dir" 値 = "$ {project.build.dir}" />
<プロパティ 名 = "project.logs.dir" 値 = "$ {project.logs.dir}" />
<プロパティ 名 = "project.api.dir" 値 = "$ {project.api.dir}" />
<プロパティ 名 = "project.coverage.dir" 値 = "$ {project.coverage.dir}" />
</ ant >
</スケジュール>
<log dir = "$ {logs.dir}" >
<merge dir = "$ {project.logs.dir}" />
</ログ>
<出版社>
<currentbuildstatuspublisher ファイル = "$ {logs.dir} /buildstatus.txt" />
<artifactspublisher dir = "$ {project.coverage.dir}" dest = "$ {artifacts.dir}" サブディレクトリ = "coverage" />
<artifactspublisher dir = "$ {project.api.dir}" dest = "$ {artifacts.dir}" サブディレクトリ = "api" />
<execute command = "phpuc graph $ {logs.dir} $ {artifacts.dir}" />
</出版社>
</プロジェクト>
</ cruisecontrol >
ファイルとディレクトリへのすべてのパスを構成ファイルの最上部の変数に転送したため、必要に応じてそれらを1か所で簡単に修正できました。
私はantをコレクターとして使用しました(これはconfig.xmlの/ cruisecontrol / project / scheduleノードで明示的に指定されています )。 プロジェクトが既にphing(antよりもphpプロジェクトの方が論理的)を使用している場合、CruiseControlはそれを完全にサポートします。
/ cruisecontrol / project / publishersノードでは、テスト結果とメトリックの処理に加えて、ビルドが失敗した場合(おそらく成功した場合)に、メール/ギルで通知を送信することもできます。
構成ファイルの詳細な説明は、 CruiseControl構成リファレンスにあります。
プロジェクトアセンブリシナリオ自体に渡します。
<プロジェクト 名 = "yourProjectName" デフォルト = "build" >
<ターゲット 名 = "準備" >
<delete dir = "$ {project.build.dir}" />
<mkdir dir = "$ {project.logs.dir}" />
</ターゲット>
<ターゲット 名 = "phpdoc" >
<exec 実行可能ファイル = "phpdoc" dir = "$ {project.build.dir}" failonerror = "false" >
<arg line = "
-o HTML:フレーム:DOM / earthli
-ti '$ {ant.project.name}ドキュメント'
-q
-t $ {project.api.dir}
-d $ {project.code.dir}
「 />
</ exec >
</ターゲット>
<ターゲット 名 = "phpcs" >
<exec 実行可能ファイル = "phpcs" dir = "$ {project.build.dir}" failonerror = "false" output = "$ {project.logs.dir} /checkstyle.xml" >
<arg line = "
--report = checkstyle
-標準= PEAR
$ {project.code.dir}
「 />
</ exec >
</ターゲット>
<ターゲット 名 = "phpunit" >
<exec 実行可能ファイル = "phpunit" dir = "$ {project.build.dir}" failonerror = "true" >
<arg line = "
--log-xml $ {project.logs.dir} /phpunit.xml
--log-pmd $ {project.logs.dir} /phpunit.pmd.xml
--log-metrics $ {project.logs.dir} /phpunit.metrics.xml
--coverage-xml $ {project.logs.dir} /phpunit.coverage.xml
--coverage-html $ {project.coverage.dir}
phpucAllTests $ {project.code.dir} /utests/AllTests.php
「 />
</ exec >
</ターゲット>
<ターゲット 名 = "build" 依存 = "prepare、phpdoc、phpcs、phpunit" />
</プロジェクト>
すべてのパス変数はconfig.xmlから渡されました
<ant anthome = "$ {ant.dir}" buildfile = "$ {project.build.file}" >
<プロパティ 名 = "project.code.dir" 値 = "$ {project.code.dir} /" />
<プロパティ 名 = "project.build.dir" 値 = "$ {project.build.dir}" />
<プロパティ 名 = "project.logs.dir" 値 = "$ {project.logs.dir}" />
<プロパティ 名 = "project.api.dir" 値 = "$ {project.api.dir}" />
<プロパティ 名 = "project.coverage.dir" 値 = "$ {project.coverage.dir}" />
</ ant >
今後リポジトリを更新しやすくするため、すぐにリポジトリにbuild.xmlを配置することにしました。
config.xmlからパスを指定することを忘れないでください( / cruisecontrol / project / schedule / antノードのbuildfile属性)
次に、プロジェクトをリポジトリから/ opt / cruisecontrol / projects / yourProjectName / sourceフォルダーにアンロードし 、CruiseControlを起動します。 それだけです!
既存の問題
警告/通知がある場合、Codesnifferはそれらを抑制せず、結果はCruiseControlが読み取れない無効なxmlファイルです。 一般に、理解できない動作については、ログ/opt/cruisecontrol/cruisecontrol.shを見ることができます
まとめ
継続的インテグレーションサーバーの結果、次の利点が得られます。
- すべての開発者は、失敗したビルドをタイムリーに通知されます
- テスト数の変化のダイナミクス
- テストでカバーされるコードの割合の変化のダイナミクス
- 特定のクラスのテストカバレッジの分析
- コーディング標準違反
- 内部APIに関する最新のドキュメント
- 静的コード分析:メソッドが長すぎる、条件ロジックが複雑すぎる、...