使用Jenkins+Sonarqueb進行自動化測試和代碼質量檢測

摘要: Jenkins Jenkins是一款開源的持續集成工具,它的特色:易於安裝、易於配置、可擴展(本身開發插件),而且它擁有數以百計的成熟插件,這種插件式的特色提供可作任何事情的可能。java

簡介python

Jenkinsmysql

Jenkins是一款開源的持續集成工具,它的特色:易於安裝、易於配置、可擴展(本身開發插件),而且它擁有數以百計的成熟插件,這種插件式的特色提供可作任何事情的可能。git

Sonarqubegithub

SonarQube 是一個用於代碼質量管理的開源平臺。經過插件形式,能夠支持包括 java, Objective-C, Swift, C#, C/C++, PL/SQL,JavaScript 等等二十幾種編程語言的代碼質量管理與檢測。web

圖片描述

SonarQueb主要從如下7個維度檢測評估代碼質量:objective-c

1.糟糕的複雜度分佈sql

文件、類、方法等,若是複雜度太高將難以改變,這會使得開發人員難以理解它們,
且若是沒有自動化的單元測試,對於程序中的任何組件的改變都將可能致使須要全面的迴歸測試

2.重複shell

顯然程序中包含大量複製粘貼的代碼是質量低下的
sonar能夠展現源碼中重複嚴重的地方

3.缺少單元測試數據庫

sonar能夠很方便地統計並展現單元測試覆蓋率及測試結果統計

4.沒有代碼標準

sonar能夠經過oclint,PMD,CheckStyle,Findbugs等等代碼規則檢測工具規範代碼編寫

5.沒有足夠的或者過多的註釋

沒有註釋將使代碼可讀性變差,特別是當不可避免地出現人員變更時,程序的可讀性將大幅降低
而過多的註釋又會使得開發人員將精力過多地花費在閱讀註釋上,亦違背初衷

6.潛在的bug

sonar能夠經過oclint,PMD,CheckStyle,Findbugs等等代碼規則檢測工具檢測出潛在的bug

7.糟糕的設計(原文Spaghetti Design,意大利麪式設計)

經過sonar能夠找出循環,展現包與包、類與類之間的相互依賴關係
能夠檢測自定義的架構規則
經過sonar能夠管理第三方的jar包
能夠利用LCOM4檢測單個任務規則的應用狀況
檢測耦合

圖片描述

安裝

jenkins

1.brew install jenkins
2.按提示安裝java 1.8
3.brew services jenkins start or jenkins –httpPort=9002
4.安裝相關插件

Folders Plugin
Build timeout plugin
Workspace Cleanup Plugin
Ant Plugin
Gradle Plugin
Pipeline
Github Organization Folders Plugin
Pipeline Stage View Plugin
Git Plugin
Subversion Plug-in
SSH Slaves plugin
LDAP Plugin
Email Extension Plugin
Gitlab Plugin

注意事項

gitlab plugin 1.5.3有問題,須要降級到1.5.1

卸妝1.5.3,而後經過上傳1.5.1的gitlab-plugin.hpi文件的方式安裝

jenkins默認使用8080端口,默認端口跟gitlab ci配置web hook會致使失敗,建議換個端口嘗試:

jenkins —-httpPort=9002

Sonarqube

下載
http://downloads.sonarsource....,下載後解壓到相應地址,好比/opt

配置環境變量

配置SONAR_HOME環境變量,如上一步中的/opt/sonarqube

mysql建庫

sonarqube須要將掃描結果保存到數據庫中,因此須要建立數據庫表格。sonarqube支持
SQL Server、Mysql、Oracle、PostgreSQL,此處以MySql爲例。

若是還沒有安裝mysql,能夠經過Homebrew進行安裝,安裝完成後,建立對應的帳號和數
據庫:

CREATE USER 'sonar'@'%' IDENTIFIED BY 'sonar';
GRANT all privileges ON sonar.* TO 'sonar'@'%' IDENTIFIED BY 'sonar';
flush privileges;
create database sonar;

經過以上指令建立了一個sonar用戶,同時建立了一個名爲sonar的數據庫。

修改/opt/sonarqube/conf/sonar.properties文件,將相關屬性按以下設置:

sonar.web.host=0.0.0.0
sonar.web.port=9000
sonar.jdbc.username=sonar
sonar.jdbc.password=sonar
sonar.jdbc.url=jdbc:mysql://localhost:3306/sonar?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true&useConfigs=maxPerformance&useSSL=false
#sonar.web.context=/your_prefix  //非必須,若須要在訪問sonarqube服務時加上統一的前綴則配置此項

start sonarqube

/opt/sonarqube/bin/macosx-universal-64/sonar.sh start

download sonar scanner

https://docs.sonarqube.org/di...

objective-c plugin

github: https://github.com/Backelite/...

clone後進入主目錄, 執行腳本:./build-and-deploy.sh

把編譯生成的backelite-sonar-objective-c-plugin-0.6.2.jar文件拷貝到/opt/sonarqube/extensions/plugins目錄。

最後重啓Sonarqube

1.Prerequisites

Installation of xcpretty with JUnit reports fix

xcpretty須要安裝fixed version,才能配合Sonarqube工做。

git clone https://github.com/Backelite/...
cd xcpretty
git checkout fix/duration_of_failed_tests_workaround
gem build xcpretty.gemspec
sudo gem install --both xcpretty-0.2.2.gem

