使用 fastlane 實現 iOS 持續集成

使用 fastlane 實現 iOS 持續集成

2015-09-16 09:06 編輯: suiling 分類:iOS開發 來源:everettjf
 0 3494

beyond-602060_640.jpg

簡介

持續集成是個“一次配置長期受益”的工作。但很多小公司都沒有。以前在做Windows開發配置感覺簡單一些,這次配置iOS的,感覺步驟還挺多。整理出來,分享給大家,不正確的地方請及時指正。

本文主要使用fastlane配置iOS的持續集成,自動編譯、打包出多個版本。

最近轉行iOS開發,首要任務是使用Jenkins(算是hudson的兄弟)配置iOS工程的持續集成。 查找各種資料後,整理出以下幾個關鍵詞。

jenkins搭建。

使用fastlane中提供的工具修改工程配置。

gym 或 ipa 工具編譯工程。

目標

  1. 配置一臺電腦自動獲取代碼,並定時打包出以下版本的ipa文件。

    • 內部測試版本:使用標準開發者的Developer證書籤名的ipa文件。

    • 公開測試版本:使用企業賬戶的Distribute InHouse證書籤名的ipa文件。

    • AppStore版本:使用標準開發者的AppStore證書籤名的ipa文件。

    • 渠道版本:內部測試版本,但Info.plist中增加每個渠道的標示符(因爲渠道例如fir.im會使用自己的證書重新簽名ipa,因此側部測試版本就可以)

  1. 保留每個版本的dSYM調試符號文件。

源代碼

https://github.com/everettjf/ios_ci_fastlane_demo

安裝

fastlane和shenzhen都需要gem安裝,把gem更換爲淘寶源。

安裝fastlane

1
sudo gem install fastlane

安裝shenzhen

1
  sudo gem install shenzhen

示例步驟

在xcodeproj文件同級目錄下,執行

1
fastlane init

fastlane 很強大,甚至能自動截圖,自動提交AppStore審覈,不過我只用最簡單的打包功能。 這裏會有一系列提問。

1
2
3
4
5
6
7
8
* Do you want to get started...? y
* Do you have everything commited... ? y
* App Identifier (com.krausefx.app): com.everettjf.fastlanedemo
* Your Apple ID ([email protected]): [email protected]
* ... updates to the App Store or Apple TestFlight? (y/n) n
* Do you want to setup 'snapshot'... n
* Do you want to use 'sigh'... n (是否自動下載provisioning文件)
* The scheme name of your app: fastlanetest (如果就一個工程,也可不輸入)

上面有一步要輸入AppleID,是因爲fastlane(的一個工具sigh,這個字母是H)會自動下載對應的provisioning文件。自動下載provisioning文件,對於經常增加測試設備的Developer證書挺方便。不過,示例就不自動下載了。

執行完成後,會在工程目錄下生成fastlane文件夾。

1
2
3
4
drwxr-xr-x   5 everettjf  staff   170B Sep  8 22:32 fastlane
drwxr-xr-x  10 everettjf  staff   340B Sep  8 22:00 fastlanedemo
drwxr-xr-x   5 everettjf  staff   170B Sep  8 22:38 fastlanedemo.xcodeproj
drwxr-xr-x   4 everettjf  staff   136B Sep  8 22:00 fastlanedemoTests

我們需要修改fastlane文件夾的兩個配置文件:Appfile和Fastfile。(實際是ruby代碼)

1. 修改Appfile

1
2
3
4
5
6
7
app_identifier "com.everettjf.fastlanedemo"
apple_id "[email protected]"
 
for_lane :inhouse do
  app_identifier "com.everettjf.fastlanedemoqiye"
  apple_id "[email protected]"
end

企業InHouse版本與AppStore的app_identifier、apple_id不同。 這裏for_lane 就是爲後面Fastfile中定義的:inhouse版本設置單獨的信息。

2. 修改Fastfile

這個文件中要編寫每個版本的編譯和打包代碼(Developer版本、AppStore版本、InHouse版本、多個渠道版本), 每個版本要經過以下幾個步驟: - 修改版本號和build號(修改爲外部傳入的版本,例如:1.0.0和100)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
def prepare_version(options)
    #say 'version number:'
    #say options[:version]
    increment_version_number(
        version_number: options[:version],
        xcodeproj: PROJECT_FILE_PATH,
    )
    #say 'build number:'
    #say options[:build]
    increment_build_number(
        build_number: options[:build],
        xcodeproj: PROJECT_FILE_PATH,
    )
