Module Odoo là code — mà code thì phải có quản lý phiên bản. Nhưng versioning một module Odoo có vài điểm riêng: bỏ gì ra khỏi Git, đặt repo ở đâu cho khớp addons_path, đánh số version thế nào. Sau khi đã biết đọc code core, bài này dựng một quy trình Git gọn gàng cho chính module demo quan_ca_phe của loạt bài.

Repo đặt ở đâu?

Một repo Git thường bọc thư mục module (hoặc một thư mục chứa nhiều module). Điều quan trọng: thư mục chứa module đó phải nằm trong addons_path. Cấu trúc điển hình:

Repo Git cho một module Odoo: bên trái là file gitignore bắt buộc bỏ qua thư mục pycache và các file pyc, thư mục .venv, file log, thư mục .idea và .vscode, cùng các file bí mật như đuôi conf và file .env; bên phải là cấu trúc repo với thư mục quan_ca_phe chứa init.py, manifest.py, các thư mục models views security data static, và file gitignore đặt ở gốc repo; phía dưới là quy ước version manifest dạng 19.0 chấm 1.1.0 trong đó 19.0 là phiên bản Odoo còn 1.1.0 là major minor patch của module

Hình 1: Bên trái là .gitignore chuẩn cho module Odoo; bên phải là cấu trúc repo. Chú ý .gitignore nằm ở gốc repo (ngoài thư mục module), và quy ước version manifest dạng 19.0.1.1.0 — hai số đầu là phiên bản Odoo, ba số sau là major.minor.patch của chính module.

.gitignore: thứ quan trọng nhất

Có hai loại file tuyệt đối không được commit:

  1. File sinh ra tự động — __pycache__/, *.pyc. Chúng thay đổi liên tục, làm rác lịch sử và gây xung đột vô nghĩa.
  2. File bí mật — *.conf (odoo.conf chứa mật khẩu CSDL), .env. Commit nhầm là rò rỉ mật khẩu vào lịch sử Git, rất khó xoá sạch.
# Python
__pycache__/
*.py[cod]
.venv/

# Odoo
*.log
.idea/
.vscode/

# Bí mật — KHÔNG commit
*.conf
.env

Phiên làm việc Git thật

Tôi dựng một repo thật cho module quan_ca_phe, commit, rồi kiểm chứng .gitignore hoạt động:

Phiên làm việc Git thật với module quan_ca_phe: chạy git add tất cả rồi commit với thông điệp feat khởi tạo module; git status short cho kết quả trống nghĩa là sạch và file pyc đã bị bỏ qua; git ls-files liệt kê 12 file được theo dõi gồm gitignore, manifest, hai model res_partner và the_thanh_vien, file bảo mật csv, các file view xml; git check-ignore xác nhận file pyc trong pycache bị ignore; sau đó tạo nhánh feature nang-version, git diff cho thấy dòng version đổi từ 19.0.1.0.0 thành 19.0.1.1.0; cuối cùng git log oneline graph hiện hai commit b36a359 nâng version và 44383b8 khởi tạo module

Hình 2: Phiên Git thật. git status --short trả về trống — repo sạch, các file .pyc không hề xuất hiện. git ls-files cho thấy đúng 12 file mã nguồn được theo dõi. git check-ignore xác nhận file .pyc trong __pycache__ bị bỏ qua. Phần dưới là một nhánh tính năng: đổi version trong manifest, git diff hiện đúng một dòng thêm/bớt, rồi commit.

Quy ước thông điệp commit

Dùng tiền tố ngắn gọn (kiểu Conventional Commits) để lịch sử dễ đọc:

  • feat: — tính năng mới (thêm model, view, chức năng).
  • fix: — sửa lỗi.
  • chore: — việc lặt vặt (nâng version, cập nhật dữ liệu mẫu).
  • refactor: — dọn code, không đổi hành vi.
git commit -m "feat: thêm trường điểm tích luỹ cho thẻ thành viên"
git commit -m "fix: sửa domain lọc thẻ hết hạn"
git commit -m "chore: nâng version module lên 19.0.1.1.0"

Nhánh tính năng

Đừng code thẳng trên main/master. Mỗi tính năng một nhánh, xong thì gộp (merge/PR):

git checkout -b feature/diem-tich-luy   # tạo nhánh mới
# ... sửa code, test trên Odoo ...
git commit -am "feat: điểm tích luỹ"
git checkout master && git merge feature/diem-tich-luy

Lợi ích với Odoo: bạn thử nghiệm một tính năng (có thể phải -u module nhiều lần), nếu hỏng thì bỏ cả nhánh mà không đụng tới bản đang chạy.

Nâng version khi nào?

Đổi version trong __manifest__.py khi bạn muốn Odoo nâng cấp module lúc chạy -u. Odoo so version trong manifest với version đã cài trong bảng ir_module_module; khác nhau thì nó chạy các script nâng cấp/migration. Vì vậy mỗi thay đổi schema (thêm trường, đổi model) nên đi kèm bump version.

Nhớ ba ý

  1. Repo bọc thư mục module; .gitignore là thứ quan trọng nhất — bỏ __pycache__/*.pyc (rác) và *.conf/.env (bí mật, tránh rò rỉ mật khẩu).
  2. Version manifest 19.0.x.y.z: hai số đầu là phiên bản Odoo; đổi version để Odoo chạy nâng cấp module khi -u.
  3. Làm việc trên nhánh tính năng, commit theo tiền tố feat/fix/chore — dễ thử nghiệm và bỏ đi mà không hại bản đang chạy.

Đã có repo gọn gàng, giờ ta cần cách dựng khung một module mới thật nhanh. Phần sau dùng lệnh odoo scaffold — tạo sẵn toàn bộ khung thư mục module chỉ bằng một dòng.