Triển khai CI/CD cho iOS – In house Distribution với DeployGate

by Sam
2.1K views
This entry is part [part not set] of 6 in the series CI/CD cho iOS

Một ngày đẹp trời, anh ấy nhận được một cái mail giới thiệu anh là chuyên gia về tài khoản Apple… đó chính ngày định mệnh mở ra con đường Enterprise. Many thanks anh Vũ Béo, người nhanh tay mang ánh sáng về và đặt những bước chân đầu tiên.

Sam

Overview

DeployGate hỗ trợ rất nhiều chế độ Distribution, tuy nhiên để tạo ra sự đa dạng cho series, ở bài viết này chúng ta sẽ sử dụng Enterprise (In house) kết hợp với DeployGate để tạo thành một quy trình CD.

Nói thêm một chút về DeployGate, đây là một nền tảng hỗ trợ phân phối ứng dụng di động (iOS & Android). Người dùng có thể upload app package (ipa & apk) lên và chia sẻ link cài đặt cho người khác. Sử dụng DeployGate, Tester sẽ không cần phải cài đặt ứng dụng trực tiếp với ipa hay apk file, và cũng không cần sử dụng Window hoặc MacOS để cài đặt. DeployGate cũng giảm bớt sự phụ thuộc của người dùng trong quá trình test vào Test Flight khi thời gian process một số ứng dụng có thể lên tới hàng chục giờ đồng hồ.

Bài viết sẽ gồm có 3 phẩn:

  1. Distribute IPA sử dụng Command Line
  2. Cấu hình DeployGate để upload IPA bằng Command Line
  3. Cấu hình file .gitlab-ci.yml cho GitlabCI

Distribute IPA sử dụng Command Line

Bước đầu tiên của quá trình vẫn là tạo ra được file IPA để upload lên Deploy Gate. Như ở bài trước đã hướng dẫn, ta sẽ sử dụng các câu lệnh sau để thực hiện tạo ra file IPA.

xcodebuild archive -archivePath "cicd-test" -scheme cicd-test
xcodebuild -exportArchive  -archivePath "cicd-test.xcarchive" -exportPath "ipa" -exportOptionsPlist ExportOptions.plist -allowProvisioningUpdates

Với chế độ In House, chúng ta sẽ sử dụng file ExportOptions.plist với nội dung như sau:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
	<key>method</key>
	<string>enterprise</string>
</dict>
</plist>

Sau khi export xong, chúng ta sẽ có một file IPA với đường dẫn tương đối so với vị trí của runner như sau:

ipa/cicd-test.ipa

Việc tiếp theo sẽ là upload file IPA lên DeployGate.

Cấu hình DeployGate để upload IPA bằng Command Line

Đầu tiên chúng ta cần upload ít nhất một bản IPA lên Deploy Gate, sau đó bật Distribution lên bằng cách ấn vào nút Add a link for sharing trong ảnh sau:

Ấn vào button [+ Add a link for sharing] phía bên phải

Sau đó, trang web sẽ điều hướng đến Distribution Page, đừng hoảng, ta chỉ cần copy đường dẫn của trang đó là được. Đường dẫn sẽ có dạng như sau:

https://deploygate.com/distributions/818c15431b824aac1763f074931ecacaed2a03d5
DISTRIBUTION_KEY = 818c15431b824aac1763f074931ecacaed2a03d5

Ta sẽ lưu key phía sau của đường dẫn lại, tạm gọi là DISTRIBUTION_KEY như trên.

Tiếp đó ta quay lại Dashboard của app như trong ảnh trên và lấy thông tin user từ đường dẫn như sau:

https://deploygate.com/users/gstdn_test/platforms/ios/apps/com.magz.techover.ios
USER = gstdn_test
USER_API_HOST = https://deploygate.com/api/users/gstdn_test/apps

Cuối cùng của việc cấu hình và thu thập thông tin lên Deploy Gate, ta vào mục Account Setting -> Profile và copy API Key ở dưới cùng của page.

Copy API Key này nhé bạn

Ta sẽ có một bộ các thông tin sau:

USER_API_HOST = https://deploygate.com/api/users/gstdn_test/apps
DISTRIBUTION_KEY = 818c15431b824aac1763f074931ecacaed2a03d5
API_KEY = 246147bb-3ab7-4cc8-8fbe-ahihidongoc

Tiếp đó, ta chỉ cần thực hiện upload IPA file lên Deploy Gate sử dụng các thông tin trên với Command sau:

Curl -H "Authorization: token $API_KEY" -F "file=@ipa/cicd-test.ipa" -F "message=New distribution" -F "distribution_key=$DISTRIBUTION_KEY" -F "release_note=Release Note" "$USER_API_HOST"

Response trả về sẽ có dạng Json như sau, nếu error = false thì tức là quá trình upload thành công.

Response trả về của Curl upload IPA lên Deploy Gate

Refresh lại Dashboard của app ta sẽ thấy có một bản build mới được upload lên với message “New distribution” như ảnh sau:

Bản build đã lên với message đi kèm

Tiếp tục qua trang Update Distribution, ta sẽ thấy bản build mới upload sẽ tự động được cập nhật thành phiên bản được phân phối với Release Notes là “Release Note”.

Bản build vừa upload được tự động phân phối với Release Note mới

