สร้างสภาพแวดล้อมการพัฒนาซอฟแวร์แบบ Continuous Integration (CI) โดยใช้ Jenkins แบบ .NET กันเถอะครับ…

สวัสดีครับ

บทความนี้ ผมจะมาแสดงการสร้างสภาพแวดล้อมการพัฒนาซอฟแวร์แบบ Continuous Integration (CI) โดยเลือกใช้ Jenkins มาเป็น build server

ส่วนตัวซอฟแวร์ ที่เป็น ผลิตภัณฑ์ของผมจะใช้ .NET Framework โดยใช้ภาษา C# เป็นตัวอย่างเครื่องมือพัฒนาครับ

ผมขออธิบาย Continuous Integration ก่อน ต่อไปนี้จะเรียกมันย่อๆว่า CI

CI คือ วิธีการปฏิบัติ โดยมันจะนำ code ของสมาชิกทุกคนในทีม มา build รวมกัน อย่างสม่ำเสมอในหลายครั้งต่อวัน แต่ละครั้งที่ build รวมกัน มีการตรวจสอบความถูกต้องของ code และ จะมีการทดสอบ code ทุกส่วนรวมกันด้วย แบบอัตโนมัติ

ในขณะที่ทุกคนในทีมพัฒนาเขียน code เพิ่มขึ้นมา CI จะนำ code เหล่านั้นมารวมกันตลอดเวลา แล้วก็ build และ test เมื่อเกิดข้อผิดพลาด CI จะแจ้งบอกให้สมาชิกในทีมทุกคนรับรู้ สมาชิกในทีมก็จะดำเนินการแก้ไขให้ถูกต้องได้ในทันที

ซึ่งวิธีการปฏิบัติ CI นี้จะลดปัญหาที่จะเกิดขึ้นในขั้นตอนการรวม code ของทีมพัฒนาทั้งหมด แล้วก็ build มันช่วยตรวจสอบว่า code ทั้งหมดของเราเขียนถูกต้อง compile ผ่านหมดหรือไม่ ถือเป็นการทดสอบขั้นแรกได้ ส่วนขั้นที่สองก็คือจะ run case ทดสอบสิ่งที่ compile ออกมา เนื่องจากมันทำงานเป็นขั้นตอนเองโดยอัตโนมัติ ดังนั้นเราจึงได้ผลิตภัณฑ์ที่พร้อมส่งมอบให้ลูกค้าใช้ประโยชน์ได้อยู่ตลอดเวลาของการพัฒนา

สำหรับ CI กระบวนการ build หนึ่งครั้งประกอบไปด้วย compile code ทั้งหมด, เตรียมข้อมูล database, test ในแต่ละระดับ (unit, integrate, acceptance), code analysis (static, dynamic) และ deploy พร้อมส่งมอบ หรือ user acceptance อยู่เสมอ

ดังนั้น การทำ CI จึงเสมือนว่าเรามีสภาพแวดล้อมการพัฒนาซอฟแวร์ ที่ทีมสามารถ build ผลิตภัณฑ์ที่พร้อมใช้ประโยชน์ได้อยู่เสมอ นั่นเอง

เอาละ เรามาลงมือทำ CI ให้เป็นจริงกันดีกว่า

ติดตั้งเครื่องพัฒนาก่อน

หลังจากสมัคร Github เสร็จแล้ว คุณอาจจะสร้าง repository ของคุณไว้เอง ชื่ออะไรก็ได้ แต่สำหรับตัวอย่างนี้ ผมสร้างไว้แล้ว ที่ https://github.com/chavp/hello-lib

หลังจากติดตั้ง Visual Studio สำหรับเขียน code พัฒนาซอฟแวร์, Jenkins สำหรับจัดการเรื่อง build และ มี Github สำหรับเก็บ code ที่เขียนแล้ว ต่อจากนี้ไปนี้ผมจะนำเสนอไปทีละขั้นตอน โดยไม่ขออธิบายค่าต่างๆ เดี๋ยวบล็อกจะยาวเกินไป ผู้อ่านทำตามผมไปก่อนนะครับ

