iOS持續(xù)集成:Jenkins + Fastlane + GitLab + 蒲公英

前言

在進(jìn)行今天內(nèi)容講解前,首先我們來介紹下持續(xù)集成相關(guān)的概念。這樣會讓我們對軟件開發(fā)有一個整體的認(rèn)識置鼻。

持續(xù)集成

概念

持續(xù)集成(Continuous Integration诲宇,簡稱CI)是一種軟件開發(fā)實踐,即團(tuán)隊開發(fā)成員經(jīng)常集成他們的工作说莫,通過每個成員每天至少集成一次,也就意味著每天可能會發(fā)生多次集成寞焙。每次集成都通過自動化的構(gòu)建(包括編譯储狭,發(fā)布,自動化測試)來驗證捣郊,從而盡早地發(fā)現(xiàn)集成錯誤辽狈。

價值

  • 減少風(fēng)險:一天中進(jìn)行多次的集成,并做了相應(yīng)的測試呛牲,這樣有利于檢查缺陷刮萌,了解軟件的健康狀況,減少假定娘扩。

  • 減少重復(fù)過程:減少重復(fù)的過程可以節(jié)省時間着茸、費用和工作量。例如:代碼編譯琐旁、數(shù)據(jù)庫集成涮阔、測試、審查灰殴、部署及反饋敬特。通過自動化的持續(xù)集成可以將這些重復(fù)的動作都變成自動化的,無需太多人工干預(yù)验懊,讓人們的時間更多的投入到動腦筋的擅羞、更高價值的事情上。

  • 任何時間义图、任何地點生成可部署的軟件:利用持續(xù)集成减俏,您可以經(jīng)常對源代碼進(jìn)行一些小改動,并將這些改動和其他的代碼進(jìn)行集成碱工。如果出現(xiàn)問題娃承,項目成員馬上就會被通知到,問題會第一時間被修復(fù)怕篷。

目的

持續(xù)集成的目的历筝,就是讓產(chǎn)品可以快速迭代,同時還能保持高質(zhì)量廊谓。它的核心措施是梳猪,代碼集成到主干之前,必須通過自動化測試蒸痹。只要有一個測試用例失敗春弥,就不能集成呛哟。

相關(guān)概念

持續(xù)集成 相關(guān)的,還有兩個概念匿沛,分別是 持續(xù)交付持續(xù)部署 扫责。

持續(xù)交付

持續(xù)交付(Continuous Delivery)指的是,頻繁地將軟件的新版本逃呼,交付給質(zhì)量團(tuán)隊或者用戶鳖孤,以供評審。如果評審?fù)ㄟ^抡笼,代碼就進(jìn)入生產(chǎn)階段苏揣。
持續(xù)交付可以看作持續(xù)集成的下一步。它強調(diào)的是蔫缸,不管怎么更新腿准,軟件是隨時隨地可以交付的。

持續(xù)部署

持續(xù)部署(Continuous Deployment)是持續(xù)交付的下一步拾碌,指的是代碼通過評審以后遗嗽,自動部署到生產(chǎn)環(huán)境髓抑。
持續(xù)部署的目標(biāo)是,代碼在任何時刻都是可部署的曲饱,可以進(jìn)入生產(chǎn)階段灾前。

流程

根據(jù) 持續(xù)集成 的設(shè)計防症,代碼從提交到生產(chǎn),整個過程有以下幾步哎甲。

提交

流程的第一步蔫敲,是開發(fā)者向代碼倉庫提交代碼。所有后面的步驟都始于本地代碼的一次提交(commit)炭玫。

測試(第一輪)

代碼倉庫對commit操作配置了鉤子(hook)奈嘿,只要提交代碼或者合并進(jìn)主干,就會跑自動化測試吞加。

測試有好幾種裙犹。

  • 單元測試:針對函數(shù)或模塊的測試
  • 集成測試:針對整體產(chǎn)品的某個功能的測試,又稱功能測試
  • 端對端測試:從用戶界面直達(dá)數(shù)據(jù)庫的全鏈路測試

