Giới thiệu về pre-commit
Trong thế giới lập trình ngày nay, việc duy trì mã nguồn sạch sẽ và tiêu chuẩn hóa là điều vô cùng quan trọng. Mặc dù chúng ta có tiềm năng lớn, nhưng nhiều khi chúng ta vẫn phải xử lý các công việc thủ công. Với việc kiểm soát mã nguồn, có một công cụ hoặc một người để kiểm tra lỗi tồn tại hoặc có thể xảy ra là cần thiết. Git đã phát triển các hooks để tự động hóa quy trình này, nhưng chúng vẫn cần được viết và duy trì mới hiệu quả. Đó chính là lý do tại sao pre-commit
ra đời!
pre-commit là gì?
pre-commit
là một framework mạnh mẽ giúp bạn quản lý và duy trì các pre-commit hooks cho nhiều ngôn ngữ lập trình. Nó tự động phát hiện những lỗi phổ biến như lỗi cú pháp, vi phạm quy tắc coding style và các dòng debug bị bỏ quên trước khi bạn thực hiện commit vào mã nguồn.
Hướng dẫn này sẽ chỉ cho bạn cách cài đặt, cấu hình và sử dụng pre-commit
trong dự án của bạn.
Tại sao nên sử dụng pre-commit?
pre-commit
tự động chạy các script (hooks) trước khi commit được thực hiện, đảm bảo mã nguồn của bạn tuân theo các tiêu chuẩn mà bạn đã đề ra. Điều này giúp bạn phát hiện lỗi sớm, tiết kiệm thời gian và duy trì chất lượng mã nguồn trong suốt vòng đời của dự án.
Cách cài đặt pre-commit
1. Sử dụng pip
Bạn có thể cài đặt pre-commit thông qua pipx bằng cách chạy các lệnh sau:
bash
sudo apt-get update && sudo apt-get install python3-pip pipx -y
pipx install pre-commit
2. Xác nhận cài đặt
Sau khi cài đặt, hãy kiểm tra phiên bản đã cài bằng lệnh:
bash
pre-commit --version
Cấu hình pre-commit
pre-commit
sử dụng một tập tin cấu hình có tên .pre-commit-config.yaml
được đặt tại thư mục gốc của dự án (lưu ý rằng tên tệp bắt đầu bằng dấu chấm). Tệp này xác định các repository của hooks và những hooks nào cần chạy.
Ví dụ cấu hình
Tạo một tệp có tên .pre-commit-config.yaml
với nội dung sau:
yaml
repos:
- repo: https://github.com/pre-commit/pre-commit-hooks
rev: v4.4.0
hooks:
- id: trailing-whitespace
- id: end-of-file-fixer
- repo: https://github.com/psf/black
rev: 23.1.0
hooks:
- id: black
- repo: https://github.com/pycqa/flake8
rev: 6.0.0
hooks:
- id: flake8
Trong cấu hình này:
- Sử dụng các hooks hữu ích từ pre-commit-hooks để tự động sửa lỗi định dạng.
- Tích hợp Black để định dạng mã Python theo tiêu chuẩn PEP 8.
- Tích hợp Flake8 để kiểm tra linting và phát hiện lỗi cú pháp.
Kích hoạt pre-commit trong dự án
Sau khi bạn đã tạo tệp cấu hình, hãy chạy lệnh sau để cài đặt hooks cho repository của bạn:
bash
pre-commit install
Bây giờ, mỗi lần bạn thực hiện commit code với lệnh git commit
, các hooks sẽ tự động chạy và kiểm tra lỗi trước khi việc commit hoàn tất.
Chạy Hooks thủ công
Ngoài việc chạy tự động khi commit, bạn có thể chạy tất cả các hooks đã cấu hình trên tất cả các tệp trong dự án bất kỳ lúc nào sử dụng lệnh:
bash
pre-commit run --all-files
Lệnh này sẽ kiểm tra và áp dụng tất cả các hooks lên toàn bộ mã nguồn của dự án.
Bỏ qua Hooks khi Commit
Nếu cần thiết, bạn có thể bỏ qua pre-commit hooks khi thực hiện commit bằng cách sử dụng cờ --no-verify
:
bash
git commit -m "Your commit message" --no-verify
Lệnh này sẽ thực hiện việc commit mà không chạy các hooks, hữu ích trong một số tình huống đặc biệt.
Cập nhật Hooks mới
Bạn có thể cập nhật các hooks bằng lệnh:
bash
pre-commit autoupdate
Sau khi cập nhật, hãy kiểm tra lại các thay đổi trong tệp .pre-commit-config.yaml
.
Tùy chỉnh Hooks
Một số hooks cho phép tùy chỉnh các tham số. Ví dụ, bạn có thể cấu hình isort
để hoạt động cùng với Black bằng cách thêm các đối số vào .pre-commit-config.yaml
:
yaml
repos:
- repo: https://github.com/pre-commit/mirrors-isort
rev: v5.10.1
hooks:
- id: isort
args: ['--profile', 'black']
Giải thích:
isort
sẽ sắp xếp các import theo phong cách của Black.- Cờ
--profile black
đảm bảo rằngisort
vàBlack
hoạt động đồng bộ, tránh xung đột về định dạng.
Sử dụng pre-commit trong CI/CD
Để chạy pre-commit
trong quy trình CI/CD, bạn có thể thêm lệnh sau vào quá trình kiểm tra mã nguồn:
bash
pre-commit run --all-files --verbose
Lệnh này sẽ:
- Chạy tất cả các hooks trên toàn bộ tệp.
- Hiển thị chi tiết sự khác biệt nếu có lỗi xảy ra.
Xử lý sự cố
- Hooks không chạy: Kiểm tra xem tệp
pre-commit
đã được cài đặt chưa và tệp.pre-commit-config.yaml
đã nằm trong thư mục gốc của repository chưa. - Lỗi Hook: Xem lại các thông báo lỗi từ hook để biết cách khắc phục.
- Bỏ qua Hook: Nhớ rằng việc bỏ qua hook bằng
--no-verify
có thể dẫn đến việc mã không đạt yêu cầu được commit vào repository.
Kết luận
Hy vọng bài viết này sẽ giúp bạn hiểu rõ hơn về pre-commit
và tận dụng nó hiệu quả trong quy trình phát triển phần mềm. Hãy bắt đầu với thiết lập cơ bản và khám phá những gì phù hợp nhất với dự án của bạn để duy trì chất lượng mã nền tảng tốt nhất.