มาใช้ CircleCI กับ Android กัน

Jedsada Tiwongvorakul
20Scoops CNX
Published in
3 min readJul 19, 2018
https://goo.gl/atCttT

สวัสดีครับผม,,, ไม่เสียเวลาเลยละกัน วันนี้ผมจะมาแชร์ประสบการณ์หลังจากการใช้เจ้าตัว CircleCI มาเป็นระยะเวลาสักพักใหญ่ๆ ว่ามันดียังไง เร็วกว่าตัวไหนบ้าง และที่สำคัญที่สุดเลยคือ มันตั้งค่ายังไง สำหรับโปรเจ็ค Android ไปลุยกันเลยดีกว่า 🚀

ถ้าใครยังไม่รู้ว่า Continuous Integration คืออะไรสามารถเข้าไปศึกษาเพิ่มเติมจากด้านล่างนี้ได้เลยครับผม 👇

และจากที่ผมเคยลองใช้ Tools CI มาหลายตัวไม่ว่าจะเป็น Jenkins (local host), Travis-CI, Bitrise, Buddy Build และแม้กระทั่ง Gitlab-CI ก็ยังมีความคิดที่ว่ามันยังไม่เร็วพอ ว่ากันง่ายๆ คือยังไม่โดนใจวัยรุ่น เพราะผมเป็นวัยรุ่นหัวร้อน ฮ่า ฮ่า ฮ่า

สุดท้ายก็ได้เจอ CircleCI เหมือนเจอแสงสว่างปลายอุโมงค์ (โคตรเว่อร์) เพราะว่ามันเร็วกว่า Tools อื่นๆ ที่ผมเคยเล่นมาจริงๆ นะ อันนี้นับจังหวะ unittest และ deploy แล้วนะครับ ปัจจุบัน Tools เหล่านั้นอาจจะเร็วขึ้นมาแล้วก็ได้นะอันนี้ไม่ชัวร์ เพราะไม่ได้กลับไปแตะอีกเลย หรืออีกเหตุผลหนึ่งคือผมอาจจะตั้งค่าไม่ 100% ก็เป็นได้…

อันนี้เป็นตัวอย่าง Build Time ในการเปรียบเทียบระหว่าง Travis-CI กับ CircleCI ในโปรเจ็คเดียวกันนะครับ

Build Time ของ Travis-CI
Build Time ของ CircleCI

จากผลลัพธ์ด้านบนจะเห็นได้ว่า Travis-CI ใช้เวลาประมาณ 7 นาที กับอีก 42 วินาที แต่กับ CircleCI ใช้เวลาไปประมาณ 3 นาที 24 วินาที คือประหยัดเวลาลงมาราวๆ 50% เลยนะครับ อันนี้ผมจะพูดว่า CircleCI ดีกว่า เร็วกว่า ก็พูดได้ไม่เต็มปาก เพราะอย่างที่บอกแหละ อาจจะเป็นเพราะผมตั้งค่า Travis-CI ไม่ดี แต่ภาพมันฟ้องอยู่แล้ว

และมันเป็นสาเหตุที่ผมหันมาใช้ CircleCI ลุกไปเข้าห้องน้ำกลับมาก็เสร็จละ เพราะถ้าใครเป็น Android Developer อยู่แล้วคงเข้าใจ pain point กับ build time มากพอ เอาล่ะไปดูวิธีการตั้งค่า CircleCI กับโปรเจ็คกันดีกว่า ฟังผมโม้มายาวเกินไปละ

Step 1 : ทำการสมัครสมาชิกกับ CircleCI โดยเข้าจากลิงค์ด้านล่างนี้ได้เลยครับ

จากนั้นก็ให้เลือกเป็น Plan เป็น Linux Plan แบบฟรีก่อนนะครับ

Step 2 : ทำการสร้างโฟลเดอร์ที่ชื่อว่า .circleci ไว้ที่ root ของโปรเจ็ค และทำการสร้างไฟล์ที่ชื่อว่า config.yml ที่มีคำสั่งตามด้านล่างนี้

ณ จุดนี้ผมคิดว่าคงไม่ต้องอธิบายเพิ่มเติมแล้วเพราะทุกอย่างในไฟล์ config.yml ทุกท่านอ่านแล้วคงจะเข้าใจ แต่จะขอเน้นย้ำไปที่ tag ที่ชื่อว่า docker สักหน่อยเพราะมันเป็นการโหลด Environment ต่างๆ ที่ใช้ในการ build โปรเจ็ค เช่น build-tools ของ Android อันนี้สำคัญเพราะจำเป็นต้องตรงกับช่วงที่เราตั้งค่าไว้ในโปรเจ็ค

ซึ่งสามารถเข้าไปดูได้ว่าตัวของ CircleCI รองรับเวอร์ชั่นอะไรบ้าง จากด้านล่างนี้เลย

Step 3 : อย่าลืมทำการ push code ขึ้นบน remote repository นะครับ 😂

Step 4 : ทำการกลับไปเพิ่ม project ใน CircleCI ดังภาพด้านล่างนี้

ก็ให้ทำการกดปุ่ม Set Up Project ก็จะเจอหน้าให้เลือก OS ของเครื่องที่จะ build ก็ให้ทำการเลือกเป็น Linux แต่จะเห็นได้ว่ามี macOS ด้วยหมายความว่า build iOS ได้ด้วยนะครับ

จากนั้นก็ให้ Scroll ลงมาเพื่อทำการ Build Project ของเรา