第一輪至少要跑單元測試衔憨。

構(gòu)建

通過第一輪測試叶圃,代碼就可以合并進(jìn)主干,就算可以交付了践图。
交付后掺冠,就先進(jìn)行構(gòu)建(build),再進(jìn)入第二輪測試码党。所謂構(gòu)建德崭,指的是將源碼轉(zhuǎn)換為可以運行的實際代碼悍及,比如安裝依賴,配置各種資源(樣式表接癌、JS腳本心赶、圖片)等等。

常用的構(gòu)建工具如下缺猛。

  • Jenkins
  • Travis
  • Codeship
  • Strider

Jenkins 和 Strider 是開源軟件缨叫,Travis 和 Codeship 對于開源項目可以免費使用。它們都會將構(gòu)建和測試荔燎,在一次運行中執(zhí)行完成耻姥。

測試(第二輪)

構(gòu)建完成,就要進(jìn)行第二輪測試有咨。如果第一輪已經(jīng)涵蓋了所有測試內(nèi)容琐簇,第二輪可以省略,當(dāng)然座享,這時構(gòu)建步驟也要移到第一輪測試前面婉商。
第二輪是全面測試,單元測試和集成測試都會跑渣叛,有條件的話丈秩,也要做端對端測試。所有測試以自動化為主淳衙,少數(shù)無法自動化的測試用例蘑秽,就要人工跑。
需要強調(diào)的是箫攀,新版本的每一個更新點都必須測試到肠牲。如果測試的覆蓋率不高,進(jìn)入后面的部署階段后靴跛,很可能會出現(xiàn)嚴(yán)重的問題缀雳。

部署

通過了第二輪測試,當(dāng)前代碼就是一個可以直接部署的版本(artifact)汤求。將這個版本的所有文件打包( tar filename.tar * )存檔俏险,發(fā)到生產(chǎn)服務(wù)器。
生產(chǎn)服務(wù)器將打包文件扬绪,解包成本地的一個目錄竖独,再將運行路徑的符號鏈接(symlink)指向這個目錄,然后重新啟動應(yīng)用挤牛。這方面的部署工具有 Ansible莹痢,Chef,Puppet 等。

回滾

一旦當(dāng)前版本發(fā)生問題竞膳,就要回滾到上一個版本的構(gòu)建結(jié)果航瞭。最簡單的做法就是修改一下符號鏈接,指向上一個版本的目錄坦辟。

下面部分就是今天要講的內(nèi)容刊侯,前面花那么大的篇幅主要是想讓大家對軟件開發(fā)有個整體的認(rèn)識。測試驅(qū)動和持續(xù)集成被稱為敏捷編程的兩大基石锉走,也是現(xiàn)階段互聯(lián)網(wǎng)軟件開發(fā)的趨勢滨彻。

Fastlane 安裝

Fastlane 是一個快速將 iOS 項目打包成 ipa 文件的工具。要安裝 fastlane挪蹭,請參考 iOS 持續(xù)集成:Fastlane + 蒲公英自動打包發(fā)布亭饵,這里我們不再贅述。

Jenkins 安裝和使用

安裝 Jenkins

方法一:直接下載安裝包安裝梁厉,下載地址: http://jenkins-ci.org

方法二:命令行安裝

// 安裝 jenkins
brew install jenkins 

// 啟動 jenkins
jenkins

// 卸載 jenkins
brew uninstall jenkins

// brew 無效辜羊,需要先安裝 Homebrew 
ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

訪問 Jenkins

打開瀏覽器訪問 Jenkins 默認(rèn)地址 http://localhost:8080/ ,能夠正常打開說明安裝成功词顾。

使用 Jenkins

自動化構(gòu)建設(shè)置

