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