Như vậy là ta đã hoàn thành việc upload và cập nhật bản build trên Deploy Gate một cách tự động. Tiếp đến là cấu hình các câu lệnh trên vào file .gitlab-ci.yml.

Cấu hình .gitlab-ci.yml cho GitlabCI

Rồi, lại tới công chuyện tiếp! Đầu tiên ta cần ném các thông tin Key của Deploy Gate vào mục Variables thay vì setting cứng trong file.

Luôn đặt các thông tin key, môi trường vào Variables

Tiếp đến, nội dung của file .gitlab-ci.yml cơ bản sẽ như sau:

stages:
  - build

build_project:
  stage: build
  script:
    - echo 'Hello bitches, welcome to lazy boys world!'
    - echo 'Just commit code, serve yourself a cup of coffee. Let gitlab build your app!'
    - xcodebuild archive -archivePath "cicd-test" -scheme cicd-test
    - xcodebuild -exportArchive  -archivePath "cicd-test.xcarchive" -exportPath "ipa" -exportOptionsPlist ExportOptions.plist -allowProvisioningUpdates
    - Curl -H "Authorization: token ${API_KEY}" -F "file=@ipa/cicd-test.ipa" -F "message=New distribution" -F "distribution_key=${DISTRIBUTION_KEY}" -F "release_note=Release Note" "${USER_API_HOST}"
  tags:
    - main

Vậy là xong, sau khi code được commit/merge vào main, GitlabCI sẽ tự động chạy Jobs build IPA và đẩy lên DeployGate. Hẹn gặp lại các bạn ở bài viết tiếp theo!

P/S: Sẽ rất tiện lợi nếu có thể cấu hình để tuỳ chỉnh Upload Message, Release Note để ghi các thay đổi cho Tester hay thông báo khi có bản build mới lên Deploy Gate. Nên mình sẽ dành riêng một bài trong series để hướng dẫn cách cấu hình các tuỳ chỉnh này.

Series Navigation

11 comments

developer.daubv September 1, 2021 - 2:25 PM

Bạn cho mình hỏi chút, Deploygate bạn dùng account thường hay account Enterprise vậy ạ.
Mình thấy Bản build trên Deploygate của bạn có chữ Enterprise

Reply
Sam September 1, 2021 - 2:44 PM

Mình dùng Enterprise nha bạn, In House Distribution bắt buộc phải dùng tài khoản Enterprise.
Mình chọn In House cho nó phong phú bài viết thôi, bạn hoàn toàn có thể dùng các mode khác (development, adhoc) để đẩy build lên.

Reply
developer.daubv September 1, 2021 - 3:47 PM

Hi, với tài khoản Apple Enterprise thì khi cài app trên Deploygate không cần phải add udid đúng không bạn?.
Còn các mode khác như (development, adhoc) thì cần phải add udid thì mới cài được app đúng không? tại mình dùng tài khoản apple thường ($99) toàn thấy báo cần phải add udid thôi à?

Reply
Sam September 1, 2021 - 3:58 PM

Đúng rồi bạn, mà cái đấy DeployGate có API để hỗ trợ add UUID, sau đó sẽ tự động làm các việc còn lại. Cũng khá là tiện đó.

Reply
developer.daubv September 1, 2021 - 4:17 PM

Bạn có hướng dẫn nào về việc Deploygate add UDID bằng API không? theo mình biết account apple ($99) chỉ add được 100 udid iPhone.
Vậy nếu có nhiều hơn 100 thiết bị (khoảng mấy trăm) thì việc add udid này có ổn không bạn?.

Mình đang muốn tìm hiểu theo hướng không cần phải add udid mà vẫn cài được app với số lượng thiết bị rất nhiều.
Rất mong bạn hỗ trợ, cảm ơn bạn rất nhiều.

Sam September 1, 2021 - 6:06 PM

Mình chưa viết section nào cụ thể hơn về DeployGate, thời gian tới sẽ cố gắng tổng hợp lại thành một bài cho mọi người nhé!
Ngoài ra về câu hỏi của bạn, “Vậy nếu có nhiều hơn 100 thiết bị (khoảng mấy trăm) thì việc add udid này có ổn không bạn?.”
=> Không thể nha, API đó thực chất là deploy gate sẽ thêm UUID vào tài khoản của bạn, refresh provisioning, build và deploy lại lên server.
Còn nếu không giới hạn device, hiện tại chỉ có thể dùng tài khoản enterprise.

developer.daubv September 1, 2021 - 8:24 PM

Cảm ơn bạn nhiều, các bài viết của bạn rất hay, Nếu chi tiết hơn một chút sẽ dễ hiểu hơn cho những người mới bạn ạ.
Chờ những bài viết hay của bạn!

Sam September 1, 2021 - 8:29 PM

Cảm ơn bạn đã ủng hộ, mình sẽ update thêm nhiều section nữa 😀

Sam September 2, 2021 - 11:08 PM

Thật ra có một cách để nâng giới hạn số device cài đặt app lên 10K mà chỉ cần tài khoản 99$.
Sắp tới mình sẽ viết thêm về section này, bạn nhớ theo dõi nhé.

developer.daubv September 5, 2021 - 5:38 PM

Thế mình đoán không nhầm cách bạn nói là Link TestFlight public (External Testing) đúng không bạn?

Sam September 8, 2021 - 8:50 AM

Đúng rồi bạn!

Leave a Comment

* By using this form you agree with the storage and handling of your data by this website.

You may also like