ทำ Jenkins pipeline ใน Android project ของเรากันเถอะ
ทีมมาใช้ Jenkins ในการรัน CI/CD ต่างๆในทีม แต่ด้วยความที่ฝั่ง Android ไม่ได้ทำแบบ pipeline แบบ iOS เราเลยต้องมาศึกษาและหาทำกันจ้า
ทางเราอาจจะไม่ได้อธิบายละเอียดมาก หวังว่าพอเป็นแนวทางในการทำต่อเองได้ และเห็นภาพชัดขึ้นเนอะ
ความเดิมตอนที่แล้ว ...
ก็จะเป็นบล็อกนี้ที่ลองใช้ Jenkins แบบปกติ เพื่อแก้ pain ของการบิ้วใน Gitlab CI นานๆ
ขั้นตอนการ setting ใน Jenkins แบบปกติ คร่าวๆ
- Source code management เพื่อใส่ gitlab repo, credential แล้วก็ branch ที่เราต้องการให้มันทำงาน
- Build Triggers เราจะให้มันเริ่มการทำงาน เมื่อเกิดการเปลี่ยนแปลงอะไร หลักๆก็จะเป็น push event, opened merge request events, approve marge request, comment
- Build Environment ให้ลบ workspace ก่อนเราจะเริ่ม build
- Build เราอยากให้มันทำอะไรบ้าง เราจะเลือก invoke Gradle script แล้วก็ใส่คำสั่ง gradle ต่างๆ ประมาณนี้
clean
build
testDevDebugUnitTestCoverage
--no-daemon
--scan
- Post-build Actions หลัง build อยากให้ทำอะไรต่อ เช่น distribute apk ให้ทีม, test result report, Notifier ต่างๆ เช่น ยิงไป Discord, Slack
ปล. ใน Jenkins จะอยู่ที่ RAM ในเครื่องกลาง ทีมเคยเจอมัน timeout ทั้งๆที่ไม่มีอะไรผิด เพราะ RAM ไม่พอ
ปัญหาก็คือ เมื่อมันบิ้วเสร็จแล้วส่งไป Discord ที่เรารัก ก็จะเจอว่า status เป็น failed แล้วมัน failed จากอะไร? ไปดูใน Jenkins สิ แล้วเราต้องไล่ดูใน Console Output ของ build 273 สิ
หัวหน้าของเราก็เลยป้ายยา เอ้ยย บอก solution ไปว่า ทำ Jenkins Pipeline สิ! จะได้เจอว่ามัน failed ที่ตรงไหน (ถึงเราจะรู้ว่า failed ที่ unit test ก็ตาม)
Jenkins Pipeline คืออะไร?
เป็น plug-in ของ Jenkins เองที่ support การ implement และ integrate ของ CD (Continuous Delivery) ใน Jenkins
โดยการทำ CD (Continuous Delivery) เป็นระบบ automation ที่มี process ในการส่ง software จาก version control ไปยัง user หรือลูกค้าของเรา
ดังนั้นเราจึงสร้างไฟล์ Jenkinsfile
เพื่อทำการสร้าง pipeline ให้รันสิ่งเหล่านี้ได้แบบ automation นั่นเอง โดยสามารถสร้างในตัว workspace เลยก็ได้ หรือ push file นี้เข้า version control ต่างๆของเราได้ด้วยนะ
สร้าง Pipeline Workspace
ก่อนอื่น เรามาสร้าง workspace ใน Jenkins กันก่อน โดยเราจะเพิ่ม New Item กันก่อน
จากนั้นใส่ชื่อ item แล้วเลือกเป็น Pipeline
แล้วใน Pipeline มีอะไรให้ใส่บ้างหล่ะ?
- General อันนี้ไม่ค่อยมีอะไร ก็ติ๊กไปตามนี้
- Build Triggers ติ๊กเหมือนของเดิมได้เลย
- Advanced Project Options อันนี้ยังไม่ต้องทำอะไร
- Pipeline ส่วนสำคัญในวันนี้ เราสามารถใส่ได้ 2 แบบ คือ Pipeline script ที่เราจะเริ่มทำกัน และ Pipeline script from SCM อันนี้เป็นไฟล์
Jenkinsfile
ที่อยู่ใน repository ที่เราต้องการนั่นเอง
ขั้นตอนการเขียน Pipeline script
ก่อนอื่นมา analyze กันก่อนว่า pipeline นี้ของเราจะมีประมาณนี้
- Checkout : ทำการ checkout git repository โปรเจกต์ของเรา ใน branch ที่เราต้องการ
- Clean : clean ก่อนแล้วกัน
- Build : ทำการ build apk ขึ้นมาเพื่อส่งเทส จะบิ้วเป็น aab ก็ได้ เปลี่ยนจาก
assembleDevDebug
เป็นbundleDevDebug
นั่นเอง หรือจะบิ้วทั้งสองอันก็ได้แหละ ที่เป็น debug เผื่อ tester เจอบัคอะไรแปลกๆก็เสียบบิ้วดู log ได้เลย - Test : ช่วยรัน Unit Test พร้อม report ให้หน่อยน้า
- SonarQube : อ่ะช่วยรัน SonarQube เพื่อตรวจสอบคุณภาพโค้ดของเราด้วยนะ แต่อันนี้อาจจะต้องไป config อะไรใน server ก่อน วิธีการอยู่ที่ reference ข้างล่างนะ
- distribute : ทำเสร็จแล้ว ช่วยให้คุณลุงส่งไปบอก Discord หน่อยว่าทำงานเสร็จแล้วนะหลานๆ
จากนั้นไปดู Pipeline syntax กันว่ามีอะไรบ้างเนอะ
agent
: รันผ่าน agent อะไร สำหรับ Android ให้ใส่ any ไม่งั้นมันจะทำงานไม่ได้จ้าstage
: ตรงนี้เราจะให้ pipeline ทำงานขั้นตอนอะไร เช่นBuild
,Test
,Deploy
ทั้งหมดจะถูกครอบด้วยstages
steps
: ใน stage นี้ เราจะให้มันทำงานอะไรบ้าง- ทั้งหมดจะถูกครอบด้วย
pipeline
อีกที
และอันนี้ก็คือ สคริปที่เราใช้นั่นเอง
.
แล้วเราใส่ ktlint ลงไปด้วยนะ สามารถอ่านเพิ่มเติมได้ที่นี่เลย
เมื่อเรา config อะไรต่างๆเรียบร้อยแล้ว ก็จะกลับมาหน้าหลักของ pipeline กด Build Now เพื่อทำการ run pipeline
สุดท้าย ถ้า Unit Test ไม่ failed และรัน SonarQube สำเร็จ ก็จะเขียวแบบนี้แหละจ้า
และตอนที่ลุงแจ้งเตือนมาก็จะเป็นแบบนี้ เย้ๆ
แต่ถ้า test failed ที่ขั้นตอนใดขั้นตอนนึง มันไม่ทำงานขั้นตอนต่อไปเลย มันจะจบงานเลยนะ
ปัญหาที่พบเจอ คือ มันไม่สามารถรันสคริปทุกครั้งที่มีการ push code อ่ะ ต้องกดมืออย่างเดียวหน่ะสิ
เพิ่ม webhook ให้ pipeline ทำงานทุกครั้งที่ push code
ไปที่โปรเจกต์ pipeline ของเรา กดที่ Configure -> Build Triggers เลื่อนลงมาหน่อยกดปุ่ม Advanced... เลื่อนลงไปจะเห็นช่อง Secret token ให้กดปุ่ม Generate เราก็จะได้ Secret token
เอาไปใช้ต่อ
จากนั้นต้องไปเพิ่ม webhook ที่ Android project บน Gitlab ของเรากันก่อนเนอะ โดยไปที่โปรเจกต์ของเรา เลือก Setting -> Webhook สิ่งที่เราต้องใส่ก็จะมี
- URL : ใส่ link ประมาณนี้
https://{host}/project/{project_name}/
- Secret token : เอาจากใน Jenkins ที่เราได้เมื่อกี้มาใส่
- Trigger : เราอยากให้ส่ง event อะไรไปบอกลุง เราก็จะเลือก Push events กับ Merge request events
จริงๆ Jenkins มี UI ที่เราสามารถดู report อะไรต่างๆได้ง่าย โดยการลง plug-in ที่ชื่อว่า Blue Ocean ตามบล็อกนี้เลย
เราสามารถคลิกที่ "Open Blue Ocean" เพื่อไปที่หน้าของ Blue Ocean ได้เลย โดยจะมี url เป็น <server_url>:<port>/blue
เมื่อ pipeline ของเรากำลังทำงานจะเป็นหน้าตาประมาณนี้
ถ้าผ่าน ก็จะเป้นสีเขียว ติ๊กถูกมุมซ้าย ถ้าไม่ผ่านเป็นสีแดง กากบาทมุมซ้าย
และถ้าเทสผ่าน สามารถเข้าไปดูแต่ละ test case ได้เลย ถ้าไม่ผ่านก็ดูไม่ได้อ่ะงง
ทั้งหมดก็จะประมาณนี้แหละ
Reference :
- อันนี้อ่านตามแล้วค่อนข้าง work นะ ลองอ่านเพิ่มเติมกันได้
- อันนี้ของทาง Jenkins เอง หน้าตาของเขาสวยกว่าเพราะใช้ Blue Ocean for Jenkins Pipelines
- document Jenkins Pipeline
- อันนี้เชื่อมต่อกับ SonarQube
เพิ่มเติม
- บทความติดดาว สำหรับอยากให้แอพที่เรา build มาแล้ว ขึ้น Firebase App Distribution
- อันนี้สำหรับบิ้วหลายๆ branch มันแยก branch ให้เราได้เลย
ถ้าท่านใดอ่านแล้วมีเพิ่มเติมสามารถมากระซิบได้เน้อ เพราะ software เป็นสิ่งที่ไม่มีวันสร้างเสร็จ pipeline ของเราก็เช่นกัน //เดี๊ยวววว
กด follow Twitter เพื่อได้รับข่าวสารก่อนใคร เช่น สปอย content ใหม่ หรือสรุป content เร็วๆในนี้จ้า
ติดตามข่าวสารและบทความใหม่ๆได้ที่
Subscribe ช่อง YouTube ของเราได้ที่
download แอพอ่านบล็อกใหม่ของเราได้ที่นี่