Jenkins+GitLab+Android+iOS+CocoaPods+Sonar+GitLog+Fir.im搭建持續集成環境

Jenkins持續集成系統

持續集成是敏捷開發的重要一環,它具備以下優點:

減少并降低軟件開發中的風險

將重復性工作自動化,讓開發人員更專注于代碼

在任何時間、任何地點生成可部署的軟件

隨著人員以及項目的增加,以上這些就變得尤為重要.所以我們也在恰當的時機把它引入進來.

而市面上持續集成系統琳瑯滿目,有Jenkins,Travis,Circleci,Bitrise,Flow.ci 我們該如何選擇,那就參考大數據,朝內還是用百度指數,目前只收錄Jenkins和Travis.

Jenkins:藍色 ? ? ?Travis:綠色

Jenkins和Travis百度搜索趨勢
Jenkins和Travis百度搜索人群畫像

Jenkins更為成熟,它是框架式的,大部分功能通過插件的方式來實現,可擴展性非常高.

廢話少說,直接來擼一擼!

下載Android SDK

下載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驗證

配置GitLab的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: 在填寫上面的相關信息后,可以測試下是否配置成功

Bearychat配置

配置Sonar代碼質量管理服務器

Sonar服務器配置

在Global Tool Config配置jdk,git

Jdk以及Git安裝

項目配置

新建項目,使用自有構建模式

項目類型選擇

指定工作目錄,和保持構建的天數,及最大個數,自定義目錄

注意: 如果使用自定義工作空間,要考慮目錄對當前是否有寫入的權限,

項目配置

源碼管理使用http地址,也可以使用ssh要配key較麻煩

GitLab項目配置

構建觸發器,配置gitlab的webhook,有push變化則自動構建打包,指定對某一個分支有效:

GitLab觸發配置
GitLab的Webhook配置

周期性觸發器:

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的高級用法可以參考以下兩篇文章:

博客園-Git log高級用法

Github-Git log 高級用法

在構建中配置剛剛的文件路徑,用戶讀取里面的環境變量打

在構建配置文件路徑

然后就可以在Fir插件上使用剛剛設置的環境變量${GIT_CHANGE_LOG}

使用環境變量 ${GIT_CHAGE_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配置

可以通過Sonar的后臺查看代碼分析

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

Fir.im配置

可以通過bearychat插件來配置通知群組,在項目中配置

Bearychat項目配置
Bearychat通知打包結果

可以配置郵件通知,使用插件來配置email-ext-plugin,可以定制發送的內容,

先配置smtp服務器

配置SMTP服務器

然后指定發給哪些郵箱地址,以及定制發送的內容

郵件發送內容

也可以使用自帶的郵件通知,要先制定系統管理員郵件地址

配置管理員郵件地址

然后再配置郵件服務器smtp

配置自帶郵件SMTP服務器

Android端構建配置


Android SDK配置

Android SDK配置

gradle可以指定本地的路徑,也可以使用在線版本自動安裝

Gradle配置

構建,可以通過Tasks來指定任務

Task任務配置


iOS端構建配置


目前我們使用的是Xcode默認配置打包,不用jenkins上配置的證書及PP文件.有幾個關鍵點要注意的.

首先要在Xcode把項目中Projec和Target的Code Signing 設置為iOS Developer,以及把PP設置為Automatic.

Code Sign和PP文件設置

然后在Product->Scheme->Manage Schemes 把項目設置為Shared,第三方庫的不用設置

scheme設置

系統管理->找到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文件是會自動加入的.

Keychain and Provisioning Profiles配置


針對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

shell配置

配置Workspace,紅色的地方可以填上target名稱,此處參考了章華龍的文章.

配置Workspace


非CocoaPods設置


配置Xcode

配置Xcode構建



這里可以填入keychain來解鎖

解鎖Keychain

整個構建環境完成.

后期我們打算優化Sonar的檢測分析,以及配置單元測試,UI測試,條件測試覆蓋率等,繼續往持續交付,持續部署的路上走!

Keep Going!

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容