-1

Giới thiệu về pre-commit và cách sử dụng hiệu quả

Dù chúng ta có tiềm năng to lớn, nhưng vẫn thường phải xử lý nhiều công việc thủ công. Trong việc kiểm soát mã nguồn, chúng ta cần ai đó hoặc một công cụ để kiểm tra lỗi hiện tại hoặc có thể xảy ra. Git đã phát triển hooks để tự động hóa quá trình kiểm tra này, nhưng những hooks đó vẫn là đoạn mã cần viết và duy trì... Và đây là lúc pre-commit xuất hiện!

pre-commit là gì?

pre-commit là một framework giúp quản lý và duy trì các pre-commit hooks cho nhiều ngôn ngữ lập trình. Nó giúp phát hiện các 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ị quên — trước khi bạn thực hiện commit mã nguồn.

Hướng dẫn này sẽ giúp bạn cài đặt, cấu hình và sử dụng pre-commit trong dự án của mình.

Giới thiệu

pre-commit tự động chạy các script (hooks) trước khi commit được hoàn tất, đảm bảo mã nguồn tuân theo tiêu chuẩn của bạn. Bằng cách phát hiện lỗi sớm, nó giúp tiết kiệm thời gian và duy trì chất lượng mã nguồn trong suốt vòng đời dự án.

Cài đặt

1. Sử dụng pip

Cài đặt pre-commit thông qua pipx:

sudo apt-get update && sudo apt-get install python3-pip3 pipx -y 
pipx install pre-commit

2. Xác nhận cài đặt

Sau khi cài đặt, bạn có thể kiểm tra bằng lệnh:

pre-commit --version

Cấu hình

pre-commit sử dụng một tập tin cấu hình có tên .pre-commit-config.yaml đặt tại thư mục gốc của dự án (lưu ý dấu . ở đầu tên file). File này xác định các repository của hooks và các hooks 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:

repos:
  - repo: https://github.com/pre-commit/pre-commit-hooks
    rev: v4.4.0  # Use the desired revision
    hooks:
      - id: trailing-whitespace
      - id: end-of-file-fixer
  - repo: https://github.com/psf/black
    rev: 23.1.0  # Use the appropriate version for your project
    hooks:
      - id: black
  - repo: https://github.com/pycqa/flake8
    rev: 6.0.0
    hooks:
      - id: flake8

Trong đó:

  • Sử dụng các hooks phổ biến từ pre-commit-hooks để tự động sửa lỗi định dạng.
  • Tích hợp Black để định dạng mã Python theo 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 tạo tệp cấu hình, chạy lệnh sau để cài đặt hooks cho repo của bạn:

pre-commit install

Bây giờ, mỗi lần bạn commit code (git commit), các hooks sẽ tự động chạy và kiểm tra lỗi trước khi commit được thực hiện.

Chạy Hooks thủ công

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 bất kỳ lúc nào bằng lệnh sau:

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ộ tệp trong dự án, giúp bạn đảm bảo mã nguồn tuân thủ quy tắc ngay cả trước khi commit.

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 --no-verify flag:

git commit -m "Your commit message" --no-verify

Lệnh này sẽ thực hiện commit mà không chạy các hooks, hữu ích khi bạn cần bypass các kiểm tra trong một số trường hợp đặc biệt.

Cập nhật Hooks mới

Sử dụng lệnh:

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 bằng cách truyền 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:

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.
  • --profile black flag đảm bảo isort và Black hoạt động đồng bộ, tránh xung đột định dạng.

Sử dụng pre-commit trong CI/CD

Để chạy pre-commit trong pipeline CI/CD, bạn có thể thêm lệnh sau vào quá trình kiểm tra mã nguồn:

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ử lý sự cố

  • Hooks không chạy: Kiểm tra xem tệp pre-commit đã được cài đặt chưa và .pre-commit-config.yaml nằm trong thư mục gốc của kho lưu trữ chưa.
  • Lỗi Hook: Xem lại các thông báo lỗi do hook cung cấp. Thông thường, chúng sẽ chỉ ra cách khắc phục các sự cố như lỗi định dạng hoặc lỗi kiểm tra.
  • Bỏ qua Hook: Hãy nhớ rằng mặc dù bạn có thể bỏ qua hook bằng --no-verify, nhưng làm như vậy có thể khiến mã có vấn đề được xác nhận.

Kết luận

Hy vọng rằng bạn thấy phần này có thông tin hữu ích và có được kỹ năng để nâng cao bản thân, hãy nhớ rằng pre-commit là công cụ mạnh mẽ để duy trì chất lượng mã. Bắt đầu với thiết lập cơ bản và khám phá những gì phù hợp với dự án của bạn dựa trên tài liệu và các nguồn khác.


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí