CODEOWNERS Generator: จัดเส้นทาง Code Review ให้ทีมที่ถูกต้อง
สร้างไฟล์ CODEOWNERS ของ GitHub จากทีม พาธ และ glob patterns พร้อมตรวจไวยากรณ์และ ownership coverage — เครื่องมือสร้างฟรีในเบราว์เซอร์
Table of Contents
ถ้าคุณเคยเจอสถานการณ์ที่ Pull Request เปลี่ยนแค่ไฟล์ CSS แต่ถูกส่งไปขอ review จากทีม backend ที่ไม่เกี่ยวข้อง หรือ PR ที่แตะไฟล์ infrastructure สำคัญแต่ใครก็ได้ในทีม approve ผ่านไปแบบไม่มีใครรู้ตัว ปัญหาเหล่านี้แก้ได้ด้วยไฟล์เดียวชื่อ CODEOWNERS ซึ่งเป็นกลไกมาตรฐานของ GitHub ที่ระบุว่าพาธไหนใน repo มีเจ้าของเป็นใคร เมื่อมีคนเปิด PR ที่แตะไฟล์ในพาธนั้น GitHub จะขอ review จากทีมที่ถูกต้องโดยอัตโนมัติ
ปัญหาคือไวยากรณ์ของ CODEOWNERS มีลูกเล่นหลายอย่าง — ต้องใช้ glob pattern จับคู่พาธ มีกฎ "last match wins" ที่ทำให้ลำดับของกฎมีผลกับผลลัพธ์ และการวางไฟล์ผิดตำแหน่งก็ทำให้ทั้งไฟล์ไม่ทำงาน ถ้าเขียนมือเปล่าแล้วพิมพ์ผิดแม้บรรทัดเดียว GitHub ก็จะเงียบ ๆ ข้ามบรรทัดนั้นไปทั้งหมดโดยไม่มีการแจ้งเตือน
CODEOWNERS Generator ช่วยให้เรื่องนี้ง่ายขึ้นมาก คุณเพิ่มกฎเป็นคู่ของ pattern กับ owners เครื่องมือจะตรวจไวยากรณ์ให้พร้อมคำแนะนำ แสดงมุมมอง ownership coverage ว่าพาธไหนมีเจ้าของแล้ว แล้วสร้างไฟล์ที่คัดลอกไปวางใน repo ได้ทันที ทำงานในเบราว์เซอร์ 100% ฟรี ไม่ต้องสมัคร และข้อมูลของทีมคุณไม่ถูกส่งไปเซิร์ฟเวอร์ใด ๆ
ทำไมต้องใช้ CODEOWNERS Generator?
- จัดเส้นทาง review ให้ถูกคนตั้งแต่ต้น — GitHub จะ request review จากทีมเจ้าของพาธอัตโนมัติ ไม่ต้องเดาว่าควรแท็กใครในแต่ละ PR
- ลด bus factor ของทีม — เมื่อทุกพาธมีเจ้าของชัดเจน ความรู้เรื่องโค้ดแต่ละส่วนไม่ได้ขึ้นอยู่กับคนเดียว และ review ไม่ติดค้างเวลาคนสำคัญลางาน
- ตรวจไวยากรณ์พร้อมคำแนะนำทันที — เช่น pattern ของโฟลเดอร์ควรลงท้ายด้วย / เครื่องมือจะเตือนให้แก้ก่อนที่กฎจะเงียบหายใน GitHub จริง
- เห็น ownership coverage ในภาพเดียว — มุมมองสรุปบอกว่าพาธไหนมีเจ้าของแล้ว พาธไหนยังโหว่ ช่วยให้คุณปิดช่องว่างก่อนนำไฟล์ไปใช้
- จัดลำดับกฎตามหลัก last match wins ได้ถูกต้อง — วางกฎกว้างไว้ก่อนและกฎเฉพาะเจาะจงไว้ทีหลัง ได้ผลการจับคู่ตรงตามที่ตั้งใจ
- ทำงานในเบราว์เซอร์ 100% — ไม่ต้องสมัคร ไม่ต้องติดตั้งอะไร ชื่อทีมและพาธของคุณไม่ออกจากเครื่อง
ฟีเจอร์หลัก
| ฟีเจอร์ | ทำอะไร |
|---|---|
| เพิ่มกฎแบบ pattern + owners | ใส่ glob pattern แล้วระบุ owner เช่น * ให้ @org/team-lead, /docs/ ให้ @org/docs-team หรือ *.tsx ให้ทั้งทีม frontend และ design |
| ตรวจสอบไวยากรณ์ | เตือน pattern ที่ผิดรูปแบบพร้อมคำแนะนำ เช่น โฟลเดอร์ควรลงท้ายด้วย / |
| มุมมอง ownership coverage | แสดงว่าพาธไหนมีเจ้าของแล้ว พาธไหนยังไม่มี พร้อมแถบความคืบหน้า |
| กฎ last match wins | จัดลำดับกฎได้และเห็นผลการจับคู่ตามหลักการเดียวกับ GitHub |
| สร้างไฟล์ในเบราว์เซอร์ | คัดลอกไฟล์ที่พร้อมใช้ไปวางใต้ .github/ ของ repo ได้ทันที |
รายละเอียดที่ควรรู้:
- ผลลัพธ์เป็น plain text ตาม spec ของ GitHub เป๊ะ ๆ นำไป commit ต่อได้ทันทีโดยไม่ต้องแก้อะไร
- การตรวจไวยากรณ์ทำงานแบบเรียลไทม์ระหว่างพิมพ์ แก้จุดที่ผิดได้ก่อนคัดลอกออกไปใช้จริง
- ทุกอย่างประมวลผลในเครื่องคุณ ปลอดภัยแม้กับ repo ภายในองค์กรที่ระบุชื่อทีมไม่ได้
วิธีสร้างไฟล์ CODEOWNERS
- เปิด CODEOWNERS Generator ในเบราว์เซอร์ แล้วเริ่มเพิ่มกฎแรกด้วยการใส่ pattern เช่น *
- ระบุ owners ของกฎนั้น เช่น @org/team-lead ใส่หลาย owner ต่อหนึ่งกฎได้ เช่น *.tsx ให้ทั้งทีม frontend และทีม design
- เพิ่มกฎถัดไปตามโครงสร้าง repo ของคุณ เช่น /docs/ ให้ทีมเอกสาร โดยเรียงจากกฎกว้างไปกฎเฉพาะเจาะจง เพราะกฎบรรทัดสุดท้ายที่ match จะชนะ
- ดูผลการตรวจไวยากรณ์และมุมมอง ownership coverage แก้คำเตือน เช่น โฟลเดอร์ที่ลืม slash ท้าย และเติม owner ให้พาธที่ยังโหว่จนครบ
- คัดลอกไฟล์ที่สร้างเสร็จ วางไว้ใต้ .github/CODEOWNERS (หรือ root / docs/ ก็ได้) แล้ว commit และ push ขึ้น GitHub
การจับคู่ pattern ของ CODEOWNERS ทำงานอย่างไร
แต่ละบรรทัดในไฟล์ประกอบด้วยสองส่วน: pattern ที่จับคู่พาธไฟล์ด้วย glob ตามด้วย owner หนึ่งตัวหรือหลายตัวคั่นด้วยช่องว่าง ตัวอย่างไฟล์สั้น ๆ:
* @org/team-lead /docs/ @org/docs-team *.tsx @org/frontend @org/design
สิ่งที่ควรเข้าใจเกี่ยวกับการจับคู่:
- สแลชต่อท้ายคือโฟลเดอร์ — /docs/ หมายถึงทุกไฟล์ในโฟลเดอร์ docs ถ้าลืม slash ท้าย ความหมายจะเปลี่ยนไป นี่คือเหตุผลที่เครื่องมือเตือนเรื่องนี้เป็นพิเศษ
- wildcard * จับคู่ในระดับชื่อไฟล์ — *.tsx จับทุกไฟล์นามสกุล .tsx ส่วน * เดี่ยว ๆ จับทุกไฟล์ในทั้ง repo นั่นเอง
- กฎบรรทัดสุดท้ายชนะ (last match wins) — ถ้าไฟล์เดียว match หลาย pattern GitHub จะใช้ owner จากบรรทัดสุดท้ายที่ match เท่านั้น เช่น * ให้ทีม lead แต่บรรทัดถัดมา /infra/ ให้ทีม SRE ไฟล์ใน infra ก็จะถูกขอ review เฉพาะทีม SRE
เรื่องตำแหน่งวางไฟล์: GitHub มองหา CODEOWNERS ได้ใน 3 ที่ คือ .github/CODEOWNERS, CODEOWNERS ที่ root ของ repo และ docs/CODEOWNERS — ใช้ได้ตำแหน่งเดียวเท่านั้น แนะนำ .github/ เพราะเป็นที่ที่คนมองหามากที่สุด
สุดท้าย ไฟล์จะบังคับใช้จริงเมื่อเปิด Require review from Code Owners ใน branch protection ของ branch หลัก มิฉะนั้น GitHub แค่แท็กคน review ให้เท่านั้น ไม่ได้บล็อกการ merge
กรณีใช้งานจริง
แยก review frontend กับ backend
ทีม fullstack ที่ codebase ผสมกันมักเจอ PR ที่ถูกส่งให้คนผิดรีวิว ด้วย CODEOWNERS คุณกำหนด *.tsx และ /src/components/ ให้ทีม frontend พร้อมทีม design ร่วมด้วย ส่วน /api/ และไฟล์ backend ให้ทีม backend PR ที่แตะสองฝั่งพร้อมกันก็จะได้ review จากทั้งสองทีมทันที ไม่ต้องคอยแท็กด้วยมือ
ปกป้องพาธ infrastructure
โฟลเดอร์อย่าง /infra/ หรือ .github/workflows/ ควรมีคนรีวิวที่เข้าใจผลกระทบเสมอ กำหนด pattern เหล่านี้ให้ทีม SRE หรือ platform แล้วเปิด required review การเปลี่ยน pipeline หรือ config ที่กระทบ production จะไม่ผ่านไปได้โดยไม่มีตาคนเฝ้า
ความต้องการด้าน compliance
องค์กรที่ต้องผ่าน audit มักต้องพิสูจน์ว่าโค้ดที่แตะข้อมูลสำคัญถูกตรวจโดยบุคคลที่กำหนด CODEOWNERS ทำให้เงื่อนไขนี้เป็น machine-enforced: พาธที่จัดการข้อมูลส่วนบุคคลถูกผูกกับทีม security หรือ data governance และ GitHub จะบล็อก merge จนกว่า owner จะ approve ช่วยลดงานเก็บหลักฐานตอน audit ไปในตัว
รับทีมใหม่เข้ามา
เวลาปรับโครงสร้างทีมหรือแบ่งทีมใหม่ แค่แก้กฎใน generator ให้ตรงกับโครงสร้างใหม่ ดู ownership coverage เพื่อยืนยันว่าไม่มีพาธไหนตกหล่น แล้ว commit ไฟล์ใหม่ ทีมใหม่เริ่มรับ review งานของตัวเองได้ตั้งแต่ PR แรกโดยไม่ต้องเรียกร้องสิทธิ์เพิ่ม
แนวทางปฏิบัติที่ดี
- เริ่มจากกฎกว้างครอบทั้ง repo แล้วค่อยวางกฎเฉพาะเจาะจงทีหลัง เพื่อให้ทุกไฟล์มีเจ้าของตั้งแต่วันแรก
- อย่าลืม slash ท้ายของโฟลเดอร์ — ใช้ /docs/ ไม่ใช่ /docs เพื่อให้ความหมายชัดว่าจับทั้งโฟลเดอร์
- ระบุทีมแทนบุคคล (@org/team) จะทนทานกว่า เพราะสมาชิกทีมเปลี่ยนได้โดยไม่ต้องแก้ไฟล์
- ใช้ ownership coverage ตรวจเป็นประจำ โดยเฉพาะหลังรีแฟกเตอร์โครงสร้างโฟลเดอร์ เพราะ pattern เก่าอาจไม่ match กับพาธใหม่
- เปิด Require review from Code Owners ใน branch protection มิฉะนั้นไฟล์เป็นแค่คำแนะนำ ไม่ใช่กติกา
- เปลี่ยน CODEOWNERS ผ่าน PR ให้ทีมเกี่ยวข้องเห็น เพื่อให้การย้ายความเป็นเจ้าของโปร่งใส ไม่ใช่เรื่องเงียบ ๆ ของคนคนเดียว
พร้อมจัดระเบียบ code review ของ repo คุณแล้วหรือยัง? เปิด CODEOWNERS Generator เพิ่มกฎแรกภายในไม่กี่นาที ตรวจ coverage ให้ครบทุกพาธ แล้วเอาไฟล์ไป commit ได้เลย — ฟรี ใช้ในเบราว์เซอร์โดยตรง ไม่ต้องสมัครอะไรทั้งสิ้น
เครื่องมือที่เกี่ยวข้องที่คุณอาจสนใจ:
- Gitignore Generator — สร้างไฟล์ .gitignore ตาม stack ที่คุณใช้
- Git Command Generator — หาคำสั่ง git ที่ต้องการได้เร็ว
- License Generator — เลือกและสร้างไฟล์ LICENSE สำหรับ project
ขอให้รีวิวโค้ดอย่างสนุก!
คำถามที่พบบ่อย
ถ: ควรวางไฟล์ CODEOWNERS ไว้ที่ไหน?
ตอบ: วางได้ 3 ตำแหน่งคือ .github/CODEOWNERS, root ของ repo และ docs/CODEOWNERS GitHub จะใช้ตำแหน่งแรกที่เจอเพียงตำแหน่งเดียว แนะนำ .github/ เพื่อความเป็นระเบียบ
ถ: ถ้าไฟล์หนึ่ง match หลายกฎจะเกิดอะไรขึ้น?
ตอบ: GitHub ใช้กฎ "last match wins" คือใช้เฉพาะบรรทัดสุดท้ายที่ match กับไฟล์นั้น ดังนั้นควรเรียงกฎจากกว้างไปแคบ เช่น * ก่อน แล้วตามด้วยกฎที่เจาะจงกว่า เช่น /infra/
ถ: ต้องเปิดอะไรเพิ่มเพื่อให้ CODEOWNERS บังคับ review จริงหรือไม่?
ตอบ: ต้อง เพราะไฟล์อย่างเดียวแค่แท็ก reviewer ให้อัตโนมัติ ให้เข้า Settings > Branches ของ branch หลัก แล้วเปิด Require review from Code Owners ใน branch protection rules
ถ: ใส่ owner เป็นอะไรได้บ้าง?
ตอบ: ใส่ได้ทั้ง user (@username) ทีมใน organization (@org/team) และอีเมล โดยทีมเป็นตัวเลือกที่แนะนำที่สุด เพราะสมาชิกเปลี่ยนได้โดยไม่ต้องแก้ไฟล์
ถ: เครื่องมือนี้ต้องสมัครสมาชิกหรือเชื่อมต่อ GitHub ไหม?
ตอบ: ไม่ต้องเลย ทำงานในเบราว์เซอร์ 100% ป้อนข้อมูลและรับไฟล์ได้ทันที ไม่มีการส่งชื่อทีมหรือพาธไปเก็บที่เซิร์ฟเวอร์ใด ๆ