ทำ Jenkins pipeline ใน Android project ของเรากันเถอะ

Android Jan 21, 2022

ทีมมาใช้ Jenkins ในการรัน CI/CD ต่างๆในทีม แต่ด้วยความที่ฝั่ง Android ไม่ได้ทำแบบ pipeline แบบ iOS เราเลยต้องมาศึกษาและหาทำกันจ้า

ทางเราอาจจะไม่ได้อธิบายละเอียดมาก หวังว่าพอเป็นแนวทางในการทำต่อเองได้ และเห็นภาพชัดขึ้นเนอะ

ความเดิมตอนที่แล้ว ...

ก็จะเป็นบล็อกนี้ที่ลองใช้ Jenkins แบบปกติ เพื่อแก้ pain ของการบิ้วใน Gitlab CI นานๆ

ทดลองใช้ Jenkins สำหรับ Android Project จากคนที่ไม่เคยใช้มาก่อน
ในเมื่อน้องจิ้งจอกส้มอินูกิ 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 ลงไปด้วยนะ สามารถอ่านเพิ่มเติมได้ที่นี่เลย

เริ่มทำ Code Review ด้วย ktlint กันเถอะ
เนื่องด้วยทำงานบริษัท startup ที่เปลี่ยนแปลง requirement ได้บ่อย จนเดฟไม่มีเวลาทำ Unit Test แล้วไม่รู้จะทำ Code Review ยังไงอีก อ่ะงั้นเราค่อยๆเริ่มทำสักอย่างก็แล้วกัน

เมื่อเรา 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 ตามบล็อกนี้เลย

Blue Ocean
Jenkins – an open source automation server which enables developers around the world to reliably build, test, and deploy their software

เราสามารถคลิกที่ "Open Blue Ocean" เพื่อไปที่หน้าของ Blue Ocean ได้เลย โดยจะมี url เป็น <server_url>:<port>/blue

เมื่อ pipeline ของเรากำลังทำงานจะเป็นหน้าตาประมาณนี้

ถ้าผ่าน ก็จะเป้นสีเขียว ติ๊กถูกมุมซ้าย ถ้าไม่ผ่านเป็นสีแดง กากบาทมุมซ้าย

และถ้าเทสผ่าน สามารถเข้าไปดูแต่ละ test case ได้เลย ถ้าไม่ผ่านก็ดูไม่ได้อ่ะงง

ทั้งหมดก็จะประมาณนี้แหละ

Reference :

  • อันนี้อ่านตามแล้วค่อนข้าง work นะ ลองอ่านเพิ่มเติมกันได้
BUILD ANDROID APPLICATION WITH JENKINS PIPELINE
Most of the organizations in the recent world are using Jenkins as a great tool for automating build processes, continuous integration…
https://medium.com/appgambit/build-android-application-with-jenkins-pipeline-9e2f6667bae1
  • อันนี้ของทาง Jenkins เอง หน้าตาของเขาสวยกว่าเพราะใช้ Blue Ocean for Jenkins Pipelines
Moving from buddybuild to Jenkins for Android Developers
Jenkins – an open source automation server which enables developers around the world to reliably build, test, and deploy their software
https://www.jenkins.io/blog/2018/01/08/moving-from-buddybuild-for-android/
  • document Jenkins Pipeline
Pipeline
Jenkins – an open source automation server which enables developers around the world to reliably build, test, and deploy their software
  • อันนี้เชื่อมต่อกับ SonarQube
Add SonarQube quality gates to your Jenkins build pipeline
SonarQube is an excellent tool for measuring code quality, using static analysis to find code smells, bugs, vulnerabilities, and poor test coverage. Rather than manually analysing the reports, why not automate the process by integrating SonarQube with your Jenkins continuous integration pipeline? Th…
GitHub - tkgregory/sonarqube-jacoco-code-coverage: Accompanying repo to tutorial on how to apply the Jacoco plugin to your project and run a SonarQube scan to generate a code coverage report
Accompanying repo to tutorial on how to apply the Jacoco plugin to your project and run a SonarQube scan to generate a code coverage report - GitHub - tkgregory/sonarqube-jacoco-code-coverage: Acco...

เพิ่มเติม

  • บทความติดดาว สำหรับอยากให้แอพที่เรา build มาแล้ว ขึ้น Firebase App Distribution
Setting up Firebase App Distribution With Automatic Builds from Jenkins
Are you currently using Fabric Beta and wondering how to migrate to Firebase App Distribution using Jenkins Pipeline and allow builds to…
https://medium.com/velos/setting-up-firebase-app-distribution-with-automatic-builds-from-jenkins-2587028e2a3a
  • อันนี้สำหรับบิ้วหลายๆ branch มันแยก branch ให้เราได้เลย
Jenkins Pipeline for Mobile Testing – Nimble
Step-by-step guide on how to configure and execute a CI/CD pipeline on a dockerised Jenkins server.

ถ้าท่านใดอ่านแล้วมีเพิ่มเติมสามารถมากระซิบได้เน้อ เพราะ software เป็นสิ่งที่ไม่มีวันสร้างเสร็จ pipeline ของเราก็เช่นกัน //เดี๊ยวววว


กด follow Twitter เพื่อได้รับข่าวสารก่อนใคร เช่น สปอย content ใหม่ หรือสรุป content เร็วๆในนี้จ้า

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

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

Posted by MikkiPastel on Sunday, 10 December 2017

Subscribe ช่อง YouTube ของเราได้ที่

mikkicoding
Android Developer & Content Creator
https://www.youtube.com/channel/UCtGbMSe4i7NJiKQ271Fezcg

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

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.