PHPの継続的統合

この記事は、私の友人で元同僚のフレッドが執筆したもので、プログラマーのチームで24時間365日稼働する大規模で複雑なプロジェクトに取り組んでいます。 誰かが彼をHabrに招待することに決めたら-喜んでhabrpostで彼のメールを送ります。 提案やコメントを歓迎します。筆者の答えを能力の及ぶ限り伝えることを約束します。



私は、作業中のプロジェクトでCIサーバーを起動することについて長い間考えていました。 単体テストのベースはすでにかなり印象的であり、プロジェクトの人数はわずかに増加しています。 コードテストによるカバレッジがどのように変化し、コーディング標準が尊重されるかを観察することができます。 そして、有罪を罰します。 冗談です。

しばらく前に、 継続的インテグレーションの本が読まれました ソフトウェアの品質の向上とリスクの低減、および出発点として役立ったPHPの品質保証ツールの記事。



継続的インテグレーションサーバーは、一定の間隔でプロジェクトリポジトリの変更をポーリングします。 変更が見つかった場合、彼は

  1. phpdoc形式のドキュメントを生成します
  2. コードをコーディング標準と照合します
  3. テストを実行する
  4. テストとコード分析の結果、およびこれらのメトリックの変化のダイナミクスからメトリックを構築します
  5. アセンブリの成功または失敗に関心のあるすべての人に通知します


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を見ることができます

まとめ



継続的インテグレーションサーバーの結果、次の利点が得られます。



便利なリンク



  1. CruiseControlベストプラクティスシリーズ
  2. PHPの品質保証ツール
  3. RunningCruiseControlFromUnixInit
  4. phpUnderControlのセットアップ
  5. phpUnderControl
  6. CruiseControl構成リファレンス
  7. 非標準ディレクトリでのコーディング標準を使用したCodeSnifferの実行




All Articles