搭建持續集成打包平臺的方案分析
該平臺主要實現的功能有3點:
定期對GitHub倉庫進行檢測,若有更新則自動執行構建打包;構建成功后根據ipa/apk生成二維碼,并可在歷史構建列表中展示各個版本的二維碼,通過手機掃描二維碼可直接安裝對應版本;在構建結果頁面中展示當次構建的成果物(Artifact,如.ipa、.app、.apk、info.plist等文件),供有需要的用戶進行下載。
接下來,本文就開始對平臺建設的完整實現過程進行詳細介紹。
安裝Jenkins
Jenkins依賴于Java運行環境,因此需要首先安裝Java。
安裝Jenkins的方式有多種,可以運行對應系統類型的安裝包,可以通過docker獲取鏡像,也可以直接運行war包。
我個人傾向于直接運行war包的形式,只需下載jenkins.war后,運行如下命令即可啟動Jenkins。
$ nohup java -jar jenkins_located_path/jenkins.war --httpPort=88 &
如果不指定httpPort,Jenkins的默認端口為8080。
Jenkins插件
Jenkins有非常多的插件,可以實現各種功能的擴展。
針對搭建的iOS/Android持續集成打包平臺,我使用到了如下幾個插件。
GIT pluginSSH Credentials PluginGit Changelog Plugin: 獲取倉庫提交的commit logbuild-name-setter:用于修改Build名稱deion setter plugin:用于在修改Build描述信息,在描述信息中增加顯示QRCode(二維碼)Post-Build Plug-in:在編譯完成后通過執行腳本實現一些額外功能
Xcode integration: iOS專用(可選)Gradle plugin: Android專用(可選)
安裝方式也比較簡單,直接在Jenkins的插件管理頁面搜索上述插件,點擊安裝即可。
創建項目(Job)
在Jenkins中,構建項目以Job的形式存在,因此需要針對每個項目創建一個Job。有時候,一個項目中可能有多個分支同時在進行開發,為了分別進行構建,也可以針對每個分支創建一個Job。
創建Job的方式有多種,本次只需要創建Freestyle project類型的即可。
Main page -》 New Item -》 Freestyle project
對于一個持續集成打包平臺,每次打包都由4步組成:觸發構建、拉取代碼、執行構建、構建后處理。對應的,在每個Job中也對應了這幾項的配置。
配置Git代碼倉庫
要對項目進行構建,配置項目的代碼倉庫是必不可少的。由于當前我們的項目托管在GitHub私有倉庫中,因此在此需要對Git進行配置。
在【Source Code Management】配置欄目下,如果之前GIT plugin安裝成功,則會出現Git選項。
配置Git代碼倉庫時,有三項是必須配置的:倉庫URL地址(Repository URL)、倉庫權限校驗方式(Credentials),以及當前Job需要構建的代碼分支(Branches to build)。
在配置Repository URL時,選擇HTTPS URL或SSH URL均可。不過需要注意的是,Credentials要和Repository URL對應,也就是說:
如果Repository URL是HTTPS URL形式的,那么Credentials就要采用GitHub用戶名密碼的校驗方式;而且,如果在GitHub中開啟了2FA(two-factor authentication),那么還需要在GitHub中創建一個Personal access token,輸入密碼時將這個Personal access token作為密碼進行輸入。如果Repository URL是SSH URL形式的,那么就需要先在Jenkins所在的服務器上創建一個SSH秘鑰對,并將公鑰添加到GitHub的SSH keys中,然后在填寫Credentials時,選擇SSH Username with private key的校驗方式,填入GitHub Username、SSH私鑰、以及創建SSH秘鑰對時設置的Passphrase。
如果對Git權限校驗的概念還比較模糊,可以參考《深入淺出Git權限校驗》。
在配置Branches to build時,可以采用多種形式,包括分支名稱(branchName)、tagName、commitId等。其中分支名稱的形式用的最多,例如,若是構建master分支,則填寫refs/heads/master,若是構建develop分支,則填寫refs/heads/develop。
除了以上關于Git的必填配置項,有時根據項目的實際情況,可能還需要對Jenkins的默認配置項進行修改。
比較常見的一種情況就是對clone的配置進行修改。
在Jenkins的默認配置中,clone代碼時會拉取所有歷史版本的代碼,而且默認的超時時限只有10分鐘。這就造成在某些項目中,由于代碼量本身就比較大,歷史版本也比較多,再加上網絡環境不是特別好,Jenkins根本沒法在10分鐘之內拉取完所有代碼,超時后任務就會被自動終止了(錯誤狀態碼143)。
這種問題的解決方式也很簡單,無非就是兩種思路,要么少拉取點代碼(不獲取歷史版本),要么提高超時時限。對應的配置在Advanced clone behaviours中:
Shallow clone:勾選后不獲取歷史版本;Timeout (in minutes) for clone and fetch operation:配置后覆蓋默認的超時時限。
配置構建觸發器
代碼倉庫配置好了,意味著Jenkins具有了訪問GitHub代碼倉庫的權限,可以成功地拉取代碼。
那Jenkins什么時候執行構建呢?
這就需要配置構建觸發策略,即構建觸發器,配置項位于【Build Triggers】欄目。
觸發器支持多種類型,常用的有:
定期進行構建(Build periodically)根據提交進行構建(Build when a change is pushed to GitHub)定期檢測代碼更新,如有更新則進行構建(Poll SCM)
構建觸發器的選擇為復合選項,若選擇多種類型,則任一類型滿足構建條件時就會執行構建工作。如果所有類型都不選擇,則該Jenkins Job不執行自動構建,但可通過手動點擊【Build Now】觸發構建。
關于定時器(Schedule)的格式,簡述如下:
MINUTE HOUR DOM MONTH DOW
MINUTE: Minutes within the hour (0-59)HOUR: The hour of the day (0-23)DOM: The day of the month (1-31)MONTH: The month (1-12)DOW: The day of the week (0-7) where 0 and 7 are Sunday.
通常情況下需要指定多個值,這時可以采用如下operator(優先級從上到下):
適配所有有效的值: * ,若不指定某一項,則以 * 占位;M-N適配值域范圍,例如7-9代表7/8/9均滿足;M-N/X或*/X:以X作為間隔;A,B,C:枚舉多個值。
另外,為了避免多個任務在同一時刻同時觸發構建,在指定時間段時可以配合使用H字符。添加H字符后,Jenkins會在指定時間段內隨機選擇一個時間點作為起始時刻,然后加上設定的時間間隔,計算得到后續的時間點。直到下一個周期時,Jenkins又會重新隨機選擇一個時間點作為起始時刻,依次類推。
為了便于理解,列舉幾個示例:
H/15 * * * *:代表每隔15分鐘,并且開始時間不確定,這個小時可能是:07,:22,:37,:52,下一個小時就可能是:03,:18,:33,:48;H(0-29)/10 * * * *:代表前半小時內每隔10分鐘,并且開始時間不確定,這個小時可能是:04,:14,:24,下一個小時就可能是:09,:19,:29;H 23 * * 1-5:工作日每晚23:00至23:59之間的某一時刻;
配置構建方式
觸發策略配置好之后,Jenkins就會按照設定的策略自動執行構建。但如何執行構建操作,這還需要我們通過配置構建方式來進行設定。
常用的構建方式是根據構建對象的具體類型,安裝對應的插件,然后采用相應的構建方式。例如,若是構建Android應用,安裝Gradle plugin之后,就可以選擇Invoke Gradle ,然后采用Gradle進行構建;若是構建iOS應用,安裝Xcode integration插件之后,就可以選擇Xcode,然后選擇Xcode進行構建。
該種方式的優勢是操作簡單,UI可視化,在場景不復雜的情況下可以快速滿足需求。不過缺點就是依賴于插件已有的功能,如果場景較復雜時可能單個插件還無法滿足需求,需要再安裝其它插件。而且,有些插件可能還存在一些問題,例如對某些操作系統版本或XCode版本兼容不佳,出現問題時我們就會比較被動。
我個人更傾向于另外一種方式,就是自己編寫打包腳本,在腳本中自定義實現所有的構建功能,然后在Execute Shell中執行。這種方式的靈活度更高,各種場景的構建需求都能滿足,出現問題后也能自行快速修復。
另外,對于iOS應用的構建,還有一個需要額外關注的點,就是開發者證書的配置。
如果是采用Xcode integration插件進行構建,配置會比較復雜,需要在Jenkins中導入開發證書,并填寫多個配置項。不過,如果是采用打包腳本進行構建的話,情況就會簡單許多。只要在Jenkins所運行的計算機中安裝好開發者證書,打包命令在Shell中能正常工作,那么在Jenkins中執行打包腳本也不會有什么問題。
構建后處理
完成構建后,生成的編譯成果物(ipa/apk)會位于指定的目錄中。但是,如果要直接在手機中安裝ipa/apk文件還比較麻煩,不僅在分發測試包時需要將好幾十兆的安裝包進行傳送,體驗用戶在安裝時也還需要通過數據線將手機與計算機進行連接,然后再使用PP助手或豌豆莢等工具進行安裝。
非常好我支持^.^
(0) 0%
不好我反對
(0) 0%
下載地址
搭建持續集成打包平臺的方案分析下載
相關電子資料下載
- iOS17.1可能明天發布,iOS17.1主要修復哪些問題? 380
- 社區說|多才多藝: 探索 Android 應用更多可能 13
- 浩辰軟件正式登陸上交所科創板 274
- 鴻蒙原生應用,對開發者意味著什么? 77
- Android端自定義鈴聲 MobPush對安卓端自定義鈴聲的教程 531
- Android推送問題排查技巧 針對MobPush安卓端推送問題的解決辦法 54
- 如何使用Proxyman抓取Android的https請求? 43
- 基于OkHttp 3.10.0的源碼案例解析 26
- 基于MacroBenchmark的性能測試量化指標方案 77
- 圖像放大為什么還能保持清晰度 圖像縮放的原理是什么 45