Basierend auf dem Aufbau einer kontinuierlichen Integrationsumgebung auf Basis von Jenkins werden wir weiterhin Jenkins in Kombination mit PHP-Projekten einführen, um automatisierte Tests und automatische Bereitstellung zu erreichen. Kein Unsinn mehr, machen Sie sich einfach an die Arbeit.
Der von Zhainiao verwendete Server ist Ubuntu
Um automatisierte Tests von PHP in Jenkins zu implementieren, müssen Sie zunächst das PHP-Testframework auf dem Jenkins-Server installieren Wir wählen PHPUnit Framework.
Die Installation von PHPUnit ist sehr einfach:
sudo apt-get install phpunit
Wenn der folgende Fehler auftritt:
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
Sie können es wie folgt installieren Methode:
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
Führen Sie nach der Installation phpunit --version aus, um Versionsinformationen zurückzugeben. Zeigt eine erfolgreiche Installation an.
root@dop-kvm-2:# phpunit --version PHPUnit 3.7.28 by Sebastian Bergmann.
Beginnen wir damit, Jenkins einige Plug-Ins zu geben:
Subversion/Git: Wird zur Integration von Projektversionskontrollsoftware verwendet, bei Bedarf auswählen (bereits installiert und im vorherigen Blog-Beitrag verwendet)
Phing/Ant: Verwenden Sie Phing oder Apache Ant, um die Erstellung von PHP-Projekten zu automatisieren.
CheckStyle: Verwenden Sie PHP CodeSniffer, um den Codestil zu überprüfen. Ein PEAR-Paket, mit dem überprüft wird, ob PHP-Code gegen eine Reihe voreingestellter Codierungsstandards verstößt. Es verfügt über integrierte ZEND- und PEAR-Codierungsstilregeln
Clover PHP: Ein Tool für Unit-Tests mit PHPUnit, das von verwendet werden kann xdebug Die Erweiterung wird zum Generieren von Codeabdeckungsberichten verwendet und kann für automatisierte Tests in Phing integriert werden. Sie kann auch in Selenium integriert werden, um groß angelegte automatisierte Integrationstests durchzuführen
DRY: Verwenden Sie PHPCPD (PHP Copy Paste). Detektor), um Probleme im Projekt zu erkennen. Doppelter Code
HTML-Herausgeber: Wird zum Veröffentlichen des PHPUnit-Codeabdeckungsberichts verwendet
JDepend: Verwenden Sie PHP Depend, um statischen Code in PHP zu analysieren und den Code zu überprüfen Größe und Komplexität des Projekts
Plot: Verwenden Sie phploc, um die Größe des PHP-Projekts zu zählen. Es kann die Anzahl der Zeilen des PHP-Projektcodes zählen.
PMD: Verwenden Sie phpmd (php mess dector). ), um die Ergebnisse basierend auf pdepend zu analysieren. Sobald das Projekt die spezifischen Indikatoren in pdepend überschreitet, wird eine Warnmeldung ausgegeben.
Verstöße: Zeigen Sie die Ergebnisse der pwd-statischen Codeanalyse zentral entsprechend der Schwere des Codes an Fehler
xUnit: Verwenden des JUnit-Formats zur Ausgabe der Protokolldatei von phpunit
Beachten Sie, dass es sich bei diesen Plug-Ins um einige Plug-Ins handelt, die von Jenkins für PHP bereitgestellt werden Projekte, aber sie sind nicht notwendig, deshalb verwende ich nur die wertvollsten. Ich werde Ihnen erklären, wie Sie das Testen, Verpacken und Veröffentlichen automatisieren können.
Geben Sie zunächst die Verzeichnisstruktur des Projekts an:
root@dop-kvm-2:/home/jenkins/api# tree . ├── aa.php ├── build.xml ├── create.php └── test ├── DemoTest.php └── FunctionTest.php 1 directory, 5 files
Hinweis:
aa.php und create.php sind die Programmdateien des Projekts
test DemoTest.php und FunxtionTest.php im Verzeichnis sind die Testdateien des Projekts
build.xml ist die aufrufende Datei für die Verpackung und Bereitstellung von Jenkins Continuous Integration-Tests
Geben Sie zunächst die für das Projekt erforderliche build.xml-Datei an:
<?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>
Nachdem Sie die build.xml gelesen haben, können Sie den Inhalt verstehen:
Projektname, Version, Paketname nach dem Packen:
<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" />
Beim Packen eingeschlossene Dateien und Ordner: Sie können auch „Ausschließen“ verwenden, um Dateien und Ordner auszuschließen:
<fileset id="api.tar.gz" dir="."> <include name="test/**"/> <include name="*.php"/> <include name="*.xml"/> </fileset>
Speicherortadresse der Testdatei:
<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>
Nachdem wir dies verstanden hatten, begannen wir mit der Erstellung eines neuen autoTestTarAndPublish-Projekts in Jenkins. Wählen Sie: Erstellen Sie ein kostenloses Softwareprojekt:
und geben Sie es an die Codebasis: wie in der Abbildung gezeigt
Dann fügen Sie den Build-Schritt hinzu->Phing-Ziele aufrufen:
Fügen Sie zwei Ziele hinzu: test bzw. tar mit dem Test, tar-Namen in build.xml Entsprechend
Parameter zu tar hinzufügen:
Dann im Hauptteil Menü auf der linken Seite: Systemverwaltung->System Einen Host hinzufügen unter Einstellungen->Über SSH veröffentlichen: (Hier ist Zhainiao so eingestellt, dass es die passwortfreie SSH-Anmeldung verwendet) Es muss auf die passwortlose Anmeldung von Jenkins zum eingestellt werden zu veröffentlichender Webserver
Einstellung wie gezeigt:
Der hier hinzugefügte Hostname lautet: 134
Weiter Wir können die Bereitstellungsarbeit einrichten:
Wählen Sie aus der folgenden Tabelle aus, um den Build-Schritt hinzuzufügen: Dateien senden oder Befehle über SSh ausführen Wenn diese Option nicht angezeigt wird, müssen Sie das Plug-in in der Plug-in-Verwaltung installieren: Über SSH veröffentlichen und dann Jenkins neu starten. Das war's Host, der in den SSH-Herausgebern veröffentlicht werden soll:
und geben Sie die Paketdateiadresse ein und veröffentlichen Sie die Adressinformationen auf dem Remote-Server. Geben Sie die Dekomprimierungs- und andere Shell-Skripte in das Exec-Befehlstextfeld ein:
Weitere Informationen finden Sie im Bild:Nachdem diese Einstellung abgeschlossen ist, können Sie das PHP-Projekt auf Server 134 veröffentlichen:
Archivierung des endgültigen Datei-Release-Pakets:
Post-Build-Schritte hinzugefügt:
填写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)!