N

Nokfa Docs

Current: framework-next.js

ไม่มีชื่อบทความ

Thought for 4 seconds

Git Workflow สำหรับ Monorepo Nokfa

TL;DR

  • ใช้ Trunk‑based flow + Feature Branch สั้น ๆ → ลด conflict, deploy เร็ว
  • Commit ตามสไตล์ Conventional Commits พร้อม scope = path เช่น web, admin-dashboard
  • ทุก PR ต้อง Review ≥ 1 คนตาม CODEOWNERS, ผ่าน CI ก่อน merge
  • ตั้งชื่อ branch: feat/<area>/<short-desc> หรือ fix/<area>/<bug>
  • ใช้คำสั่ง git log -- apps/web เพื่อดูประวัติรายแอป แก้ปัญหา log รก

1. โครงสร้างหลักของ Workflow

  • main → branch เสถียร, deploy production อัตโนมัติ
  • dev → รวมงานระหว่างวัน, สร้าง Preview Deploy
  • feature / bugfix → แตกจาก dev, อายุสั้น ≤ 3 วัน
  • release → (ไม่บังคับ) แท็ก version ตาม Sprint / Milestone

💡 ทีมเราเล็ก (2 dev) → เน้น CI เร็วกว่า branch ยาว ๆ


2. การตั้งชื่อ Branch

ประเภทงาน รูปแบบ ตัวอย่าง หมายเหตุ
Feature feat/<area>/<desc> feat/web/login-form <area> = web, admin, ui-kit, auth-lib ฯลฯ
Bugfix fix/<area>/<issue#> fix/admin/421 ถ้าเชื่อม Issue ID ให้ใช้เลข
Chore chore/<area>/<task> chore/dev/update-eslint งานบ้าน, dependency upgrade
Hotfix hotfix/<prod-bug> hotfix/404-page-error แตกจาก main แล้ว merge กลับทันที

✅ ชื่อ branch สั้น, ไม่ใช้ space, ใช้ขีดกลางเท่านั้น


3. Conventional Commits + Scope

ตัวอย่าง Commit คำอธิบาย Scope ควรใช้
feat(web): เพิ่ม Hero Section ฟีเจอร์ใหม่ในเว็บ web
fix(auth-lib): handle token refresh แก้ bug ใน shared lib auth-lib
chore(ui-kit): upgrade tailwind 3.4 งานบ้านอัปเกรด lib ui-kit
refactor(utils): simplify date helper ปรับโครงสร้างไม่เปลี่ยน behavior utils

กฎย่อย:

  • type = feat|fix|chore|refactor|docs|test|build
  • scope = โฟลเดอร์บนสุด (apps หรือ packages)
  • Message หลัง : = ภาษาไทยหรืออังกฤษได้ แต่ต้องสั้น ≤ 50 ตัวอักษร
# ตัวอย่าง commit จริง
$ git commit -m "feat(admin-dashboard): หน้า Report พื้นฐาน"

4. Pull Request (PR) Policy

  • ฐาน (base branch): dev (ถ้า Hotfix → main)

  • Assignee = คนเขียน, Reviewer = คนอีกคนตาม CODEOWNERS

  • Checklist ก่อนกด Create PR

    • ผ่าน pnpm lint
    • pnpm test ผ่าน
    • อัปเดต docs ถ้ามี breaking change
    • ไม่มีไฟล์ build, .env, log ใน diff
  • CI ต้องผ่านทุกขั้น (lint, test, build)

  • Reviewer กด Approve + Comment แก้ไข (หากพบ)

  • Squash & Merge เป็นค่าเริ่มต้น → Log clean


5. ตัวอย่างไฟล์ CODEOWNERS

