Contents
Bài viết này mình sẽ hướng dẫn mọi người cơ bản về cấu hình Travis CI cho iOS Project. Để tự động run & build iOS project từ GitHub. Các bài sau thì mình sẽ hướng dẫn việc cài đặt các tools tự động khác. Như auto review code, auto deploy, auto run unittest … Và đối tượng hướng tới cho bài này là các bạn:
-
- Mù về CI
- Các iOS Dev muốn sài các tools auto
- Các lead dự án
- Các bạn chưa biết gì
Trước khi bắt đầu thì nắm một số khái niệm trước nha. 😎
CI/CD là gì?
CI là Continuous Integration.
Nó là phương pháp phát triển phần mềm yêu cầu các thành viên của team tích hợp công việc của họ thường xuyên, mỗi ngày ít nhất một lần. Mỗi tích hợp được “build” tự động (bao gồm cả test) nhằm phát hiện lỗi nhanh nhất có thể. Cả team nhận thấy rằng cách tiếp cận này giảm thiểu vấn đề tích hợp và cho phép phát triển phần mềm nhanh hơn.
CD là Continuous Delivery (tạm dịch là chuyển giao liên tục)
lại nâng cao hơn một chút, bằng cách triển khai tất cả thay đổi về code (đã được build và test) đến môi trường testing hoặc staging. Continuous Delivery cho phép developer tự động hóa phần testing bên cạnh việc sử dụng unit test, kiểm tra phần mềm qua nhiều thước đo trước khi triển khai cho khách hàng (production). Những bài test này bao gồm UI testing, load testing, integration testing, API testing… Nó tự động hoàn toàn quy trình release phần mềm.
Hoạt động của CI
Một kịch bản CI bắt đầu bằng việc developer commit code lên repository (github chẳng hạn). Bất kỳ thay đổi nào cũng sẽ trigger một vòng đời CI. Các bước trong một kịch bản CI thường như sau:
-
- Đầu tiên, developer commit code lên repo.
- CI server giám sát repo và kiểm tra xem liệu có thay đổi nào trên repo hay không (liên tục, chẳng hạn mỗi phút 1 lần)
- Ngay khi commit xảy ra, CI server phát hiện repo có thay đổi, nên nó nhận code mới nhất từ repo và sau đó build, chạy unit và integration test
- CI server sẽ sinh ra các feedback và gửi đến các member của project
- CI server tiếp tục chờ thay đổi ở repo
Mỗi lần developer làm xong task, họ phải chạy một private build (tức là chạy phần mềm trên local trước), check choác cẩn thận và commit code lên repo khi đã thấy ổn. Bước này xảy ra thường xuyên và ở bất kỳ thời điểm nào trong ngày. Việc build tích hợp sẽ không xảy ra khi những thay đổi này chưa ảnh hưởng đến repo (kiểu như bạn commit mà chưa được merge vậy).
Một trong những tuyên ngôn của CI là “Build Software at Every Change”. Mục đích là để tránh những câu kiểu như “Ớ, phần này chạy trên máy em bình thường mà” 😄 Vấn đề sẽ được tìm ra sớm bằng cách build thường xuyên, và để CI hoạt động hiệu quả trong project, tốt nhất là developer phải commit code thường xuyên hơn. Đợi hơn một ngày để commit code lên repo có thể khiến việc tích hợp tốn thời gian và code mình dùng có thể không phải là code mới nhất.
Lợi ích của việc sử dụng CI sẽ là:
-
- Giảm thiểu rủi ro nhờ việc phát hiện lỗi và fix sớm, tăng chất lượng phần mềm nhờ việc tự động test và inspect (đây cũng là một trong những lợi ích của CI, code được inspect tự động dựa theo config đã cài đặt, đảm bảo coding style, chẳng hạn một function chỉ được dài không quá 10 dòng code …)
- Giảm thiểu những quy trình thủ công lặp đi lặp lại (build css, js, migrate, test…), thay vì đó là build tự động, chạy test tự động
- Sinh ra phần mềm có thể deploy ở bất kì thời gian, địa điểm
Trong bài này thì chúng ta tập trung vào CI nhiều hơn. Về CD thì sẽ trình bày ở phần khác.
Tại sao lại là Travis CI?
Có rất nhiều dịch vụ và open source cho CI. Trong khuôn khổ bài này thì mình chỉ hướng dẫn về Travis CI. Các CI khác thì áp dụng tương tự, nếu bạn đã hiểu rõ về bản chất hoạt động của CI là như thế nào.
Sự lựa chọn ở đây là do iOS. Vì iOS chạy được trên nền tảng OS là MAC OS. Các dịch vụ CI khác thì ít hỗ trợ MAC OS hoặc nếu có thì đều thu phí hoặc bị giới hạn. Với Travis CI thì chúng ta sẽ dùng được với iOS Project. Ngoài ra, về cấu hình Travis CI cũng khá là cơ bản, nếu bạn thành tạo được rồi thì có thể cấu hình các CI khác một cách nhanh chóng.
Có 2 loại dịch vụ của Travis-CI
-
- Free (chỉ sử dụng được với các repo public) : https://travis-ci.org/
- Trả phí (dùng được cho cả 2) : https://travis-ci.com/
Bạn truy cập vào link free và tiến hành đăng nhập với account GitHub của bạn. Mình sử dụng GitHub để lưu trữ và quản lý source code.
Đăng nhập thành công thì bạn sẽ thấy các repo của mình. Chọn repo mà bạn muốn sử dụng và bật nó lên. EZ game 😎
Cấu hình iOS Project
1. The YAML File
-
- Là file có đuôi là
yml
- Đây là file quy định cấu hình của CI cho repo.
- Các dịch vụ CI sẽ tự động clone source code từ repo của bạn về, nếu trong repo có
yaml file
thì sẽ tự động đọc file đó và thực thi các lệnh hay setup cấu hình mà mình ghi trong đó. - Với Travis CI thì file sẽ tên là
.travis.yml
- Là file có đuôi là
Ví dụ:
language: objective-c osx_image: xcode10.1 xcode_workspace: TheLastProject.xcworkspace xcode_scheme: TheLastProject_Development xcode_destination: platform=iOS Simulator,OS=12.1,name=iPhone X before_install: - bundle install - bundle exec pod install --repo-update
2. Sử dụng YAML
Bạn tạo mới 1 branch và tiến hành tạo 1 file tên là .travis.yml
với cấu hình như ví dụ trên. Chú ý: các file yml này rất nhạy cảm, nếu bạn sai cú pháp hay có kí tự đặt biệt thì sẽ không hoạt động được. Nên kiểm tra cẩn thận nó.
Sau khi đã tạo xong, thì bạn push lên repo của bạn. Tạo pull request mới.
Bạn sẽ thấy phần màu vàng của Travis BOT hiển thị. Bạn có thể xem được chi tiết CI đang hoạt động hay log như thế nào. Vì mặc định Travis CI sẽ tự động kiểm tra GitHub khi có pull request mới hoặc khi có commit/merge vào Master
. Các trường hợp tạo pull request mới thì các lần commit sau thì Travis CI sẽ auto kiểm tra bản build mới và tự động chạy lại.
3. Triggering a Build
- Phần này thì mặc định Tracis CI sẽ theo dõi các
pull request
vàomaster
- Nên bạn cứ tạo
new branch
và gởipull request
. Các lần sau chỉ cầncommit
vàpush
vàobranch
đó thì CI auto chạy - Vì sài đồ free hoặc nếu có trả phí thì cũng sẽ bị giới hạn các repo build cùng lúc nêu
- Các trigger phức tạp thì sẽ để phần sau nha. 🙂
Bạn mở Travis CI lên và thấy Travis đã tự động nhận được cấu hình từ GitHub và tiến hành build project.
Bạn có thể xem phần log đang chạy
Quá trình này có thể hơi lâu, tùy thuộc vào cấu hình YAML File của bạn. Tất nhiên lần đầu tiên chạy thì khá là lâu. Hoặc bạn sử dụng với nhiều repo chạy cùng 1 lúc. Vì với account free thì có 1 job chạy thôi, khá là eo hẹp kinh tế.
4. Cấu trúc YAML File
- language
- Travis hỗ trợ cả 2 ngôn ngữ
Objective-C
vàSwift
- Tuy nhiên cài đặt thì
objective-c
cho cả 2
- Travis hỗ trợ cả 2 ngôn ngữ
- osx_image
- Đây là máy ảo chọn để build project lên mình
- Có nhiều cấu hình máy áo, bạn nên chọn loại phù hợp với project của mình. Nếu như chọn máy ảo đời thấp hơn so với yêu cầu project thì sẽ không build được
- Danh sách các máy ảo được support của Tracis CI sau đây
- xcode_workspace
- Vì có nhiều project trong 1 workspace (Pod, project hiện tại, các thư viện nếu build trực tiếp từ project)
- Nên hãy chọn cho đúng
- Nếu có thư mục thì hãy trỏ đường dẫn vào. Ví dụ:
./Example/TravisCIBlog.xcworkspace
- xcode_scheme
- Cực kì quan trọng vì nó sẽ quyết định bạn muốn build gì hay kiểm tra gì. Hãy chọn cho đúng.
- Ngoài ra, thì cần phải share scheme để CI có thể build đc (vào Scheme -> Managment —> xem vào chọn)
- xcode_destination
- Lựa chọn cho các thanh niên nhà nghèo khi dùng
iPhone simulator
- Bạn có thể quyết định chọn máy ảo nào để build
- Danh sách các máy ảo được support ở đây
- Lựa chọn cho các thanh niên nhà nghèo khi dùng
- before_install
- Cực kì quan trọng, vì nó sẽ chạy các lệnh cơ bản trước khi thực hiện
- Vì máy ảo đó trên mạng nên ko có như local là bạn chỉ cần chạy các lệnh như
pod
rồi cứ thế mà build tới. Nên mình phải thêm các lệnh đó vào phần này - Nếu có lệnh nào phức tạp hơn thì hay chuẩn bị gì thêm thì bỏ thêm vào
before_install: - bundle install - bundle exec pod install --repo-update
Và …
Đời không như là mơ. Và code không bao giờ chạy ổn trong lần chạy đầu tiên.
Đó chỉ là một ví dụ mà thôi. Bạn sẽ bị fail rất, rất, rất nhiều lần
. Có nhiều bạn ngay tại phần này đã từ bỏ cuộc chơi vì quá nản. Điều đầu tiên bạn cần là
Bình tĩnh. Bình tĩnh hết sức. Bình tĩnh sống.
Xem log và tiến hành fix. Sau đây là một số tips hướng dẫn bạn fix để lần đầu của bạn bớt đau và rát.
Cấu hình lại iOS Project
- Đời không đơn giản khi bạn cấu hình xong
yaml file
là CI sẽ chạy. Lỗi đầu tiên gặp như sau:
The command "set -o pipefail && xcodebuild -workspace TheLastProject.xcworkspace -scheme TheLastProject_Development build test | xcpretty" exited with 66
- Bạn nên xem lại project đã có các target
test
chưa, nếu chưa có thì:- Tạo thêm các target test (Unit & UI)
- Config build cho tụi nó
- Check lại 1 lượt các scheme
- Tiếp theo lỗi như thế này
error: No profiles for 'com.fx.TheLastProject' were found: Xcode couldn't find any iOS App Development provisioning profiles matching 'com.fx.TheLastProject'. Automatic signing is disabled and unable to generate a profile. To enable automatic signing, pass -allowProvisioningUpdates to xcodebuild. (in target 'TheLastProject')
- Chúc mừng là đã thiếu profile
dev, certificate, provisioning profile
… Nôm na là phầndev signing
để có thể build được app. Khắc phục sau:- Cần phải tắt auto signing
- Nếu tắt rồi mà không đc thì xoá
team developer
- Nếu như vậy mà không đc nữa thì chú ý phần xcode_destination, cấu hình lại cho
simulator
chạy. Vì đôi khi một số xcode của anh/chị/em đã ăn với account dev nào rồi nên pó tay thôi.
Đừng lo lắng về phần này quá. Vì sẽ được giải quyết tiếp ở phần sau.
- Còn thành công thì sẽ như thế này
- Xem lại được các bản build khác
- Còn trên GitHub thì sẽ trông như thế này
- Bạn có thể thấy các UnitTest và UITest cũng được thưc thi trong CI
Làm đẹp YAML File
- cache : vì các lệnh
bundler
vàpod
chạy khá tốn thời gian, nên mình sẽ cache lại phần này. Có thể chọn đường dẫn để trỏ tới thư mục cache
cache: - bundler - cocoapods
- script: dùng để chạy các tập lệnh phức tạp hơn chút
- install: thêm các tiện ích khác.
Tạm thời như vậy, sau đây là yaml file
cơ bản của mình.
language: objective-c osx_image: xcode10.1 cache: - bundler - cocoapods xcode_workspace: TheLastProject.xcworkspace xcode_scheme: TheLastProject_Development xcode_destination: platform=iOS Simulator,OS=12.1,name=iPhone X before_install: - bundle install - bundle exec pod install --repo-update install: - set -o pipefail - sudo systemsetup -settimezone Asia/Ho_Chi_Minh - bundle install --path=vendor/bundle --jobs 4 --retry 3
Tổng kết
Hiểu về CI, thì đơn giản như sau:
-
- Nó là 1 cái máy ảo ở một nơi nào đó
- Muốn chạy iOS Project thì máy ảo đó phải cài MAC OS và cái Xcode
- Để build được iOS Project thì xem cấu hình project ổn không, phù hợp với Xcode và Simulator gì trên máy ảo.
- Để run được Simulator thì phải cài đặt các thư viện, nhất là các thư viện trong cocoapod
- Kiểm tra script và YAML File
- Tối ưu YAML FIle để hoạt động nhanh.
Chúc bạn thành công!
Tham khảo:
Related Posts:
Written by chuotfx
Hãy ngồi xuống, uống miếng bánh và ăn miếng trà. Chúng ta cùng nhau đàm đạo về đời, về code nhóe!
Leave a Reply Cancel reply
Fan page
Tags
Recent Posts
- Charles Proxy – Phần 1 : Giới thiệu, cài đặt và cấu hình
- Complete Concurrency với Swift 6
- 300 Bài code thiếu nhi bằng Python – Ebook
- Builder Pattern trong 10 phút
- Observer Pattern trong 10 phút
- Memento Pattern trong 10 phút
- Strategy Pattern trong 10 phút
- Automatic Reference Counting (ARC) trong 10 phút
- Autoresizing Masks trong 10 phút
- Regular Expression (Regex) trong Swift
You may also like:
Archives
- September 2024 (1)
- July 2024 (1)
- June 2024 (1)
- May 2024 (4)
- April 2024 (2)
- March 2024 (5)
- January 2024 (4)
- February 2023 (1)
- January 2023 (2)
- November 2022 (2)
- October 2022 (1)
- September 2022 (5)
- August 2022 (6)
- July 2022 (7)
- June 2022 (8)
- May 2022 (5)
- April 2022 (1)
- March 2022 (3)
- February 2022 (5)
- January 2022 (4)
- December 2021 (6)
- November 2021 (8)
- October 2021 (8)
- September 2021 (8)
- August 2021 (8)
- July 2021 (9)
- June 2021 (8)
- May 2021 (7)
- April 2021 (11)
- March 2021 (12)
- February 2021 (3)
- January 2021 (3)
- December 2020 (3)
- November 2020 (9)
- October 2020 (7)
- September 2020 (17)
- August 2020 (1)
- July 2020 (3)
- June 2020 (1)
- May 2020 (2)
- April 2020 (3)
- March 2020 (20)
- February 2020 (5)
- January 2020 (2)
- December 2019 (12)
- November 2019 (12)
- October 2019 (19)
- September 2019 (17)
- August 2019 (10)