ลดต้นทุน CI/CD สำหรับทีม DevOps: เลือก Runner, Cloud และ Pipeline ให้คุ้มค่า

webmaster

CI CD 파이프라인의 운영 비용 절감 방법 - Photorealistic modern Bangkok technology office, Thai DevOps engineer reviewing a cost-efficient CI/...

ลดค่าใช้จ่าย CI/CD ได้ด้วยการวัดต้นทุนต่อ build, ลดงานที่รันซ้ำ, ใช้ cache และ runner ให้เหมาะกับภาระงาน พร้อมเกณฑ์เปรียบเทียบ Cloud CI, self-hosted runner และบริการดูแลระบบเพื่อเลือกแนวทางที่คุ้มค่าในระยะยาว

CI CD 파이프라인의 운영 비용 절감 방법 관련 이미지 1

การลดต้นทุน CI/CD ที่ได้ผลเริ่มจากการเห็นต้นทุนต่อ build และต่อ deployment ให้ชัด ไม่ใช่รีบลดขนาด runner หรือตัดขั้นตอนทดสอบทันที. จุดที่ควรปรับก่อนคือ workflow ที่รันซ้ำ งานที่ไม่เกี่ยวกับไฟล์ที่เปลี่ยน และเวลา build ที่เสียไปกับการติดตั้ง dependency เดิม. เมื่อค่าใช้งานเริ่มสูงหรือมีข้อกำหนดด้านข้อมูล จึงค่อยเปรียบเทียบ Cloud-hosted CI, self-hosted runner และบริการ DevOps แบบ managed ตามภาระดูแลจริง. Cloud CI เริ่มง่ายและปรับทรัพยากรได้เร็ว ส่วน self-hosted ให้ควบคุมสเปกและตารางใช้งานได้มากกว่า แต่ต้องรวมต้นทุนแพตช์ ความปลอดภัย และ monitoring ด้วย. ไม่มีรูปแบบใดประหยัดที่สุดสำหรับทุกทีม เพราะภาษาโปรแกรม ขนาดโปรเจกต์ ความถี่ deploy และลักษณะการทดสอบต่างกัน. การตัดสินใจที่คุ้มค่าควรอ้างอิงข้อมูลการใช้งานของทีม ไม่ใช่ดูเฉพาะค่าบริการของ runner.

สรุปแบบรวดเร็ว

  • วัดต้นทุนต่อ build และต่อ deployment โดยรวมค่า runner, artifact, data transfer, license และเวลาทีม
  • ลดงานที่รันซ้ำก่อนเพิ่มงบ compute ด้วย cache, การเลือก job ตามไฟล์ที่เปลี่ยน และการแยก pipeline ตามบริบท
  • เปลี่ยนรูปแบบ runner เมื่อข้อมูลชี้ว่าคุ้มค่า โดยเปรียบเทียบค่าแพ็กเกจ CI/CD กับภาระดูแลระบบและข้อกำหนดด้านความปลอดภัย
แนวทาง เหมาะกับสถานการณ์ ต้นทุนที่ต้องมองให้ครบ จุดที่ต้องระวัง
Cloud-hosted CI ทีมเริ่มต้น งานขึ้นลงไม่แน่นอน หรืออยากขยายทรัพยากรเร็ว หน่วยคิดค่าบริการ runner, storage, artifact, data transfer และข้อจำกัดแพ็กเกจ ค่าใช้งานอาจเพิ่มเมื่อ workflow รันบ่อยหรือใช้ทรัพยากรสูง
Self-hosted runner ต้องควบคุมสเปก สภาพแวดล้อม หรือเวลาการใช้งานของ runner เครื่อง compute, พื้นที่เก็บข้อมูล, การอัปเดต, ความปลอดภัย และเวลาทีม ต้องดูแลแพตช์ การมอนิเตอร์ และการเข้าถึงอย่างต่อเนื่อง
Hybrid runner มีงานบางส่วนต้องใช้สภาพแวดล้อมเฉพาะ แต่ยังต้องการความยืดหยุ่น ค่า Cloud CI ควบคู่กับค่าโครงสร้างพื้นฐานและการดูแล runner ภายใน ต้องกำหนดให้ชัดว่างานใดควรรันที่ใด เพื่อไม่ให้ซ้ำซ้อน
บริการ DevOps แบบ managed ทีมต้องการลดภาระปฏิบัติการหรือขาดคนดูแล runner โดยเฉพาะ ค่าแพ็กเกจบริการ, SLA, ขอบเขตการสนับสนุน และค่า storage ตรวจสอบเงื่อนไขบริการและความรับผิดชอบด้านความปลอดภัยก่อนเลือก
Advertisement

