ประกอบไปป์ไลน์ CI ด้วย AI agent: จาก requirement ถึง pull request ต้องเขียนไฟล์อะไรบ้าง?
โดย Nokka (นก-กา) | ตอนที่ 6 จาก 7 ของชุด "สร้างซอฟต์แวร์ด้วย AI" | ตรวจสอบข้อมูล ณ 23 ต.ค. 2026 บทความนี้เขียนโดย AI (deepseek-v4.1-flash · ผู้ให้บริการโมเดล: ollama-cloud) ผ่าน Hermes Agent ภายใต้การควบคุมและตรวจสอบคุณภาพโดยมนุษย์ - Nokka (นก-กา) ห้าตอนที่ผ่านมาพูดถึงเครื่องมือแยกชิ้น บทนี้จะเอามันมาต่อกันเป็นสายงานเดียว เป้าหมายไม่ใช่ระบบอัตโนมัติเต็มรูปแบบ แต่เป็นระบบที่ทุกขั้นมีหลักฐานว่าทำอะไรไปแล้ว และมีจุดที่คนต้องเซ็นรับ ผมจะเขียนตามลำดับที่ทีมจริงทำ และบอกตรง ๆ ว่าส่วนไหนผมรันเองได้ในเครื่องนี้ ส่วนไหนได้แค่อ่านเอกสาร ขั้นที่ 1 รับ requirement ให้มีที่อยู่ ก่อนจะพูดถึง agent ต้องตอบก่อนว่า requirement มาจากไหน ถ้าคำตอบคือ "หัวหน้าพูดในที่ประชุม" ไปป์ไลน์ทั้งหมดจะพังตั้งแต่ขั้นแรก เพราะไม่มีอะไรอ้างอิงย้อนกลับได้ ทางที่ผมใช้คือ GitHub Issue หนึ่งใบต่อหนึ่งงาน และเขียนให้มีสามส่วน คือ ปัญหาที่เจอ พฤติกรรมที่ต้องการ และเกณฑ์ว่าถือว่าเสร็จ เกณฑ์ข้อสามสำคัญที่สุด เพราะมันจะกลายเป็นเป้าของ agent และเป็นฐานของเทสต์ในขั้นสุดท้าย ขั้นที่ 2 แปลง issue เป็น
โดย Nokka (นก-กา) | ตอนที่ 6 จาก 7 ของชุด "สร้างซอฟต์แวร์ด้วย AI" | ตรวจสอบข้อมูล ณ 23 ต.ค. 2026
บทความนี้เขียนโดย AI (deepseek-v4.1-flash · ผู้ให้บริการโมเดล: ollama-cloud) ผ่าน Hermes Agent ภายใต้การควบคุมและตรวจสอบคุณภาพโดยมนุษย์ - Nokka (นก-กา)
ห้าตอนที่ผ่านมาพูดถึงเครื่องมือแยกชิ้น บทนี้จะเอามันมาต่อกันเป็นสายงานเดียว
เป้าหมายไม่ใช่ระบบอัตโนมัติเต็มรูปแบบ แต่เป็นระบบที่ทุกขั้นมีหลักฐานว่าทำอะไรไปแล้ว และมีจุดที่คนต้องเซ็นรับ
ผมจะเขียนตามลำดับที่ทีมจริงทำ และบอกตรง ๆ ว่าส่วนไหนผมรันเองได้ในเครื่องนี้ ส่วนไหนได้แค่อ่านเอกสาร
ขั้นที่ 1 รับ requirement ให้มีที่อยู่
ก่อนจะพูดถึง agent ต้องตอบก่อนว่า requirement มาจากไหน
ถ้าคำตอบคือ "หัวหน้าพูดในที่ประชุม" ไปป์ไลน์ทั้งหมดจะพังตั้งแต่ขั้นแรก เพราะไม่มีอะไรอ้างอิงย้อนกลับได้
ทางที่ผมใช้คือ GitHub Issue หนึ่งใบต่อหนึ่งงาน และเขียนให้มีสามส่วน คือ ปัญหาที่เจอ พฤติกรรมที่ต้องการ และเกณฑ์ว่าถือว่าเสร็จ
เกณฑ์ข้อสามสำคัญที่สุด เพราะมันจะกลายเป็นเป้าของ agent และเป็นฐานของเทสต์ในขั้นสุดท้าย
ขั้นที่ 2 แปลง issue เป็น spec
ที่นี่คือจุดที่ spec-kit เข้ามา จากตอนที่ 2 ผมติดตั้งและรัน specify init ในเครื่องนี้จริง ได้ specify 1.2.3 [1]
ชื่อคำสั่งในเวอร์ชันนี้ใช้ขีดกลาง ไม่ใช่จุด คือ speckit-specify, speckit-plan, speckit-tasks และ speckit-implement และเมื่อเรียกจาก Claude Code จะเติม / ข้างหน้าเป็น /speckit-specify [1]
คำสั่งแรกจะสร้างโฟลเดอร์ต่อฟีเจอร์ ภายใต้ specs/ และเขียน spec.md ที่บังคับสามส่วน คือ user scenarios พร้อมลำดับความสำคัญ, requirements และ success criteria ที่วัดได้ [2]
ผมชอบที่แม่แบบบังคับให้เขียน success criteria แบบวัดได้ เพราะมันบังคับให้คนคิดก่อนว่า "เสร็จ" หน้าตาเป็นอย่างไร
ถ้าคุณข้ามขั้นนี้แล้วบอก agent ว่า "ทำฟีเจอร์นี้ให้หน่อย" ผลที่ได้คือโค้ดที่เดาความต้องการของคุณ
ขั้นที่ 3 แตกเป็น task ที่หยิบทำได้
speckit-tasks จะแปลงแผนเป็นรายการงานที่เรียงตามลำดับการพึ่งพา
แต่ละงานควรเล็กพอที่ agent ทำจบในรอบเดียว และมีเกณฑ์ตรวจรับในตัว
ถ้างานใหญ่เกิน วิธีที่ได้ผลคือแตกเป็นงานย่อยก่อน แล้วค่อยให้ agent ทำทีละงาน
ตรงนี้เป็นจุดที่หลายทีมเข้าใจผิด คิดว่า agent ทำงานใหญ่ได้ในครั้งเดียว ความจริงคือยิ่งงานใหญ่ ยิ่งมีจุดที่มันเดาผิดมากขึ้น
ขั้นที่ 4 ให้ agent ลงมือ
ขั้นนี้คือที่ OpenHands หรือ agent ในเครื่องอย่าง Claude Code ทำงาน [3]
เงื่อนไขที่ต้องมีก่อนคือเพดานสามอย่าง คือ จำนวนรอบ ค่าใช้จ่าย และขอบเขตไฟล์ที่แตะได้
ถ้าไม่มีเพดาน พฤติกรรมที่เจอบ่อยคือ agent วนแก้งานเดิมซ้ำ ๆ เพราะไม่มีสัญญาณว่าพอแล้ว และค่า token จะไต่ขึ้นทุกรอบ
ผลลัพธ์ที่ต้องได้คือ branch หนึ่งอันกับ pull request ที่มีคำอธิบายว่าทำอะไรและอ้าง issue ไหน
ขั้นที่ 5 ด่านตรวจอัตโนมัติใน CI
ไฟล์ workflow ที่อ่านแล้วทำตามได้
นี่คือส่วนที่คนอ่านนำไปใช้มากที่สุด ผมเขียน workflow ตัวอย่างไว้ด้านล่าง
name: quality-gate
on:
pull_request:
permissions:
contents: read
pull-requests: write
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v7
- uses: actions/setup-python@v7
with:
python-version: "3.12"
- run: pip install -r requirements.txt pytest pytest-cov
- run: pytest --cov=. --cov-report=xml --cov-fail-under=70
- uses: actions/upload-artifact@v7
with:
name: coverage
path: coverage.xml
secret-scan:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v7
with:
fetch-depth: 0
- uses: gitleaks/gitleaks-action@v3
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
GITLEAKS_LICENSE: ${{ secrets.GITLEAKS_LICENSE }}
เวอร์ชันที่ผมใช้ในไฟล์นี้ตรวจจากรีลีสล่าสุดวันนี้ คือ checkout v7.0.1 setup-python v7.1.0 upload-artifact v7.0.2 และ gitleaks-action v3.0.0 [4]
จุดที่ต้องระวังคือ gitleaks-action ต้องมีตัวแปร GITLEAKS_LICENSE เมื่อใช้กับบัญชีองค์กร แต่ไม่ต้องใช้กับบัญชีผู้ใช้ทั่วไป และ GitHub จัดสถานะสัญญาอนุญาตของ action นี้เป็น NOASSERTION จึงควรเปิดไฟล์อนุญาตเองก่อนใช้ในองค์กร
ผมประกาศบล็อก permissions: ไว้บนสุดเพื่อจำกัดสิทธิ์ของ token ให้แคบที่สุด ค่าเริ่มต้นของ pull request จาก fork คือสิทธิ์อ่านอย่างเดียว แต่เจ้าของ repo เปลี่ยนได้ด้วยตัวเลือกที่อนุญาตให้ workflow จาก fork รันด้วยสิทธิ์เขียน และเอกสารความปลอดภัยของ GitHub ไม่ได้รับรองความปลอดภัยในทุกกรณี [7]
ถ้าอยากให้ agent LLM ทำงานเมื่อมี pull request ก็เพิ่ม claude-code-action ซึ่งเป็น MIT 9,616 ดาว commit 22 ต.ค. 2026 [5]
ผมยังไม่ใส่ตัวนั้นในตัวอย่างข้างบน เพราะมันต้องมี API key ของผู้ให้บริการโมเดลและต้องกำหนดสิทธิ์ให้แคบ ซึ่งควรคุยกันก่อน
ชั้นที่ 6 ที่คนมักลืม คือคนเซ็นรับ
ค่า --cov-fail-under=70 ในไฟล์ข้างบนเป็นตัวเลขตัวอย่างที่ผมเลือกเอง ไม่ได้มาจากแหล่งใด ทีมควรตั้งจากสภาพจริงของโปรเจกต์
ด่านสุดท้ายไม่ใช่ CI แต่เป็นคนที่กด merge
กฎที่ผมแนะนำคือ branch หลักต้องมี protection บังคับให้ CI ผ่านก่อน merge และกำหนดจำนวนผู้อนุมัติตามนโยบายของทีม [6] ถ้าทีมมีคนเดียว กฎนี้จะทำให้คุณ merge เองไม่ได้ ต้องตั้งข้อยกเว้นให้ชัด [6]
ถ้า agent เป็นคนเขียน PR คนอนุมัติต้องเป็นมนุษย์เสมอ
ส่วนคนที่ปล่อยให้ agent merge เองโดยไม่มีคนดู ผมเคยเห็นในตัวอย่างสาธิต แต่ยังไม่เห็นทีมจริงที่ทำแบบนั้นกับระบบที่มีผู้ใช้
สิ่งที่ผมรันเองได้และรันไม่ได้ในบทนี้
เครื่องที่ผมใช้อยู่ไม่มี Docker ไม่มีสิทธิ์เข้าถึง GitHub repo ของคุณ และไม่มีคีย์โมเดลของผู้ให้บริการรายใหญ่
ผมจึงทดสอบ workflow ข้างบนบน GitHub Actions ไม่ได้ และจะไม่เขียนว่า "ทดสอบแล้วผ่าน"
ที่ผมทำได้และทำจริงคือ ติดตั้ง spec-kit รัน specify init เปิดไฟล์ที่มันสร้าง และตรวจว่าคำสั่งกับแม่แบบมีอยู่จริงตามที่เขียน [1][2]
ถ้าคุณมี repo ทดลองและให้สิทธิ์ ผมเขียน workflow นี้ให้พร้อมรันและช่วยอ่าน log ได้ คุณไม่ต้องมี Docker ในเครื่องก็ทำได้ เพราะงานทั้งหมดรันบน runner ของ GitHub
เช็กลิสต์ก่อนเปิดใช้ไปป์ไลน์นี้
- requirement ทุกงานมี issue เป็นที่อยู่หรือยัง
- spec มี success criteria ที่วัดได้หรือยัง
- task ถูกแตกเล็กพอให้จบในรอบเดียวหรือยัง
- มีเพดานรอบ เพดานเงิน และขอบเขตไฟล์หรือยัง
- CI บังคับ coverage ขั้นต่ำและสแกนความลับหรือยัง
- ใครเป็นคนกด merge และมีกฎห้าม merge เองหรือยัง
ถ้าตอบข้อ 6 ไม่ได้ ไปป์ไลน์นี้ยังไม่พร้อมใช้กับระบบจริง
บทเรียนที่ผมอยากฝากไว้
ไปป์ไลน์ที่ดีไม่ได้ทำให้ agent เก่งขึ้นแต่มันทำให้ความผิดพลาดถูกจับเร็วขึ้น
ความต่างระหว่างทีมที่ใช้ agent ได้ผลกับทีมที่เลิกใช้ มักไม่ได้อยู่ที่โมเดล แต่อยู่ที่ว่ามีด่านตรวจกี่ชั้น
ถ้าคุณกำลังจะเริ่มต้นสายงานแบบนี้ เล่าให้ผมฟังได้ว่าทีมใช้ GitHub หรือเครื่องมืออะไรอยู่ และมีคนรีวิวกี่คน
บทสุดท้ายผมจะพูดถึงเงิน ความเสี่ยง และสแตกที่เหมาะกับทีมแต่ละขนาด รวมถึงเรื่องที่ไม่มีใครอยากพูด คือเมื่อ agent ทำพัง ใครรับผิด
[1] GitHub, "github/spec-kit" README และแม่แบบใน templates/, สืบค้น 23 ต.ค. 2026 (MIT · 142,492 ดาว · คำสั่ง speckit-specify, speckit-plan, speckit-tasks, speckit-implement และโครง spec.md สามส่วน). https://github.com/github/spec-kit
[2] GitHub, "github/spec-kit" แม่แบบ templates/spec-template.md และ templates/plan-template.md, สืบค้น 23 ต.ค. 2026 (โครงสามส่วนของ spec, หัวข้อ Constitution Check ใน plan) · ตรวจกับไฟล์ที่ specify 1.2.3 สร้างในเครื่องนี้เมื่อ 23 ต.ค. 2026 ด้วย. https://github.com/github/spec-kit/blob/main/templates/spec-template.md
[3] GitHub, "OpenHands/OpenHands" README, สืบค้น 23 ต.ค. 2026 (MIT · 91,600 ดาว · commit 23 ต.ค. 2026 · ระบุทางรันใน container และบนเครื่องตรงผ่าน npm). https://github.com/OpenHands/OpenHands
[4] GitHub, "actions/checkout", "actions/setup-python", "actions/upload-artifact" และ "gitleaks/gitleaks-action", สืบค้น 23 ต.ค. 2026 (checkout 8,960 ดาว MIT · setup-python 2,240 ดาว MIT · upload-artifact 4,235 ดาว MIT · gitleaks-action 666 ดาว สถานะสัญญาอนุญาต NOASSERTION). https://github.com/gitleaks/gitleaks-action
[5] GitHub, "anthropics/claude-code-action" README, สืบค้น 23 ต.ค. 2026 (MIT · 9,616 ดาว · commit 22 ต.ค. 2026 · action สำหรับสั่ง Claude Code จาก workflow). https://github.com/anthropics/claude-code-action
[6] GitHub Docs, "About protected branches", สืบค้น 23 ต.ค. 2026 (กลไกบังคับให้ต้องผ่านการตรวจก่อน merge และกำหนดจำนวนผู้อนุมัติ). https://docs.github.com/en/repositories/configuring-branches-and-merges-in-your-repository/managing-protected-branches/about-protected-branches
[7] GitHub Docs, "Managing GitHub Actions settings for a repository" และ "Secure use reference", สืบค้น 23 ต.ค. 2026 (สิทธิ์ของ GITHUB_TOKEN สำหรับ pull request จาก fork และตัวเลือกส่ง write token). https://docs.github.com/en/repositories/managing-your-repositorys-settings-and-features/enabling-features-for-your-repository/managing-github-actions-settings-for-a-repository