iOS 持續(xù)集成打包腳本

我是一名測(cè)試惋嚎,所以編碼能力有限予权,在大家看代碼的過程中,若發(fā)現(xiàn)問題或者建議請(qǐng)及時(shí)指出脂凶,或者直接在 GitHub 提交代碼
寫此文檔的初衷宪睹,因?yàn)閮赡昵熬蛯戇^ iOS 打包腳本,后來去做提升效能的測(cè)試工具的開發(fā)蚕钦,就不在關(guān)注前端的知識(shí)了亭病,現(xiàn)在
又要測(cè)試前端的業(yè)務(wù),但是之前的打包不能通用嘶居,所以自己就重新整理了一套通用的打包腳本與大家分享一下

摘要:本文主要介紹 iOS 打包腳本所必須的配置罪帖,及注意事項(xiàng)。腳本中不涉及第三方打包工具邮屁,如:fastlane整袁,或者第三方應(yīng)用分發(fā) 平臺(tái),如:fir.im佑吝。完全是基于 Apple 官方提供的 xcodebuild 編譯打包芋忿,通過 itms-services 分發(fā)應(yīng)用戈钢,以及通過 altoolipa 上傳至 iTunes Connecnt

項(xiàng)目

  • 項(xiàng)目名稱:iOS-CI-Script
  • 前提:
    • 使用此項(xiàng)目進(jìn)行持續(xù)集成,項(xiàng)目中的證書管理必須采用手動(dòng)管理的方式
    • 項(xiàng)目須使用 Cocopods 管理第三方模塊(如不符合此條抖所,可以自行調(diào)整 xcodebuild 打包命令即可
      Tip:此項(xiàng)目主要針對(duì)持續(xù)集成田轧,如:Jenkins 或 GItLab CI 使用鞍恢,若想在本地直接運(yùn)行,需要進(jìn)行微調(diào)
  • 能做什么窒典?瀑志?污秆?
    1. 打包之前修改 APP 名稱(CFBundleDisplayName)、版本號(hào)(CFBundleShortVersionString)及構(gòu)建號(hào)(CFBundleVersion
    2. 可以結(jié)合 Jenkins 選擇 Configuration 的打包類型战得,選擇你需要構(gòu)建的類型庸推,如:Debug贬媒、EnterpriseRelease 等等
    3. 結(jié)合 Jenkins 或 GitLab CI 實(shí)現(xiàn)應(yīng)用分發(fā)杀捻,無需依賴第三方平臺(tái)
    4. 結(jié)合 Jenkins 或 GitLab CI 將 ipa 自動(dòng)上傳 iTunes Connect,并發(fā)布 TestFlight 內(nèi)測(cè)
      Tip:無論各位所在的公司中有多少個(gè)開發(fā)項(xiàng)目或者馬甲包器赞,使用此腳本港柜,只需一個(gè)配置文件即可輕松搞定持續(xù)集成哦

運(yùn)行環(huán)境

  • Python 3.5 及以上(Mac 安裝:brew install python3
  • xcodebuild
  • xcpretty(安裝方式:gem install xcpretty夏醉,RubyGems 安裝請(qǐng)點(diǎn)擊鏈接畔柔,這里就不再贅述)
    Tip:腳本運(yùn)行所需第三方模塊靶擦,見項(xiàng)目根目錄下的 Pipfile 文件內(nèi)容

運(yùn)行方式

python3 ci.py

目錄結(jié)構(gòu)

├── Pipfile  // pipenv 安裝依賴庫的配置文件
├── README.md  // 使用說明文件
├── ci.py  // 入口文件
├── modify_plist.py  // 修改項(xiàng)目中的 APP 配置文件,及腳本中打包依賴的 plist 文件
├── compile.py  // xcodebuild 打包相關(guān)的配置踩蔚,包含:clean枚粘、archive馅闽、export ipa馍迄、zip dSYM
├── archive.py  // 處理 Jenkins 歸檔的相關(guān)操作捞蛋,詳情請(qǐng)看代碼注釋
├── configurations  // 此目錄存放 app 的配置信息文件(支持多個(gè) APP 打包配置文件柬姚,在 `Jenkins + iOS 持續(xù)集成配置` 會(huì)進(jìn)行持續(xù)集成配置講解)拟杉,詳情請(qǐng)看下面文件的介紹信息
│   └── example.plist  // 配置文件模板
├── libs  // 此目錄存在一些工具里及環(huán)境變量文件
│   ├── __init__.py
│   ├── configuration.py  // 初始化配置類
│   ├── env_enum.py  // 存在環(huán)境變量文件
│   ├── html_tools.py  // html 解析類(目前暫未使用)
│   ├── make_qr_code.py  // 生成二維碼函數(shù)
│   └── plist_operation.py  // 操作 plist 工具類
├── plist  // 存在 exportOption 配置文件
│   ├── ad-hoc.plist
│   ├── app-store.plist
│   ├── development.plist
│   ├── enterprise.plist
│   └── itms-services.plist  // 此文件的作用是分發(fā)應(yīng)用量承,與打包無關(guān)
└── static  // 存放靜態(tài)資源文件
    ├── html  // 存放 html web 靜態(tài)頁面的目錄搬设,在 `Jenkins + iOS 持續(xù)集成配置` 這篇中會(huì)進(jìn)行演示
    └── icon  // 存在 app icon 的目錄

使用說明

基礎(chǔ)參數(shù)配置

# 編輯 `lib` 目錄下的 `env_num` 變量文件
# 需手動(dòng)更改的參數(shù)(選擇默認(rèn)也可以)
DIST_CONFIGURATION_NAME = 'Release'
ARCHIVE_DIR_NAME = 'Products'
SCRIPT_DIR_NAME = 'scripts'
WORKSPACE_URL = f'{BUILD_URL}execution/node/3/ws/'
  • 變量說明
    • DIST_CONFIGURATION_NAME:項(xiàng)目中配置發(fā)布證書的 configuration 的名稱
    • ARCHIVE_DIR_NAME:Jenkins 配置歸檔的目錄名稱,此目錄是被創(chuàng)建在代碼的根目錄
    • SCRIPT_DIR_NAME:存在腳本項(xiàng)目的目錄名稱撕捍,也是在項(xiàng)目的根目錄下
    • WORKSPACE_URL:此 URL 是通過 Jenkins 的 Web 頁面上訪問的 WORKSPACE 的 URL(必須修改)

iTunes Connect 參數(shù)配置

# 編輯 `lib` 目錄下的 `env_num` 變量文件
# iTunes Connect 配置
UPLOAD_ITUNES_CONNECT = os.getenv('UPLOAD_ITUNES_CONNECT', 'false') 
ITC_USER = os.getenv('ITC_USER', None)
ITC_PASSWORD = os.getenv('ITC_PASSWORD', None)
  • 變量說明
    • UPLOAD_ITUNES_CONNECT:上傳 iTunes Connect(發(fā)布 TestFlight 內(nèi)測(cè))拿穴,默認(rèn) false 不上傳
    • ITC_USER:開發(fā)者賬號(hào)用戶名
    • ITC_PASSWORD:開發(fā)者賬號(hào)密碼(若 Apple 賬號(hào)已開啟雙重認(rèn)證忧风,請(qǐng)生成并使用專用密碼
      注:為了安全起見,不建議將開發(fā)者賬號(hào)的用戶名和密碼寫死在腳本或則環(huán)境系統(tǒng)的環(huán)境變量中腿宰,個(gè)人建議寫在 Jenkins 的 JOB 中,針對(duì)此 JOB 做權(quán)限控制即可

APP 配置文件參數(shù)講解

example.plist
  • 配置文件參數(shù)說明
    • appName:應(yīng)用名稱
    • workspace:app workspace(注:如果無 workspace椿每,就需要修改 compile.py 文件的中打包命令英遭,針對(duì)目前大部分項(xiàng)目都是用 Cocopods 管理依賴庫的挖诸,所以目前未對(duì)未使用 workspace 的項(xiàng)目兼容
    • scheme:scheme (嗯.....不好描述汁尺,如果對(duì) workspacescheme 不理解的税灌,請(qǐng)點(diǎn)擊 這里
      • 注:在項(xiàng)目中必須將此 scheme 設(shè)置為 shared
    • iconPath:存在 static/icon 目錄下的 icon
      • icon 規(guī)格:推薦 128 * 128 或 144 * 144(大小適中即可
        Tip:這是用于生成二維碼時(shí)均函,給中間增加圖標(biāo)用的亿虽,如果圖片不合法會(huì)報(bào)錯(cuò),所以需要讓 UE 或者 RD 把這個(gè) icon 給你
    • plistPaths:配置自代碼根目錄下的 info.plist 文件的相對(duì)路徑苞也,主要包括:項(xiàng)目及 Extension 中的 info.plist 文件路徑(注:和 APP 不相關(guān)的 info.plist 無需配置
    • Debug洛勉、AdHocRelease如迟、Enterprise收毫,這幾個(gè)都是項(xiàng)目中 Configuration 的名稱,由于配置都是一樣的殷勘,所以就 Debug 進(jìn)行說明此再,如下??
      • method:此參數(shù)的值有四種類型:app-store, ad-hoc, enterprise or development 詳情請(qǐng)查看 Xcode Archive: export options 此文檔
      • teamID:開發(fā)者賬號(hào)的 ID,獲取方式:登錄開發(fā)者賬號(hào) → 點(diǎn)擊 Team Name → 選擇 View Account玲销,然后在頁面中找到 Team ID 即可
      • bundleID:就是 APP 的唯一標(biāo)識(shí)输拇,如:com.companyName.porjectName
      • provisioningProfiles:此配置參數(shù)是字典類型 key: value
        • key 的值為 bundleID
        • value 的值為 buildID 所對(duì)應(yīng)的描述文件(Provisioning Profile)的名稱
          注:項(xiàng)目中涉及到所有的 bundleID 都必須要用 key: value 的形式寫在這里,例如:除了項(xiàng)目的 bundleID 和 NotificationServiceExtension(如果 APP 不涉及推送贤斜,請(qǐng)忽略) 的 bundleID這兩個(gè)策吠,可能還有自定義的 ExtensionbundleID

其它

itms-services(了解即可)

通過 itms-services 協(xié)議,發(fā)布或者分享 iOS 應(yīng)用程序?qū)ёx:itms-services 協(xié)議常用于 iOS 企業(yè)應(yīng)用的無線部署瘩绒,這可在不使用 iTunes 的情況下將內(nèi)部軟件發(fā)布或者分享給用戶猴抹。

  • 實(shí)現(xiàn)原理
OTA 方式安裝,是通過 Safari 解析鏈接中的 "itms-services://" 來實(shí)現(xiàn)的锁荔。
例如:
<a title="iPhone" href="itms-services://?action=download-manifest&url=https://github.com/NAISI-ZC/iOS-CI-Script/blob/master/plist/itms-services.plist">
  安裝應(yīng)用
</a>
Safari 會(huì)去讀取 itms-services.plist 中的信息蟀给,如:iOS 應(yīng)用的名稱、版本阳堕、安裝地址等跋理。
什么是 OTA?嘱丢?薪介?
OTA 即 Over-the-Air,是 Apple 在  iOS 4 中新加的一項(xiàng)技術(shù)越驻,目的是讓開發(fā)者能夠脫離 Appstore,實(shí)現(xiàn)從自己的服務(wù)器下載并安裝 iOS 應(yīng)用道偷。
簡單地說缀旁,就是用戶只需要在 Safari 中點(diǎn)開一條鏈接,就能直接在主界面中安裝 APP
  • 注意事項(xiàng)
    1. itms-services 協(xié)議拼接的 URL 必須是 HTTPS 服務(wù)
    2. HTTPS 無須暴露在公網(wǎng)下勺鸦,只要保證是可信的證書即可(自簽名證書生成并巍,個(gè)人沒做過,所以不做斷言换途。個(gè)人覺得關(guān)于證書問題直接找運(yùn)維解決就可以了

配置持續(xù)集成請(qǐng)查看 Jenkins + iOS 持續(xù)集成配置

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末懊渡,一起剝皮案震驚了整個(gè)濱河市刽射,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌剃执,老刑警劉巖誓禁,帶你破解...
    沈念sama閱讀 218,451評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異肾档,居然都是意外死亡摹恰,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,172評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門怒见,熙熙樓的掌柜王于貴愁眉苦臉地迎上來俗慈,“玉大人,你說我怎么就攤上這事遣耍」脍澹” “怎么了?”我有些...
    開封第一講書人閱讀 164,782評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵舵变,是天一觀的道長酣溃。 經(jīng)常有香客問我,道長棋傍,這世上最難降的妖魔是什么救拉? 我笑而不...
    開封第一講書人閱讀 58,709評(píng)論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮瘫拣,結(jié)果婚禮上亿絮,老公的妹妹穿的比我還像新娘。我一直安慰自己麸拄,他們只是感情好派昧,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,733評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著拢切,像睡著了一般蒂萎。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上淮椰,一...
    開封第一講書人閱讀 51,578評(píng)論 1 305
  • 那天五慈,我揣著相機(jī)與錄音,去河邊找鬼主穗。 笑死泻拦,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的忽媒。 我是一名探鬼主播争拐,決...
    沈念sama閱讀 40,320評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼晦雨!你這毒婦竟也來了架曹?” 一聲冷哼從身側(cè)響起隘冲,我...
    開封第一講書人閱讀 39,241評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎绑雄,沒想到半個(gè)月后展辞,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,686評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡绳慎,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,878評(píng)論 3 336
  • 正文 我和宋清朗相戀三年纵竖,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片杏愤。...
    茶點(diǎn)故事閱讀 39,992評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡靡砌,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出珊楼,到底是詐尸還是另有隱情通殃,我是刑警寧澤,帶...
    沈念sama閱讀 35,715評(píng)論 5 346
  • 正文 年R本政府宣布厕宗,位于F島的核電站画舌,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏已慢。R本人自食惡果不足惜曲聂,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,336評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望佑惠。 院中可真熱鬧朋腋,春花似錦、人聲如沸膜楷。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,912評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽赌厅。三九已至穷绵,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間特愿,已是汗流浹背仲墨。 一陣腳步聲響...
    開封第一講書人閱讀 33,040評(píng)論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留揍障,地道東北人宗收。 一個(gè)月前我還...
    沈念sama閱讀 48,173評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像亚兄,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子采驻,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,947評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容