Maison développement back-end tutoriel php 基于Jenkins 实现php项目的自动化测试、自动打包和自动部署

基于Jenkins 实现php项目的自动化测试、自动打包和自动部署

Jul 30, 2016 pm 01:29 PM

基于Jenkins 搭建持续集成环境 的基础上,继续介绍Jenkins结合php项目实现自动化测试和自动部署。废话不再多说,直接上干活。

宅鸟所使用的server为Ubuntu

   要实现在jenkins中实现php的自动化测试,首先需要Jenkins服务器上安装php测试框架,php的测试框架很多,在这里我们选择 PHPUnit Framework.

PHPUnit的安装很简单:

sudo apt-get install phpunit
Copier après la connexion

如果出现如下错误:

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
Copier après la connexion

可以通过下面方法安装:

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
Copier après la connexion

安装后执行phpunit --version 返回版本信息。表示安装成功。

root@dop-kvm-2:# phpunit --version
PHPUnit 3.7.28 by Sebastian Bergmann.
Copier après la connexion

下面我们开始给Jenkins一些插件:

Subversion/Git:用于集成项目版本控制软件,根据需要选择(在上篇博文已安装使用)

Phing/Ant:使用Phing或Apache Ant 对PHP项目做自动化构建

CheckStyle:使用PHP CodeSniffer进行代码风格检查的工具。用于检查PHP代码是否有违反一组预先设置好的编码标准的一个PEAR包,内置了ZEND,PEAR的编码风格规则

Clover PHP:使用phpunit进行单元测试的工具,可以被xdebug扩展用来生成代码覆盖率报告,并且可以与phing集成来自动测试,还可以和Selenium整合来完成大型自动化集成测试

DRY:使用PHPCPD(php copy paste detector)来发现项目中的重复代码

HTML Publisher:用来发布phpunit代码覆盖率报告

JDepend:使用PHP Depend分析php中静态代码,用来检查项目中的代码规模和复杂程度

Plot:使用phploc来统计php项目规模大小的工具,可以统计php的项目代码行数

PMD:使用phpmd(php mess dector),对基于pdepend的结果进行分析,一旦项目超过了pdepend中各具体指标的规定,将发出警告信息.

Violations:按照代码缺陷严重性集中显示pwd静态代码分析的结果

xUnit:使用JUnit的格式来输出phpunit的日志文件


注意这些插件是jenkins为php项目所提供的一些插件,但并不是必须的,所以宅鸟只把最值得大家关注的怎么自动化测试、打包和发布来给大家讲解。

先给出项目的目录结构:

root@dop-kvm-2:/home/jenkins/api# tree
.
├── aa.php
├── build.xml
├── create.php
└── test
    ├── DemoTest.php
    └── FunctionTest.php
1 directory, 5 files
Copier après la connexion

注意:

aa.php、create.php是项目的程序文件

test目录下的DemoTest.php和FunxtionTest.php是项目的测试文件

build.xml是jenkins持续集成测试打包部署的调用文件


首先给出项目需要的build.xml文件:

<?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>
Copier après la connexion

阅读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" />
Copier après la connexion

打包时包括的文件和文件夹:这里还可以使用exclude排除文件和文件夹:

<fileset id="api.tar.gz" dir=".">
           <include name="test/**"/>
           <include name="*.php"/>
           <include name="*.xml"/>
       </fileset>
Copier après la connexion

测试文件所在地址:

<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>
Copier après la connexion

了解这些后,我们开始在jenkins中新建autoTestTarAndPublish项目,选择:构建一个自由风格的软件项目:

并且指定好代码库:如图所示

855.jpg

然后再 增加构建步骤->Invoke Phing targets:

增加两个 target: test,tar 分别与build.xml中的test,tar名称相对应

856.jpg

给tar加上参数:

857.jpg

然后在左边主菜单: 系统管理->系统设置->Publish over SSH 下添加主机:(这里宅鸟设置使用ssh免密码登陆)需要设置成从jenkins到要发布的web服务器的无密码登陆

如图设置:

858.jpg


这里添加设置的主机名是:134


接下来我们就可以设置部署工作了:

在添加构建步骤下来表中选择:Send files or execute commands over SSh,如果该选项未出现需要在插件管理中安装插件:Publish Over SSH 然后重启jenkins即可.