ติดตั้ง Jenkins plugin Git

  • ไปที่ หน้าแรกที่ menu ด้านซ้ายมือ กด Manage Jenkins -> Manage Plugins ตามภาพ pic-8
  • ที่ tab Available ที่ช่อง Filter ใส่คำว่า git แล้วเลือก Git plugin ครับแล้วกด Install
  • ติดตั้ง Git plugin เสร็จ ไปตั้งค่า Manage Jenkins -> Configuration System ไปที่ส่วน Git ตั้งค่า Git client path ถ้ามี ตามภาพ  pic-2
  • Configure System  อีกจุด ไปที่ Git plugin ใส่ชื่อตัวเอง และ email ที่สมัคร github ไว้ ตามภาพ  pic-3
  • เสร็จแล้ว กด Save ครับ

ขั้นตอนนี้ เรามาทดสอบ Clone source code จาก github ด้วย jenkins กันก่อน

  • ไปที่ Jenkins เลือก New Item เพื่อสร้าง job ใส่ข้อมูลและเลือก ตามภาพ pic-4
  • ที่ Source Code Management เลือก git แล้วใส่ข้อมูล ตามภาพ pic-5
  • ออกไปข้างนอก ลองกด run job ดูครับ ถ้า run job สำเร็จจะ สถานะจะเป็นบอลสีน้ำเงิน ตามภาพ pic-6
  • ไปดูที่ folder ที่เราติดตั้ง Jenkins ไว้ ตัวอย่างของผมอยู่ที่ C:\Program Files (x86)\Jenkins\jobs\hello-lib\workspace จะแสดง source file ที่ clone มาจาก
    hello-lib เรียบร้อยแล้ว ตามภาพ pic-7

ทีนี้มาถึงขั้นตอน Build solution โปรเจ็ค hello-lib ด้วย job ที่สร้างไว้แล้วก่อนหน้านี้ กันต่อ

ติดตั้ง jenkins plugin MSBuild

  • เหมือนเดิมครับ ไปที่ Manage Jenkins -> Manage Plugins (ดูภาพเดียวกับติดตั้ง Git plugin)
  • ที่ tab Available ค้นหา MSBuild แล้วเลือก กด install ดูภาพ pic-9
  • ติดตั้งเสร็จ ต้องไป config MSBuild ไปที่ Manage Jenkins -> Configure System ดูภาพ pic-10
  • ที่ส่วนของ MSBuild กด Add MSBuild แล้วตั้งค่า cofig ดังภาพ pic-11
  • เสร็จแล้ว กด Save ครับ

เมือติดตั้ง Jenkins plugin MSBuild และ config เป็นที่เรียบร้อยแล้ว ก็กลับไปที่ job hello-lib เพื่อเพิ่มขั้นตอน build code กันครับ

เพิ่มขั้นตอน compile code ให้ Job hello-lib

  • ไปที่ job hello-lib เลือก Configure
  • ไปที่ Jenkins หน้าแรก click ที่ job hello-lib จะไปอีกหน้าหนึ่ง แล้ว click ที่ Configure
  • ไปที่ส่วนของ Build กด Add build step > Build a Visual Studio project or solution using MSBuild แล้ว config ตามภาพ pic-12
  • กด save ครับ

ทีนี้พอเราทดลองกด run build job นี้อีกที นอกจากเราจะได้ source code ใหม่ที่ clone/pull มาจาก github แล้ว job นี้ก็ยังทำการ compile code ให้เราอีกด้วย ลองไปดูที่ folder HelloLib.Test จะเห็นว่าเราจะได้ folder bin เพิ่มขึ้นมา ในนั้นก็คือ compile file ทั้งหมดของเราครับ ดูภาพ pic-13

ให้ลองลบ File ทั้งหมดใน folder \Jenkins\jobs\hello-lib\workspace แล้ว run build job นี้ใหม่ดูอีกครั้งครับ …

เอาละเราได้ automate build ที่สามารถ compile code ให้เราได้แบบอัตโนมัติแล้วละครับทีนี้ ขั้นต่อมาถึงขั้นตอน พัฒนาซอฟแวร์กัน

