8 คะแนน โดย outsideris 2020-12-25 | 1 ความคิดเห็น | แชร์ทาง WhatsApp

GitHub ให้นิยามบิลด์ที่เป็นโค้ดเดียวกัน แต่บางครั้งบิลด์พังและบางครั้งผ่าน ว่าเป็น flaky build โดยผู้เขียนบอกว่าได้ลด flaky build ลงเหลือ 1/18 ด้วยการทำระบบอัตโนมัติ เพื่อให้คนที่เขียนโค้ดนั้นเป็นผู้แก้ไขเอง และไม่ส่งผลกระทบต่อคนอื่น

ใน CI ภายในของ GitHub มีการติดตาม flaky build และจัดระเบียบสถานการณ์ปัญหา จากนั้นจึงมอบหมายให้กับผู้ที่คาดว่าน่าจะเป็นคนทำให้เกิดปัญหานั้น

  • เมื่อติดตาม flaky build พบว่าความถี่แตกต่างกัน โดย flaky build ที่ล้มเหลวมากกว่า 100 ครั้งมีสัดส่วนเพียง 0.4% ของทั้งหมด ดังนั้นจึงตัดสินใจโฟกัสที่ 0.4% นี้

  • ตอนที่เริ่มนำมาใช้ในปี 2016 ใช้วิธีเข้าหาสองแบบดังนี้

    • เมื่อบิลด์เสร็จ ให้ค้นหาบิลด์ที่รันด้วยคอมมิตเดียวกัน แล้วถ้าผลลัพธ์ต่างกันก็ทำเครื่องหมายว่าเป็น flaky build

    • ถ้ามีการลองใหม่ในบิลด์เดียวกันแล้วผลลัพธ์ต่างกัน ก็ทำเครื่องหมายว่าเป็น flaky build

  • ด้วยวิธีนี้สามารถแยกแยะได้เพียง 25% ของ flaky build ทั้งหมด

ปรับปรุง

  • ใช้วิธีรันใหม่ 3 ครั้ง

    1. ลองใหม่ในโปรเซสเดิม flaky build แบบนี้เกิดจากความไม่แน่นอนของโค้ดหรือ race condition

    2. ลองใหม่ในโปรเซสเดิม แต่เว้นช่วงเวลาไปก่อน flaky build แบบนี้เกิดเมื่อมีการตั้งสมมติฐานเกี่ยวกับเวลาอย่างผิดพลาด

    3. ลองใหม่บนโฮสต์ที่แตกต่างไปโดยสิ้นเชิง flaky build แบบนี้เกิดจากการพึ่งพาลำดับการทดสอบหรือ shared state

ด้วยวิธีนี้จึงสามารถตรวจจับได้อัตโนมัติถึง 90%

การวัดผลกระทบ

เพื่อจัดลำดับความสำคัญ จำเป็นต้องมีวิธีวัดผลกระทบเชิงปริมาณ

ใช้ข้อมูลอย่างบิลด์, แบรนช์, ผู้เขียน, คอมมิต ฯลฯ เพื่อให้คะแนนผลกระทบ ว่าล้มเหลวบ่อยแค่ไหน และส่งผลต่อแบรนช์อื่นหรือผู้พัฒนาคนอื่นมากเพียงใด

หากเกินคะแนนที่กำหนด จะสร้าง issue และมอบหมายให้นักพัฒนาเข้าไปแก้ไขได้

1 ความคิดเห็น

 
ganadist 2020-12-25

ในกรณีของผม มักจะพบ flaky build บ่อยครั้งใน unittest ของ gradle จึงได้ลองใช้โซลูชันด้านล่างนี้ครับ