Continuous Integration – The future of software development(Updated)

Bài này được viết khá lâu rồi, từ giữa tháng 5 nhưng quả thật lúc đấy hơi lười, lại hơi tham muốn làm cho cả Android + iOS nên để mốc meo đến tận bây giờ. Nhưng chỉ còn vài ngày ngắn ngủi làm việc cho 3S thôi nên trước khi ra đi cũng muốn viết cái gì đó dành cho team iOS nên tôi quyết định edit lại để đưa lên Techblog không nó phí hoài . Bài này sẽ chỉ nói về Continuous Integration(CI) cho iOS kết hợp với Automation Test, cái món mà tôi khá tâm đắc và rất rất mong muốn được áp dụng vào khi làm việc.

 Tôi biết đến với CI 1 cách rất tình cờ. Khi đó đang trong giai đoạn giữa XXXiOS, ngồi ngáp ngắn ngáp dài chờ khách hàng confirm về việc thay đổi Requirement lần thứ n. Code trước thì cũng dở mà ngồi chơi thì ại không hay. Tiện đang có vụ liên quan đến OSX Server của anh Nghĩa nên ngó nghiêng nghịch ngợm tý.

Đọc các bài hướng dẫn sử dụng OSX Server thì thấy có cái nhắc đến Xcode Server + XCode Bot mà chả biết nó là cái gì, cơ mà cứ có chữ Xcode là hấp dẫn rồi. Tìm hiểu thêm thì ra đây là bộ công cụ của Apple để hỗ trợ Continuous Integration cho Mac OS và iOS.

Nhưng mà trí thông minh có hạn nên đọc mãi vẫn chưa hiểu cụ thể CI nó là cái gì, ứng dụng như thế nào. Đến khi thấy các ví dụ sử dụng CI việc test các project 1 cách liên tục, đặc biệt là sự kết hợp hoàn hảo với Automation Test thì mới thấy được lợi ích rõ ràng của nó.  Bỏ hẳn 3 ngày để setup, tìm hiểu + viết code sau đó là làm buổi Seminar nho nhỏ. Vẫn cố gắng để áp dụng kỹ thuật mình nghiên cứu được vào công việc nhưng sau Tết ăn nhiều đạm + bận nhiều việc linh tinh nên quên béng đi mất.

Đến giờ thì mới thấy tiếc quãng thời gian vừa qua. Giá như mình chịu khó hơn, giá như mình quyết liệt hơn với anh Tuấn thì có lẽ giờ anh Hiếu.TT đang hì hụi làm Automation rồi cũng nên.

Trở lại với vấn đề chính, xin nêu qua các vấn đề chính sẽ được nói đến trong bài này:

  1. Giới thiệu sơ qua về CI
  2. Giới thiệu sơ lược về Automation và lý do tại sao lại sử dụng OSX Server + Xcode Bot
  3. Khi CI và Automation Test song kiếm hợp bích
  4. Demo và các vấn đề bên lề.

1. Giới thiệu sơ qua về CI

Thực ra tôi thấy tại 3S đã và đang sử dụng CI cho 1 vài dự án sử dụng Team City hoặc Jenkins tuy nhiên chắc có khó khăn gì đó mà chưa thấy nhân rộng ra. Có thể nhiều người biết về CI rõ hơn tôi nhiều, nhưng vẫn cứ xin nói qua lý thuyết 1 chút bằng ví dụ thực tiễn:

Team phát triển của bạn gồm nhiều người sử dụng chung hệ thống SVN. Trước khi một thành viên commit code họ đều build thử, thành công thì mới đẩy lên SVN. Nhưng đó chỉ là source code tại local(working copy) không phải trên SVN. Chẳng may họ quên không commit 1 file, thay đổi config thì người khác lấy code từ SVN về sẽ không build được. FAILED! Sẽ thật đen đủi nữa nếu hôm sau họ nghỉ làm và công việc của cả team bị chậm deadline ngày hôm đó.

 Đó chỉ là 1 vấn đề đơn giản phát sinh, còn các khả năng khác như: code chạy lỗi, sai business logic hoặc không pass các test case… Sẽ nhức đầu hơn nữa khi dự án gồm nhiều phase nhỏ và để chắc chắn các function mới + cũ đều chạy đúng thì bạn phải bỏ ra rất nhiều thời gian + công sức để test lại. Dự án càng dài hơi thì effort ngày càng nhiều.

