ข้ามไปที่เนื้อหา

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 — กั้นก่อน merge
  • workflow_dispatch — ทริกเกอร์ด้วยมือจากแท็บ Actions

เพื่อให้ CI ประหยัด แต่ละ workflow มีตัวกรอง paths: เพื่อให้ PR ที่มีแต่เอกสาร ไม่เผาเวลา lint/test และ concurrency: ยกเลิกการรันที่กำลังดำเนินอยู่ เมื่อมี commit ใหม่ลงบน ref เดียวกัน

Lint workflow

- uses: actions/setup-python@v5
  with:
    python-version: '3.10'
- uses: pre-commit/action@v3.0.1

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

services:
  postgres:
    image: postgres:15
container:
  image: odoo:18.0

Job รัน ภายใน Docker image ทางการ odoo:18.0 พร้อม service container Postgres 15 ข้าง ๆ เนื่องจาก Q6 (Mass Import) อ่าน XLSX ผ่าน openpyxl ซึ่งไม่ได้มาในตัว image ของ Odoo จึงมีขั้นตอน pip install พิเศษเพียงขั้นเดียวที่เพิ่มมันก่อนการทดสอบรัน:

- run: pip install --break-system-packages --quiet openpyxl

การเลือกโมดูล

แทนที่จะระบุทั้ง 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 var MODULES_TO_TEST
  • Makefile — ตัวแปร 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):

![Lint](https://github.com/jakapolr/hemms-demo/actions/workflows/lint.yml/badge.svg)
![Tests](https://github.com/jakapolr/hemms-demo/actions/workflows/tests.yml/badge.svg)
![Docs](https://github.com/jakapolr/hemms-demo/actions/workflows/docs.yml/badge.svg)

การเพิ่มความแข็งแกร่งในอนาคต

รายการเหล่านี้ถูกเลื่อนออกจาก 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