讓程序員變懶的工具 : Jenkins + 蒲公英
關(guān)于懶惰
經(jīng)??吹胶芏嗖┪睦锩嬷v’懶惰’是一個(gè)優(yōu)秀程序猿的良好品質(zhì),這一點(diǎn)我深以為然,因?yàn)樵诔绦蛟车墓ぷ髦锌偸浅錆M了重復(fù)勞動(dòng),也許正是因?yàn)檫@個(gè)原因,導(dǎo)致大部分程序猿慢慢變得懶惰,而那些沒(méi)變懶的程序猿他們慢慢滅絕了~~~。而對(duì)于懶惰這個(gè)詞,我們不能曲解它的意思,并不是怠倦、消沉的對(duì)待工作,而是當(dāng)一個(gè)程序員遇到重復(fù)的工作時(shí),懶惰的程序員首先想到的是我要開(kāi)發(fā)出一個(gè)工具自動(dòng)執(zhí)行這些工作。
為什么需要工具
當(dāng) UI 妹子給你一大堆圖片而沒(méi)有給你加上 @2x 后綴時(shí),看著妹子可憐的眼神,怎么忍心讓妹子們返工,懶惰的程序員就在想了,這特么是一個(gè)循環(huán)重復(fù)的勞動(dòng),為啥不寫個(gè)腳本自動(dòng)給每張圖片文件名加上一個(gè) @2x 后綴呢,分分鐘搞定,然后準(zhǔn)時(shí)下班約會(huì)去了。。。。
所以很早之前我的***個(gè)開(kāi)源工具 dSYM 分析工具 就是這么來(lái)的,當(dāng)我連在命令行中續(xù)修改了幾個(gè)友盟統(tǒng)計(jì)后臺(tái)收集到異常后,我發(fā)現(xiàn)這就是一個(gè)重復(fù)而且繁瑣的勞動(dòng)啊,所以我便花了兩個(gè)多小時(shí)做了一個(gè) APP 應(yīng)用,這樣以后我每次需要做的只是:1)打開(kāi)應(yīng)用,2)拖入 dSYM 文件 3)輸入異常地址,便得到異常信息了。
而寫這篇文章則講述了我是如何一步一步從 1)手動(dòng)打包 –> 2)Jenkins 打包,手動(dòng)發(fā)布 –> 3)Jenkins 打包 + 蒲公英 分發(fā) 的。
起因
對(duì)于發(fā)包這個(gè)問(wèn)題,相信是每個(gè)程序猿哥哥心中揮之不去的痛,而測(cè)試妹子們也在每次馬上就發(fā)的承諾中得出一個(gè)結(jié)論 : “你是個(gè)大騙子”。
所以每次被測(cè)試妹子追著要測(cè)試包,產(chǎn)品經(jīng)理說(shuō)給我裝一個(gè)開(kāi)發(fā)中的新版本瞧瞧唄,后臺(tái)哥哥說(shuō)給我安裝一個(gè)某某老版本的包調(diào)試一下啊。。。然后每次不得暫停下手中的工作,切換到某個(gè)版本,Archive。。。。終于有一次答應(yīng)測(cè)試妹子吃飯前會(huì)給他們發(fā)包后,忙著忙著就忘掉直接去吃飯了,看著妹子 QQ 上發(fā)來(lái)各種鄙視的表情,這不是我想要的人生啊,我一定要改變?cè)跍y(cè)試妹子心中的形象,所以自動(dòng)化構(gòu)建這件事情提上日程.
使用 Jenkins 半自動(dòng)化
我直接選用了已經(jīng)很成熟的 Jenkins 持續(xù)集成解決方案,至于如何配置就不做過(guò)多介紹了,網(wǎng)上有不少這類的文章。有了 Jenkins 后,給我?guī)?lái)最便利的一點(diǎn)就是,每次打包的時(shí)候,直接在公司的 Mac 服務(wù)器上進(jìn)行操作,而我還可以繼續(xù)進(jìn)行手上的工作,打包完成后把 ipa 包發(fā)給測(cè)試,同時(shí)也教會(huì)了測(cè)試如何從 Jenkins 上下載已經(jīng)打包好的 ipa 文件,就這樣我可以隨時(shí)在手機(jī)上打開(kāi)公司內(nèi)網(wǎng)的 Jenkins 打包,當(dāng)我把這一切告訴測(cè)試妹子的時(shí)候,她用期望的眼神看著我說(shuō):“這是真的么。。。”
Jenkins + 蒲公英 升級(jí)
就這樣用了一段時(shí)間,也沒(méi)遇到什么問(wèn)題,或許是比較愛(ài)折騰,我發(fā)現(xiàn)每次 Jenkins 打包好了之后,我還需要手動(dòng)去下載,或者讓測(cè)試他們下載,當(dāng)測(cè)試拿到文件后,還需要將手機(jī)連到電腦用 iTunes 或者第三方工具安裝文件,我想要是 Jenkins 打包完成后會(huì)自動(dòng)通知測(cè)試更新并安裝該多好,而且之前也聽(tīng)說(shuō)過(guò)第三方的分發(fā)平臺(tái) “蒲公英”,于是我去蒲公英網(wǎng)站看了一番,很高興的是他們開(kāi)放上傳 APP 和安裝 APP 等 API,有了這個(gè)東西,我的想法便完全可以實(shí)現(xiàn)了:1)Jenkins 打包 2)打包成功后 IPA 文件上傳到 Tomcat 服務(wù)器 3)通過(guò) API 把 IPA 文件傳給 蒲公英 4)上傳成功后把安裝地址通過(guò)郵件發(fā)送給測(cè)試。 5)測(cè)試直接在手機(jī)上打開(kāi)地址安裝。
流程圖大概像這樣:
1.IPA 文件上傳到 Tomcat 服務(wù)器
由于每次 Jenkins 打包的時(shí)候,編譯后的文件是放在項(xiàng)目根目錄下的 build 文件夾里面,每次 build 的時(shí)候這個(gè)文件夾內(nèi)的文件都會(huì)被覆蓋,所以每次 build 后我都會(huì)通過(guò) FTP 把 IPA 文件上傳到 Tomcat 上備份,同時(shí)還可以方便提供給別人下載,比如在給測(cè)試發(fā)送蒲公英的安裝地址時(shí),同時(shí)也可以給出 IPA 下載地址。
* 開(kāi)啟 Mac FTP-server
Mac 電腦本身是支持 FTP 服務(wù)的,只不過(guò)系統(tǒng)默認(rèn)關(guān)閉了,Mountain Tweaks 這款軟件可以很方便的修改系統(tǒng)的一些設(shè)置,比如是否開(kāi)啟打開(kāi) Window 動(dòng)畫,是否顯示用戶的 Library 文件夾,其中有一個(gè)選項(xiàng)就是是否開(kāi)啟系統(tǒng)的 FTP-server 功能。
* 配置 Jenkins 的 FTP Server
Mac服務(wù)器支持 FTP-server 后,我在 Jenkins 上安裝了 Publish Over FTP Plugin 這個(gè)插件,這個(gè)插件可以將指定的文件發(fā)送到選中的 FTP 服務(wù)器上去,安裝完插件后,在 Jenkins 的系統(tǒng)設(shè)置中會(huì)多出一項(xiàng) Publish over FTP 的設(shè)置,因?yàn)?Tomcat 和 Jenkins 是在一臺(tái)電腦上,所以 Hostname 直接指向本地,Remote Directory 也直接指向 Tomcat 的 webapps 下對(duì)應(yīng) app 的目錄。配置好后可以點(diǎn) Test Configuration 測(cè)試一下,如果顯示 success,則成功了。
* 在 Job 的設(shè)置里面指定上傳到 FTP 的文件
Jenkins 配置好 FTP Server 后,接下來(lái)就需要在 Job 中去設(shè)置打包成功后把哪些文件上傳到指定的 FTP Server 中去了。在 增加構(gòu)建后操作步驟中 有一個(gè) Send build artifacts over FTP 選項(xiàng),這里首先需要選擇我們之前配好的 FTP Server。Source files 是我們構(gòu)建目錄下 build 文件夾內(nèi)所有的文件,Remove prefix設(shè)置為 build 是告訴插件創(chuàng)建路徑的時(shí)候不要包含 build,Remote directory則是我們指定的 FTP Server 上需要?jiǎng)?chuàng)建的目錄,這里我以 Jenkins 構(gòu)建的版本號(hào)去創(chuàng)建文件夾,之后取文件的時(shí)候,路徑便會(huì)很方便拼接。
#p#
2.通過(guò) API 把 IPA 文件傳給 蒲公英
打包成功了,并且文件也備份到 Tomcat 上去之后,接下來(lái)就需要編寫腳本了,腳本需要的功能是:1)上傳 IPA 文件到 蒲公英 2)發(fā)郵件通知測(cè)試。這兩點(diǎn)通過(guò)腳本是很好實(shí)現(xiàn)的,已經(jīng)放在 GitHub 上,如果想將腳本應(yīng)用到自己的環(huán)境中,最主要的是如下這幾行代碼 :
uKey、file_name、_api_key、installPassword這四個(gè)值是根據(jù)自己的情況配置的。project_name的值很重要,涉及到很多地方:1)tomcat 的 webapps 目錄下面要有 project_name 對(duì)應(yīng)的目錄,因?yàn)樵讷@取 ipa_file_tomcat_http_url 的時(shí)候,是需要 project_name的, 還有就是獲取發(fā)給蒲公英的 IPA 文件時(shí)也需要知道 project_name
接著就需要讓 Jenkins 去執(zhí)行這個(gè)腳本了,通過(guò)對(duì) Jenkins 插件的搜索,找到一個(gè)叫 Post-Build Script Plug-in 的插件,功能官方介紹寫的很清楚:PostBuildScript makes it possible to execute a set of scripts at the end of the build.。
安裝完這個(gè)插件后,在 Job 的 增加構(gòu)建后操作步驟 中會(huì)多出一個(gè) Execute a set of scripts 的選項(xiàng),這里我只配置了 Build steps 中的 Execute shell,讓它用 Python編譯器去執(zhí)行項(xiàng)目根目錄下的腳本,還有就是 Execute script only if build success 勾選上:
這樣當(dāng) Jenkins 打包成功后,便會(huì)執(zhí)行此腳本,最終達(dá)到了我的目的。
最終收到的郵件大概是這樣的:
如果是在手機(jī)上打開(kāi)郵件的話,可以直接使用第三種方式:點(diǎn)我直接安裝,這種方式最方便,其次是第二種,蒲公英在線安裝,***一種便是自己下載 IPA 包到本地,使用工具安裝。
到這兒之前設(shè)想的都已經(jīng)實(shí)現(xiàn)了,整個(gè)過(guò)程中從開(kāi)發(fā)的角度來(lái)說(shuō),需要的只是點(diǎn)擊一下 Jenkins 中的 立即構(gòu)建 按鈕,然后就繼續(xù)做手頭上的事情把!
總結(jié)
教科書上把會(huì)不會(huì)制造工具當(dāng)做人和動(dòng)物的根本區(qū)別,我覺(jué)得這也是判斷一個(gè)好程序員的標(biāo)準(zhǔn)之一,優(yōu)秀的程序員總是會(huì)去尋找好的工具,或者自己去創(chuàng)造一些工具來(lái)提高自己的生產(chǎn)效率,他們通過(guò)工具把那些浪費(fèi)在重復(fù)勞動(dòng)上的時(shí)間花在了更有意義的事情上去。
任何工具出現(xiàn)的最初目的都是為了提高生產(chǎn)效率,很慶幸在 iOS 開(kāi)發(fā)的這個(gè)圈子中有一大批的先驅(qū)者,他們創(chuàng)造并開(kāi)源了很多優(yōu)秀的工具,為這個(gè)環(huán)境奠定了一個(gè)良好的基礎(chǔ),所以在工作或生活中,多創(chuàng)造工具,讓自己變得更懶,卻更有價(jià)值!