เริ่มลดงบ CI/CD จากจุดที่วัดผลได้

คำตอบสั้น ๆ คืออย่าเริ่มจากการตัด quality gate ให้เริ่มจากวัดว่า pipeline ใช้ทรัพยากรตรงไหน แล้วจัดลำดับการแก้ไขตามเวลาที่สูญเสียจริง การมีข้อมูลแยกตามขั้นตอนทำให้รู้ว่าปัญหาอยู่ที่ test, build image, ติดตั้ง dependency หรือการเก็บ artifact มากกว่าการเดาแล้วเพิ่มขนาด runner

สรุป 3 ขั้นตอน: วัดต้นทุนต่อ build, ตัดงานซ้ำ, ปรับทรัพยากรตามงาน

ขั้นแรก รวบรวมจำนวน build และ deployment พร้อมเวลาที่แต่ละ job ใช้งาน runner ขั้นต่อมา ตรวจหา workflow ที่รันทุกครั้งแม้ไฟล์ที่เปลี่ยนไม่เกี่ยวข้อง เช่น งานเฉพาะส่วน frontend ที่ถูกเรียกเมื่อแก้เอกสารหรือ service คนละส่วน สุดท้ายจึงปรับ CPU, memory และ concurrency ให้สอดคล้องกับ job นั้น ๆ แทนการตั้งค่าสูงเท่ากันทั้งหมด

แยกต้นทุนตรงและต้นทุนแฝงของ pipeline

ต้นทุนตรงอาจรวมเวลาใช้งาน runner, พื้นที่เก็บ artifact, log, การรับส่งข้อมูล และ license แต่ต้นทุนแฝงที่มักถูกลืมคือเวลาของทีมในการรอ build แก้ pipeline ดูแล runner และตรวจสอบปัญหา หากกำลังเปรียบเทียบ Cloud CI กับ self-hosted runner ควรใส่ค่าแรงสำหรับอัปเดตระบบ แพตช์ความปลอดภัย และ monitoring ลงในภาพรวมด้วย

ตั้ง baseline ก่อนเปลี่ยนค่า runner หรือ workflow

บันทึกเวลารัน pipeline แยกตามขั้นตอน จำนวนงานที่ล้มเหลวหรือค้าง และการใช้ storage ในช่วงหนึ่งก่อนปรับค่า baseline นี้ช่วยให้เห็นว่าการเปลี่ยน cache, retention หรือขนาด runner ลดเวลาซ้ำจริงหรือเพียงย้ายภาระไปอีกจุดหนึ่ง ควรเปลี่ยนทีละส่วนเพื่อให้เปรียบเทียบผลได้ชัดเจน

Advertisement

ตารางเปรียบเทียบ Cloud CI, self-hosted runner และ hybrid แบบไหนคุ้มกว่า

ความคุ้มค่าไม่ได้วัดจากราคาต่อหน่วยเพียงอย่างเดียว แต่ต้องดูความผันผวนของงาน ความเร็วที่ต้องการ ความอ่อนไหวของข้อมูล และคนที่พร้อมดูแลระบบ หากใช้ runner ไม่สม่ำเสมอ Cloud-hosted CI อาจเหมาะกับการเริ่มต้น แต่หากมีงานเฉพาะทางหรือข้อกำหนดด้านสภาพแวดล้อม Self-hosted หรือ hybrid อาจเป็นตัวเลือกที่ควรประเมิน

ค่าใช้จ่าย ความยืดหยุ่น ความปลอดภัย และภาระทีมที่ต้องดูแล

Cloud-hosted CI ช่วยลดขั้นตอนการเริ่มใช้งานและขยายทรัพยากรได้เร็ว อย่างไรก็ตามควรตรวจสอบหน่วยคิดค่าบริการ ข้อจำกัดของแพ็กเกจ CI/CD และการคิดค่า storage ให้ครบ Self-hosted runner เปิดให้กำหนดสเปกและตารางใช้งานได้เอง แต่ความปลอดภัย การอัปเดต และการมอนิเตอร์เป็นภาระของทีม Hybrid เหมาะเมื่อแยกงานทั่วไปไป Cloud และเก็บงานที่ต้องใช้เครือข่ายหรือข้อมูลเฉพาะไว้ในสภาพแวดล้อมที่ควบคุมได้

กรณีที่ Cloud-hosted เหมาะกับทีมขนาดเล็กหรือการใช้งานผันผวน

หากทีมยังไม่ต้องการสร้างระบบดูแล runner เอง หรือจำนวน build เปลี่ยนตามรอบพัฒนา Cloud CI ช่วยให้เริ่มทำงานได้เร็ว เหมาะกับการทดลอง workflow และปรับ pipeline โดยไม่ต้องเตรียมเครื่องเอง ก่อนใช้งานจริงให้ตรวจสอบราคาแพ็กเกจ เวลา runner ที่รวมอยู่ ข้อจำกัดการใช้งาน และค่าใช้จ่ายส่วน storage หรือ data transfer ตามเงื่อนไขปัจจุบันของผู้ให้บริการ

กรณีที่ self-hosted หรือ managed DevOps อาจคุ้มค่ากว่า

Self-hosted runner อาจควรนำมาเปรียบเทียบเมื่อทีมต้องใช้สเปกเฉพาะ ต้องควบคุมสภาพแวดล้อม หรือมีรูปแบบงานที่ทำให้ต้องการกำหนดตารางใช้งานเอง แต่ต้องไม่ประเมินเฉพาะค่าเครื่อง บริการ DevOps แบบ managed อาจช่วยลดภาระบางส่วนสำหรับทีมที่ไม่มีคนดูแลโดยตรง โดยควรดูขอบเขตงานที่รวมอยู่ในบริการ, SLA และความรับผิดชอบด้านระบบให้ชัดก่อนตัดสินใจ

Advertisement

ลดเวลา build โดยไม่ลดมาตรฐานคุณภาพ

เป้าหมายคือเอาเวลาที่ไม่จำเป็นออก ไม่ใช่เอาการตรวจสอบที่จำเป็นออก งานทดสอบและ security scan ที่มีผลต่อคุณภาพควรถูกจัดวางให้เหมาะกับความเสี่ยงของแต่ละช่วง เช่น pull request, main branch และ release แทนการปิดเพียงเพื่อลดนาทีการรัน

ใช้ cache สำหรับ dependencies, Docker layers และ artifact อย่างมีอายุการเก็บที่ชัดเจน

Dependency cache และ Docker layer cache ช่วยลดเวลาติดตั้งหรือ build ซ้ำได้เมื่อกำหนดค่าอย่างถูกต้อง ควรทำ key ของ cache ให้สัมพันธ์กับไฟล์กำหนด dependency หรือส่วนประกอบที่เกี่ยวข้อง และกำหนดอายุเก็บให้เหมาะกับการใช้งาน Artifact ควรเก็บเฉพาะสิ่งที่จำเป็นต่อการ deploy การตรวจสอบ หรือการส่งต่อระหว่าง job ไม่ควรใช้เป็นพื้นที่เก็บทุกผลลัพธ์โดยไม่มีแผน retention

รันเฉพาะ test และ job ที่เกี่ยวข้องกับไฟล์ที่เปลี่ยน

การเรียกทุก workflow กับทุก commit ทำให้ compute เพิ่มขึ้นโดยไม่จำเป็น โดยเฉพาะโปรเจกต์ที่มีหลายส่วน แยกเงื่อนไขตาม path หรือประเภทไฟล์เพื่อให้ job ที่เกี่ยวข้องเท่านั้นเริ่มทำงาน แต่ควรวางกฎอย่างรอบคอบ เพราะไฟล์ส่วนกลางหรือการเปลี่ยนแปลงโครงสร้างอาจส่งผลกับหลายส่วนได้ การข้าม test ต้องมีเหตุผลและตรวจสอบได้

แยกงานเร็วสำหรับ pull request ออกจาก regression และ release pipeline