ผมจะนำเสนอเทคนิคที่เรียกว่า Test-Driven Development (เรียกย่อๆว่า TDD) โดยผลลัพย์ขั้นสุดท้ายของเรา ต้องเข้าในกฏเพียง 2 ข้อ ก็คือ

  • code ต้องมี automate test
  • code ต้องไม่ซ้ำซ้อนกัน

และ ขั้นตอนการทำ TDD มี 3 ขั้นตอน ก็คือ

  • เขียนทดสอบผลลัพย์ที่ต้องการให้เกิดความล้มเหลว เรียกขั้นตอนนี้ว่า Red
  • เขียน code ที่ทำให้ได้ผลลัพย์ที่ต้องการ ที่ทดสอบผ่านทั้งหมด เรียกขั้นตอนนี้ว่า Green
  • ปรับปรุงแก้ไข code ไม่ให้ซ้ำซ้อนกันเลย เรียกขั้นตอนนี้ว่า Refactor

จากกฎบังคับของ TDD ข้อแรก คือผลลัพย์จะต้องมี automate test แต่ตอนนี้ผมมีแต่ automate build ที่แค่ compile code ได้แล้ว
งานต่อมาผมจะต้องเพิ่มขั้นตอน test เข้าไปที่ build job ของผม

ดังนั้น ขั้นตอนต่อมาผมจะต้องติดตั้ง automate test ให้ Jenkins เพิ่มเข้าไปครับ

ติดตั้ง Jenkins plugin VsTestRunner และ MSTest (ใช้แสดง test report)

  • ไปที่ Manage Jenkins -> Manage Plugins
  • ที่ tab Available ค้นหา VsTestRunner แล้วเลือก VsTestRunner และ MSTest ด้วยครับ กด install ดูภาพ pic-14
  • พอเรากด install แล้ว ให้เรา check เลือก Restart Jenkins when … ตามภาพ pic-15
  • พอติดตั้งเสร็จ ก็กลับไปที่ Manage Jenkins -> Configuration System ไปที่ส่วนของ VSTest กด Add VSTest แล้ว config ตามภาพ pic-16

เพิ่มขั้นตอน test ให้ job build hello-lib

  • กลับไปที่ job build hello-lib ครับ ไปที่ Configure กด Add build step เพิ่ม automate test
  • ใส่ข้อมูล config ตามภาพ pic-17
  • ไปที่ส่วนของ Post-build Action กด Add post-build action
  • เพิ่ม step action Publish MSTest test result report แล้ว config ตามภาพ pic-18
  • กด save ครับ

ลองกลับไปกด build job hello-lib ดูครับ ถ้า build สำเร็จ จะปรากฏ folder TestResults นั่นหมายความว่าเรามี automate test แล้วครับ ดูภาพ

pic-19