在 Jenkins 中八秃,所有的任務(wù)都是以 “item” 為單位的。接下來我們就新建一個 iOS 的項目來開始自動化構(gòu)建计技。點擊“新建”喜德,輸入 item 的名稱,選擇 “構(gòu)建一個自由風(fēng)格的軟件項目”垮媒,然后點擊 “OK”。

Jenkins 創(chuàng)建項目-1.png

然后按下圖設(shè)置構(gòu)建信息:

Jenkins 創(chuàng)建項目-2.png
源碼管理

這里主要是設(shè)置源碼的倉庫航棱,以便讓 Jenkins 知道我們的 iOS 項目的代碼在哪里睡雇。因為我的代碼放在自己搭建的 GitLab 倉庫中(如果你用 Github 等其他倉庫也是類似),所以要先告訴 Jenkins 如何獲取代碼饮醇。首先它抱,我們需要配置 SSH,我們可以在 Jenkins 的證書管理中添加 SSH朴艰。在 Jenkins 管理頁面观蓄,選擇 “Credentials”,然后選擇 “Global credentials (unrestricted)”祠墅,點擊 “Add Credentials”侮穿,如下圖所示,我們填寫自己的 SSH 信息毁嗦,然后點擊 “Save”亲茅,這樣就把 SSH 添加到 Jenkins 的全局域中去了。

Jenkins 源碼管理.png

接下來,我們再回到剛剛新建的任務(wù)中克锣,在源碼管理中茵肃,選擇 Git,按下圖填好相關(guān)信息袭祟。注意:Branch Specifier (blank for 'any') 選擇需要打包的分支验残。

Jenkins 添加 Git .png
構(gòu)建觸發(fā)器設(shè)置

因為此教程不涉及自動測試這塊的流程,所以不需要設(shè)置觸發(fā)器巾乳。

構(gòu)建環(huán)境設(shè)置

這里我們是直接用 fastlane 這個工具您没,所以這里不需要特別設(shè)置。fastlane 會自動讀取本地 iOS 項目中設(shè)置的簽名等信息想鹰,所以需要保證本地 iOS 工程已經(jīng)設(shè)置好了正確的簽名信息和 Provisioning Profiles 等文件紊婉,并在 keychain 中已經(jīng)加入了正確的證書。否則后續(xù)的操作中可能會出現(xiàn)錯誤辑舷。如果這里沒有設(shè)置好喻犁,請用 Xcode 打包工程進(jìn)行相關(guān)設(shè)置即可。

腳本設(shè)置

這一步主要用來打包 ipa 并上傳到蒲公英何缓。我們點擊“增加構(gòu)建步驟”肢础,選擇 "Execute Shell"。輸入下列腳本:

IPANAME=“TestGitProject”
fastlane gym --export_method ad-hoc --output_name ${IPANAME}
curl -F "file=@${IPANAME}.ipa" -F "uKey=4477d913a078c11df32be931523619dc" -F "_api_key=d066f633dc2d970eb230dba7823ff022" https://qiniu-storage.pgyer.com/apiv1/app/upload

注意:其中碌廓,USER_KEY 和 API_KEY 可以在蒲公英的「賬戶設(shè)置」中找到传轰,之后進(jìn)行相應(yīng)替換。
export_method 可以根據(jù)打包類型進(jìn)行相應(yīng)設(shè)置谷婆】埽可選的值有:app-store、ad-hoc纪挎、development期贫、enterprise。對于 Xcode 8.3 以下的版本异袄,則不需要設(shè)置 export_method通砍。

設(shè)置好之后,類似界面如下所示:

Jenkins 構(gòu)建.png

最后點擊最下面的 Save 按鈕來保存所有設(shè)置烤蜕。這樣我們就簡單的實現(xiàn)了自動打包封孙,并上傳到蒲公英的所有配置了。

接下來讽营,我們可以測試一下虎忌。點擊項目頁面左側(cè)的 Build Now,我們可以看到項目已經(jīng)開始構(gòu)建斑匪。在 Console Output 中呐籽,我們可以看到項目已經(jīng)成功構(gòu)建锋勺,并自動上傳到了蒲公英。