859.jpg

然后在出现的SSH Publishers中选择要发布的主机:

并填写打包文件地址,发布到远程server地址信息,并在Exec command文本框中填写解压等shell脚本:

详情见图:

860.jpg

此项设置完毕后,就可以发布php项目到134服务器上了:


最后文件发布包的存档工作:


增加构建后操作步骤:

861.jpg

填写dist/*.tar.gz

862.jpg

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


来看一下发布结果:

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

863.jpg

我们来到134上看:

864.jpg

至此发布完毕.


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

<?php
class DemoTest extends PHPUnit_Framework_TestCase {
  public function testPass() {
      $this->assertTrue(true);
    }
  public function testFail() {
      $this->assertFalse(false);
    }
}
?>
Copier après la connexion
Copier après la connexion

我们把 testFail()改成下面:

<?php
class DemoTest extends PHPUnit_Framework_TestCase {
  public function testPass() {
      $this->assertTrue(true);
    }
  public function testFail() {
     $this->assertTrue(false);
    }
}
?>
Copier après la connexion

$this->assertTrue(false);

这个是错误的断定:

提交文件后再次构建:

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

865.jpg

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

<?php
class DemoTest extends PHPUnit_Framework_TestCase {
  public function testPass() {
      $this->assertTrue(true);
    }
  public function testFail() {
      $this->assertFalse(false);
    }
}
?>
Copier après la connexion
Copier après la connexion

866.jpg

ok,到此介绍结束.

总结一下:

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


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


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


Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Article chaud

R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
1 Il y a quelques mois By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Meilleurs paramètres graphiques
1 Il y a quelques mois By 尊渡假赌尊渡假赌尊渡假赌
Will R.E.P.O. Vous avez un jeu croisé?
1 Il y a quelques mois By 尊渡假赌尊渡假赌尊渡假赌

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Comment utiliser des scripts Python pour implémenter des tests automatisés dans un environnement Linux Comment utiliser des scripts Python pour implémenter des tests automatisés dans un environnement Linux Oct 05, 2023 am 11:51 AM

Comment utiliser des scripts Python pour implémenter des tests automatisés dans l'environnement Linux Avec le développement rapide du développement logiciel, les tests automatisés jouent un rôle essentiel pour garantir la qualité des logiciels et améliorer l'efficacité du développement. En tant que langage de programmation simple et facile à utiliser, Python présente une forte portabilité et efficacité de développement et est largement utilisé dans les tests automatisés. Cet article explique comment utiliser Python pour écrire des scripts de test automatisés dans un environnement Linux et fournit des exemples de code spécifiques. Préparation de l'environnement pour l'automatisation dans un environnement Linux

Écrire des échantillons de tests automatisés en utilisant le langage Go Écrire des échantillons de tests automatisés en utilisant le langage Go Jun 03, 2023 pm 07:31 PM

Avec le développement rapide du développement logiciel, les tests automatisés jouent un rôle de plus en plus important dans le processus de développement. Par rapport aux tests manuels, les tests automatisés peuvent améliorer l’efficacité et la précision des tests et réduire les délais et les coûts de livraison. Par conséquent, maîtriser les tests automatisés devient très nécessaire. Le langage Go est un langage de programmation moderne et efficace. En raison de son modèle de concurrence unique, de son mécanisme de gestion de la mémoire et de récupération de place, il a été largement utilisé dans les applications Web, la programmation réseau, la concurrence à grande échelle, les systèmes distribués et d'autres domaines. En termes de tests automatisés,

Comment gérer les tests automatisés et le déploiement de services dans une architecture de microservices ? Comment gérer les tests automatisés et le déploiement de services dans une architecture de microservices ? May 17, 2023 am 08:10 AM

Avec le développement rapide de la technologie Internet, l’architecture des microservices est de plus en plus utilisée. L'utilisation d'une architecture de microservices peut efficacement éviter la complexité et le couplage de code d'une seule application, et améliorer l'évolutivité et la maintenabilité de l'application. Cependant, contrairement aux applications monolithiques, dans une architecture de microservices, il existe un grand nombre de services, et chaque service nécessite des tests et un déploiement automatisés pour garantir la qualité et la fiabilité du service. Cet article explique comment gérer les tests automatisés et le déploiement de services dans une architecture de microservices. 1. Tests automatisés dans l'architecture des microservices Les tests automatisés sont la garantie

Tests d'intégration du go-zero : réalisation de tests non destructifs automatisés des services API Tests d'intégration du go-zero : réalisation de tests non destructifs automatisés des services API Jun 22, 2023 pm 02:06 PM

À mesure que les sociétés Internet continuent de croître, le développement de logiciels devient de plus en plus complexe et les tests deviennent de plus en plus importants. Afin de garantir l'exactitude et la stabilité du programme, différents types de tests doivent être effectués. Parmi eux, les tests automatisés sont un moyen très important. Ils peuvent améliorer l'efficacité du travail de test, réduire les taux d'erreur et permettre l'exécution répétée de scénarios de test pour détecter les problèmes à un stade précoce. Cependant, dans le processus opérationnel réel, nous rencontrerons également divers problèmes. , tels que des problèmes tels que la sélection des outils de test, la rédaction de cas de test et la configuration de l'environnement de test. aller à zéro

Scripts Java et Linux : comment automatiser les tests Scripts Java et Linux : comment automatiser les tests Oct 05, 2023 am 08:50 AM

Fonctionnement des scripts Java et Linux : méthodes et exemples de mise en œuvre de tests automatisés Introduction : Dans le processus de développement logiciel, les tests automatisés peuvent considérablement améliorer l'efficacité et la qualité des tests. En utilisant le langage Java et les scripts Linux, nous pouvons écrire de puissants scripts de test automatisés pour exécuter automatiquement des cas de test, générer des rapports de test et d'autres fonctions. Cet article explique comment utiliser les scripts Java et Linux pour implémenter des tests automatisés et fournit des exemples de code spécifiques. 1. Tests automatisés Java : Java est un

Explication détaillée de la documentation de l'API et des tests automatisés dans le framework Gin Explication détaillée de la documentation de l'API et des tests automatisés dans le framework Gin Jun 22, 2023 pm 09:43 PM

Gin est un framework Web écrit en Golang. Il présente les avantages d'efficacité, de légèreté, de flexibilité, de performances relativement élevées et de facilité d'utilisation. Dans le développement du framework Gin, la documentation API et les tests automatisés sont très importants. Cet article examinera en profondeur la documentation de l'API et les tests automatisés dans le framework Gin. 1. Documentation API La documentation API est utilisée pour enregistrer les informations détaillées de toutes les interfaces API afin de faciliter leur utilisation et leur compréhension par les autres développeurs. Le framework Gin fournit une variété d'outils de documentation API, notamment Swagger, GoSwa

L'importance de l'inférence du type de valeur de retour du langage Go pour les tests automatisés L'importance de l'inférence du type de valeur de retour du langage Go pour les tests automatisés Apr 29, 2024 pm 04:45 PM

L'inférence du type de retour du langage Go simplifie les tests automatisés : elle permet au compilateur de déduire le type de retour en fonction de l'implémentation de la fonction, éliminant ainsi le besoin de déclarations explicites. Améliorez la simplicité et la lisibilité des fonctions de test et simplifiez la vérification des sorties des fonctions. Des cas pratiques montrent comment utiliser l'inférence de type pour écrire des tests automatisés afin de vérifier que le résultat de la fonction répond aux attentes.

Guide de configuration et d'utilisation UniApp pour les tests automatisés et la surveillance des performances Guide de configuration et d'utilisation UniApp pour les tests automatisés et la surveillance des performances Jul 04, 2023 pm 12:28 PM

UniApp est un framework de développement d'applications multiplateformes capable de développer rapidement des applications qui s'adaptent simultanément à plusieurs plates-formes. Au cours du processus de développement, nous devons souvent effectuer des tests automatisés et une surveillance des performances pour garantir la qualité et les performances de l'application. Cet article explique comment configurer et utiliser les outils de test automatisé et de surveillance des performances dans UniApp. 1. Guide de configuration et d'utilisation des tests automatisés. Téléchargez et installez les outils nécessaires. Les tests automatisés d'UniApp s'appuient sur Node.js et WebdriverIO. Premièrement, nous devons

See all articles