สำหรับ pull request อาจให้ความสำคัญกับ lint, unit test และการตรวจสอบที่ให้ผลเร็ว ส่วน regression ที่ใช้เวลามากสามารถกำหนดให้ทำตามเงื่อนไขของ main branch หรือ release pipeline ตามกระบวนการของทีม วิธีนี้ช่วยลดงานซ้ำโดยยังรักษาด่านตรวจที่จำเป็นไว้ การออกแบบดังกล่าวต้องมีความชัดเจนว่าเมื่อใดงานชุดเต็มจะถูกเรียกใช้ เพื่อไม่ให้ช่องว่างด้านคุณภาพหลุดไปถึงการ deploy

Advertisement

ควบคุมค่า storage, log และทรัพยากร runner

ค่าใช้จ่าย CI/CD ไม่ได้หยุดเมื่อ build เสร็จ เพราะ artifact และ log ที่สะสมต่อเนื่องอาจสร้างต้นทุน storage ได้ การกำหนดนโยบายเก็บข้อมูลและป้องกันงานค้างจึงเป็นส่วนหนึ่งของการลดงบ Cloud อย่างมีวินัย

กำหนด retention ของ artifact และ log ตามข้อกำหนดทีม

แยกให้ชัดว่า artifact ใดใช้สำหรับ deploy, การย้อนตรวจสอบปัญหา หรือการทำงานชั่วคราว จากนั้นตั้ง retention ให้สอดคล้องกับความจำเป็นของแต่ละประเภท Log ก็เช่นกัน ไม่จำเป็นต้องใช้ระยะเก็บเท่ากันทั้งหมด หากมีข้อกำหนดภายในหรือความต้องการด้านการตรวจสอบ ควรตรวจสอบให้ retention ที่ตั้งใหม่ไม่ขัดกับข้อกำหนดนั้น

เลือก CPU, memory และ concurrency ให้พอดีกับงาน

Runner ที่ใหญ่ขึ้นไม่ได้ทำให้ทุก job เร็วขึ้นเสมอไป ให้ดูเวลารันแยกตามขั้นตอนก่อน งานที่ใช้ memory สูงอาจต้องปรับ memory ขณะที่งานเบาอาจไม่จำเป็นต้องใช้ทรัพยากรเท่ากัน Concurrency ควรพอดีกับปริมาณงานและความสามารถของระบบปลายทาง เพราะการรันพร้อมกันมากเกินไปอาจทำให้เกิดคิว ปัญหาเสถียรภาพ หรือการใช้ทรัพยากรเกินความจำเป็น

หลีกเลี่ยง runner ว่างและ build ที่ค้างโดยไม่มี timeout

CI CD 파이프라인의 운영 비용 절감 방법 관련 이미지 2

ตรวจสอบ job ที่รอนาน ใช้ runner โดยไม่เกิดงานจริง หรือค้างเพราะกระบวนการภายนอกไม่ตอบสนอง การตั้ง timeout ตามลักษณะงานช่วยจำกัดการใช้ compute ที่ไม่ก่อให้เกิดผลลัพธ์ และควรมีการแจ้งเตือนเมื่อ pipeline ล้มเหลวหรือใช้เวลานานผิดปกติ เพื่อให้ทีมแก้ที่ต้นเหตุได้เร็ว

Advertisement

ข้อผิดพลาดที่ทำให้ลดค่าใช้จ่ายแล้วกลับเสี่ยงกว่าเดิม

การลดงบที่ดีต้องคงสมดุลระหว่างค่าใช้จ่าย ความเร็ว คุณภาพ และความปลอดภัย หากลดเฉพาะตัวเลขนาที runner แต่ทำให้ปัญหาถูกพบช้าขึ้น ต้นทุนรวมของทีมอาจเพิ่มขึ้นได้

ตัด security scan หรือ test สำคัญเพียงเพื่อลดนาทีการรัน

ไม่ควรลบการตรวจสอบที่จำเป็นออกโดยไม่มีการประเมินผลกระทบ ทางเลือกที่ปลอดภัยกว่าคือจัดลำดับงานให้เหมาะกับจุดที่รัน หรือปรับเงื่อนไขการรันตามความเกี่ยวข้องของการเปลี่ยนแปลง โดยยังคงให้มีขั้นตอนตรวจสอบในช่วงที่เหมาะสม

ใช้ shared cache โดยไม่มีการแยกสิทธิ์หรือการตรวจสอบความถูกต้อง

