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 프로젝트를 만들기 시작했습니다. 자유 스타일 소프트웨어 프로젝트 빌드:
를 선택하고 지정합니다. 코드 베이스: 그림과 같이
그런 다음 빌드 단계를 추가하고 Phing 대상 호출:
두 개의 대상 추가: 각각 test, tar 테스트를 사용하면 build.xml의 tar 이름에 따라
tar에 매개변수를 추가합니다.
그런 다음 기본 왼쪽 메뉴: 시스템 관리->시스템 설정-> SSH를 통해 게시 아래에 호스트 추가: (여기서 Zhainiao는 SSH 비밀번호 없는 로그인을 사용하도록 설정되어 있습니다.) 젠킨스에서 비밀번호 없는 로그인으로 설정해야 합니다. 게시할 웹 서버
표시된 대로 설정:
여기에 추가된 호스트 이름은 134
다음으로 배포 작업을 설정할 수 있습니다.
아래 표에서 선택하여 빌드 단계를 추가합니다. SSH를 통해 파일을 보내거나 명령을 실행합니다. 이 옵션이 표시되지 않으면 플러그인 관리에서 플러그인을 설치해야 합니다. SSH를 통해 게시한 다음 Jenkins를 다시 시작하세요.
나타나는 SSH 게시자에 게시할 호스트:
그리고 패키지 파일 주소를 입력하고 원격 서버 주소 정보에 게시하고 Exec 명령 텍스트 상자에 압축 해제 및 기타 셸 스크립트를 입력합니다. 🎜>
자세한 내용은 사진을 참조하세요. 이 설정이 완료되면 PHP 프로젝트를 서버 134에 게시할 수 있습니다.填写dist/*.tar.gz
至此配置完毕后,点击 保存 按钮.我们就可以发布程序到指定服务器134上了.
来看一下发布结果:
回到项目左侧点击:立即构建:可以看到构建进度条,结束后可以在控制台看到输出结果:
我们来到134上看:
至此发布完毕.
此时我们查看一下test/DemoTest.php文件内容:
<?php class DemoTest extends PHPUnit_Framework_TestCase { public function testPass() { $this->assertTrue(true); } public function testFail() { $this->assertFalse(false); } } ?>
我们把 testFail()改成下面:
<?php class DemoTest extends PHPUnit_Framework_TestCase { public function testPass() { $this->assertTrue(true); } public function testFail() { $this->assertTrue(false); } } ?>
$this->assertTrue(false);
这个是错误的断定:
提交文件后再次构建:
我们可以看到本次构建失败,查看输出结果如下:
当把测试用例修改回正确后,执行构建,发布正确。
<?php class DemoTest extends PHPUnit_Framework_TestCase { public function testPass() { $this->assertTrue(true); } public function testFail() { $this->assertFalse(false); } } ?>
ok,到此介绍结束.
总结一下:
jenkins根据项目根目录下的build.xml文件,并根据jenkins中targets的配置,首先自动执行test,当测试通过后,开始执行tar,打包完成后,开始链接远程webserver把程序包上传到远程webserver指定目录下,然后再根据jenkins下的command 执行解压操作,然后就可以根据自己的业务通过shell脚本进行自动处理自动发布的各项操作.
如果在执行test过程中,出现发现测试用例不通过,则就发出错误报告,终止本次构建。
以上就是基于Jenkins 实现php项目的自动化测试、自动打包和自动部署的内容,更多相关内容请关注PHP中文网(www.php.cn)!