โดยทำการกดปุ่ม Start building ได้เลย… 💥 💥 💥

จังหวะนี้ลุกไปเข้าห้องน้ำก่อนได้เลยครับ อาจจะนานหน่อย เพราะเป็นครั้งแรก ซึ่งยังไม่มีการเก็บ cache นะครับ พอเสร็จแล้วก็กลายเป็นแบบนี้

ใช้เวลาไปประมาณ 3 นาที กับอีก 0.5 วินาที จากนั้นก็ให้ทำการ Scroll ลงมาด้านล่างเพื่อดูรายละเอียดของงานต่างๆ ว่าในแต่ละงานใช้เวลาไปเท่าไร

ซึ่งโปรเจ็คที่ผมนำมาเป็นตัวอย่างเป็นโปรเจ็คเปล่านะครับ อย่าตกใจไป! ยังไม่จบให้ทุกท่านลองกด Rebuild อีกรอบนะครับเพื่อดูว่าหลังจากที่เราเก็บ cache ต่างๆ ไว้แล้วเนี่ยมันจะช่วยลดเวลาลงไปได้อีกเท่าไรกัน…

ตูมมมม!!! ไม่ถึงนาที โอ้แม่เจ้า และผมอยากจะให้ทุกท่านได้เห็นข้อดีอีกอย่างของ CircleCI นั่นก็คือ การเก็บ Artifacts นั้นเองโดยให้เลือกไปที่เมนู Artifacts ก็จะเจอแบบนี้

ซึ่งสามารถเอาลิงค์ของไฟล์ APK ไปให้เพื่อนในทีมไปดาวน์โหลดกันได้เลย หรือถ้าเรามี report test ก็จะขึ้นตรงนี้เลยนะครับ ก็เป็นอันเสร็จสิ้นสำหรับการตั้งค่า CircleCI สำหรับในการ build โปรเจ็ค Android แล้วนะครับ

ข้อดีของ CircleCI

  1. ฟรีทั้ง Repository ที่เป็นแบบ Public และ Private (Github นะครับ ตัวอื่นผมไม่เคยลอง) มีเวลาในการ build ต่อเดือนให้ 1,500 นาที กี่โปรเจ็คก็ได้
  2. รวดเร็วทันใจวัยรุ่น หัวร้อนอย่างผม 🔥
  3. ติดตั้งง่ายถ้าเทียบกับ Gitlab-CI ฮ่า ฮ่า ฮ่า อันนี้ส่วนตัวล้วนๆ
  4. Fixable กว่าตัวที่เคยเล่นมาถ้าจะใช้ Fastlane ควบคู่ไปด้วย ยกเว้น Bitrise กับ Buddy Build เพราะสองตัวนี้มีตัวทำ CD มาให้เลยส่วน Jenkins อันนี้ไม่นับ
  5. อันนี้ยังคิดไม่ออก เพราะแค่ 4 ข้อข้างบนก็เพียงพอสำหรับผมแล้ว

ข้อจำกัดของ CircleCI

อันนี้เขียนออกมาเป็นข้อๆ ยากหน่อย ผมเลยจะขอพูดรวมๆ ละกันนะครับ เท่าที่ผมใช้มาสักพักใหญ่เจอปัญหาเลยก็คือ เวลาผม PR มันชอบเอา status build จาก commit ล่าสุดมาให้ ซึ่งมัน build อะผ่าน แต่ condition ของการ PR ไม่มาเพราะผมได้ตั้งค่าไว้ว่าถ้า PR เข้า Branch develop หรือ master ต้องทำ 1 2 3 ด้วยก่อน เป็นการตั้งไว้เฉพาะการ PR เท่านั้น

วิธีแก้ก็คือต้องเข้าไปกด rebuild ใหม่มันถึงจะมองว่าเป็นการ PR หรือต้องทิ้งช่วงไว้สักพักก่อนค่อย PR อันนี้ งง อยู่ยังหาวิธีแก้กันต่อไป แต่เอาจริงๆ คือไม่เสียหายอะไรมากมายอะไรขนาดนั้น

และอันสุดท้ายที่น่าจะเป็นปัญหาของหลายๆ คนคือ Concurrent Job ซึ่งถ้าแบบฟรีได้ job เดียว ถ้าหากอยากได้เพิ่มก็เสียตังค์เท่าที่ดูมาก็แพงใช่เล่น ยิ่งเป็น macOS ยิ่งโคตรจะแพง แต่ส่วนตัวผมไม่เป็นปัญหานะ เพราะมันไม่นานจนเกินรอ (ของมันแรง)

สรุป

เท่าที่ผมใช้ตัว CircleCI มาก็ถือว่าติดใจมากเลยนะครับ แมร่งเร็วดีอันนี้ชอบเป็นการส่วนตัวเลย และในเรื่องของ UI ก็ถือว่าสวยงามทันสมัย ใช้งานง่าย แถมยังตั้งค่าให้ส่ง Notification ของ status การ build มายัง Slack ก็ง่ายเพียงปลายนิ้วคลิก! ก็หวังว่าจะเป็นอีกตัวเลือกหนึ่งสำหรับเพื่อนๆ พี่ๆ น้องๆ ในการทำ CI นะครับ สุดท้ายถ้าหากบทความนี้มีข้อผิดพลาดประการใด ผมต้องขออภัย ด้วยนะครับ ไว้เจอกันในบทความถัดไปครับผม

Happy Coding… 😎

--

--