持續集成是敏捷開發的重要一環,它具備以下優點:
減少并降低軟件開發中的風險
將重復性工作自動化,讓開發人員更專注于代碼
在任何時間、任何地點生成可部署的軟件
隨著人員以及項目的增加,以上這些就變得尤為重要.所以我們也在恰當的時機把它引入進來.
而市面上持續集成系統琳瑯滿目,有Jenkins,Travis,Circleci,Bitrise,Flow.ci 我們該如何選擇,那就參考大數據,朝內還是用百度指數,目前只收錄Jenkins和Travis.
Jenkins:藍色 ? ? ?Travis:綠色
Jenkins更為成熟,它是框架式的,大部分功能通過插件的方式來實現,可擴展性非常高.
廢話少說,直接來擼一擼!
通過HomreBrew安裝啟動和停止jenkins服務:
brew install jenkins
brew tap homebrew/services
Start Jenkins: sudo launchctl load /Library/LaunchDaemons/org.jenkins-ci.plist
Stop Jenkins: sudo launchctl unload /Library/LaunchDaemons/org.jenkins-ci.plist
開機啟動 Run at boot:? /Library/LaunchDaemons 可以在這里修改jenkins相關信息
Run at login: /Users/Lavare/Library/LaunchAgents
通過pkg文件安裝的可以通過 java命令啟動:
java -jar /Applications/Jenkins/jenkins.war
Jenkins安裝配置各種插件:
Git? ---- GitLab ---- Gitlab Authentication plugin ?(Git授權插件)
?Environment Injector Plugin (環境變量注入,目前用于獲取gitLog,并傳遞給Fir.im上傳信息)
?Email Extension? (郵件擴展插件,打包完成后郵件通知各人員)
? Fir Plugin ?(Fir.im上傳插件,apk/ipa 分發渠道)
?Bearychat Plugin (上傳到Bearychat插件,同于通知)
Gradle Plugin ? (Android 構建插件)
?Xcode integration ?(iOS構建插件)
Keychains and Provisioning Profiles Management ?(iOS證書配置插件)
Sonar:代碼質量管理平臺,也是通過安裝各種插件來擴展代碼檢測功能
1.糟糕的復雜度分布
2.重復
3.缺乏單元測試
4.沒有代碼標準
5.沒有足夠的或者過多的注釋
6.潛在的bug
7.糟糕的設計
在系統管理界面配置->系統設置
GitLab配置,使用Api Token驗證
Bearychat配置,方便后期構建成功后通知到相應群組
* Team Subdomain: 在 https://ydj.bearychat.com 中,如yjd便是團隊的 subdomain
* Integration Token: 在 BearyChat 中的 Jenkins 機器人的 hook 地址中, 最后的部分便是 token。
* Channel: 討論組名稱,如果指定的話,可以將 Jenkins 通知推送到該討論組
* Build Server URL: 團隊的 Jenkins 服務器所在的地址,用于構建 Jenkins 通知中的鏈接等信息
* Test Connection: 在填寫上面的相關信息后,可以測試下是否配置成功
配置Sonar代碼質量管理服務器
在Global Tool Config配置jdk,git
項目配置
新建項目,使用自有構建模式
指定工作目錄,和保持構建的天數,及最大個數,自定義目錄
注意: 如果使用自定義工作空間,要考慮目錄對當前是否有寫入的權限,
源碼管理使用http地址,也可以使用ssh要配key較麻煩
構建觸發器,配置gitlab的webhook,有push變化則自動構建打包,指定對某一個分支有效:
周期性觸發器:
Build periodically指周期性構建(Provides a cron-like feature to periodically execute this project.)
Poll SCM指周期性掃描遠程git repository,當有變化時進行構建(Configure Jenkins to poll changes in SCM.)
日期定義
Cron表達式字符串的格式為“分 小時 日 月 星期 年”,其中“年”是可選的,其余5個字段是必須的。
區別(1)沒有秒 (2)星期的取值范圍是0-6(SUN-SAT)
字段取值范圍通配符分0-59* / , -時0-59* / , -日1-31* / , - ? L W月1-12 or JAN-DEC* / , -星期0-6 or SUN-SAT* / , - ? L #年1970–2099* / , -
例子:
*/5 * * * *? // 每5分鐘
H/5 * * * *? ? // 每5分鐘 推薦
5 * * * *? ? // 每小時的第5分鐘
0 8 * * *? ? // 每天8點
0 16,18,20,22 * * *? ? // 每天的16點、18點、20點、22點
0 1,18 * * *? ? // 每天的1點和18點
03 09 * * 1-5? ? // 工作日(周日到周五)的9點3分
59 23 * * 1-5 或者 @midnight? ? // 工作日(周日到周五)的9點3分
0 20 * * 1-5
H 20 * * 1-5 周一到周五的每晚8點自動構建
自定義環境變量獲取Git Log
構建觸發器配置完成后,我們還可以通過Environment Injector Plugin(環境變量注入插件),目前用于獲取gitLog,并傳遞給Fir.im上傳信息).
要先在Properties File Path 路徑下創建一個對應的文件,否則改插件會報錯找不到文件,名字可以自定義,但是要和Script Content的腳本內容中done> 后面的文件及路徑一致.
我這里用于測試后期,只需要顯示昨天Git提交的信息:
GIT_CHANGE_LOG=$(git log --after="yesterday" --pretty=format:"%s")
echo "GIT_CHANGE_LOG=$(git log --after="yesterday" --pretty=format:"%s" | while read line
do?
echo $line\\\\\\\\n | tr -d \\n
done)" >? ${WORKSPACE}/gitLogFile.properties
關于Git log的高級用法可以參考以下兩篇文章:
在構建中配置剛剛的文件路徑,用戶讀取里面的環境變量打
然后就可以在Fir插件上使用剛剛設置的環境變量${GIT_CHANGE_LOG}
構建分為Android和iOS構建,放在后面講,先講公共流程
構建期還可以通過Sonar來進行代碼質量檢查,配置源碼路徑,支持java,oc,swift,php,javascript
sonar.projectKey=xxx_Android_Key
sonar.projectName=xxx_Android_Name
sonar.projectVersion=$BUILD_NUMBER
sonar.sourceEncoding=UTF-8
sonar.sources=/Users/jz_mac_mini/xxx/xxx/app/src/main 靜態代碼目錄(必選)
sonar.java.libraries=/Users/jz_mac_mini/xxx/xxx/app/libs/ 第三方庫目錄(必選)
sonar.java.binaries=/Users/jz_mac_mini/xxx/xxx/app/build/intermediates/classes/production/ 編譯后的代碼目錄(必選)
可以通過Sonar的后臺查看代碼分析
構建后使用Fir.im發布,先安裝ruby,
$ gem sources --remove https://rubygems.org/ $ gem sources -a https://ruby.taobao.org/ $ gem sources -l *** CURRENT SOURCES *** https://ruby.taobao.org # 請確保只有 ruby.taobao.org, 如果有其他的源, 請 remove 掉
Mac OS X 10.11 以后的版本, 由于10.11引入了 rootless , 無法直接安裝 fir-cli, 有以下三種解決辦法:
1. 使用 Homebrew 及 RVM 安裝 Ruby, 再安裝 fir-cli(推薦)
# Install Homebrew:
$ ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
# Install RVM:
$ \curl -sSL https://get.rvm.io | bash -s stable --ruby
$ gem install fir-cli
然后再通過插件配置Fir.im的賬號,以及提交的fir的信息
jenkins的build版本為:? $BUILD_NUMBER
git的提交版本? 號 為 :? $GIT_COMMIT
可以通過bearychat插件來配置通知群組,在項目中配置
可以配置郵件通知,使用插件來配置email-ext-plugin,可以定制發送的內容,
先配置smtp服務器
然后指定發給哪些郵箱地址,以及定制發送的內容
也可以使用自帶的郵件通知,要先制定系統管理員郵件地址
然后再配置郵件服務器smtp
Android端構建配置
Android SDK配置
gradle可以指定本地的路徑,也可以使用在線版本自動安裝
構建,可以通過Tasks來指定任務
iOS端構建配置
目前我們使用的是Xcode默認配置打包,不用jenkins上配置的證書及PP文件.有幾個關鍵點要注意的.
首先要在Xcode把項目中Projec和Target的Code Signing 設置為iOS Developer,以及把PP設置為Automatic.
然后在Product->Scheme->Manage Schemes 把項目設置為Shared,第三方庫的不用設置
系統管理->找到Keychain and Provisioning Profiles Management
1.點擊選擇文件從本地選取Keychain,路徑為:/Users/用戶名/Library/Keychains/login.keychain
這里我們目前的做法是只配置login.keychain,然后jenkins的機子上安裝Code Signing證書,再在xcode項目上fix issue,就能夠為我們自動生成一個PP文件,名為-iOS Team Provisioning Profiles : xxxx, 而且當我們在開發者中心更新設備列表的時候,此PP文件是會自動加入的.
針對CocoaPods設置
如果項目是使用CocoaPods來管理的,還要針對xcworkspace進行build的話,還要額外進行寫設置
如果構建是出現編碼錯誤的可以在~/.bash_profile文件加上一句
export LC_ALL="en_US.UTF-8"
Xcode構建前,先用shell跑一遍pod install,我這里會出現pod: command not found 的錯誤,所以要在前面加上一句
#!/bin/bash -l
pod install --verbose --no-repo-update
配置Workspace,紅色的地方可以填上target名稱,此處參考了章華龍的文章.
非CocoaPods設置
配置Xcode
這里可以填入keychain來解鎖
整個構建環境完成.
后期我們打算優化Sonar的檢測分析,以及配置單元測試,UI測試,條件測試覆蓋率等,繼續往持續交付,持續部署的路上走!
Keep Going!