Cache ช่วยประหยัดเวลาได้ แต่ shared cache ต้องถูกออกแบบโดยคำนึงถึงสิทธิ์เข้าถึงและความถูกต้องของข้อมูล ไม่ควรนำ cache ที่มาจากบริบทต่างกันมาใช้ร่วมกันโดยไม่มีการควบคุม เพราะอาจทำให้ build ไม่สอดคล้องกับสิ่งที่คาดไว้หรือเพิ่มความเสี่ยงด้านความปลอดภัย

ย้ายไป self-hosted โดยไม่รวมค่าแรงดูแล แพตช์ และ monitoring ในงบ

การมีเครื่อง runner ของตัวเองไม่ได้แปลว่าต้นทุนรวมต่ำลงโดยอัตโนมัติ ต้องนับเวลาที่ใช้ดูแลระบบ การอัปเดต การแก้เหตุขัดข้อง การมอนิเตอร์ และมาตรการรักษาความปลอดภัยไว้ในแบบจำลองต้นทุนด้วย หากทีมยังไม่พร้อมรับภาระนี้ Cloud CI หรือบริการ managed อาจเหมาะกับช่วงปัจจุบันมากกว่า

Advertisement

เกณฑ์เลือกและเปรียบเทียบแนวทางที่เหมาะกับทีม

ก่อนเลือก runner หรือแพ็กเกจ CI/CD ให้ตอบคำถามเหล่านี้: จำนวน build และ deployment มีความสม่ำเสมอหรือผันผวนเพียงใด, ขั้นตอนใดใช้เวลามากที่สุด, ข้อมูลหรือเครือข่ายใดต้องควบคุม, ทีมมีคนดูแลระบบเพียงพอหรือไม่, และ storage กับ artifact ถูกใช้งานอย่างไร หากคำตอบยังไม่ชัด ควรเก็บ baseline ก่อนตัดสินใจย้ายทั้งระบบ

เช็กลิสต์ตัดสินใจตามจำนวน build, ความถี่ deploy และข้อมูลที่ต้องปกป้อง

ทีมที่มีการใช้งานผันผวนอาจให้ความสำคัญกับความยืดหยุ่นของ Cloud-hosted CI ทีมที่มีข้อกำหนดสภาพแวดล้อมเฉพาะอาจพิจารณา self-hosted หรือ hybrid และทีมที่ขาดทรัพยากรปฏิบัติการอาจเปรียบเทียบบริการ DevOps แบบ managed ควบคู่กัน อย่าลืมตรวจสอบว่าการแยก runner หรือการย้ายงานกระทบสิทธิ์เข้าถึงข้อมูลและการจัดการ secrets อย่างไร

วิธีเปรียบเทียบราคาแพ็กเกจ CI/CD กับค่าใช้จ่ายการดูแล runner ภายใน

เปรียบเทียบในหน่วยเดียวกัน เช่น ต้นทุนต่อ build หรือต้นทุนต่อ deployment แล้วรวมค่า runner, storage, data transfer, license และเวลาทีม สำหรับ self-hosted ให้รวมค่าเครื่อง การอัปเดต ความปลอดภัย และ monitoring ด้วย ส่วน Cloud CI หรือ managed DevOps ให้ดูหน่วยคิดค่าบริการ ข้อจำกัดแพ็กเกจ และ SLA ไม่ควรใช้ราคาหน้าแพ็กเกจเป็นตัวตัดสินเพียงอย่างเดียว

เริ่มจาก pilot ขนาดเล็กก่อนย้าย pipeline ทั้งหมด

เลือก workflow หนึ่งชุดที่มีรูปแบบงานชัดเจนมาทดลอง เช่น งาน build ที่ใช้เวลานานหรือมีการรันซ้ำบ่อย วัดผลก่อนและหลังในด้านเวลา runner ความเสถียร ค่า storage และภาระดูแล เมื่อเห็นผลจาก pilot แล้วจึงขยายไปยัง pipeline อื่น วิธีนี้ลดความเสี่ยงจากการย้ายระบบครั้งใหญ่และช่วยปรับมาตรฐานให้เหมาะกับทีมจริง

Advertisement

สรุปเกณฑ์การเลือกและการเปรียบเทียบ

