ทดลองใช้ Jenkins สำหรับ Android Project จากคนที่ไม่เคยใช้มาก่อน
ในเมื่อน้องจิ้งจอกส้มอินูกิ gitlab รัน CI ช้าดีนัก เลยขอพึ่งพาคุณลุงแล้วกันเนอะ
เรื่องของเรื่อง มาจากบล็อกก่อนหน้านี้ ซึ่งหลายๆคนก็บอกเช่นกันว่าช้า แล้วอีกทีมเขาใช้ Jenkins พอดี เลยขอ access มาลองใช้ดูจ้า
ปล. เราจะเขียนแบบลวกๆไม่ละเอียด ด้วยความที่เราไม่เคยใช้ Jenkins มาก่อน เลย search Google แล้วมาทำตามเนอะ
แนะนำ Pipeline ก่อน
ที่เราใช้ของเดิมมีดังนี้
- install Android : จริงๆมันควรจะเหมือนคอมเราป่ะ ลงทีเดียว แต่ใน gitlab.ci เขียนมือคือลงทุกครั้งโคดขัดใจ ดีที่มี docker ให้ใช้ แต่ก็เสี่ยงเอาอีก
- sync submodule : แล้วแต่โปรเจก
- build : ในที่นี้ใช้
assembleDebug
ว่าเอ้อออที่ push ไปอ่ะ มัน build ผ่านไหม - quality_assurance : พวก ktlint และ lint ต่างๆ ในแง่ code inspection
- test : เอาไว้ run Unit Test ต่างๆ ว่า code ที่ push ไปน้านนน เทสผ่านหม๊ายย
ส่วน release จะไปในเชิง CD ซึ่งขอข้ามไปก่อน เพราะทางเราจะบิ้วแค่วันละครั้ง แต่เราจะรัน CI บ่อยๆเนาะ
มาเริ่มใช้งานคุณลุงกันเถอะ~
ก่อนอื่นเรามาสร้าง workspace โปรเจกใน Jenkins ก่อน ซึ่งเราอ่านตามนี้เนอะ น้องเขาเขียนบล็อกดี เขียนบล็อกละเอียดแล้ว ทำตามได้ไม่ยากเลยจ้า (นอกจากเราจะล่กเอง)
สร้าง workspace
เข้ามาใน Dashboard แล้วจะเจอ tab เยอะๆเนอะ ซึ่งแต่ละ tab จะเรียกว่า View เนอะ แล้วข้างในนั้นจะเป็น workspace เนอะ
เริ่มต้นการสร้าง workspace โดยไปที่ New Item แล้วกรอกชื่อโปรเจกของเรา แล้วเลือก Freestyle project
ถัดไปเราจะใส่ gitlab repository ลงไป ไปที่ Source Code Management เลือก git ใส่ repo link แล้ว Credentials ก็ login gitlab ของเราไป แล้วระบุ branch ที่ต้องการเนอะ
ถ้าไม่มีอะไรผิดพลาด เมื่อสร้างเสร็จ กด Build Now จะได้ลูกบอลสีฟ้าๆเนอะ
trigger ให้บิ้วหลังจาก push (หรืออะไรก็ตามแต่) สำหรับ Gitlab
เนื่องจากโค้ดเราอยู่ที่ Gitlab ดังนั้นเราจะต้องเข้าไปติด plug-in ของ Gitlab โดยไปที่ Manage Jenkins > Manage Plugin แล้วไปที่ tab Available แล้ว search “gitlab” แล้วกดลง ลงเสร็จให้ restart 1 รอบ เมื่อไม่มีใครรันงานอะไรทิ้งไว้แบบออโต้ เพื่อใช้งาน plugin นี้ได้จ้า
เนื่องจากไม่คิดว่าจะต้องเขียนบล็อกเรื่องนี้จริงๆจัง เลยไม่ได้แคปรูปมาเนอะ
จากนั้นกลับไปตั้งค่าต่างๆเพิ่มเติม ดังนี้
Build Triggers
ด้วยความที่ Jenkins ของเราเป็น local เลยไม่สามารถทำแบบนี้ได้ใน Gitlab จ้า
สิ่งที่ทำได้ ซึ่งเราก็ลอกโปรเจกอื่นๆมา ก็คือ การ set cron job จ้า โดยในที่นี้เรากดเลือก Poll SCM แล้วใส่ Schedule ให้มันรันทุกชั่วโมง ในวันทำงานจ้า
ส่วน syntax ต่างๆอ่านเพิ่มเติมได้ที่
https://www.baeldung.com/cron-expressions
Build
Android เราจะต้องทำการ build ผ่าน gradle เนอะ ไป add เพิ่มที่ Build แล้วเลือก Invoke Gradle Wrapper
ดังนั้นเราจะต้องทำการเลือก Use Gradle Wrapper และติ๊ก Make gradlew executable จากนั้นใส่ task ตามความเข้าใจของเราน้านนนนนน ก็คือใส่ส่วน build เข้าไป โดย clean รอบนึงก่อนเผื่อมันแอบเก็บ cache อะไรไว้ ที่ไปส่องมาจะเจอประมาณนี้
clean
assembleDebug
--no-daemon
ผลการทดสอบ พบว่า เหมือนบิ้วบนเครื่องเรา และความเร็วอิชั้นประทับจายมาก
note: เหมือนมันจะ run CI ตอนที่มี commit change มั้งนะ และบิ้วครั้งแรกจะนานหน่อย ครั้งหลังๆจะไวขึ้น
แต่ถ้าโปรเจกดันมี submodule ด้วย ทำยังไงดีนะ?
แน่นอนว่ามันจะไม่สามารถ build ผ่าน เพราะเราไม่ได้นำเจ้า git ของ submodule ลงมาแต่แรกด้วยสิ ลองไปดูใน workspace จะพบแต่ความว่างเปล่า
ก่อนอื่นเราไปหาใน Google ว่าเพิ่มยังไงดีนะ
ไปที่ Source Code Management เจอเจ้า Additional Behaviours กดแอ๊ดดดดดด เลือก Advanced sub-modules behaviours
จากนั้นใส่ git submodule url ที่ช่อง Path of the reference repo to use during submodule update แล้วติ๊กเลือก Recursively update submodules และ Use credentials from default remote of parent repository เพื่อทำการ pull submodule ให้สดใหม่เสมอ
จากนั้นกด build
เอ้ออออ ลืมบอกไปว่า สิ่งที่เราทดสอบต่อไปนี้ ก็คือโปรเจกเดียวกับบล็อกคราวที่แล้วนั่นเองงงง ผลที่ได้ก็คือ
เอ้ออออ มัน failed แบบงงๆแหะ แต่ถือว่าถ้าบิ้วเต็มแล้วน่าจะไวกว่าใช้ gitlab.ci อ่ะ
ส่วนพวก lint หรือ release app จะไปอยู่ใน Post-build Actions ซึ่งข้ามไปก่อนเนอะ
แต่มีอีกวิธีนึงที่ดีกว่ามานำเสนอ ก็คือ run Jenkins pipeline นั่นเอง เพื่อให้เราแยกออกว่า ที่เรา run ไว้ มันตายตรงไหนนั่นเอง
(coming soon จ้า)
download แอพอ่านบล็อกใหม่ของเราได้ที่นี่
ติดตามข่าวสารและบทความใหม่ๆได้ที่
และช่องทางใหม่ใน Twiter จ้า