前言
新到公司的時候發(fā)現(xiàn)公司還在使用傳統(tǒng)的手動打包測試方式从撼,所以利用自己的閑暇時間開發(fā)了一個 iOS 打包平臺,經(jīng)過不斷改良钧栖,現(xiàn)在公司在使用新一款的打包平臺低零,測試人員可以輕松完成打包工作婆翔。我目前也在重新構(gòu)建平臺,發(fā)布開源版本掏婶。
本系列文章記錄完整的 iOS 打包平臺搭建過程啃奴,文章列表記錄如下:
iOS自動打包平臺搭建:一 概述
iOS自動打包平臺搭建:二 模塊(組件)化開發(fā)
iOS自動打包平臺搭建:三 Master/Slave架構(gòu)
iOS自動打包平臺搭建:四 打包腳本(待完成)
iOS自動打包平臺搭建:五 內(nèi)網(wǎng)OTA(待完成)
iOS自動打包平臺搭建:附 安卓打包(待完成)
開端
因為在開發(fā)過程中,為測試人員打包是一個耗時雄妥、重復(fù)操作較多并且容易出錯的一個部分最蕾,如果能將這一部分由測試人員自助完成,將節(jié)省很多時間老厌,而為測試人員提供自助打包的服務(wù)揖膜,就需要搭建一個簡(sha)單(gua)易(dou)用(hui)的平臺來提供支持。
Jenkins 是業(yè)界使用最多梅桩,評價最高的開源服務(wù)壹粟,但是因為使用 Jenkins 需要進行二次開發(fā)才能提供一個很友好的操作界面,并且很難自定義化我們的需求宿百。而二次開發(fā)對于我們目前的情況而言并不是很合適趁仙。
使用 shell 開發(fā)可能會遇到各種難題,但相對于 Jenkins 垦页,得到的產(chǎn)品更容易被我們掌控雀费,而且我們的需求也僅限于持續(xù)打包和模塊集成, shell 很輕松能應(yīng)對這些痊焊。
下面先簡要介紹一下第一版的一些情況及新版的一些展示盏袄,我們后續(xù)的文章將圍繞新版展開。
第一版
打包流程
打包的想法來源于 xcode 自身提供的命令集薄啥,市面所有的 iOS 打包的底層實現(xiàn)全部都是依賴這些命令集辕羽,僅僅有這些命令是不夠的,即使每次使用命令沒有問題垄惧,但這些命令依賴于 xcode 刁愿,也就是說只能在 Mac 系統(tǒng)下進行(Jenkins為什么可以?它并不可以到逊,它需要我們設(shè)置代理機器來執(zhí)行操作铣口,而這個代理機器只能是 Mac)。
到這里觉壶,我們需要一個 Mac 來做為這些腳本的暖床脑题,果斷選擇自己的電腦,不過用命令行執(zhí)行我電腦中的命令讓我毫無思路铜靶,開啟服務(wù)叔遂,apache + PHP 或者 nodejs,第一版中我選擇了前者。
打包用到的腳本為 1.sh掏熬、2.sh、3.sh秒梅, 直接丟到一個 PHP 函數(shù)中執(zhí)行旗芬,看上去并沒有問題,但是好像并不能看到當(dāng)前的進度捆蜀,頁面會一直處于加載頁面疮丛,直到腳本結(jié)束,這對于一個需要很長時間的操作用戶體驗很差啊辆它,索性再將腳本分開誊薄,每一個 PHP 函數(shù)執(zhí)行一個腳本,并且對結(jié)果做處理锰茉,然后在頁面使用 ajax 請求 觸發(fā) PHP 函數(shù)呢蔫,將每次的結(jié)果更新到界面,再根據(jù)結(jié)果處理是否繼續(xù)向下執(zhí)行飒筑,如果成功生成一條記錄寫入數(shù)據(jù)庫片吊,第一版就這樣完成了。
第一版開發(fā)中受限于時間問題沒有深入了解 PHP 的一些功能协屡,所以使用了 js 一步一步驅(qū)動打包的進展俏脊,而這種方式的弊端也是顯而易見的,無法在頁面關(guān)閉的情況下完成打包操作肤晓,而且架設(shè)在我的電腦上爷贫,造成對我的電腦的嚴(yán)重依賴,如果有一天我請假补憾,那么整個打包流程無法進行漫萄。
新一版的想法是回歸最開始的想法,所有腳本丟到一個 PHP 函數(shù)中盈匾,通過 ajax 請求執(zhí)行函數(shù)卷胯,將執(zhí)行的結(jié)果實時寫入數(shù)據(jù)庫,并且檢測到一旦正在打包威酒,開啟輪詢的方式獲取當(dāng)前進度窑睁。或許 redis 會是更好的選擇葵孤,但是對于我們沒有那么高的需求担钮,檢測到打包結(jié)束,關(guān)閉輪詢尤仍。
安裝包分發(fā)
有一種方式可以讓用戶下載安裝包箫津,可能你更多的了解是很多分發(fā)平臺在使用這種技術(shù),它叫 OTA ,是蘋果在 iOS 4 發(fā)布的一種技術(shù)苏遥,可以讓測試人員通過非商店方式安裝應(yīng)用饼拍,它的協(xié)議頭是 itms-services ,從最開始的只有 safari 到現(xiàn)在大部分瀏覽器都支持(微信不支持)田炭,我們通過如下 HTML 就可以安裝對應(yīng)的應(yīng)用:
<a title="iPhone" href=“itms-services://?action=download-manifest&url=https://192.168.0.1/installIPA.plist">
Iphone Download</a>
其中的 plist 文件是對應(yīng)用的描述文件师抄,其中包含應(yīng)用名、版本教硫、包地址等信息叨吮,具體展示如下:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>items</key>
<array>
<dict>
<key>assets</key>
<array>
<dict>
<key>kind</key>
<string>software-package</string>
<key>url</key>
<string>https://ipack.pub/Packages/installer/1.2.0/1.2.7.ipa</string>
</dict>
</array>
<key>metadata</key>
<dict>
<key>bundle-identifier</key>
<string>pub.ipack.installer</string>
<key>bundle-version</key>
<string>1.2.0</string>
<key>kind</key>
<string>software</string>
<key>title</key>
<string>iPack</string>
</dict>
</dict>
</array>
</dict>
</plist>
我們將安裝包存放在本地,然后配置好 plist 文件瞬矩,在網(wǎng)頁中配置好鏈接的按鈕就可以了茶鉴,為了方便我們開發(fā)了一款專門用來安裝的 APP,因為蘋果在介紹中有說過景用,可以通過網(wǎng)頁涵叮、郵件、APP 等方式讓用戶安裝 APP伞插,能有多少員工會在手機端接受公司郵件呢围肥? 顯然郵件不在我們考慮范圍內(nèi)。而提到網(wǎng)頁的形式蜂怎,如果讓用戶手動輸入 url穆刻,也不是明智的方案,如果簡化呢杠步?二維碼氢伟,這是一項偉大的發(fā)明,而我們公司使用釘釘交流幽歼,釘釘提供的機器人加上二維碼簡直就是上天安排好的一次約會朵锣,果斷用起來。
遇到的問題
shell 與 PHP 的交互是一個很蛋疼的問題甸私, shell 獲取 PHP 的參數(shù)容易诚些,但是獲取 shell 執(zhí)行的結(jié)果還真有些難度,打包的腳本會輸出很多信息皇型,怎么才能知道最后執(zhí)行的結(jié)果呢诬烹,一旦判斷錯了,會影響后續(xù)的操作弃鸦,可能明明成功了我們誤判為失敗了绞吁。。唬格。
因為第一次使用腳本做這樣的事兒家破,所以在腳本的調(diào)試過程中颜说,也出現(xiàn)了很多事故,現(xiàn)在的平臺也無法保證不出現(xiàn)問題汰聋,但至少經(jīng)過了上百次打包的洗禮门粪。
部分設(shè)備無法安裝,良思許久終不得解烹困,蘋果官網(wǎng)上也只見有人發(fā)問玄妈,不見官方答復(fù),不得不將 plist 文件由本地存放移動到 github 上韭邓,后經(jīng)同事點醒措近,找到問題所在溶弟,之后又移回本地女淑。
展示
新版
展示
總結(jié)
本文主要針對第一版打包思路進行介紹,并且對我們后續(xù)要展開介紹的新版進行簡要的展示辜御,如發(fā)現(xiàn)錯誤或有任何疑問歡迎留言交流鸭你。
更多內(nèi)容請訪問 http://blog.makaiwen.com