Cài đặt Local CI đơn giản cho Android team của bạn

Tram Ho

Chào mọi người, hôm rồi mình có hướng dẫn dùng ktlint và detekt để check code style, lint cho android. Hôm nay, tiếp tục seri cải thiện code, mình chia sẻ tiếp về cách chạy các tool trên tự động mỗi khi commit code.

OK, bắt đầu thôi !

Git Hooks

Trước đây, mình vẫn luôn mong muốn tìm một công cụ để giúp loại bỏ những lỗi cơ bản về gitcoding convention trước khi gởi PR, như commit message theo chuẩn công ty, code phải được format chung, unit test phải đc chạy passlocal hay lỗi lint phải được xử lý hết… tìm hoài không thấy nên phải thường nhắc nhở anh em, đôi khi nhắc hoài nó lại dỡ. Bởi lẽ code mọi người đều quản lý trên máy cá nhân, ai làm gì thì sao can thiệp, cứ ngỡ rồi mình sẽ mãi bị ghét vì suốt ngày lãi nhãi, nhắc đi nhắc lại mấy chuyện kiểu “Ừ biết rồi, khổ lắm, nói mãi”. Và rồi…

Như vô tình nhặt được bí kíp, mình tình cờ tìm kiếm cách check từ khoá commit message rule gitgit hooks hiện ra như cứu cánh. Với git hooks, mọi vấn đề của mình đã gần như hoàn toàn được giải quyết.

Git hooks là gì?

Giống như các hệ thống quản lý version khác, Git cũng cung cấp cho chúng ta một cách để can thiệp vào một số quá trình đặc biệt của nó bằng những custom script, đó là hook.

Git hooks trở thành vị cứu tinh như thế nào?

Mình chọn ngay 2 client hook phù hợp cho việc kiểm tra commit message rule, và chạy các tool/task tự động code style, lint, unit test trước khi commit.

  1. pre-commit: Hook này được gọi đầu tiên, thực thi trước khi bạn nhập nội dung cho commit message. Hook này được sử dụng để kiểm tra nội dung các tập tin được commit. Bạn có thể viết script để kiểm tra code convention, run test hoặc chạy static analysis trước khi commit. Nếu script trả về kết quả lớn hơn 0, quá trình commit sẽ bị hủy bỏ.
  2. commit-msg: Nó được gọi sau khi chúng ta đã nhập nội dung message cho commit. Thích hợp trong việc chuẩn hóa commit message. Chỉ có một tham số được nhận trong hook này, đó là tên file chứa commit message. Tương tự, nếu script này trả về kết quả lớn hơn 0 thì quá trình commit sẽ bị hủy.

Cài đặt

Tạo một folder team-props có cấu trúc như sau:

Lưu ý: nếu các bạn thay đổi tên hoặc cấu trúc thư mục, các bước bên dưới các bạn phải tự tìm kiếm và sửa đường dẫn đến các file theo đúng thư mục của bạn.

Tạo script checking commit message (commit-msg.sh)

For Linux:

For Mac:

Bạn có thể thay thế regex theo đúng mong muốn, hiện tại mình đang follow theo rule của project.

Ví dụ, những commit sau sẽ là hợp lệ:

Tạo script chạy tự động các gradle task và Unit test (pre-commit.sh)

Trong đoạn code trên mình kết hợp sử dụng lại các gradle task trong bài dùng ktlint và detekt để kiểm tra code convention và code smell .

Lỗi ở điểm nào thì mình dừng ngay tại thời điểm đó luôn. Commit chỉ thành công khi tất cả các bước trên thành công.

Lưu ý: cú pháp run unit test có dạng như bên dưới, bạn có thể tuỳ chỉnh theo cách của project đang hoạt động.

Copy Hooks to git hooks folder

Bây giờ mình cùng tạo 1 gradle task để copy hooks vào đúng thư mục dự án .git/hooks nào.

Trong đoạn code trên, sẽ có 2 taskcopyGitHooksinstallGitHooks, 2 task sẽ tự động chạy mỗi khi bạn clean code. Do vậy, chỉ khi bạn chạy clean project ít nhất 1 lần thì các (thay đổi) git hooks mới được copy và chạy đúng mong muốn.

Sau khi hoàn thành tạo task này, bạn hãy thêm vào build.gradle level project:

Test kết quả

Bây giờ hay clean project 1 lần, sau đó thử edit và tạo 1 commit. Hãy ăn mừng nếu gradle task được chạy thành công ! (beer)(beer)(beer).

Conclusion

Ok, như vậy là mình đã hướng dẫn các bạn tự tạo một local CI nhỏ, giúp check qua code của anh em trong team về code style, lint, unit test trước khi tạo Pull Request. Hy vọng bài viết mang lại lợi ích cho mọi người.

Tham khảo: Mình sẽ share code chi tiết sớm khi có thời gian.

HAPPY CODING !

Chia sẻ bài viết ngay

Nguồn bài viết : Viblo