(ดูจากภาพ ผม build ไปหลายรอบแล้วครับ เพราะว่า config ผิดไปหลายครั้ง ก่อนจะเขียนที่ถูกต้องมานำเสนอนี้ได้ 🙂

ทีนี้เราก็พร้อมทำ TDD กันได้แล้วล่ะ

กลับไปที่ Visual Studio ที่ project HelloLib.Test ครับ ผมขอไม่เปลี่ยนชื่อ class default ใดๆที่เครื่องมือตั้งมาให้แต่แรกนะครับ

ผมจะเริ่มจากขั้นตอน Red โดยการเขียนทดสอบผลลัพย์จากงานง่ายๆ โดยผลลัพย์ที่ต้องการคือ คำว่า Hi แล้วตามด้วยชื่อ ที่ใส่เข้าไปครับ ดูภาพ

pic-20

หลังจากนั้นผม push code นี้ขึ้น github เพื่อทดสอบ automate test ของผมก่อนนะครับ

พอ push code ขึ้น github สำเร็จ แล้วลอง กด build job อีกครั้ง … จะเป็น build ที่ผิดผลาดแล้ว ดูภาพข้างล่างนี้ ตามลำดับ

pic-21

pic-22

รูปที่ 2 ด้านบน ที่กราฟด้านซ้าย แกนตั้งแสดงจำนวน test case ส่วนแกนนอนแสดง ครั้งที่ build ครับจะเห็นว่ากราฟเป็นสีแดง ซึ่งแน่นอนว่า มีข้อผิดผลาดเกิดขึ้น 1 case ที่ผมเขียนไว้

เอาละก่อนที่เราจะไปแก้ไข code ให้อยู่ในขั้นตอน Green ต่อไป ผมรู้สึกขึ้เกียจจะกลับมา กด build job เองแล้ว
ซึ่งผมอยากให้มันทำงานให้ผมเองแบบอัตโนมัติ ก็ไม่ยากเลยครับ กลับไปที่ job hello-lib ครับ ไปที่ Configure ตรงส่วน Build Triggers เลือก Build periodically ผมตั้งให้  job ถูก run ทุกๆ 3 นาทีครับ ตามภาพ

pic-23

ตั้งค่าเสร็จอย่าลืมกด save ครับ ต่อไปผมก็ไม่ต้องมาคอยกด build job ด้วยตนเองอีกแล้ว สบายใจ

ผมเห็นว่าผลลัพย์จากการ build ไม่ค่อยเท่เท่าไหร่ มันควรจะต้องเป็นอะไรที่ชัดเจน เข้าใจง่ายมากกว่านี้

ในกรณีที่ทำงานหลายๆโครงการ หลายๆคน ผมก็อยากให้ทุกคนหลังจากพัฒนา code เสร็จ เมื่อ push code ของตนเองขึ้นไปรวมกันบน github แล้วแสดงข้อผิดพลาดให้เห็นชัดๆ ง่ายๆ เพื่อดำเนินการแก้ไขได้ทันที
ผมแนะนำ การแสดงผลที่ชัดเจน และอ่านง่ายเป็นกระดานการ์ด ด้วย Jenkins plugin eXtreme Feedback Panel Plugin ครับ

ติดตั้ง eXtreme Feedback Panel Plugin

  • ไปที่ Manage Jenkins -> Manage Plugins
  • ที่ tab Available ค้นหา xfpane แล้วเลือก กด install ดูภาพ pic-24
  • เหมือนเดิมครับให้ check restart jenkins หลังจากติดตั้งเสร็จ

หลังจากติดตั้งเสร็จ ให้เปิดใช้กระดาน eXtreme Feedback Panel โดยไปที่หน้าแรก แล้วกด + ที่แทบใกล้ All job ครับ ดูรูป

pic-25

กด + แล้วจะมี eXtreme Feedback Panel ให้เลือก ตั้งชื่อ แล้วกด Ok ตามภาพ

pic-26

จะไปหน้าให้ configure ที่ Job options ผมเลือก hello-lib ถ้าเรามี job มากกว่านี้มันก็จะแสดงให้เลือกครับ
กด OK ครับ จะแสดง หน้า กระดานเท่ๆ (รึเปล่า) แบบรูปนี้

pic-27

ถ้าต้องการ แก้ไขการแสดงผล eXtreme Feedback Panel ให้ไปที่ url ของกระดานนะครับแล้ว เติม /configure
เช่นตัวอย่างนี้ไปที่ http://localhost:8080/view/my-eXtreme/configure ก็จะกลับไปที่หน้า config อีกครั้งได้

OK พร้อมแล้วครับ กลับไป พัฒนา code ของเราต่อ เพื่อเปลี่ยนสถานะจาก Red เป็น Green ได้

ไปที่โปรเจ็ค HelloLib.Test ของเราต่อครับ แก้ไข code ให้ทดสอบทำงานได้ผลลัพย์ถูกต้อง ให้อยู่ในขั้นตอน Green ตามภาพ

pic-28

เสร็จแล้วให้ push code ขึ้น github เดิม แล้วรอสักพัก ที่หน้า eXtreme Feedback Panel จะแสดงเหมือนผมแบบนี้ครับ ตามภาพ

pic-29

ตอนนี้เราก็อยู่ในขั้นตอน Green แล้วครับผม

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

ขอบคุณครับ
#:P

อ่านเพิ่มเติม

Advertisements

#net, #agile, #continuous-integration, #jenkins, #tdd, #xp