ทดลองใช้ Jenkins สำหรับ Android Project จากคนที่ไม่เคยใช้มาก่อน

Android Nov 13, 2020

ในเมื่อน้องจิ้งจอกส้มอินูกิ gitlab รัน CI ช้าดีนัก เลยขอพึ่งพาคุณลุงแล้วกันเนอะ

เรื่องของเรื่อง มาจากบล็อกก่อนหน้านี้ ซึ่งหลายๆคนก็บอกเช่นกันว่าช้า แล้วอีกทีมเขาใช้ Jenkins พอดี เลยขอ access มาลองใช้ดูจ้า

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

ปล. เราจะเขียนแบบลวกๆไม่ละเอียด ด้วยความที่เราไม่เคยใช้ 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 ก่อน ซึ่งเราอ่านตามนี้เนอะ น้องเขาเขียนบล็อกดี เขียนบล็อกละเอียดแล้ว ทำตามได้ไม่ยากเลยจ้า (นอกจากเราจะล่กเอง)

ANDROID : Jenkins CI มาทำ Auto build APK กัน แบบละเอียด
หากคุณเป็น Developer
https://blog.nextzy.me/android-jenkins-ci-มาทำ-auto-build-apk-กัน-แบบละเอียด-42b68104414f

สร้าง 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 จ้า

Create a Jenkins Pipeline
“Discover how to create a Jenkins Pipeline page with GitLab’s Jenkins integration”

สิ่งที่ทำได้ ซึ่งเราก็ลอกโปรเจกอื่นๆมา ก็คือ การ 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 ว่าเพิ่มยังไงดีนะ

Git submodules not updating in Jenkins build
I have a submodule in a project in Jenkins. I’ve enabled the advanced setting to recursively update submodules. When I run the build, I see that the workspace has the files from the submodule. The

ไปที่ 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 แอพอ่านบล็อกใหม่ของเราได้ที่นี่

MikkiPastel - Apps on Google Play
First application from “MikkiPastel” on play store beta feature- read blog from https://www.mikkipastel.com by this application- read blog content by chrome custom tab- update or refresh new content by pull to refresh- share content to social network
https://play.google.com/store/apps/details?id=com.mikkipastel.blog

ติดตามข่าวสารและบทความใหม่ๆได้ที่

อย่าลืมกด like กด share บทความกันด้วยนะคะ :)

Posted by MikkiPastel on Sunday, 10 December 2017

และช่องทางใหม่ใน Twiter จ้า

Tags

Minseo Chayabanjonglerd

I am a full-time Android Developer and part-time contributor with developer community and web3 world, who believe people have hard skills and soft skills to up-skill to da moon.