Lúc này team của bạn sẽ cần/nên áp dụng Continuous Integration vào quy trình phát triển. Bất cứ khi nào, sau khi 1 thành viên commit code lên SVN/github, CI Server sẽ tự động lấy code về, auto build, auto run test và sau đó báo lại kết quả của lần commit đó qua dashboard, hay hơn nữa là sẽ gửi e-mail cho cả team. Các thành viên sẽ sớm biết được có lỗi xảy ra và tìm cách fix chúng. Ứng dụng của bạn sẽ lại nhanh chóng free-bug, commit gần nhất luôn đảm bảo là stable version.

 Đây là các cách ứng dụng thực tế của CI, vì khá ngắn và dễ hiểu nên xin phép để nguyên tiếng Anh:

  • Maintain a code repository
  • Automate the build
  • Make the build self-testing
  • Everyone commits to the baseline every day
  • Every commit (to baseline) should be built
  • Keep the build fast
  • Test in a clone of the production environment
  • Make it easy to get the latest deliverables
  • Everyone can see the results of the latest build
  • Automate deployment

Các bước thực hiện CI:

  • Developers check out code into their private workspaces.
  • When done, the commit changes to the repository.
  • The CI server monitors the repository and checks out changes when they occur.
  • The CI server builds the system and runs unit and integration tests.
  • The CI server releases deployable artefacts for testing.
  • The CI server assigns a build label to the version of the code it just built.
  • The CI server informs the team of the successful build.
  • If the build or tests fail, the CI server alerts the team.
  • The team fix the issue at the earliest opportunity.
  • Continue to continually integrate and test throughout the project.

2. UI Automation Test

Cái tên nói lên tất cả rồi: tự động Test, không cần thao tác thủ công, không cần công sức của QA Tester, tất cả đều tự động.

Đầu tiên bạn cần phải viết/record lại các thao tác, các bước của Test Case để tạo ra script giúp cho các lần sau muốn test lại thì không cần động chân động tay nữa, bấm play phát là máy nó tự chạy test cho bạn luôn.

Việc tạo UI Automation Test Script ban đầu sẽ mất thêm thời gian nhưng nếu các dự án có thời gian phát triển dài qua nhiều giai đoạn nhỏ, requirement chưa rõ ràng hoặc thay đổi liên tục, dự án phát triển theo mô hình Iterative & Incremental hoặc Sprint… thì về sau bạn sẽ không mất thêm thời gian để test thủ công nữa.

Ví như dự án XXXiOS trong giai đoạn phát triển phải thay đổi rất nhiều về cấu trúc do khách hàng thay đổi requirement rất nhiều. Có những lúc anh em cảm thấy khá mệt mỏi. Những function, feature đã hoàn thành: code, test rồi nhưng đôi khi bị ảnh hưởng và bạn phải test lại từ đầu trên cả 4 thiết bị để đảm bảo chất lượng. Vậy là phải thêm thời gian, công sức để thực hiện test lại. 1-2 lần thì không sao nhưng nếu nhiều lần thì sẽ dễ gây nhàm chán, mệt mỏi cho dev(phải mượn device, chờ mạng nhanh, server sống lại mới test được…). Việc phải cắm mặt vào màn hình chơi cờ caro cả nghìn ô khiến nhiều anh em dev khá mệt mỏi!

Demo App:

Demo Automation Test:

Hẳn đến đây các bạn sẽ thấy được chúng ta có 2 tool Auto rồi. Cũng sẽ dễ dàng thấy được lợi ích, sự tiện dụng khi sử dụng CI kết hợp với Automation Test: Tự động lấy code về build, test, report. Quá nhàn. Unit Test cũng như thế luôn.

3. Sử dụng CI và UI Automation Test cho iOS