Jenkins 打包日志-1.png

最后看到 Finished: SUCCESS 說明打包上傳蒲公英成功狡蝶∈鳎可以根據(jù)日志中應(yīng)用下載鏈接去下載測試應(yīng)用。

Jenkins 打包日志-2.png

常見問題

出現(xiàn) fastlane: command not found 怎么辦贪惹?

解決方法一:這個情況一般是由于 jenkins 沒有設(shè)置正確的 $PATH 環(huán)境變量導(dǎo)致的苏章。正確設(shè)置的方法為:

在命令行下執(zhí)行 echo $PATH,記錄下輸出的結(jié)果
在 jenkins 中系統(tǒng)管理-系統(tǒng)設(shè)置中奏瞬,找到 環(huán)境變量(Environment variables)
在 key 中填寫 PATH枫绅,在 value 中填寫第一步中輸出的結(jié)果
保存即可。

解決方法二:請確認(rèn)您安裝 Jenkins 的方式和我們在本文里推薦的方式一致硼端。使用其他方式安裝的 Jenkins 也經(jīng)常會出現(xiàn)此問題并淋。

原文鏈接:http://sessionch.com/fastlane/fastlane-jenkins-gitlab-pgy.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市珍昨,隨后出現(xiàn)的幾起案子县耽,更是在濱河造成了極大的恐慌,老刑警劉巖镣典,帶你破解...
    沈念sama閱讀 212,686評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件兔毙,死亡現(xiàn)場離奇詭異,居然都是意外死亡兄春,警方通過查閱死者的電腦和手機(jī)澎剥,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,668評論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來赶舆,“玉大人哑姚,你說我怎么就攤上這事∥咭穑” “怎么了蜻懦?”我有些...
    開封第一講書人閱讀 158,160評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長夕晓。 經(jīng)常有香客問我,道長悠咱,這世上最難降的妖魔是什么蒸辆? 我笑而不...
    開封第一講書人閱讀 56,736評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮析既,結(jié)果婚禮上躬贡,老公的妹妹穿的比我還像新娘。我一直安慰自己眼坏,他們只是感情好拂玻,可當(dāng)我...
    茶點故事閱讀 65,847評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般檐蚜。 火紅的嫁衣襯著肌膚如雪魄懂。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 50,043評論 1 291
  • 那天闯第,我揣著相機(jī)與錄音市栗,去河邊找鬼。 笑死咳短,一個胖子當(dāng)著我的面吹牛填帽,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播咙好,決...
    沈念sama閱讀 39,129評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼篡腌,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了勾效?” 一聲冷哼從身側(cè)響起嘹悼,我...
    開封第一講書人閱讀 37,872評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎葵第,沒想到半個月后绘迁,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,318評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡卒密,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,645評論 2 327
  • 正文 我和宋清朗相戀三年缀台,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片哮奇。...
    茶點故事閱讀 38,777評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡膛腐,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出鼎俘,到底是詐尸還是另有隱情哲身,我是刑警寧澤,帶...
    沈念sama閱讀 34,470評論 4 333
  • 正文 年R本政府宣布贸伐,位于F島的核電站勘天,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏捉邢。R本人自食惡果不足惜脯丝,卻給世界環(huán)境...
    茶點故事閱讀 40,126評論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望伏伐。 院中可真熱鬧宠进,春花似錦、人聲如沸藐翎。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,861評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至堤器,卻和暖如春昆庇,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背吼旧。 一陣腳步聲響...
    開封第一講書人閱讀 32,095評論 1 267
  • 我被黑心中介騙來泰國打工凰锡, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人圈暗。 一個月前我還...
    沈念sama閱讀 46,589評論 2 362
  • 正文 我出身青樓掂为,卻偏偏與公主長得像,于是被迫代替她去往敵國和親员串。 傳聞我的和親對象是個殘疾皇子勇哗,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,687評論 2 351

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