Jenkins Gitlab持續整合打包平臺搭建
更多精彩請直接訪問SkySeraph個人站點:www.skyseraph.com
相關概念
Jenkins
- Jenkins,一個用Java編寫的開源的持續整合工具,提供了軟體開發的持續整合服務,可監控並觸發持續重複的工作,具有開源,支援多平臺和外掛擴充套件,安裝簡單,介面化管理等特點。更多介紹參考[維基](https://en.wikipedia.org/wiki/Jenkins_(software)介紹.
Gitlab
- GitLab是一個利用Ruby on Rails開發的開源應用程式,實現一個自託管的Git專案倉庫,可通過Web介面進行訪問公開的或者私人專案,更多介紹參考
持續整合
- 持續整合, 簡稱CI(continuous integration).
- CI作為敏捷開發重要的一步,其目的在於讓產品快速迭代的同時,儘可能保持高質量.
- CI一種可以增加專案可見性,降低專案失敗風險的開發實踐。其每一次程式碼更新,都要通過自動化測試來檢測程式碼和功能的正確性,只有通過自動測試的程式碼才能進行後續的交付和部署.
- CI 是團隊成員間(產研測)更好地協調工作,更好的適應敏捷迭代開發,自動完成減少人工干預,保證每個時間點上團隊成員提交的程式碼都能成功整合的,可以很好的用於對Android/iOS專案的打包.
蒲公英
- 蒲公英(pgyer)為移動開發者提供App免費測試分發應用的服務平臺,支援iOS與Android,簡單兩步分發應用。類似的還有fir.im等.
流程結構
簡單繪製了下Jenkins的一個流程,如下圖:
IBM Developer上也有一個看似更復雜一點的圖,如下圖
持續互動流程圖:
平臺搭建
Jenkins安裝和啟動
安裝:
- 依賴於Java環境,首先安裝和配置Java環境
- 到官網下載Jenkins,雙擊安裝,如果是Mac電腦,會自動生成全域性變數jenkins
- 修改引數: jenkins + 相關引數,如
jenkins –httpPort=8888 #更換埠號,當預設埠8080被佔用,或指定特定埠時。
啟動
- 手動啟動: java -jar jenkins.war
- 後臺啟動(預設埠): nohup java -jar jenkins.war &
- 後臺啟動(指定埠): nohup java -jar jenkins.war -httpPort=88 &
- 後臺啟動(HTTPS): nohup java -jar jenkins.war -httpsPort=88 &
Jenkins外掛安裝
外掛安裝
操作: Manage Jenkins -> Manage Plugins -> Available -> Search -> Click to install,如下圖所示
實用外掛
- iOS專用:Xcode integration
- Android專用:Gradle plugin
- Gitlab外掛:GitLab Plugin 和 Gitlab Hook Plugin
- Git外掛: Git plugin
- GitBuckit外掛: GitBuckit plugin
- 簽名證書管理外掛: Credentials Plugin 和Keychains and Provisioning Profiles Management
- FTP外掛: Publish over FTP
- 指令碼外掛: Post-Build Script Plug-in
- 修改Build名稱/描述(二維碼): build-name-setter / description setter plugin
- 獲取倉庫提交的commit log: Git Changelog Plugin
- 自定義全域性變數: Environment Injector Plugin
- 自定義郵件外掛: Email Extension Plugin
- 獲取當前登入使用者資訊: build-user-vars-plugin
- 顯示程式碼測試覆蓋率報表: Cobertura Plugin
- 來展示生成的單元測試報表,支援一切單測框架,如junit、nosetests等: Junit Plugin
- 其它: GIT plugin / SSH Credentials Plugin
Jenkins系統設定
操作: Manage Jenkins -> Configure System
- Jenkins內部shell UTF-8 編碼設定,如下圖所示
- Jenkins Location和Email設定,如下圖所示
- E-mail Notification,設定如下如所示
Jenkins Jobs配置
Jobs基礎配置
配置編譯引數
例如,如果需要打包者自行選擇打包型別,如需要編譯Release/Debug/Test等不同版本的包,那需要配置Jobs的編譯引數,配置方法如下圖所示:
你還可以配置一些其它引數,例如:
配置完後,build介面中就會出現,如下如所示:
配置匿名使用者許可權
後面打包的應用釋出時,如果懶得自己搭建伺服器,就用Jenkins的,但釋出出去的連結需要登入才能訪問,這時候你可以設定匿名使用者的訪問許可權,這樣匿名使用者可以下載訪問你提供的應用連結了,非常取巧的方法,如下圖:
Jobs原始碼庫配置(Gitlab為例)
配置SSH
操作: Manage Jenkins -> Credentials -> Global credentials (unrestricted) -> Add Credentials
- 本機生成SSH:ssh-keygen -t rsa -C “Your email” , 生成過程中需設定密碼,最終生成id_rsa和id_rsa.pub(公鑰)
- 本機新增祕鑰到SSH:ssh-add 檔名(需輸入管理密碼)
- Gitlab上新增公鑰:複製id_rsa.pub裡面的公鑰新增到Gitlab
- Jenkins上配置金鑰到SSH:複製id_rsa.pub裡面的公鑰新增到Jenkins(private key選項)
新建Job
在Jenkins中,所有的任務都是以”Job”為單位的。在進行操作前,你需要新建一個Job,Job新建比較簡單,只需要在Jenkins管理的首頁左側,點選“New Job”,一般選擇free-style software project,再輸入Job的名字即可。
配置Gitlab
在新建的任務(Jobs)中,Gitlab原始碼配置如下圖:需要輸入git倉庫和build分支,公鑰使用上面配置SSH生成的公鑰。
Jobs觸發條件配置
Jenkins支援多種觸發器配置,包括:
定期進行構建(Build periodically),定時器使用示例如下:
H(25-30) 18 * * 1-5: 工作日下午6點25到30分之間進行build
H 23 * * 1-5:工作日每晚23:00至23:59之間的某一時刻進行build
H(0-29)/15 * * * *:前半小時內每隔15分鐘進行build(開始時間不確定)
H/20 * * * *:每隔20分鐘進行build(開始時間不確定)根據提交進行構建(Build when a change is pushed to GitHub)
- 定期檢測程式碼更新,如有更新則進行構建(Poll SCM)
Jobs構建方式/編譯 配置
Jenkins支援多種編譯配置方式,包括:
- Xcode: iOS編譯配置(安裝Xcode integration外掛)
- Invoke Gradle script: Android編譯配置(安裝Gradle plugin外掛)
- Exceute Shell: 指令碼方式
對於iOS應用的構建,如果選擇Xcode方式構建,需要配置好開發者證書,具體參考後面簽名和整數問題。
推薦使用Exceute Shell方式,簡單有效。
Jobs構建後處理
Artifacts和郵件通知配置,參考下圖
可藉助Email Extension Plugin 外掛進行詳細配置,具體可參考此文
釋出
- FTP伺服器, 最傳統的方式,可助蒲公英或者fir.im(安裝對應的Jenkins外掛)。
- 專業的Artifacts儲存倉庫, 比如Nexus, Artifactory等。
iOS的釋出可能希望用到OTA,可參考此文
這裡分享一個我寫的shell指令碼模板(已開源),可以用於iOS的plist檔案自動建立以及OTA簡單釋出頁面的自動建立,參考此連結獲取原始碼, 歡迎Star.
自動生成一個簡單HTML介面,如下圖,點選Install即可安裝:
注意,這裡iOS7.1以後限定必須要要用https,所以需要對jenkins設定下https,參考下面”後記” 中的Jenkins Https設定
Last Show
構建成功後最終的結果如下如所示:
後記
簽名和證書問題(iOS)
Jenkins Https Support
查詢Jenkins Https相關命令:
java -jar jenkins.war –help | grep -i https
說明:下面以Mac為例.
KeyStore方式
- 生成:
keytool -genkey -keyalg RSA -alias selfsigned -keystore keystore.jks -storepass 密碼 -dname "cn=WEB"
- 使用:
java -jar jenkins.war --httpPort=-1 --httpsPort=8080 --httpsKeyStore=/目錄/keystore.jks --httpsKeyStorePassword=密碼
- 注意: 第一次使用時需要將”WEB”證書匯入,匯入步驟為:Chrome匯出證書 -> 安裝證書 -> 設定證書”全部允許”, 圖解步驟可參考下面實用參考中的第5篇文章.
Certificate方式
- 生成:
1. openssl genrsa -out server.key 1024
2. openssl req -new -key server.key -out server.csr
3. openssl x509 -req -in server.csr -signkey server.key -out server.crt
- 使用:
java -jar jenkins.war --httpsPort=8088 --httpsCertificate=/path/server.crt --httpsPrivateKey=/path/server.key
- 注意:①同上 ②iOS手機需要匯入cer證書
實用參考
Refs
文章持續更新地址,請移步查閱
By SkySeraph-2016