end
  • 修改app identifier(就是bundle id,例如:com.everettjf.fastlanedemo)

1
2
3
4
5
6
7
8
9
10
11
12
def update_app_identifier(app_id)
    update_info_plist(
        xcodeproj:PROJECT_FILE_PATH ,
        app_identifier:app_id,
        plist_path:"#{PLIST_FILE_PATH}"
    )
    update_info_plist(
        xcodeproj:PROJECT_FILE_PATH ,
        app_identifier:app_id,
        plist_path:"#{UNITTEST_PLIST_FILE_PATH}"
    )
end
  • 修改簽名的配置,配置對應的provision file

1
2
3
4
5
6
def update_provision(typePrefix)
  update_project_provisioning(
      xcodeproj:PROJECT_FILE_PATH ,
      profile:"./fastlane/provision/#{typePrefix}.mobileprovision",
  )
end
  • 渠道版本修改Info.plist文件中對應的字符串

1
2
3
4
5
6
7
8
9
10
def set_info_plist_value(path,key,value)
  sh "/usr/libexec/PlistBuddy -c \"set :#{key} #{value}\" #{path}"
end
def set_channel_id(channelId)
    set_info_plist_value(
        "./../fastlanedemo/#{PLIST_FILE_PATH}",
        'ChannelID',
        "#{channelId}"
    )
end
  • 編譯打包爲ipa

這步使用了工具shenzhen,也可以使用fastlane推薦的gym。

1
2
3
4
5
6
7
8
9
10
11
12
13
def generate_ipa(typePrefix,options)
  #say 'generate ipa'
  fullVersion = options[:version] + '.' + options[:build]
  channelId = options[:channel_id]
  ipa(
      configuration:"Release",
      scheme:"#{SCHEME_NAME}",
      destination:"./build",
      ipa:"#{APP_NAME}_#{fullVersion}_#{typePrefix}.ipa",
      archive:false
  )
  sh "mv ./../build/#{APP_NAME}.app.dSYM.zip ./../build/#{APP_NAME}_#{fullVersion}_#{typePrefix}.app.dSYM.zip"
end

3.?編寫shell腳本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#!/bin/sh
 
#
# usage:
# > sh build.sh 1.0.0 200
#
 
versionNumber=$1 # 1.0.0
buildNumber=$2 # 2000
 
rm -rf build
 
basicLanes="AdHoc AppStore Develop InHouse"
for laneName in $basicLanes
do
    fastlane $laneName version:$versionNumber build:$buildNumber
done
 
channelIds="fir 91"
for channelId in $channelIds
do
    fastlane Channel version:$versionNumber build:$buildNumber channel_id:$channelId
done
1
sh build.sh 1.0.0 100

我們傳入主版本號和一個自增的id(一般是jenkins的build number)。

配置Jenkins

有了能一鍵編譯的腳本,讓Jenkins在獲取代碼後,調用build.sh就可以了。

安裝

1
brew install jenkins

配置獲取代碼,獲取代碼後調用shell:

1
sh build.sh 1.0.0 ${BUILD_NUMBER}

蘋果開發者證書配置

假設我們有兩個開發者賬號,一個是標準開發者賬戶(99刀,個人或公司),一個是企業賬戶(299刀)。 - 標準開發者賬戶:[email protected]

1
2
Identifier中增加com.everettjf.fastlanedemo
Provisioning Profiles中增加一個 iOS Distribution(AdHoc 和 AppStore) 和 iOS Development

企業賬戶:[email protected]

1
2
Identifier中增加com.everettjf.fastlanedemoqiye
Provisioning Profiles中增加一個 iOS Distribution(AdInHouse)

相關文檔

其他途徑

  1. Jenkins的xcode插件:Jenkins有個xcode插件,網上有些文章,不過自己沒有使用。不知道能否 動態的更換證書。

  2. 一次編譯多次簽名:在沒有使用fastlane之前,看到fastlane提供了一套工具集,就使用gym先編譯 一個Developer證書籤名的ipa,之後使用其他證書分別簽名。

重要補充

  • 安裝jenkins的機器上的Xcode要導入開發者賬戶(存在私鑰的賬戶信息,通過首次創建證書的電腦上的Xcode導出)

文章首次發佈於:everettjf.github.io

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章