# apps
/apps/web/*              @dev-a
/apps/admin-dashboard/*  @dev-b

# shared packages
/packages/ui-kit/*       @dev-a
/packages/auth-lib/*     @dev-b

# config & root
/tsconfig.base.json      @dev-a @dev-b
/turbo.json              @dev-a @dev-b
  • GitHub จะ Auto‑request Review ตามไฟล์ที่แก้
  • แก้ CODEOWNERS ต้อง PR และให้ทุกคนรับรู้

6. คำสั่ง Git ที่ใช้บ่อย

# แสดง log เฉพาะแอป web (ล่าสุด 20 รายการ)
$ git log --oneline -20 -- apps/web

# ค้น commit ที่แตะ shared ui-kit
$ git log --pretty=format:"%h %s" -- packages/ui-kit

# ตรวจ diff ระหว่าง branch dev กับ main (เฉพาะ admin)
$ git diff main..dev -- apps/admin-dashboard

⚡ ช่วยให้ไม่ต้องไถ log ยาว ๆ


7. วิธีทำงานรายวัน (Flow Step‑by‑Step)

  1. Sync main & dev

    $ git checkout dev
    $ git pull origin dev
    
  2. สร้าง Branch ของตัวเอง

    $ git checkout -b feat/web/contact-form
    
  3. เขียนโค้ด + commit เป็นกลุ่ม logical changes

  4. Rebase กับ dev ก่อนเปิด PR (ลด conflict)

    $ git fetch origin
    $ git rebase origin/dev
    
  5. Push Branch

    $ git push -u origin feat/web/contact-form
    
  6. สร้าง PR → Reviewer ตรวจ

  7. Squash & Merge → dev

  8. CI on dev สำเร็จ → Auto Deploy Preview

  9. ทุกวันศุกร์ → Merge dev → main → Production Deploy


8. กลยุทธ์ลด Conflict

  • Feature branch สั้น: จบภายใน 1‑3 วัน
  • ก่อน Commit ใหญ่git pull --rebase
  • หลีกเลี่ยงแก้ไฟล์ config เดียวกันพร้อมกัน (เช่น turbo.json, tsconfig.base.json)
  • แก้ไฟล์ UI shared (ui-kit) → แจ้งอีกคนทันที

9. ตัวอย่าง Release Tag

# สร้าง tag v0.3.0 บน main
$ git checkout main
$ git pull
$ git tag -a v0.3.0 -m "Release 0.3.0 - เพิ่มระบบรายงาน"
$ git push origin v0.3.0

10. ตัวอย่าง .gitignore (ย่อ)

# Node
node_modules/

# Build Outputs
.next/
dist/

# Env
*.env*
.env.local

# Logs
logs/
*.log

ป้องกันไฟล์ใหญ่รั่วลง repo + ลด diff รก


11. สคริปต์ช่วยใน package.json

{
  "scripts": {
    "pre-commit": "pnpm lint",
    "prepare": "husky install"
  },
  "lint-staged": {
    "*.{ts,tsx}": "eslint --fix"
  }
}
  • ติดตั้ง husky + lint‑staged → Prevent commit ที่ไม่ผ่าน lint
  • ทำงานเร็ว, ลด Bug ตั้งแต่ local

12. เช็กลิสต์ Reviewer (Mini‑Guide)

  • โค้ดอ่านง่าย, ใช้ภาษาเดียวกัน (ENG/TH ไม่ปน)
  • ไม่มี query ไร้ index ใน Firestore
  • ไม่มี console.log เหลือค้าง
  • UI สอดคล้องกับ Design System (ui-kit)
  • Docs / Storybook อัปเดต

💬 ใช้ Comment สั้น + Suggestion เมื่อแก้เล็กน้อย


13. Summary Tips

  • Commit ถี่แต่เล็ก → ง่าย rollback
  • ตั้ง Push default เป็น --no-verify ไม่ควร (จะข้าม pre‑commit!)
  • ใช้ git stash -u เก็บงานชั่วคราวก่อน rebase
  • ถ้า conflict หนัก → git rerere เปิดช่วยจำการ merge