Fastlane自动打包上传iOS App

2,439 阅读5分钟
原文链接: ios.devdon.com

每當開始出現一些重複性的工作時,我們就做一個工具來幫我們自動完成這些任務,比如寫完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上進行測試,而這過程可能是這樣的:

  1. 在負責發布的電腦上執行git pull拿到最新的code。
  2. 執行pod install來安裝/更新依賴包。
  3. 修改XCode中的Version/Build號。
  4. 通過XCode將code進行Archive編譯和打包。
  5. 選擇一個要上傳的ipa文件(其實就是剛archive的ipad檔案)
  6. 通過Xcode或者Application Loader上傳ipa檔案。
  7. 等待上傳處理完成,登入itunes connet選擇要測試的版本(只有第一次要設定的樣子)
  8. 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中看到我們的圖片: