PHP代码质量保障

团队人员水平参差不齐,编码风格百花齐放,需要一套基础的方案,统一基本的代码风格,确保基础的代码质量。
方案只能做基础的代码检查,并不能替代code review
无论如何其实还是用Jenkins+git webhook靠谱点

代码质量基础要求

  • 编码风格遵循PSR2
  • 绝对不可出现语法错误
  • 良好的封装,减少重复代码和耦合
  • 保持扩展性的同时具有具有良好的性能

方案原理

  • GIT 本地 commit hook 机制,在提交的时执行任务
  • 不依赖持续集成

自检流程变更

graph LR
本地--git commit-->GrumPHP
GrumPHP{GrumPHP}--成功-->测试环境
GrumPHP--失败-->本地
测试环境--发布流程-->正式环境

基础的知识储备

  • [x] PHP
  • [x] Composer
  • [x] Git
  • [x] PSR2 标准

环境依赖

依赖名称Composer备注
GrumPHPcomposer require phpro/grumphp-shim --dev此工具在集成项目运行,Git Commit Hook工具,Commit时执行Task
PHPCPDcomposer global require sebastian/phpcpdPHP重复代码检测
PHPCScomposer global require squizlabs/php_codesnifferPHP代码风格检测
PHPSTANcomposer global require phpstan/phpstanPHP代码静态分析
PHPMDcomposer global require phpmd/phpmdPHP代码质量检测

配置

  1. 项目根目录创建YAML格式配置文件 grumphp.yml

    grumphp:
      tasks:
        phpcs:
          standard: ['PSR2']
          triggered_by: ['php','PHP']
    #    phpmd:
    #      whitelist_patterns: []
    #      exclude: []
    #      report_format: text
    #      ruleset: ['cleancode', 'codesize', 'naming','design','unusedcode']
    #      triggered_by: ['php']
        phpstan:
          autoload_file: ~
          configuration: ~
          level: 5
          force_patterns: []
          ignore_patterns: []
          triggered_by: ['php']
          memory_limit: "-1"
        phpcpd:
          directory: ['.']
          exclude: ['vendor','runtime']
          names_exclude: []
          regexps_exclude: []
          fuzzy: false
          min_lines: 5
          min_tokens: 70
          triggered_by: ['php']
  2. 几个Task 说明

    • PHPCS

      • standard检测标准 PSR2
      • triggered_by 触发文件
    • PHPMD

    • PHPSTANT

      • level 检测等级0~9
      • autoload_file 自动加载文件路径(常量、加载器等)
    • PHPCPD
  3. PHPSTROM 配置

结果演示

  • 'git commit -m "test"'
  • 质量校验失败

    • 失败
    • 失败

其他扩展

  • Task加入单元测试
  • GitLab + Jenkins + 代码检测

资料

  1. GrumPHP配置
  2. 书籍 《代码整洁之道》
  3. 代码整洁之道PHP
  4. YAML配置说明