🚥 どのようにワークフローのコード品質チェックを自動化するには?⚙


目次


  • How to embed code analysis tools in your workflow
  • 📝 In your editor or IDE
  • 🌱 With git hooks
  • Automatisation through Composer
  • 🚉 In your CI/CD pipeline
  • To go further
  • 以前は、PHP用のいくつかの広く採用されているコード品質ツールに焦点を当てましたphpcs , phpmd and php-cs-fixer ) そして、私たちは、それらのツールが我々のコードベースの一部として含まれる必要があるという結論に達しました.

    This article is not particularly focused on PHP, but on controlling the quality of your codebase at every stage of your workflow (editing => versioning => building). Thus, it can be helpful for any kind of project (front or back, Go or JS, ...). You just have to find the right tools for your language.

    For the most impatient of you, I created a template project on gitlab.com to allow you to quickly bootstrap a PHP project with ready-to-use quality tools.


    ワークフローでコード解析ツールを埋め込む方法❓

    Using the CLI to manually check your code is cool (really? 🤔), but not very productive. Let's automatize ⚙ that a bit!

    📝 あなたのエディタまたはIDEで

    Personally, I use Atom and Neovim . 両方の多くの品質ツールのプラグインを提供します.しかし、既存のすべてのエディタ( Emacs , sublimetext , vscode ...)とIDE ( intellij , phpstorm ...)その目的のためのプラグインもあります.
    💡 Atomでのプラグインのインストール
    apm install linter-phpmd \
                linter-phpcs \
                linter-php \
                php-cs-fixer
    
    Installing linter-phpmd to /home/boris/.atom/packages ✓
    Installing linter-phpcs to /home/boris/.atom/packages ✓
    Installing linter-php to /home/boris/.atom/packages ✓
    Installing php-cs-fixer to /home/boris/.atom/packages ✓
    
    次に、これらのプラグインを設定して、関連するツールを見つけますlinter-phpcs./vendor/bin/phpcs ).
    あなたが作曲家とグローバルにインストールするならcomposer global require xx/xx ), 次に、あなただけを置く必要がある~/.config/composer/vendor/bin あなたの$PATH . 原子を設定する必要はありません.
    そして、あなたがPHPCのための標準的なファイル名であなた自身のルールセットを定義するならばphpcs.xml.dist ), ( PHPMD )phpmd.xml.dist ) とPHP cs fixer (.php_cs.dist ) プロジェクトのルートで、自動的にAtomのプラグインでロードされます.
    原子にどのように見えますか

    これらの3つのツールを組み合わせることによってphpcs , phpmd and php-cs-fixer ), 私たちは、現在のファイルのリアルタイム診断、検出された違反のインライン強調表示(エラーがアンダーラインされ、ツールチップがマウスの上に表示され、アイコンが関連する行の余白に表示されます)、およびphp-cs-fixer 自動的に修正のエラーを保存します.
    NVIMにおいても、現在のファイルの下に専用のバッファにエラーが表示されます.

    あなたがVim/Neovimで改善された開発経験のためにBOX解決のために探しているならば、このものすごいものを見てください🚀 プロジェクト

    宇宙線 / 宇宙線


    コミュニティ主導モジュラーVIM分布究極のVIM配置



    Wiki |
    Community |
    Sponsors |

    Gitter Chat |
    中文官网







    SpaceVim コミュニティ駆動モジュラーVIM分布です.コレクションを管理する
    層のプラグインのうち、関連するパッケージを収集してIDEのような機能を提供するのに役立ちます.
    最後のリリースはv1.6.0 , チェックアウトfollowing-HEAD 最後のリリース以来何が起こったのページ.
    詳細については、下記を参照してください.

  • Quick Start Guide : 初心者のための簡単なガイド.

  • Documentation : SpaceVimを使用する完全なドキュメント.

  • Available Layers : SpaceVimに含まれるすべての利用可能な層のリスト.
  • サポートスペース


    このプロジェクトはすべての人々のおかげで存在するcontributed
    我々は、コミュニティからの貢献に感謝しています.

    SpaceVimをサポートする最良の方法は、バグを報告することによって
    コミュニティの支援Gitter Chat またはプルリクエストを送信します.
    詳細についてはdevelopment guidelines .
    あなたがSpacevimを使うならば..
    View on GitHub

    🌱 Gitフックで

    Check the code in the editor is good, but do it before pushing to git is better!

    Git comes with a set of hooks that you can use at many steps of the workflow (pre-commit, pre-push, post-update...). A git hook is just a script that will be executed before or after a particular event. It can be a shell script, a PHP script, a perl script, a python script or whatever scripting language. It can even be a binary. It just needs to be an executable.

    Here is the list of all available hooks:


    我々は、に焦点を当てるpre-commit フック.
    アイデアは、品質のツールを実行することですpre-commit フックは、あなたの変更があなたのプロジェクトのために定義した標準に準拠していることを確認します.したがって、誤ったコードをコミットしないことを確認します.
    ⚠️ 編集前に知っておくべきことpre-commit いくつかのツールがエラーコード(0と異なる)を返すなら、それはコミットプロセスを止めるでしょう.そして、それはまさに我々が望むものです.
    📜 私が個人的に使用する2つの規則は以下の通りです.
  • The pre-commit フックはユーザがコミットしたファイルをチェックして(修正してください).あなたがチェックする必要がある場合/全体のCodeBaseを修正し、手動でそれを行い、マージ地獄を避けるためにあなたのチームに通知します.
  • フックによって修正されたファイルはGitインデックスに自動的に再追加されるべきではありません.これはユーザが本当にコミットされていることについてのコントロールをさせるために行われるべきです.
  • ファイルを開始するには.git/hooks/pre-commit.sample で変更する必要があります.git/hooks/pre-commit .
    次に、gitインデックスに追加されたファイルの一覧を取得し、必要なファイル拡張子をフィルタリングする必要があります.
    #!/bin/bash
    
    STAGED_FILES_CMD=`git diff --cached --name-only --diff-filter=ACMR HEAD | grep \\\\.php`
    
    ここではbash ためには、ほぼすべてのコンピュータ上で実行できるポータブルスクリプトを持っている.しかし、どんなスクリプト言語も受け入れられます.
    さて、あなたの品質ツールのそれぞれに、段階的なファイルのリストを提供することによって呼び出しの下に追加し、エラーの場合に1で終了してコミットを中断します.
    #!/bin/bash
    
    echo "Running pre-commit hook"
    
    PROJECT=`php -r "echo dirname(dirname(dirname(realpath('$0'))));"`
    STAGED_FILES_CMD=`git diff --cached --name-only --diff-filter=ACMR HEAD | grep \\\\.php`
    
    echo "Checking PHP Lint..."
    for FILE in $STAGED_FILES_CMD
    do
        php -l -d display_errors=0 $PROJECT/$FILE
        if [ $? != 0 ]
        then
            echo "Fix the error before(s) commit."
            exit 1
        fi
        FILES="$FILES $PROJECT/$FILE"
    done
    
    echo "Running PHP Code Beautifier and Fixer (phpcbf)..."
    phpcbf --standard=phpcs.xml.dist $STAGED_FILES_CMD --colors --report=summary
    if [ $? != 0 ]
    then
        echo "Fix the error before(s) commit."
        exit 1
    fi
    
    echo "Running PHP-CS-FIXER..."
    
    PHP_CS_STATUS=0
    
    for FILE in $STAGED_FILES_CMD
    do
        php-cs-fixer fix $FILE
        PHP_CS_STATUS=$(( $PHP_CS_STATUS + $? ))
    done
    
    if [ $PHP_CS_STATUS != 0 ]
    then
        echo "Fix the error(s) before commit."
    fi
    
    echo "End of pre-commit hook"
    
    exit $PHP_CS_STATUS
    
    ここでは走るphpcs and phpmd , 彼らはGitフックで使用するように高度にカスタマイズする必要があるので.それ以外の場合、エラー/警告の多くが発生し、コミットをブロックします.あなたとあなたの同僚が準備ができているときだけそれをしてください.あなたが早すぎるならば、それはあなたとあなたのチームを落胆させるかもしれません.
    あなたがそれの準備ができているならばphpmd file 良いスタートでしょう.
    PHP linterも使用します.php -l ) すべてのPHPファイルが構文的に正しいことを確認します.
    我々はまた、呼び出しを追加することができますphpunit , しかし、コミットが速くなければならないので、数秒以上持続してはいけません.
    gitフックの限界はあなたの想像力の一つです.私は私のプロジェクトのファイルの多くをlintに使用します:JSON、XML、swagger spec、markdown、シェルスクリプト.

  • swagger-cli : リントあなたのswaggerファイル!
  • 作曲家Validate :あなたの作曲家をリントしてください.JSON!

  • dockerlint : あなたのDockerfileをリント!

  • shellcheck : シェルスクリプトをリント!
  • そして、あなたのファイルのためのリンターがないならば、あなた自身のライナーを書いてください!例えば、私はI 18 Nリソースファイルがすべての言語で均一であることを確認する単純なスクリプトを作成しました.
    最後に、Gitインデックスとコミットにファイルを追加することでフックをテストする準備が整いました.The pre-commit スクリプトが自動的にトリガされます.そうでない場合は、実行ビットをチェックします.そうでない場合:
    chmod +x .git/hooks/pre-commit
    

    ⚙ 作曲家による自動化

    In , I introduced three tools and how to automatize their installation within Composer. This way, each developer can install them just by running composer install at the project's root.

    But how to ensure that each of them will use them each time they modify a single line of code? Fortunately, Composer comes also with a set of hooks allowing you to automatize some of your tasks.

    Thus, instead of manually creating a pre-commit script for every developers, the idea is to put the script somewhere in your codebase (e.g. in /contrib ), and to ask Composer to install it automatically when installing or updating your project.

    Just add a new section in your composer.json :

    {
        "scripts": {
            "post-update-cmd": [
                "mv .git/hooks/pre-commit .git/hooks/pre-commit.bak",
                "cp contrib/pre-commit .git/hooks/pre-commit",
                "chmod a+x .git/hooks/pre-commit"
            ],
            "post-install-cmd": [
                "mv .git/hooks/pre-commit .git/hooks/pre-commit.bak",
                "cp contrib/pre-commit .git/hooks/pre-commit",
                "chmod a+x .git/hooks/pre-commit"
            ]
        }
    }
    

    That way, anytime a dev will be running composer install or composer update , the script will be installed.

    🚉 あなたのCI / CDパイプラインで

    The goal of the quality control in the CI/CD pipeline is twofold:

    • first check the whole codebase against your project's quality rules, and break the build in case of any error (like a unit test would do)
    • (optionnally) perform a deeper analysis and publish a detailed build report that can be consulted by the devs at any time

    Of course, it doesn't make sense to use a fixer ( phpcbf , php-cs-fixer ) in the pipeline as it would modify the code after it has been pulled from the repo, and we don't want the code to be modified without any control of the devs.

    ⚠ Checking your whole codebase will have a significant impact on the build time. It can vary from few seconds to few minutes, depending on your code size.
    For your information, on a 40 000 LoC project, it takes approximately 5 seconds for phpcs and 40 seconds for phpmd , with a relatively «light» analysis.

    Regarding the deeper analysis, we'll use phpcs and phpmd to raise errors/warnings and to publish the results, either in «human-readable» reports for devs (e.g. on a static website) with a notification in Slack, or in a standard format ( junit , checkstyle , other...) to be integrated in a statistics tool like Sonar or PhpMetrics .

    Here is a simple example of a gitlab-ci's pipeline allowing to build, test & check a PHP app and to publish the reports to gitlab pages:

    image: composer
    
    stages:
      - test
      - deploy
    
    test:app:
      stage: test
      script:
        - apk add --no-cache $PHPIZE_DEPS
        - pecl install xdebug-2.6.0
        - docker-php-ext-enable xdebug
        - composer install
        - ./vendor/bin/phpunit --testsuite=unit --coverage-text --colors=never --log-junit reports/phpunit-junit.log --testdox-html reports/phpunit-report.html
        - ./vendor/bin/phpcs -sw --standard=phpcs_squiz.xml.dist src --basepath=. --report=full --report-file=reports/phpcs-report.log || echo "ok"
        - ./vendor/bin/phpmd src html phpmd.xml.dist --reportfile reports/phpmd-report.html --ignore-violations-on-exit
      artifacts:
        paths:
          - reports
        expire_in: 30m
    
    pages:
      stage: deploy
      dependencies:
        - test:app
      script:
        - mkdir public
        - cp ci/pages/index.html public/
        - cp reports/* public/
      artifacts:
        paths:
          - public
      only:
        - master
    
    You can find all you need to bootstrap a PHP project with quality tools and git+gitlab integration on my template project .
    あなたの情報のためにGitlab Pages あなたのプロジェクトのために、あなたはちょうど名前をつけなければなりませんpages あなたのパイプラインで.あなたが入れたすべて/public 次のURLでプロジェクトの静的サイトでアクセスできます.https://<group-or-username>.pages.forge.orange-labs.fr/<project-name> .
    そして、我々が話している時からGitlab Pages , APIドキュメント(phpdoc、javadoc、その他)をホストするために使用することもできますし、コードのカバレッジをテストしたり、Swagger ドキュメント.

    ⏭ さらに進む

    There are many frameworks to manage the git hooks. Some of them are language specific (Node.js, PHP, Go, ...), and some others are language agnostic. They support many types of stacks. Just pick yours!

    If you're interested in this topic, you can have a look at the Python pre-commit これは非常に強力です(しかし、Windows上でバギー…).しかし、簡単な構成ファイルを使用すると、前のコミットの段階のフックの全体の束を切り替えることができますので、それは一見を取る価値がある.また、独自のプラグインを書くことによって、その容量を拡張することができます.
    PHPでは、DigitalPulp plugins .
    🌟 私はあなたが必要な場合は詳細を与えるために喜んでいるので、尋ねることを躊躇しないでください!