ตรวจสอบ ต้นทุนต่อ build และต่อ deployment ก่อนเสมอ, แยกค่า runner ออกจากค่า artifact, log และเวลาทีม, ดูว่า workflow ใดรันซ้ำโดยไม่จำเป็น, ประเมินภาระความปลอดภัยของ self-hosted runner และทดสอบด้วย pilot ก่อนขยายผล สำหรับการเลือกแพ็กเกจ CI/CD หรือบริการ DevOps ให้ตรวจสอบราคา, SLA, วิธีคิดค่า storage และขอบเขตค่าดูแลระบบจากหน้ารายละเอียดของผู้ให้บริการก่อนตัดสินใจ

Advertisement

ส่งท้าย

การลดต้นทุน CI/CD ไม่จำเป็นต้องแลกกับความเร็วหรือคุณภาพ หากเริ่มจากข้อมูลที่วัดได้ ทีมมักพบโอกาสลดเวลาสูญเปล่าจากงานซ้ำ cache ที่ตั้งค่าไม่เหมาะสม และการเก็บข้อมูลเกินความจำเป็น เลือก Cloud, self-hosted หรือ hybrid จากต้นทุนรวมและความพร้อมของทีม แล้วทบทวนผลเมื่อรูปแบบการพัฒนาเปลี่ยนไป

Advertisement

ข้อมูลที่ควรรู้เพิ่มเติม

ราคา Cloud compute, CI runner, storage และ data transfer อาจต่างกันตามแพ็กเกจ ภูมิภาค และปริมาณใช้งาน จึงควรยืนยันเงื่อนไขล่าสุดทุกครั้งก่อนคำนวณงบประมาณ อีกจุดที่ควรติดตามคือเวลารัน pipeline รายขั้นตอน เพราะเป็นข้อมูลที่ใช้ชี้จุดปรับปรุงได้ตรงกว่าการดูยอดรวมเพียงอย่างเดียว

ข้อควรทราบสำคัญ

จำนวนเงินที่ประหยัดได้จริงไม่สามารถระบุเป็นค่าตายตัว เพราะขึ้นกับภาษาโปรแกรม ขนาดโปรเจกต์ ความถี่การ deploy และรูปแบบการทดสอบ การลดขั้นตอนตรวจสอบเพื่อประหยัดค่าใช้จ่ายอาจเพิ่มความเสี่ยงด้านคุณภาพและความปลอดภัยได้ ควรประเมินผลกระทบและยืนยันข้อกำหนดของทีมก่อนปรับ pipeline

คำถามที่พบบ่อย

Q1. ทีมขนาดเล็กควรใช้ Cloud CI หรือ self-hosted runner เพื่อประหยัดกว่ากัน?

A1. ไม่มีคำตอบเดียวสำหรับทุกทีม Cloud CI มักเริ่มใช้งานง่ายและเหมาะเมื่อปริมาณงานผันผวน ส่วน self-hosted runner ควรประเมินเมื่อทีมต้องควบคุมสเปกหรือสภาพแวดล้อมเป็นพิเศษ โดยต้องรวมต้นทุนดูแล แพตช์ ความปลอดภัย และ monitoring ในการเปรียบเทียบด้วย

Q2. ควรลด retention ของ artifact และ log เหลือกี่วันจึงไม่กระทบการตรวจสอบปัญหา?

A2. ไม่มีจำนวนวันที่เหมาะกับทุกองค์กร ให้แยก artifact และ log ตามวัตถุประสงค์การใช้งาน เช่น deploy, ส่งต่องาน หรือการตรวจสอบปัญหา แล้วกำหนด retention ตามความจำเป็นและข้อกำหนดของทีม ควรตรวจสอบผลกระทบก่อนลดระยะเก็บข้อมูล

Q3. การใช้ cache ใน CI/CD ปลอดภัยหรือไม่ และต้องระวังเรื่องใดบ้าง?

A3. Cache ช่วยลดเวลาติดตั้งและ build ซ้ำได้เมื่อกำหนดค่าอย่างถูกต้อง แต่ควรแยกสิทธิ์เข้าถึง กำหนด key ให้สัมพันธ์กับ dependency หรือส่วนที่เปลี่ยน และตรวจสอบความถูกต้องของข้อมูล หลีกเลี่ยง shared cache ที่ไม่มีการควบคุม เพราะอาจเพิ่มความเสี่ยงด้านความปลอดภัยหรือทำให้ผล build ไม่ตรงตามที่คาดไว้