Implementieren Sie automatisierte Tests, automatische Paketierung und automatische Bereitstellung von PHP-Projekten auf Basis von Jenkins

PHP中文网
Freigeben: 2016-07-30 13:29:30
Original
3671 Leute haben es durchsucht

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
Nach dem Login kopieren

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
Nach dem Login kopieren

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
Nach dem Login kopieren

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.
Nach dem Login kopieren

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
Nach dem Login kopieren

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>
Nach dem Login kopieren

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" />
Nach dem Login kopieren

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>
Nach dem Login kopieren

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>
Nach dem Login kopieren

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

Implementieren Sie automatisierte Tests, automatische Paketierung und automatische Bereitstellung von PHP-Projekten auf Basis von Jenkins

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

Implementieren Sie automatisierte Tests, automatische Paketierung und automatische Bereitstellung von PHP-Projekten auf Basis von Jenkins

Parameter zu tar hinzufügen:

Implementieren Sie automatisierte Tests, automatische Paketierung und automatische Bereitstellung von PHP-Projekten auf Basis von Jenkins

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:

Implementieren Sie automatisierte Tests, automatische Paketierung und automatische Bereitstellung von PHP-Projekten auf Basis von Jenkins


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: Implementieren Sie automatisierte Tests, automatische Paketierung und automatische Bereitstellung von PHP-Projekten auf Basis von Jenkins

Weitere Informationen finden Sie im Bild:

Nachdem diese Einstellung abgeschlossen ist, können Sie das PHP-Projekt auf Server 134 veröffentlichen:

Implementieren Sie automatisierte Tests, automatische Paketierung und automatische Bereitstellung von PHP-Projekten auf Basis von Jenkins

Archivierung des endgültigen Datei-Release-Pakets:


Post-Build-Schritte hinzugefügt:


填写dist/*.tar.gz

Implementieren Sie automatisierte Tests, automatische Paketierung und automatische Bereitstellung von PHP-Projekten auf Basis von Jenkins

至此配置完毕后,点击 保存 按钮.我们就可以发布程序到指定服务器134上了.


来看一下发布结果:

回到项目左侧点击:立即构建:可以看到构建进度条,结束后可以在控制台看到输出结果:

Implementieren Sie automatisierte Tests, automatische Paketierung und automatische Bereitstellung von PHP-Projekten auf Basis von Jenkins

我们来到134上看:

Implementieren Sie automatisierte Tests, automatische Paketierung und automatische Bereitstellung von PHP-Projekten auf Basis von Jenkins

至此发布完毕.


此时我们查看一下test/DemoTest.php文件内容:

<?php
class DemoTest extends PHPUnit_Framework_TestCase {
  public function testPass() {
      $this->assertTrue(true);
    }
  public function testFail() {
      $this->assertFalse(false);
    }
}
?>
Nach dem Login kopieren
Nach dem Login kopieren

我们把 testFail()改成下面:

<?php
class DemoTest extends PHPUnit_Framework_TestCase {
  public function testPass() {
      $this->assertTrue(true);
    }
  public function testFail() {
     $this->assertTrue(false);
    }
}
?>
Nach dem Login kopieren

$this->assertTrue(false);

这个是错误的断定:

提交文件后再次构建:

我们可以看到本次构建失败,查看输出结果如下:

Implementieren Sie automatisierte Tests, automatische Paketierung und automatische Bereitstellung von PHP-Projekten auf Basis von Jenkins

当把测试用例修改回正确后,执行构建,发布正确。

<?php
class DemoTest extends PHPUnit_Framework_TestCase {
  public function testPass() {
      $this->assertTrue(true);
    }
  public function testFail() {
      $this->assertFalse(false);
    }
}
?>
Nach dem Login kopieren
Nach dem Login kopieren

Implementieren Sie automatisierte Tests, automatische Paketierung und automatische Bereitstellung von PHP-Projekten auf Basis von Jenkins

ok,到此介绍结束.

总结一下:

jenkins根据项目根目录下的build.xml文件,并根据jenkins中targets的配置,首先自动执行test,当测试通过后,开始执行tar,打包完成后,开始链接远程webserver把程序包上传到远程webserver指定目录下,然后再根据jenkins下的command 执行解压操作,然后就可以根据自己的业务通过shell脚本进行自动处理自动发布的各项操作.


如果在执行test过程中,出现发现测试用例不通过,则就发出错误报告,终止本次构建。


以上就是基于Jenkins 实现php项目的自动化测试、自动打包和自动部署的内容,更多相关内容请关注PHP中文网(www.php.cn)!


Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage