Jenkins를 기반으로 PHP 프로젝트의 자동 테스트, 자동 패키징 및 자동 배포 구현

PHP中文网
풀어 주다: 2016-07-30 13:29:30
원래의
3671명이 탐색했습니다.

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를 사용하여 PHP 프로젝트 구성을 자동화합니다.

CheckStyle: PHP CodeSniffer를 사용하여 코드 스타일을 확인합니다. PHP 코드가 미리 설정된 코딩 표준 집합을 위반하는지 확인하는 데 사용되는 PEAR 패키지에는 ZEND 및 PEAR의 코딩 스타일 규칙이 내장되어 있습니다.

Clover PHP: phpunit을 사용한 단위 테스트용 도구로, 다음에서 사용할 수 있습니다. xdebug 확장 프로그램은 코드 적용 범위 보고서를 생성하는 데 사용되며 자동화된 테스트를 위해 phing과 통합될 수 있으며 Selenium과 통합되어 대규모 자동화 통합 테스트를 완료할 수도 있습니다

DRY: PHPCPD(php 복사 붙여넣기 사용) 감지기)를 사용하여 프로젝트의 문제를 발견합니다. 중복 코드

HTML Publisher: phpunit 코드 커버리지 보고서를 게시하는 데 사용됩니다.

JDepend: PHP를 사용하여 PHP의 정적 코드를 분석하여 코드를 확인합니다. 프로젝트의 크기와 복잡성

플롯: phploc을 사용하여 PHP 프로젝트의 크기를 계산합니다.

PMD: phpmd(php mess dector)를 사용합니다. )를 기준으로 결과를 분석하기 위해 프로젝트가 pdependent의 특정 지표를 초과하면 경고 메시지가 표시됩니다.

위반: 코드 심각도에 따라 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
로그인 후 복사

참고:

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" />
로그인 후 복사

패키징 시 포함된 파일 및 폴더: 파일 및 폴더를 제외하려면 제외를 사용할 수도 있습니다:

<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 대상 호출:

두 개의 대상 추가: 각각 test, tar 테스트를 사용하면 build.xml의 tar 이름에 따라

Jenkins를 기반으로 PHP 프로젝트의 자동 테스트, 자동 패키징 및 자동 배포 구현

tar에 매개변수를 추가합니다.

Jenkins를 기반으로 PHP 프로젝트의 자동 테스트, 자동 패키징 및 자동 배포 구현

그런 다음 기본 왼쪽 메뉴: 시스템 관리->시스템 설정-> SSH를 통해 게시 아래에 호스트 추가: (여기서 Zhainiao는 SSH 비밀번호 없는 로그인을 사용하도록 설정되어 있습니다.) 젠킨스에서 비밀번호 없는 로그인으로 설정해야 합니다. 게시할 웹 서버

표시된 대로 설정:

Jenkins를 기반으로 PHP 프로젝트의 자동 테스트, 자동 패키징 및 자동 배포 구현


여기에 추가된 호스트 이름은 134


다음으로 배포 작업을 설정할 수 있습니다.

아래 표에서 선택하여 빌드 단계를 추가합니다. SSH를 통해 파일을 보내거나 명령을 실행합니다. 이 옵션이 표시되지 않으면 플러그인 관리에서 플러그인을 설치해야 합니다. SSH를 통해 게시한 다음 Jenkins를 다시 시작하세요.

Jenkins를 기반으로 PHP 프로젝트의 자동 테스트, 자동 패키징 및 자동 배포 구현

나타나는 SSH 게시자에 게시할 호스트:

그리고 패키지 파일 주소를 입력하고 원격 서버 주소 정보에 게시하고 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)!


원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