前言
在進(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”。
然后按下圖設(shè)置構(gòu)建信息:
源碼管理
這里主要是設(shè)置源碼的倉庫航棱,以便讓 Jenkins 知道我們的 iOS 項目的代碼在哪里睡雇。因為我的代碼放在自己搭建的 GitLab 倉庫中(如果你用 Github 等其他倉庫也是類似),所以要先告訴 Jenkins 如何獲取代碼饮醇。首先它抱,我們需要配置 SSH,我們可以在 Jenkins 的證書管理中添加 SSH朴艰。在 Jenkins 管理頁面观蓄,選擇 “Credentials”,然后選擇 “Global credentials (unrestricted)”祠墅,點擊 “Add Credentials”侮穿,如下圖所示,我們填寫自己的 SSH 信息毁嗦,然后點擊 “Save”亲茅,這樣就把 SSH 添加到 Jenkins 的全局域中去了。
接下來,我們再回到剛剛新建的任務(wù)中克锣,在源碼管理中茵肃,選擇 Git,按下圖填好相關(guān)信息袭祟。注意:Branch Specifier (blank for 'any') 選擇需要打包的分支验残。
構(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è)置好之后,類似界面如下所示:
最后點擊最下面的 Save 按鈕來保存所有設(shè)置烤蜕。這樣我們就簡單的實現(xiàn)了自動打包封孙,并上傳到蒲公英的所有配置了。
接下來讽营,我們可以測試一下虎忌。點擊項目頁面左側(cè)的 Build Now,我們可以看到項目已經(jīng)開始構(gòu)建斑匪。在 Console Output 中呐籽,我們可以看到項目已經(jīng)成功構(gòu)建锋勺,并自動上傳到了蒲公英。
最后看到 Finished: SUCCESS 說明打包上傳蒲公英成功狡蝶∈鳎可以根據(jù)日志中應(yīng)用下載鏈接去下載測試應(yīng)用。
常見問題
出現(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