ホームページ  >  記事  >  バックエンド開発  >  Jenkins に基づいて PHP プロジェクトの自動テスト、自動パッケージ化、自動デプロイメントを実装します。

Jenkins に基づいて PHP プロジェクトの自動テスト、自動パッケージ化、自動デプロイメントを実装します。

PHP中文网
PHP中文网オリジナル
2016-07-30 13:29:303619ブラウズ

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 ログ ファイルを出力


これらのプラグインは、Jenkins が提供する一部のプラグインであることに注意してください。 PHP プロジェクトですが、必須ではないため、家にいてください。Niao は、最も注目すべきテスト、パッケージ化、公開を自動化する方法のみを説明します。

最初にプロジェクトのディレクトリ構造を指定します:

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 の継続的統合テストのパッケージ化とデプロイメントのための呼び出しファイルです


まず、プロジェクトに必要な 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>

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 プロジェクトを作成し、次を選択します: フリー スタイル ソフトウェア プロジェクトをビルドします:

そして、図に示すようにコード ベースを指定します:

Jenkins に基づいて PHP プロジェクトの自動テスト、自動パッケージ化、自動デプロイメントを実装します。

次に、ビルド ステップを追加します - >Phing ターゲットを呼び出す:

2 つのターゲットを追加します: test、tar は、それぞれビルド内の test 名と tar 名に対応します: [Publish over SSH] の下にホストを追加します: (ここでは、Zhainiao 設定は ssh パスワードなしのログインを使用します) を設定する必要があります。 jenkins から公開する Web サーバーにパスワードなしでログインします

次のように設定します:

Jenkins に基づいて PHP プロジェクトの自動テスト、自動パッケージ化、自動デプロイメントを実装します。

Jenkins に基づいて PHP プロジェクトの自動テスト、自動パッケージ化、自動デプロイメントを実装します。

ここに設定を追加します。ホスト名は 134 です

Jenkins に基づいて PHP プロジェクトの自動テスト、自動パッケージ化、自動デプロイメントを実装します。次に、デプロイメントを設定できますwork:

ビルド ステップを追加するには、下の表で選択します: SSh 経由でファイルを送信するか、コマンドを実行します。 このオプションが表示されない場合は、プラグイン管理にある必要があります。 プラグインをインストールします: SSH 経由で公開し、次に、jenkins を再起動します


次に、表示される SSH Publishers で公開するホストを選択します:


パッケージ ファイルのアドレスを入力し、リモート サーバーのアドレス情報を入力し、Exec コマンドに解凍を入力します。およびその他のシェル スクリプトをテキスト ボックスに入力します:

詳細については画像を参照してください:

Jenkins に基づいて PHP プロジェクトの自動テスト、自動パッケージ化、自動デプロイメントを実装します。 この設定が完了したら、php プロジェクトを 134 サーバーに公開できます:

最終ファイル リリースのアーカイブパッケージ:

Jenkins に基づいて PHP プロジェクトの自動テスト、自動パッケージ化、自動デプロイメントを実装します。

ビルド後のステップを追加:


填写dist/*.tar.gz

Jenkins に基づいて PHP プロジェクトの自動テスト、自動パッケージ化、自動デプロイメントを実装します。

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


来看一下发布结果:

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

Jenkins に基づいて PHP プロジェクトの自動テスト、自動パッケージ化、自動デプロイメントを実装します。

我们来到134上看:

Jenkins に基づいて PHP プロジェクトの自動テスト、自動パッケージ化、自動デプロイメントを実装します。

至此发布完毕.


此时我们查看一下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);

这个是错误的断定:

提交文件后再次构建:

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

Jenkins に基づいて PHP プロジェクトの自動テスト、自動パッケージ化、自動デプロイメントを実装します。

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

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

Jenkins に基づいて PHP プロジェクトの自動テスト、自動パッケージ化、自動デプロイメントを実装します。

ok,到此介绍结束.

总结一下:

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


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


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


声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。