每當開始出現一些重複性的工作時,我們就做一個工具來幫我們自動完成這些任務,比如寫完 code 後操作 git 的 commit/push/merge、截圖、跑測試等等。
而 Fastlane 就是通過 Ruby 撰寫的整合性工具,其中包含了可以處理構建、測試、上傳、屏幕截圖等一系列工具,目前已經被Google收購了。
關於 Fastlane
Fastlane 包含了打包、簽名、測試、部署、發布等等移動開發中會涉及到的工具,當然我們也是可以通過 ruby 來自己寫 plugin 的。
iOS 方面初期應該會用到這些:
- Scan – run tests.
- Gym – build app.
- Deliver – upload screenshots, metadata, app to App Store.
- Snapshot – automate taking localized screenshots.
- Pilot – Upload a new binary to iTunes Connect for TestFlight beta testing.
- Sigh – 處理配置 (Provisioning profiles) 相關工作。
更多的工具可以看看官方的 Actions 列表。
持續集成中的重複工作
當我們完成一部分開發內容以後,會進行發布到 Testflight 上進行測試,而這過程可能是這樣的:
- 在負責發布的電腦上執行 git pull 拿到最新的 code。
- 執行 pod install 來安裝/更新依賴包。
- 修改 Xcode中的 version/build 號。
- 通過 Xcode 將 code 進行 Archive 編譯和打包。
- 選擇一個要上傳的 ipa 文件(上一步 archive 的 ipa 檔案)
- 通過 Xcode 或者 Application Loader 上傳 ipa 檔案。
- 等待上傳處理完成,登入 itunes connect 選擇要測試的版本。
- commit code(因為修改了 Xcode 中 version/build 號碼)
每一次打完一段 code 以後就要這樣做一次,而這裡都還包括測試的環節,這樣重複性的工作真的佔用了不少時間。
安裝&初始化Fastlane
可以通過 Ruby Gem 來安裝 Fastlane:
1 |
gem install fastlane |
在Xcode項目中初始化Fastlane:
1 |
fastlane init |
初始化的過程會要求填寫 iTunes Connect 帳號等資訊,如果是全新的項目,會幫你在 iTunes Connect 中建立 App。
設定完成後可以看到 Xcode 項目中會多一個 faselane 目錄。
Appfile
這裡放的是和 App 有關的資訊,包括 app identifier,apple id、team id…等等。
需要注意的是,如果你的帳號同時有多個 team,可以在這裡直接設定 itc_team_id 或者 itc_team_name,因為如果沒有設定的話,
在 fastlane 執行發布相關的任務時,會詢問使用者要用哪一個 team,這樣就沒辦法自動化了。
可以在這裡看更多有關 Appfile 的設定。
Deliverfile
可以在這裡直接設定 app identifier 和 user name(Apple user ID),如果你的帳號同時有多個 team 的話。
也可以在具體執行任務的時候加入,比如pilot(team_name: “Don Chen”)
可以在這裡看更多有關 Deliverfile 的設定。
Fastfile
這裡放的是具體要執行的命令,一個打包上傳到TestFlight的例子:
其中 pilot 指定了 team_name 是因為我的帳號有多個 team,需要指定一個。
其中 lane 代表任務, beta 代表任務的名稱。
1 2 3 4 5 6 |
desc "Submit a new Beta Build to Apple TestFlight" lane :beta do increment_build_number gym(scheme: "Lab-Fastlane") # build app, 生成一個iPA文件 pilot(team_name: "Tung Chen") end |
然後在 terminal 中執行任務:
1 |
fastlane beta |
而 increment_build_number 是自動讓 build 號碼增加 1,這個需要搭配 Xcode 設定。
這個任務的 lane 取名叫做 beta,於是在 terminal 中執行 fastlane iOS beta,就會開始自動執行任務了。
- increment_build_number – build 號碼增加 1
- gym(scheme: “Lab-Fastlane”) – build 項目
- pilot(team_name: “Tung Chen”) – 上傳到 TestFlight ( iTunes connect ) 上。
需要注意的是:
而目前 iTunes Connect 會要求 App 填寫「出口合規證明」,如果沒有對 code 另外進行加密可以直接設定為 No。
在 info.plist 中可以設定:
Fastlane Metadata
前面我們以發布 app 到 TestFlight 為例子,接下來會說明和 release 有關的內容。
- copyright.txt – 填寫 copyright 信息,比如 Copyright (c) 2017 Don
- primary_category.txt – 填寫主分類,比如 Games
- primary_first_sub_category.txt – 填寫分類,比如 Card
- primary_second_sub_category.txt – 填寫 second_sub 分類,比如 Casino
而發布方面的資訊,也可以根據不同的應用市場來創建資料:
1 |
en-US, en-CA, fi, ru, zh-Hans, nl-NL, zh-Hant, en-AU, id, de-DE, sv....... |
可以到這裡看到更多關於 Deliver 的設定。
截圖(Screenshots)
這裡我們要用到 snapshot 這個工具
首先我們需要加入 iOS UI Test Bundle,File -> new target -> iOS UI Test Bundle。
然後在我們的項目中初始化 snapshot:
1 |
fastlane snapshot init |
這時候 fastlane fold 裡面會多一個 SnapshotHelperXcode8.swift,把這個文件直接拖到剛才建立的 UITests 中。
Sanpfile
除了剛才提到的 SnapshotHelper 以外,還會看到一個 snapfile 的設定檔。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
devices([ "iPhone 5s", "iPhone 7" ]) languages([ "en-US", "zh-Hant" ]) # Where should the resulting screenshots be stored? output_directory "./screenshots" clear_previous_screenshots true |
- devices: 可以指定想要開啟的設備類型,要注意大小寫敏感比如打「iPhone 7 plus」不會過,要打「iPhone 7 Plus」。
- languages:可以指定要設備的語言,這樣做多國語言的時候,截圖就可以有不同語言的畫面了
- output_directory:截圖的保存的路徑。
- clear_previous_screenshots:每一次截圖是不是要清理原本的檔案。
這裡可以看到更多有關 Sanpshots 的設定。
UITests
通過 UITests 來執行截圖任務,其中 snapshot (“圖片名稱”) – 這是截圖的方法,參數是圖片名稱。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
func testExample() { // 1 - 打開App後截圖 let app = XCUIApplication() setupSnapshot(app) app.launch() snapshot("home-01") // 2 - 點下按鈕後截圖 app.buttons["home button"].tap() snapshot("one-01") // 3 - 點下按鈕後截圖 app.buttons["one button"].tap() snapshot("two-01") } |
terminal 中輸入 fastlane snapshot 開始截圖任務
更新:Xcode 9 以後模擬器會被關起來,在關起來以後再手動打開就可以看到跑測試的流程。
執行的過程會看到 testing 在執行任務、切換語言等等,最後會在 screenshots 中看到我們的圖片: