CI/CD — GitHub Actions¶
Q7 เชื่อมการตรวจอัตโนมัติสองอย่างที่รันบนทุก push ไปยัง main และทุก pull request:
| Workflow | ไฟล์ | ทำอะไร | runtime ทั่วไป |
|---|---|---|---|
| Lint | .github/workflows/lint.yml | รัน toolchain pre-commit เต็มรูปแบบ — ruff (จัดรูปแบบ + lint), pylint_odoo, oca-checks-odoo-module, สุขอนามัย XML/YAML | ~1 นาที |
| Tests | .github/workflows/tests.yml | เปิด Postgres 15 + Odoo 18, ติดตั้งทุก addon roots_hemms_* ด้วย --test-enable, ล้มเหลวเมื่อมี test/install error ใด ๆ | ~5-8 นาที |
workflow ที่สาม คือ Docs (docs.yml) ถูกส่งมอบก่อน Q7 อยู่แล้วและ build ไซต์ MkDocs บนทุก push ที่แตะต้อง docs/ หรือ mkdocs.yml
ทริกเกอร์¶
ทั้งสอง workflow ของ Q7 ทริกเกอร์เมื่อ:
pushไปยังmain— กั้นก่อน build เอกสารpull_requestต่อmain— กั้นก่อน mergeworkflow_dispatch— ทริกเกอร์ด้วยมือจากแท็บ Actions
เพื่อให้ CI ประหยัด แต่ละ workflow มีตัวกรอง paths: เพื่อให้ PR ที่มีแต่เอกสาร ไม่เผาเวลา lint/test และ concurrency: ยกเลิกการรันที่กำลังดำเนินอยู่ เมื่อมี commit ใหม่ลงบน ref เดียวกัน
Lint workflow¶
pre-commit/action แคชสภาพแวดล้อมของ hook ตาม hash ของ .pre-commit-config.yaml ดังนั้นการรันครั้งต่อ ๆ ไปใช้เวลาเป็นวินาที — การรันครั้งแรก ใช้เวลา ~1 นาทีเพื่อดึง ruff, pylint_odoo และ oca-checks
การกำหนดค่าสะท้อน OCA/maintenance 18.0 โดยมีสามการเบี่ยงเบนโดย ตั้งใจ ที่บันทึกไว้ด้านบนสุดของ .pre-commit-config.yaml:
- ข้าม
oca-gen-addon-readme(ยังไม่มีไดเรกทอรีreadme/) - ข้าม
oca-fix-manifest-website(HEMMS ใช้https://roots.techไม่ใช่ URL ของรีโพ OCA) - comment
prettier-xml+eslintออก (เปิดใช้อีกครั้งเมื่อมี JS asset bundle ส่งมอบ)
Tests workflow¶
Job รัน ภายใน Docker image ทางการ odoo:18.0 พร้อม service container Postgres 15 ข้าง ๆ เนื่องจาก Q6 (Mass Import) อ่าน XLSX ผ่าน openpyxl ซึ่งไม่ได้มาในตัว image ของ Odoo จึงมีขั้นตอน pip install พิเศษเพียงขั้นเดียวที่เพิ่มมันก่อนการทดสอบรัน:
การเลือกโมดูล¶
แทนที่จะระบุทั้ง 10 โมดูล roots_hemms_* CI ติดตั้งสี่ leaf module ซึ่งดึงทุกโมดูลอื่นมาแบบ transitive ผ่าน depends:
| Leaf | ดึง (แบบ transitive) |
|---|---|
roots_hemms_mass_import | Q6 + roots_hemms_ha_report + roots_hemms_pm + roots_hemms_asset_master |
roots_hemms_spare_parts | Q2 + roots_hemms_pm + roots_hemms_asset_master + roots_hemms_criticality |
roots_hemms_signature | Q4 + roots_hemms_asset_inspection + roots_hemms_service_contracts |
roots_hemms_ha_report | Q5 + roots_hemms_signature + roots_hemms_pm + roots_hemms_asset_inspection + ... |
ค่าคงที่นี้อยู่ใน สองที่ที่สอดคล้องกัน:
.github/workflows/tests.yml— env varMODULES_TO_TESTMakefile— ตัวแปรHEMMS_MODULES
หากคุณเพิ่มโมดูล HEMMS ที่อยู่ยอดสุดของต้นไม้ ให้อัปเดตทั้งสอง
การตรวจจับความล้มเหลวของการทดสอบ¶
exit code ของ Odoo คือ 0 แม้เมื่อการทดสอบล้มเหลว — มันสะท้อนเพียง ว่าคำสั่ง CLI เองพังหรือไม่ ขั้นตอน verify จะ scrape odoo.log หาลายเซ็นสามแบบ:
grep -E "^(FAIL|ERROR): " odoo.log # unittest runner per-test
grep -E "odoo\.tests\.runner.*(FAIL|ERROR)" odoo.log # framework
! grep -q "Modules loaded\." # install crashed
หากตรงกันแบบใด ๆ → job ล้มเหลว และ odoo.log เต็มจะถูกอัปโหลดเป็น artifact (odoo-log, เก็บไว้ 7 วัน) เพื่อให้คุณ debug ได้โดยไม่ต้อง รัน CI ใหม่
ความเทียบเท่า CI บนเครื่อง¶
จำลอง CI บนแล็ปท็อปของคุณ:
# Lint — same hooks GH runs
make lint
# Tests — runs inside the running private sandbox container
make up-private # if not already up
make test # installs into a throw-away DB
# Both together
make ci
หากคุณไม่มี Docker stack บนเครื่อง ให้ติดตั้ง lint venv ด้วยมือ:
python3.10 -m venv .venv-lint
.venv-lint/bin/pip install ruff==0.6.8 pylint-odoo==9.1.3
.venv-lint/bin/ruff check addons/roots/
.venv-lint/bin/pylint --rcfile=.pylintrc addons/roots/
Status badge¶
เพิ่มลงใน README ของคุณ (แทนที่ OWNER/REPO):



การเพิ่มความแข็งแกร่งในอนาคต¶
รายการเหล่านี้ถูกเลื่อนออกจาก Q7 โดยตั้งใจ — จับไว้ในการปรับแก้แผน ครั้งถัดไปหากมันกลายเป็นเรื่องสำคัญ:
- Matrix เวอร์ชัน Postgres (15 + 16) — เมื่อเรามีลูกค้า ที่รัน 16
- รายงาน code coverage — การรวม
coverage.py+ การอัปโหลด Codecov - Demo data smoke test — ติดตั้งด้วย
--with-demoและตรวจสอบ จำนวนระเบียนที่คาดหวัง (ตอนนี้ demo โหลดแต่ไม่ได้ถูกตรวจสอบ) - Two-DB matrix (
hemms_demoกับhemms_private) — Q5 มี ความแตกต่างเชิงพฤติกรรมที่บันทึกไว้ระหว่างฐานข้อมูลแบบ fresh-install และ แบบที่ติดตั้ง Q2 ที่ยังไม่ได้ทดสอบใน CI