每當開始出現一些重複性的工作時,我們就做一個工具來幫我們自動完成這些任務,比如寫完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的ipad檔案)
- 通過Xcode或者Application Loader上傳ipa檔案。
- 等待上傳處理完成,登入itunes connet選擇要測試的版本(只有第一次要設定的樣子)
- commit code(因為修改了xcode中version/build號碼)
每一次打完一段code以後就要這樣做一次,而這裡都還包括測試的環節,這樣重複性的工作真的佔用了不少時間。
安裝&初始化Fastlane
可以通過Ruby Gem來安裝Fastlane:
gem install fastlane
在Xcode項目中初始化Fastlane:
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的例子:
desc "Submit a new Beta Build to Apple TestFlight"
desc "This will also make sure the profile is up to date"
lane :beta do
# match(type: "appstore") # more information: https://codesigning.guide
increment_build_number
gym(scheme: "Lab-Fastlane") # Build your app - more options available
pilot(team_name: "Tung Chen")
# sh "your_script.sh"
# You can also use other beta testing services here (run `fastlane actions`)
end
其中pilot指定了team_name是因為我的帳號有多個team。
在terminal中執行任務:
fastlane ios 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
而發布方面的資訊,也可以根據不同的應用市場來創建資料:
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:
fastlane snapshot init
這時候fastlane folde裡面會多一個SnapshotHelperXcode8.swift,把這個文件直接拖到剛才建立的UITests中。
Sanpfile
除了剛才提到的SnapshotHelper以外,還會看到一個snapfile的設定檔。
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來執行我們的截圖任務:
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")
}
- 其中snapshot(“圖片名稱”) – 這是截圖的方法。
執行的過程:
影片播放器下載檔案執行的過程會看到testing在執行任務、切換語言等等,最後會在screenshots中看到我們的圖片: