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

Minseo Chayabanjonglerd
MikkiPastel
Published in
4 min readNov 13, 2020

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

Photo by Paul Cuoco on Unsplash

เรื่องของเรื่อง มาจากบล็อกก่อนหน้านี้ ซึ่งหลายๆคนก็บอกเช่นกันว่าช้า แล้วอีกทีมเขาใช้ 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 ต่างๆอ่านเพิ่มเติมได้ที่

  • 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 ซึ่งข้ามไปก่อนเนอะ

ก็หวังว่าคนติดตาม medium น่าจะได้อ่านอะไรในนี้บ้างเนอะ เพราะเดี๋ยวนี้เราโพสที่เว็บบล็อกของเราหมดเลย ฮ่าๆ

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

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

--

--

Minseo Chayabanjonglerd
MikkiPastel

Android Developer | Content Creator AKA. MikkiPastel | Web2 & Web3 Contributor