Tự động check coding standard trong Laravel trước khi commit lên GIT

Tự động check coding standard trong Laravel trước khi commit lên GIT

Trong PHP, chúng ta có những tiêu chuẩn code (Coding Standard) như PSR-12, Laravel, Symfony... nhằm mục đích đưa các cú pháp trong code về một chuẩn. Cùng với đó, cũng có các công cụ hỗ trợ chúng ta kiểm tra trước hoặc thậm chí là sửa lỗi theo các chuẩn trên như PHP CodeSniffer (PHPCS), PHP Code Standard Fixer (PHP CS Fixer), hay gần đây có Laravel Pint (thực ra là một phiên bản wrap lại của PHP Code Standard Fixer) của chính chủ nhà Laravel.

Hiện nay, hầu hết các project open-source hoặc nội bộ, các maintainer sẽ thiết lập sẵn các công cụ CI/CD như GitHub Actions, Gitlab CI... dựa vào các công cụ trên để kiểm tra trước các Pull Request (PR) để đảm bảo chất lượng code trước khi tiến hành review. Tuy nhiên, dùng CI/CD thì sẽ có thể phát sinh chi phí, ví dụ như GitHub Actions, hiện đang giới hạn số phút đối với các project private, vì vậy việc kiểm tra trước ở local cũng là một cách hay để tiết kiệm chi phí. Trong bài viết này, mình sẽ chia sẻ các bạn cách kiểm tra coding standard trước khi commit code trong git.

GIT Hooks

Mặc định, ở trong GIT sẽ cấp cho chúng ta một số hook được viết bằng shell script, mỗi hook sẽ được gọi ở các thời điểm khác nhau trong quá trình làm việc với GIT. Các bạn sẽ dễ dàng tìm thấy các file mẫu mà GIT cung cấp tại .git/hooks trong thư mục GIT repository.

File pre-commit.sample sẽ là cái mà chúng ta quan tâm, đây là hook được gọi đến khi chúng ta tiến hành commit. Thử tạo một file .git/hooks/pre-commit với nội dung như sau:

#!/bin/sh

echo "Hello Everyone!"

Bạn cần phải cấp quyền thực thi cho file đấy, để làm được việc đó, ta dùng câu lệnh sau:

chmod +x .git/hooks/pre-commit

Giờ chúng ta sẽ thử commit, các bạn sẽ thấy file đấy sẽ được thực thi:

Chúng ta sẽ viết script kiểm tra coding standard vào đây.

Laravel Pint

Như đã được đề cập ở trên, Laravel Pint là một công cụ giúp cho chúng ta sửa lỗi coding standard được bọc lại từ công cụ PHP CS Fixer. Chúng ta sẽ dùng công cụ này, nhưng không sử dụng chức năng tự động fix, mà chỉ dùng để hiển thị lỗi thôi.

Mặc định các bản Laravel mới đã có sẵn công cụ này rồi, nếu chưa các bạn có thể cài đặt chúng bằng composer:

composer require laravel/pint --dev

Sau khi cài, chúng ta sẽ chạy câu lệnh sau để kiểm tra lỗi bằng việc thêm option --test:

./vendor/bin/pint --test

Kết quả trả về sau sau:

Để hiển thị chi tiết hơn về lỗi và fix nó như thế nào, bạn dùng option -v:

./vendor/bin/pint --test -v

Ở đây, nếu bạn muốn Pint tự động sửa lỗi, các bạn chỉ cần bỏ đi option --test thôi, nhưng chúng ta không làm điều đó trong bài viết này. Quay lại file .git/hooks/pre-commit, chúng ta sẽ để nguyên câu lệnh trên vào file đó như sau:

#!/bin/sh

echo "Running Laravel Pint...\n"

php ./vendor/bin/pint --test -v

Khi ta commit. Nếu có lỗi từ Pint, chắc chắn việc commit sẽ được dừng lại:

Nếu như các bạn muốn đổi preset, có thể thêm option --preset={name} vào câu lệnh ./vendor/bin/pint, hoặc tạo file pint.json với nội dung như sau:

{
  "preset": "{name}"
}

Laravel Pint hiện đang hỗ trợ preset sau: laravel (mặc định), symfony, psr12.

Như vậy, bạn đã có thể kiểm tra coding standard ở local trước khi commit. Cách này có một nhược điểm đó là bạn cần phải thiết lập lần đầu khi clone project về, vì hiện tại các GIT repository không hỗ trợ lưu trữ các hooks.

Giới thiệu package botble/git-commit-checker

Các bạn có thể thực hiện việc một các thủ công, hoặc có thể tham khảo package botble/git-commit-checker do team Botble phát triển và đang được tin dùng trong cộng đồng Laravel Việt Nam nếu bạn đang làm việc với project Laravel.

Hiện tại git-commit-checker phiên bản 2 sử dụng Laravel Pint và đang yêu cầu Laravel 9 và PHP 8 trở lên.

Tiến hành cài đặt package:

composer require botble/git-commit-checker --dev

Dùng câu lệnh sau để cài đặt GIT Hook:

php artisan git-commit-checker:install

Trong quá trình cài đặt GIT Hook, nó sẽ hỏi các bạn về việc có tạo file preset.json  không và cấu hình theo chuẩn nào, bạn cứ chọn theo hướng dẫn hoặc từ chối.

Sau khi cài đặt sau, hook sẽ được hiệu lực ngay mà bạn không cần phải làm gì thêm. Hoặc là bạn có thể thực hiện việc kiểm tra thủ công bằng câu lệnh sau:

php artisan git-commit-checker:pre-commit-hook

Lệnh này sẽ chỉ kiểm tra những file *.php có sự thay đổi trong commit của bạn, chứ không check toàn bộ file trong project.

Để vô hiệu hóa checker tạm thời, bạn có thể publish file config của package ra để tùy chỉnh hoặc thêm key sau vào .env:

GIT_COMMIT_CHECKER_ENABLED=false

Kết luận

Bằng cách trên, các bạn có thể kiểm tra trước được code của mình ở local trước khi commit, để tiết kiệm được tối đa thời gian chạy CI/CD nếu có hoặc thời gian review của các maintainer. Việc gắn vào GIT Hook như vậy cũng giúp bạn hạn chế được việc quên kiểm tra bằng lệnh check trước khi commit. Nếu bạn có cách nào khác hay hơn đừng ngại chia sẻ với mình bằng cách bình luận bên dưới nhé.

Đừng quên theo dõi blog để nhận các thông báo về bài viết sớm nhất từ Laravel Việt Nam Blog.