install xctool
brew install xctool

  • install oclint

brew tap oclint/formulae
brew install oclint

  • install gcovr

brew install gcovr

  • install slather

gem install slather

若是報錯:no implicit conversion of nil into string

sudo gem update --system

若是提示:no write permissions

sudo gem install /usr/local/bin slather

  • install lizard

sudo pip install lizard

若是沒有安裝pip,下載<https: bootstrap.pypa.io="" get-pip.py="">

chmod +x get-pip.py
sudo python get-pip.py

演示一個示例代碼工程的例子

代碼工程的配置

sonar-project.properties

下載上面sonar-objective-c github工程sample目錄下的sonar-project.properties文件,拷貝到示例代碼工程目錄,按照對應的設置進行修改

run-sonar.sh

拷貝該文件到代碼工程目錄

jenkins配置

在管理jenkins->系統設置->gitlab下配置gitlab鏈接
圖片描述

在Gitlab host url處設置gitlab的url,而後在creadential處點擊add。

建立一個Gitlab API token,而後在API token處填入gitlab上的token:

圖片描述

圖片描述

建立工程

構建一個自由風格的軟件項目,而後在源碼管理處,選擇git,而後進行以下配置:

圖片描述

在Repository URL處填入對應工程的URL,注意,由於後續工程check是經過ssh方式接入的,因此填寫的URL必定是ssh URL:

圖片描述

而後在Branch Specifier處填入要關注的分支。

而後在Credentials處點擊add,配置ssh祕鑰:

圖片描述

選擇SSH Username with private key,而後在username處填入gitlab帳號,而後private key能夠選擇Enter directly,直接輸入祕鑰,將~/.ssh/id_rsa文件中的內容直接拷貝便可。注意,此處必須保證該私鑰對應的公鑰(即 id_rsa.pub)必須配置在gitlab上,不然會失敗, 配置完成後點擊Add。

而後在Credentials處選擇剛纔建立的credential便可,若是配置成功不會有報錯信息,不然會有相關的錯誤信息。

其餘的配置能夠根據實際狀況進行配置,配置完成後點擊保存即建立完成。

配置SonarQube servers

在管理jenkins->全局配置頁面下,找到SonarQube servers,配置sonarqube server相關信息:

圖片描述

其中Server authentication token可在SonarQube網站,我的帳號管理下的security處進行生成:

圖片描述

增長SonarScanner構建步驟

點擊jenkins裏出現的示例工程名 –> Configure –> Build (Add build step),

增長一個Execute shell構建步驟:
圖片描述
圖片描述
圖片描述

Command內容爲:

用戶目錄/.bashrc              # 加載須要的環境變量
./run-sonar.sh -v               # 生成數據並傳遞給SonarQube Server

Build工程並顯示生成的數據

圖片描述

圖片描述

報告生成流程分析

Bugs、Velnerabilities、Code Smells

對於Objective-C語言,是經過oclint靜態掃描工程代碼來生成相關數據。

圖片描述

單元測試

利用xcodebuild命令運行虛擬機進行單元測試,而後把輸出結果數據生成報告。

覆蓋率

利用slather工具生成數據報告。

圖片描述

功能探討

目前針對objective-c語言,利用上面提到的objective-c插件,只支持1個Bug和186個Code Smells,Bug和Vulnerability支持的不夠。

因爲SonarQube並非徹底開源,對於objective-c,它有商業版的插件,若是想要把Bug、Vulnerability支持的好的話,就必須得自定義相關規則,並提供SonarQube支持。

所以研究了一下如何自定義規則並獲得SonarQube支持,步驟以下:

1.修改oclint源碼,添加自定義規則
2.修改sonar-objectivec插件源碼,添加自定義規則
3.構建代碼工程,檢測自定義規則,生成顯示數據

oclint添加自定義規則

下載oclint源碼,地址:https://github.com/oclint/oclint

進入代碼主目錄,利用腳手架腳本生成自定義規則模版文件:

oclint-scripts/scaffoldRule TestRule -t ASTVisitor
對生成的TestRule.cpp文件進行編輯,實現自定義規則邏輯。

最後編譯整個工程:

cd oclint-scripts
./make

用生成的oclint程序對測試代碼進行測試:

./build/oclint-release/bin/oclint -report-type pmd -o test.xml 測試代碼目錄/測試文件.m

sonar-objectivec插件支持自定義規則

SonarQube服務端程序利用插件識別規則,並寫入數據庫,因此插件代碼也須要進行修改。

下載插件源碼,地址:https://github.com/Backelite/...

須要修改以下3個文件:

1.src/main/resources/com/sonar/sqale/oclint-model.xml
2.src/main/resources/org/sonar/plugins/oclint/profile-oclint.xml
3.src/main/resources/org/sonar/plugins/oclint/rules.txt
而後編譯插件:

./build-and-deploy.sh

最後把生成的.jar插件拷貝到SonarQube服務端程序的extensions/plugins目錄下,再重啓SonarQube服務。

圖片描述

reference
https://github.com/Backelite/...
https://mp.weixin.qq.com/s/xi...
https://www.jianshu.com/p/74b...
http://blog.csdn.net/hdwhappy...
http://blog.csdn.net/hdwhappy...

原文連接

閱讀更多幹貨好文,請關注掃描如下二維碼:
圖片描述

相關文章
相關標籤/搜索