Bàn về CI thì có khá nhiều services, framework hỗ trợ, nổi lên có thể kể đến: Jenkins, Travis, TeamCity, Hudson-CI… Nhưng nhược điểm chung của các anh này mất thời gian config, config cũng gặp nhiều khó khăn do dùng command line nhiều hoặc cần nhiều bước phức tạp, nhất là với người mới chưa có kinh nghiệm.

Tuy không nhiều tính năng bằng nhưng OSX Server của Apple config rất đơn giản và config hoàn toàn bằng giao diện, đặc biệt là support tốt cho iOS nhất là khi giới thiệu iOS9 Apple đã giới thiệu UI Testing trên XCode 7 cực kì lợi hại(xem clip cuối bài). Hiện tại cứ sử dụng cái đơn giản nhất, tốt nhất đã, sau này mở rộng, thêm yêu cầu về tính năng thì tính sau. Mà hàng của Apple luôn thuộc đỉnh của đỉnh rồi, cứ thế mà dùng cũng được :D.

Workflow cơ bản của XCode Server

– Xcode continuous integration workflow

 

– Xcode Server source code repository interaction

– Xcode Server activity reporting workflow

 

Report trên XCode:


Report trên Web browser:


– Framework hỗ trợ Automation Test cũng có rất nhiều: Appium(hỗ trợ cả Android), SubliminalKIFCalaba.sh… Nhưng KIF hiện tại là sáng giá nhất khi được update thường xuyên, cộng đồng hoạt động mạnh, code được viết bằng Objective-C nhưng cấu trúc + số lệnh đơn giản nên bất kỳ Tester nào cũng có thể làm quen trong vòng 1 vài tiếng đồng hồ. Appium sẽ là lựa chọn tốt nhất cho Android + iOS nhưng trong bài này sẽ không bàn tới.

4. Demo

Trong bài này tôi sẽ sử dụng XCode Server + XCode Bots để làm CI Server, thư viện KIF cho iOS để viết Automation Test Script. Kịch bản đơn giản gồm các bước sau:

1. XCode Server sẽ tự động lấy code về sau khi dev commit code lên github/SVN.

2. XCode Bot sẽ tự động Build, Run UnitTest, Automation Test được viết sẵn.

3. Kết quả report sẽ được tổng hợp lại trên trên Xcode IDE hoặc trên Dashboard thông qua trình duyệt web.

4. Kết quả cũng có thể được gửi về danh sách các địa chỉ email định sẵn cho các trường hợp cụ thể Success/Fail.

Các bạn vui lòng xem clip sẽ rõ hơn:

Dưới đây là clip demo của Apple tại WWDC 2014. Trong clip có giới thiệu chi tiết các bước config Server, XCode Bot… demo việc gửi email, kích hoạt Integration qua tin nhắn…

Dashboard on Web browser:

*Update: Đây là lý do tại sao tôi quyết đinh iOS của Apple thì hãy dùng tool của Apple. UI Testing trên Xcode 7 WWDC 2015:

Full video: https://developer.apple.com/videos/wwdc/2015/?id=406

Hy vọng team iOS sẽ tiếp tục đầu tư thời gian để nghiên cứu, ứng dụng Continuous + Automation Test vào trong quá trình phát triển nhằm giảm bớt sức lực con người mà vẫn đảm bảo chất lượng sản phẩm. Nếu tạo thêm được hệ thống Continuous Delivery với tool Auto Submit bên Shopapp của anh Trai Đẹp Giang thì tuyệt vời.

 Blog này xin chỉ dừng lại ở mức giới thiệu sơ lược, các bước config vui lòng xem video phía trên hoặc tham khảo các link sau:

https://developer.apple.com/library/ios/documentation/IDEs/Conceptual/xcode_guide-continuous_integration/
http://www.techinsight.io/review/mobile-app-development/ios-continuous-integration/
http://matt.vlasach.com/xcode-bots-hosted-git-repositories-and-automated-testflight-builds/
http://hack.swic.name/automated-xcode-6-bot-testflight-uploads/

Bài viết có tham khảo wiki và nhiều nguồn trên internet:

http://www.martinfowler.com/articles/continuousIntegration.html
http://blog.sudeium.com/2013/10/24/stop-sucking-at-build-environments/


Tôi đã viết app cho Apple Watch như thế nào (P3)?