Jenkinsをベースとした継続的インテグレーション環境の構築をベースに、PHPプロジェクトと組み合わせたJenkinsを導入し、自動テストと自動デプロイメントを実現していきます。もうナンセンスはやめて、仕事に取り掛かりましょう。
Zhainiao が使用するサーバーは Ubuntu です
Jenkins で PHP の自動テストを実装するには、まず Jenkins サーバーに PHP テスト フレームワークをインストールする必要があります。ここでは PHPUnit Framework.
PHPUnit を選択します。インストールは非常に簡単です:
sudo apt-get install phpunit
次のエラーが発生した場合:
PHP Warning: require_once(PHP/CodeCoverage/Filter.php): failed to open stream: No such file or directory in /usr/bin/phpunit on line 39 PHP Fatal error: require_once(): Failed opening required 'PHP/CodeCoverage/Filter.php' (include_path='.:/usr/share/php:/usr/share/pear') in /usr/bin/phpunit on line 39
次の方法でインストールできます:
sudo pear channel-discover pear.phpunit.de sudo pear channel-discover pear.symfony-project.com sudo pear channel-discover components.ez.no sudo pear channel-discover pear.symfony.com sudo pear update-channels sudo pear upgrade-all sudo pear install pear.symfony.com/Yaml sudo pear install --alldeps phpunit/PHPUnit sudo pear install --force --alldeps phpunit/PHPUnit
インストール後、phpunit --versionを実行してバージョン情報を返します。インストールが成功したことを示します。
root@dop-kvm-2:# phpunit --version PHPUnit 3.7.28 by Sebastian Bergmann.
さて、Jenkins にいくつかのプラグインを与え始めましょう:
Subversion/Git: プロジェクトのバージョン管理ソフトウェアを統合するために使用され、必要に応じて選択します (すでにインストールされ、前のブログ投稿で使用されています)
Phing/Ant: Phing またはApache Ant for PHP プロジェクト構築の自動化
CheckStyle: PHP CodeSniffer を使用したコード スタイル チェックのためのツール。 PHP コードが一連の事前設定されたコーディング標準に違反しているかどうかをチェックするために使用される PEAR パッケージには、ZEND および PEAR コーディング スタイル ルールが組み込まれています
Clover PHP: phpunit を使用した単体テスト用のツールで、xdebug 拡張機能で使用できます。コードカバレッジレポートを生成し、自動テストのために phing と統合することもできます。また、大規模な自動統合テストを完了するために Selenium と統合することもできます
DRY: PHPCPD (php コピーペースト検出器) を使用して、プロジェクト内の重複コードを見つけます
HTML Publisher: phpunit コードカバレッジレポートを公開するために使用します
JDepend: PHP depend を使用して php の静的コードを分析し、プロジェクト内のコードのサイズと複雑さをチェックします
Plot: phploc を使用して php のサイズをカウントしますphp プロジェクト コードの行数をカウントできるプロジェクト
PMD: phpmd (php mes dector) を使用して、pdepend に基づいて結果を分析します。プロジェクトが pdepend の特定の指標を超えると、警告メッセージが発行されます。
違反: 重大なコードの欠陥による pwd 静的コード分析の結果を一元的に表示xUnit: JUnit 形式を使用して phpunit ログ ファイルを出力root@dop-kvm-2:/home/jenkins/api# tree . ├── aa.php ├── build.xml ├── create.php └── test ├── DemoTest.php └── FunctionTest.php 1 directory, 5 files注: aa.php と create.php はプロジェクトのプログラム ファイルです test ディレクトリ内の DemoTest.php と FunxtionTest.php はプロジェクトのテスト ファイルですプロジェクトbuild .xml は、Jenkins の継続的統合テストのパッケージ化とデプロイメントのための呼び出しファイルです
<?xml version="1.0" encoding="UTF-8"?> <project name="api" default="build"> <target name="build" depends="make_runtime,phpcs-ci,phploc,pdepend,phpcb,phpunit,phpdox,phpcpd"/> <property name="version-m" value="1.1" /> <property name="version" value="1.1.0" /> <property name="stability" value="stable" /> <property name="releasenotes" value="" /> <property name="tarfile" value="${phing.project.name}.${buildnumber}.${buildid}.tar.gz" /> <property name="pkgfile" value="${phing.project.name}.${version}.tgz" /> <property name="distfile" value="dist/${tarfile}" /> <property name="tests.dir" value="test" /> <fileset id="api.tar.gz" dir="."> <include name="test/**"/> <include name="*.php"/> <include name="*.xml"/> </fileset> <target name="make_runtime"> <mkdir dir="${project.basedir}/Runtime" /> <mkdir dir="${project.basedir}/build/logs" /> <mkdir dir="${project.basedir}/build/pdepend" /> <mkdir dir="${project.basedir}/build/code-browser" /> </target> <target name="phpcs" description="Find coding standard violations using PHP_CodeSniffer"> <exec executable="phpcs"> <arg value="--standard=${project.basedir}/build/phpcs.xml" /> <arg value="--ignore=autoload.php" /> <arg path="${project.basedir}/" /> </exec> </target> <target name="phpcs-ci" description="Find coding standard violations using PHP_CodeSniffer"> <exec executable="phpcs" output="${project.basedir}/build/build.log"> <arg value="--report=checkstyle" /> <arg value="--report-file=${project.basedir}/build/logs/checkstyle.xml" /> <arg value="--standard=${project.basedir}/build/phpcs.xml" /> <arg value="--ignore=" /> <arg path="${project.basedir}/" /> </exec> </target> <target name="phploc" description="Measure project size using PHPLOC"> <exec executable="phploc"> <arg value="--log-csv" /> <arg value="${project.basedir}/build/logs/phploc.csv"/> <arg path="${project.basedir}/"/> </exec> </target> <target name="pdepend" description="Calculate software metrics using PHP_Depend"> <exec executable="pdepend"> <arg value="--jdepend-xml=${project.basedir}/build/logs/jdepend.xml"/> <arg value="--jdepend-chart=${project.basedir}/build/pdepend/dependencies.svg"/> <arg value="--overview-pyramid=${project.basedir}/build/pdepend/overview-pyramid.svg"/> <arg path="${project.basedir}/"/> </exec> </target> <target name="phpmd" description="Perform project mess detection using PHPMD"> <exec executable="phpmd"> <arg path="${project.basedir}/"/> <arg value="text"/> <arg value="${project.basedir}/build/phpmd.xml"/> </exec> </target> <target name="phpmd-ci" description="Perform project mess detection using PHPMD"> <exec executable="phpmd"> <arg path="${project.basedir}/"/> <arg value="xml"/> <arg value="${project.basedir}/build/phpmd.xml"/> <arg value="--reportfile"/> <arg value="${project.basedir}/build/logs/pmd.xml"/> </exec> </target> <target name="phpcpd" description="Find duplicate code using PHPCPD"> <exec executable="phpcpd"> <arg value="--log-pmd"/> <arg value="${project.basedir}/build/logs/pmd-cpd.xml"/> <arg path="${project.basedir}/"/> </exec> </target> <target name="phpdox" description="Generate API documentation using phpDox"> <exec executable="phpdox"/> </target> <target name="phpunit" description="Run unit tests with PHPUnit"> <exec executable="phpunit" /> </target> <target name="test" description="Run PHPUnit tests"> <phpunit haltonerror="true" haltonfailure="true" printsummary="true"> <batchtest> <fileset dir="${tests.dir}"> <include name="**/*Test.php" /> </fileset> </batchtest> </phpunit> </target> <target name="phpcb" description="Aggregate tool output with PHP_CodeBrowser"> <exec executable="phpcb"> <arg value="--log"/> <arg path="${project.basedir}/build/logs"/> <arg value="--source"/> <arg path="${project.basedir}/"/> <arg value="--output"/> <arg path="${project.basedir}/build/code-browser"/> </exec> </target> <target name="check" description="Check variables" > <fail unless="version" message="Version not defined!" /> <fail unless="buildnumber" message="buildnumber not defined!" /> <fail unless="buildid" message="buildid not defined!" /> <delete dir="dist" failonerror="false" /> <mkdir dir="dist" /> </target> <target name="tar" depends="check" description="Create tar file for release"> <echo msg="Creating distribution tar for ${phing.project.name} ${version}"/> <delete file="${distfile}" failonerror="false"/> <tar destfile="${distfile}" compression="gzip"> <fileset refid="api.tar.gz"/> </tar> </target> </project>build.xml を読むと、コンテンツ:
<project name="api" default="build"> <target name="build" depends="make_runtime,phpcs-ci,phploc,pdepend,phpcb,phpunit,phpdox,phpcpd"/> <property name="version-m" value="1.1" /> <property name="version" value="1.1.0" /> <property name="stability" value="stable" /> <property name="releasenotes" value="" /> <property name="tarfile" value="${phing.project.name}.${buildnumber}.${buildid}.tar.gz" /> <property name="pkgfile" value="${phing.project.name}.${version}.tgz" /> <property name="distfile" value="dist/${tarfile}" /> <property name="tests.dir" value="test" />パッケージ化時に含まれるファイルとフォルダー: exclude を使用してファイルとフォルダーを除外することもできます:
<fileset id="api.tar.gz" dir="."> <include name="test/**"/> <include name="*.php"/> <include name="*.xml"/> </fileset>テスト ファイルのアドレス:
<target name="phpunit" description="Run unit tests with PHPUnit"> <exec executable="phpunit" /> </target> <target name="test" description="Run PHPUnit tests"> <phpunit haltonerror="true" haltonfailure="true" printsummary="true"> <batchtest> <fileset dir="${tests.dir}"> <include name="**/*Test.php" /> </fileset> </batchtest> </phpunit> </target>これらを理解した後、Jenkins で新しい autoTestTarAndPublish プロジェクトを作成し、次を選択します: フリー スタイル ソフトウェア プロジェクトをビルドします: そして、図に示すようにコード ベースを指定します: 次に、ビルド ステップを追加します - >Phing ターゲットを呼び出す: 2 つのターゲットを追加します: test、tar は、それぞれビルド内の test 名と tar 名に対応します: [Publish over SSH] の下にホストを追加します: (ここでは、Zhainiao 設定は ssh パスワードなしのログインを使用します) を設定する必要があります。 jenkins から公開する Web サーバーにパスワードなしでログインします次のように設定します: ここに設定を追加します。ホスト名は 134 です
次に、デプロイメントを設定できますwork:
ビルド ステップを追加するには、下の表で選択します: SSh 経由でファイルを送信するか、コマンドを実行します。 このオプションが表示されない場合は、プラグイン管理にある必要があります。 プラグインをインストールします: SSH 経由で公開し、次に、jenkins を再起動します
パッケージ ファイルのアドレスを入力し、リモート サーバーのアドレス情報を入力し、Exec コマンドに解凍を入力します。およびその他のシェル スクリプトをテキスト ボックスに入力します:
詳細については画像を参照してください:
この設定が完了したら、php プロジェクトを 134 サーバーに公開できます:
最終ファイル リリースのアーカイブパッケージ: ビルド後のステップを追加:填写dist/*.tar.gz
至此配置完毕后,点击 保存 按钮.我们就可以发布程序到指定服务器134上了.
来看一下发布结果:
回到项目左侧点击:立即构建:可以看到构建进度条,结束后可以在控制台看到输出结果:
我们来到134上看:
至此发布完毕.
此时我们查看一下test/DemoTest.php文件内容:
<?php class DemoTest extends PHPUnit_Framework_TestCase { public function testPass() { $this->assertTrue(true); } public function testFail() { $this->assertFalse(false); } } ?>
我们把 testFail()改成下面:
<?php class DemoTest extends PHPUnit_Framework_TestCase { public function testPass() { $this->assertTrue(true); } public function testFail() { $this->assertTrue(false); } } ?>
$this->assertTrue(false);
这个是错误的断定:
提交文件后再次构建:
我们可以看到本次构建失败,查看输出结果如下:
当把测试用例修改回正确后,执行构建,发布正确。
<?php class DemoTest extends PHPUnit_Framework_TestCase { public function testPass() { $this->assertTrue(true); } public function testFail() { $this->assertFalse(false); } } ?>
ok,到此介绍结束.
总结一下:
jenkins根据项目根目录下的build.xml文件,并根据jenkins中targets的配置,首先自动执行test,当测试通过后,开始执行tar,打包完成后,开始链接远程webserver把程序包上传到远程webserver指定目录下,然后再根据jenkins下的command 执行解压操作,然后就可以根据自己的业务通过shell脚本进行自动处理自动发布的各项操作.
如果在执行test过程中,出现发现测试用例不通过,则就发出错误报告,终止本次构建。
以上就是基于Jenkins 实现php项目的自动化测试、自动打包和自动部署的内容,更多相关内容请关注PHP中文网(www.php.cn)!