适用于 PHP Laravel 开发人员的 7 个持续集成工具 使用 PHP Laravel 的 Semaphore 演示 CI/CD 管道

2025-06-07

面向 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\Unit\UserServiceTest::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\Browser\LoginTest::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 CI 管道

将流程拆分成一系列步骤的目的是为了获得更快的反馈。例如,如果我们在代码中犯了一个根本性的错误,那么运行耗时的高级浏览器测试就毫无意义了。

为了避免从头开始设置管道,您可以分叉这个开源项目并将其添加到 Semaphore 上:

GitHub 徽标 semaphoreci-demos / semaphore-demo-php-laravel

使用 PHP Laravel 的 Semaphore 演示 CI/CD 管道

CI 状态徽章

使用 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
PREV
完美是无用的
NEXT
什么是 REST API - 你需要知道的一切