面向 PHP Laravel 开发人员的 7 个持续集成工具
使用 PHP Laravel 的信号量演示 CI/CD 管道
在本文中,我们将介绍 7 种可以提高代码质量、缩短开发时间、轻松发现错误并让您作为 PHP 开发人员的生活更轻松的工具。
我们的目标是为我们的代码设置各种测试,而无需 配置或维护任何服务器。快速的反馈周期使我们 能够尽早发现错误,并在错误加剧之前修复它们。
听起来不错?那就开始吧。
代码分析测试
代码分析包括扫描源代码以查找 可能指向更深层次问题的某些结构,例如设计缺陷和不良编码 实践,通常称为代码异味。
一些代码分析工具专注于找出不良模式:参数 过多的函数、臃肿的类或嵌套结构过深。 而另一些工具则检查代码风格:缩进规则、命名规范等。
任何分析都必须遵循一些标准。这些规则 最终是主观的,但基于以往的经验。 这些规则通常可以配置和定制。
PHP 混乱检测器
PHP Mess Detector (phpmd) 可以检查代码异味:笨拙、过于复杂或未使用的代码。它受 PMD 项目启发。
phpmd 附带多个可以独立启用或禁用的规则集。
基本用法:
$ phpmd SOURCE_FILE_OR_DIR REPORT_FORMAT RULESETS
Enter fullscreen mode
Exit fullscreen mode
内置规则包括:
cleancode:强制执行清洁代码库规则。
代码大小:复杂性规则、过长的类等。
有争议的:驼峰规则、全局变量等。
设计:禁止 eval、goto、exit。此外,还要遵循耦合和深度规则。
命名:长短标识符名称、方法命名规则。
unusedcode:死代码和未使用的变量规则。
它看起来像什么?
$ phpmd src text cleancode,codesize,controversial,design,naming,unusedcode
ProvisionerCommand.php:38 The variable $myvar_id is not named in camelCase.
ProvisionerCommand.php:38 Avoid variables with short names like $io . Configured minimum length is 3.
PermissionsComponent.php:53 Avoid unused private methods such as 'checkAccount' .
PagesController.php:349 Avoid excessively long variable names like $view_registration_count . Keep variable name length under 20.
ProvisionersController.php:106 The method delete uses an else expression. Else is never necessary and you can simplify the code to work without else .
Enter fullscreen mode
Exit fullscreen mode
如果你之前从未对你的项目进行过任何代码分析,那么这 很可能会让你抓狂不已。别担心, 耐心等待,等我们理清代码之后,一切就会变得 轻松很多。
我们不需要通过命令行设置规则,而是可以创建一个 可以在源代码管理中检查的 xml 文件:
$ phpmd src text myrules.xml
Enter fullscreen mode
Exit fullscreen mode
<?xml version="1.0"?>
<ruleset name= "Basic"
xmlns= "http://pmd.sf.net/ruleset/1.0.0"
xmlns:xsi= "http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation= "http://pmd.sf.net/ruleset/1.0.0
http://pmd.sf.net/ruleset_xml_schema.xsd"
xsi:noNamespaceSchemaLocation= "
http://pmd.sf.net/ruleset_xml_schema.xsd" >
<description>
First basic ruleset for code analysis...
</description>
<!-- Import all rule sets -->
<rule ref= "rulesets/cleancode.xml" />
<rule ref= "rulesets/codesize.xml" />
<rule ref= "rulesets/controversial.xml" />
<rule ref= "rulesets/design.xml" />
<rule ref= "rulesets/naming.xml" >
<exclude name= "ShortVariable" />
<exclude name= "LongVariable" />
</rule>
</ruleset>
Enter fullscreen mode
Exit fullscreen mode
PHP代码嗅探器
PHP 代码嗅探器 (phpcs) 是一款代码风格检查器。如果您曾经使用过 Linter(jshint、pylint、checkstyle 等),那么您肯定知道它的功能。 phpcs
它可以检查代码缩进、缺失注释、命名规范等。
PHP 代码嗅探器内置了多种流行的 PHP 风格,例如 PEAR、PSR2 和 Zend 等。我们也可以自定义规则,或者 根据现有规则进行混合搭配检查。
典型的调用如下:
$ phpcs FILE_OR_DIR --standard = STANDARD_NAME
Enter fullscreen mode
Exit fullscreen mode
$ phpcs FILE_OR_DIR --report-full --standard = PEAR
FILE: app/Providers/RouteServiceProvider.php
-----------------------------------------------------------------------------------------------------
FOUND 7 ERRORS AFFECTING 7 LINES
-----------------------------------------------------------------------------------------------------
2 | ERROR | [ ] Missing file doc comment
8 | ERROR | [ ] Missing doc comment for class RouteServiceProvider
55 | ERROR | [ x] Object operator not indented correctly; expected 12 spaces but found 13
56 | ERROR | [ x] Object operator not indented correctly; expected 12 spaces but found 13
69 | ERROR | [ x] Object operator not indented correctly; expected 12 spaces but found 13
70 | ERROR | [ x] Object operator not indented correctly; expected 12 spaces but found 13
71 | ERROR | [ x] Object operator not indented correctly; expected 12 spaces but found 13
-----------------------------------------------------------------------------------------------------
PHPCBF CAN FIX THE 5 MARKED SNIFF VIOLATIONS AUTOMATICALLY
-----------------------------------------------------------------------------------------------------
Enter fullscreen mode
Exit fullscreen mode
PHP Code Sniffer 还包括 phpcbf
一个可以自动修复某些问题的程序。
$ phpcbf FILE_OR_DIR --report-full --standard = PEAR
PHPCBF RESULT SUMMARY
-------------------------------------------------------------------
FILE FIXED REMAINING
-------------------------------------------------------------------
app/Providers/RouteServiceProvider.php 5 2
app/Providers/BroadcastServiceProvider.php 3 5
app/Http/Middleware/Authenticate.php 1 4
app/Http/Middleware/RedirectIfAuthenticated.php 3 6
app/Http/Controllers/UserController.php 10 20
app/Http/Controllers/Auth/RegisterController.php 8 9
app/Services/UserService.php 9 22
app/Exceptions/Handler.php 3 7
app/Console/Kernel.php 2 4
-------------------------------------------------------------------
A TOTAL OF 44 ERRORS WERE FIXED IN 9 FILES
-------------------------------------------------------------------
Time: 201ms; Memory: 8MB
Enter fullscreen mode
Exit fullscreen mode
PHP复制粘贴检测器
PHP 复制粘贴检测器 (phpcpd) 的功能正如其名称所示:查找项目中的重复代码。
重复代码通常意味着需要重构,重复的部分应该在共享库或组件中找到新的归宿。重复代码还会迫使开发人员进行“散弹式”修改:一个修改必须重复多次。
基本用法:
$ phpcpd FILE_OR_DIR
Enter fullscreen mode
Exit fullscreen mode
我们可以知道 phpcpd
必须重复多少行才会被视为错误:
$ phpcpd src --min-lines = 40
phpcpd 4.1.0 by Sebastian Bergmann.
Found 1 clones with 45 duplicated lines in 2 files:
- src/Controller/PagesController.php:32-77 ( 45 lines)
src/Controller/Component/PermissionsComponent.php:9-54
1.14% duplicated lines out of 3950 total lines of code.
Average size of duplication is 45 lines, largest clone has 45 of lines
Time: 39 ms, Memory: 6.00MB
Enter fullscreen mode
Exit fullscreen mode
单元测试:PHPUnit
单元测试确保我们的实现能够按照设计完成。单元是最小的可测试代码片段,例如类方法、函数、API 调用。
单元测试也充当着一种动态文档的形式,通过阅读它们的作用,我们可以推断出被测试部分应该如何工作、 它们接受哪些输入以及它们应该提供哪些输出。它们还能验证 代码在重构后是否仍然有效。
在编写新代码时,我们还应该创建测试来 验证其行为。
PHPUnit 是 PHP 最流行的测试框架,用于驱动我们的测试用例。如果您正在寻找入门教程,以下教程或许能帮到您:
测试完成后,我们调用以下方法 phpunit
来获取错误报告:
$ phpunit
PHPUnit 7.5.2 by Sebastian Bergmann and contributors.
..F. 4 / 4 ( 100%)
Time: 1.04 seconds, Memory: 18.00MB
There was 1 failure:
1) Tests\U nit\U serServiceTest::testItCanUpdateUser
Failed asserting that two strings are equal.
--- Expected
+++ Actual
@@ @@
-'updated name'
+'updatedx name'
tests/Unit/UserServiceTest.php:45
FAILURES!
Tests: 4, Assertions: 8, Failures: 1.
Enter fullscreen mode
Exit fullscreen mode
浏览器测试:Laravel Dusk
PHPUnit 最大的问题是无法在前端测试 JavaScript。Dusk 是一款浏览器 自动化 工具,通过在实际浏览器上测试应用程序来克服这一限制。
Dusk 与真正的 Chrome 浏览器交互,以编程方式浏览网站、执行操作、选择元素和进行断言。
为了使用 Dusk 进行测试,我们需要使用 Laravel 的 artisan
工具启动我们的应用程序:
$ php artisan serve &
$ php artisan dusk
PHPUnit 7.5.2 by Sebastian Bergmann and contributors.
F.. 3 / 3 ( 100%)
Time: 11.34 seconds, Memory: 20.00MB
There was 1 failure:
1) Tests\B rowser\L oginTest::testUserCanLogIn
Did not see expected text [ Welcome, Test Account] within element [ body].
Failed asserting that false is true.
vendor/laravel/dusk/src/Concerns/MakesAssertions.php:173
vendor/laravel/dusk/src/Concerns/MakesAssertions.php:144
tests/Browser/LoginTest.php:33
vendor/laravel/dusk/src/Concerns/ProvidesBrowser.php:67
tests/Browser/LoginTest.php:34
FAILURES!
Tests: 3, Assertions: 4, Failures: 1.
Enter fullscreen mode
Exit fullscreen mode
安全测试:Sensiolabs
使用 SensioLabs 安全检查器,我们可以扫描项目依赖项中是否存在已知漏洞。它会扫描 Composer 文件中的依赖项,并 通过漏洞 数据库 进行查找:
$ php security-checker security:check ../composer.lock
Symfony Security Check Report
=============================
No packages have known vulnerabilities.
Enter fullscreen mode
Exit fullscreen mode
持续集成:信号量
持续集成 (CI) 允许尽早测试并经常测试。
我们可以设置一个 持续集成 (CI) 流水线 ,在每次推送时构建应用程序。该 流水线将所有工具绑定在一个工作流中,驱动测试,并可以选择部署应用程序。
Semaphore 是一个基于云的持续集成服务,可以自动扩展以在每个 上运行测试 git push
。您可以从单个配置文件设置多阶段 CI 管道:
将流程拆分成一系列步骤的目的是为了获得更快的反馈。例如,如果我们在代码中犯了一个根本性的错误,那么运行耗时的高级浏览器测试就毫无意义了。
为了避免从头开始设置管道,您可以分叉这个开源项目并将其添加到 Semaphore 上:
使用 PHP Laravel 的 Semaphore 演示 CI/CD 管道
使用 PHP Laravel 的信号量演示 CI/CD 管道
示例应用程序和 CI/CD 管道展示如何在 Semaphore 2.0 上运行 PHP Laravel 项目。
本地项目设置
要在本地设置项目,您的本地环境需要满足常见的 Laravel 开发要求,根据 Laravel 文档, 我们建议使用 Vagrant 和 Homestead 进行设置,因为它是所有主流操作系统都支持的交钥匙解决方案。
本地环境搭建完成后,可以运行以下命令:
cp .env.example .env // and enter your DB details in the newly created .env
composer install
php artisan key:generate
php artisan migrate
Semaphore 上的 CI/CD
从 Web UI 或命令行分叉此存储库并使用它来 创建项目 :
curl https://storage.googleapis.com/sem-cli-releases/get.sh | bash
sem connect <semaphore-organization-link> <semaphore-id> // found in Semaphore Dashboard
cd <project directory>
sem init
之后,推送到存储库以触发工作流程……
有关 CI 配置的逐步说明, 请阅读 Semaphore 博客上的文章 。
祝您搭建愉快!
文章来源:https://dev.to/markoa/7-continuous-integration-tools-for-php-laravel-developers-2m28