Jenkins 的簡單部署
在安裝了 Jenkins 運行所需的依賴(主要是 JDK)之后,可以通過如下步驟簡單快速地部署 Jenkins:
打開終端并切換至下載目錄吸申。
運行命令
java -jar jenkins.war --httpPort=8080
肋杖。
--httpPort
參數(shù)用于指定 Jenkins 服務(wù)運行的端口丽柿。這條命令將運行 Jenkins 服務(wù)滋早。打開瀏覽器并輸入網(wǎng)址
http://localhost:8080
妇垢。
URL 中的端口需要與上面運行 Jenkins 時指定的端口一致妓笙。在瀏覽器中我們能看到 Jenkins 的頁面了夭委。按照指示完成安裝過程幅狮。
安裝插件,并對 Jenkins 做配置株灸。
Jenkins 在 Tomcat 中的部署
雖然上面的 Jenkins 部署很方便快捷崇摄,但是服務(wù)管理卻不是很方便。Jenkins 作為一個 Java Web 應(yīng)用慌烧,其 war 包可以非常方便的部署在 Tomcat 容器中逐抑。Tomcat 在 Ubuntu 系統(tǒng)中的安裝過程可以參考 Ubuntu 16.04 Tomcat 8安裝指南 一文。
要在 Tomcat 容器中部署 Jenkins屹蚊,只需將 jenkins.war 復(fù)制到 $TOMCAT_HOME/webapps
厕氨,然后通過 URL http://yourhost/jenkins 訪問即可。
如果 Tomcat 容器中只部署 Jenkins 服務(wù)汹粤,可以移除 $TOMCAT_HOME/webapps
目錄中的所有內(nèi)容腐巢,然后將 jenkins.war 放進這個目錄中并重命名為 ROOT.war(注意大小寫要保持一致)。Tomcat 將展開這個文件并創(chuàng)建 ROOT 目錄玄括,然后我們應(yīng)該可以在 http://yourhost 看到 Jenkins冯丙,而無需任何額外的路徑(如果采用了 Tomcat 的默認配置,應(yīng)該是 http://yourhost:8080)
如 Ubuntu 16.04 Tomcat 8安裝指南 一文的介紹遭京,如果為 Tomcat 建立了 systemd 服務(wù)文件胃惜,可以通過如下命令重啟 Tomcat 服務(wù):
$ sudo systemctl stop tomcat
$ sudo systemctl start tomcat
并可以通過如下命令查看 Tomcat 的運行狀態(tài):
$ sudo systemctl status tomcat
在 Jenkins 服務(wù)啟動之前,設(shè)置環(huán)境變量 JENKINS_HOME
可以指定 Jenkins 服務(wù)的主目錄哪雕。這可以通過為 Tomcat 的 systemd 服務(wù)文件 /etc/systemd/system/tomcat.service
添加如下的行來實現(xiàn):
Environment=JENKINS_HOME=/opt/tomcat/jenkins_home
這行配置在啟動 Tomcat 容器之前船殉,導(dǎo)出環(huán)境變量。
更多關(guān)于在 Tomcat 中部署 Jenkins 的內(nèi)容可以參考 Tomcat - Jenkins - Jenkins Wiki斯嚎。
nginx 反向代理
將 Tomcat 容器作為 Web 服務(wù)器不是那么的方便利虫,通過 nginx 做反向代理會好很多。在 Ubuntu 中可以通過如下命令安裝并運行 nginx:
$ sudo apt-get install nginx
$ sudo nginx
修改 nginx 的配置文件 /etc/nginx/nginx.conf
堡僻,在 http
塊的最后添加如下幾行為 Jenkins 設(shè)置反向代理:
server {
listen 80;
server_name 59.111.103.32;
location / {
proxy_pass http://127.0.0.1:8080;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
隨后糠惫,就可以通過 http://yourhost URL,經(jīng)過 nginx 訪問 Jenkins 服務(wù)了钉疫。登陸之后硼讽,打開 Jenkins 左上角的 Jenkins -> Manage Jenkins -> Configure System Jenkins 全局配置頁面,滾動到 Jenkins Location 的部分牲阁,正確配置 Jenkins URL:
Jenkins 作為一個強大的持續(xù)集成平臺固阁,其強大之處的重要體現(xiàn)就是壤躲,支持許許多多的插件,可以將功能強大的第三方工具集成進來备燃,代碼質(zhì)量保障相關(guān)的工具碉克,比如代碼的靜態(tài)檢查工具,是其中比較常用的一些并齐。常用的代碼靜態(tài)檢查工具有 PMD漏麦,F(xiàn)indBugs,Android Lint冀膝,CheckStyle 和 SonarQube Scanner 等。
PMD
PMD 是一個可擴展跨語言的靜態(tài)代碼分析器霎挟。它查找常見的編程缺陷窝剖,如未使用的變量,空 catch 塊酥夭,不必要的對象創(chuàng)建赐纱,等等。此外它還包含 CPD熬北,復(fù)制粘貼探測器疙描。CPD 查找重復(fù)代碼。
PMD 掃描 Java 和其它編程語言 的源代碼讶隐,并查找像下面這樣的潛在問題:
- 可能的 bugs - 空的 try/catch/finally/switch 聲明
- 死碼 - 未使用的本地變量起胰,參數(shù)和私有方法
- 次優(yōu)代碼 - 無用的 String/StringBuffer 使用
- 過于復(fù)雜的表達式 - 不必要的 if 聲明,可能可以寫成 while 的 for 循環(huán)
CPD巫延,復(fù)制粘貼探測器效五,查找多種語言的重復(fù)代碼:
- 重復(fù)代碼常常是由復(fù)制粘貼產(chǎn)生的。這意味著炉峰,bugs 也被復(fù)制粘貼了畏妖。修正它們意味著,修正所有重復(fù)的代碼疼阔。
在正式開始集成 PMD 之前戒劫,首先需要通過 Jenkins 左上角的 Jenkins -> Manage Jenkins -> Manage Plugins,在 Jenkins 中安裝 PMD 的插件:
我們通過為 Jenkins Project 添加 Post-build Action 來集成 PMD婆廊。打開 Jenkins Project 的主頁迅细,點擊左邊的 Configure
打開工程的配置頁面,找到頁面最下邊的 Post-build Actions
淘邻,點擊 Add post-build action
的下拉箭頭疯攒,并找到 Publish PMD analysis results
,添加 PMD post-build action列荔,如下圖:
在 PMD results
輸入框中輸入 PMD 檢查結(jié)果文件的路徑敬尺,這個結(jié)果文件需要我們在構(gòu)建期間調(diào)用 PMD 工具生成枚尼。配置了 PMD post-build action 之后,點擊左下角的 Save
按鈕保存退出配置砂吞。
使用 PMD 工具生成源代碼的靜態(tài)檢查分析報告的方法如下:
$ cd $HOME
$ wget https://github.com/pmd/pmd/releases/download/pmd_releases%2F6.2.0/pmd-bin-6.2.0.zip
$ unzip pmd-bin-6.2.0.zip
$ alias pmd="$HOME/pmd-bin-6.2.0/bin/run.sh pmd"
$ pmd -d /usr/src -f xml -r pmd.xml -rulesets java-basic,java-design
PMD 工具的 -d
參數(shù)用于指定項目的源碼路徑署恍,-f
參數(shù)用于指定輸出報告文件的格式,-r
用于指定輸出報告文件的文件名蜻直,-rulesets
則用于指定檢查規(guī)則集合盯质。這個命令將產(chǎn)生名為 pmd.xml
的 XML 格式的檢查報告,這也是 Jenkins 的 PMD 插件所支持的格式概而。
在下載并安裝 PMD 工具之后呼巷,在 Jenkins 工程的構(gòu)建腳本中執(zhí)行 PMD 工具產(chǎn)生檢查報告,如將 PMD 檢查的功能集成進一個用 Python 寫的構(gòu)建腳本:
def run_pmd(wrapper_module_name, target_module_name):
if "PMD_ROOT_PATH" not in os.environ.keys():
print("Cannot find PMD")
return
pmd_root_path = os.environ["PMD_ROOT_PATH"]
pmd_cmd_path = pmd_root_path + os.path.sep + "bin/run.sh"
src_dir = wrapper_module_name + os.path.sep + target_module_name + os.path.sep + "src/main/java"
pmd_cmd_path = "%s pmd -d %s -f xml -r pmd.xml -rulesets java-basic,java-design" % (pmd_cmd_path, src_dir)
print(pmd_cmd_path)
os.system(pmd_cmd_path)
Jenkins 工程在構(gòu)建結(jié)束之后赎瑰,將根據(jù)配置的 PMD results
路徑查找 PMD 檢查的結(jié)果王悍,并將結(jié)果展示在 Jenkins 工程的主頁面上,如下圖所示:
點擊 PMD Trend
將可以看到 PMD 檢查的詳細結(jié)果餐曼,如下圖:
關(guān)于 PMD 工具用法更詳細的內(nèi)容压储,可以參考它的 主頁 和 官方文檔。
FindBugs
FindBugs 是另一個強大的靜態(tài)代碼檢查工具源譬,它主要用于查找 Java 代碼 中的 bugs集惋,它查找 正確性 bugs,糟糕的做法及 Dodgy 等問題踩娘。
與在 Jenkins 中集成 PMD 類似刮刑,同樣需要先在 Jenkins 中為 FindBugs 安裝插件:
然后配置 Jenkins 工程,添加 post-build action Publish FindBugs analysis results
养渴,如下圖:
FindBugs results
輸入框中需要輸入 FindBugs 工具代碼檢查的結(jié)果文件为朋。Jenkins 將在構(gòu)建結(jié)束之后,掃描這個文件厚脉,并在頁面中展示出來习寸。
在 Jenkins 工程的構(gòu)建階段,需要調(diào)用 FindBugs 工具生成檢查報告傻工,方法如下:
$ cd $HOME
$ wget https://jaist.dl.sourceforge.net/project/findbugs/findbugs/3.0.1/findbugs-3.0.1.tar.gz
$ tar xvf findbugs-3.0.1.tar.gz
$ findbugs-3.0.1/bin/findbugs -textui -low -xml -output findbugs.xml module/build/intermediates/bundles/debug/classes.jar
FindBugs 提供了兩種用戶界面霞溪,分別是 GUI 和命令行用戶界面,在 Jenkins 的構(gòu)建腳本中中捆,我們以命令行界面執(zhí)行 findbugs
鸯匹,這通過 -textui
參數(shù)來指定。-low
參數(shù)用于指明希望輸出所有類型的問題泄伪,-xml
參數(shù)用于指定生成的檢查報告的文件格式殴蓬,-output
參數(shù)指明輸出文件名,最后是模塊編譯生成的 class jar 文件。
在 Jenkins 服務(wù)器上下載安裝了 FindBugs 工具之后染厅,集成代碼檢查過程進 Python 構(gòu)建腳本的方法大體如下:
def run_findbugs(wrapper_module_name, target_module_name):
if "FIND_BUGS_ROOT_PATH" not in os.environ.keys():
print("Cannot find findbugs")
return
findbugs_root_path = os.environ["FIND_BUGS_ROOT_PATH"]
findbugs_cmd_path = findbugs_root_path + os.path.sep + "bin/findbugs"
class_file_path = wrapper_module_name + os.path.sep + target_module_name + os.path.sep + "build/intermediates/bundles/debug/classes.jar"
findbugs_cmd_path = "%s -textui -low -xml -output findbugs.xml %s" % (findbugs_cmd_path, class_file_path)
print(findbugs_cmd_path)
os.system(findbugs_cmd_path)
在 Jenkins 的構(gòu)建任務(wù)結(jié)束之后痘绎,它掃描 FindBugs 的檢查結(jié)果,并展示出來:
點進去可以查看更詳細的找到的問題:
關(guān)于 FindBugs 更詳細的內(nèi)容肖粮,可以參考其主頁和文檔孤页。
總結(jié)一下 PMD、FindBugs 集成進 Jenkins 的流程:
- 全局 Jenkins 配置方面涩馆,為相應(yīng)的代碼靜態(tài)檢查工具安裝插件行施。
- 在 Jenkins 工程配置中,為相應(yīng)的代碼靜態(tài)檢查工具添加 post-build action魂那,配置檢查結(jié)果文件的存放路徑蛾号。
- 為 Jenkins 服務(wù)器下載并安裝代碼靜態(tài)檢查工具。
- 在 Jenkins 工程的構(gòu)建腳本中涯雅,調(diào)用代碼檢查工具生成檢查報告文件鲜结。
其它的代碼靜態(tài)檢查工具集成進 Jenkins 的過程與此類似,如 Checkstyle 和 Android Lint斩芭。
Checkstyle
Checkstyle 是一個幫助程序員編寫符合某一編碼規(guī)范的 Java 代碼 的開發(fā)工具轻腺。為它提供編碼規(guī)范的定義文件和源代碼乐疆,它自動檢查源代碼中不符合規(guī)范的地方划乖。編碼規(guī)范的定義文件可以自行配置,比較常用的 Java 代碼編碼規(guī)范如 Sun 代碼規(guī)范 和 Google Java 代碼規(guī)范挤土。
在 Jenkins 中集成 Checkstyle 的整體過程與集成 PMD 和 FindBugs 的過程類似琴庵。需要為 Checkstyle 安裝的插件為 Checkstyle Plug-in
,需要為 Jenkins 工程添加的 post-build action 為 Publish Checkstyle analysis results
仰美。下載并安裝 Checkstyle 工具的方法如下:
$ wget https://excellmedia.dl.sourceforge.net/project/checkstyle/checkstyle/8.8/checkstyle-8.8-bin.tar.gz
$ tar xvf checkstyle-8.8-bin.tar.gz
此外還需要自己定義或下載公開的代碼風格定義文件迷殿,如 Sun 代碼規(guī)范 sun_checks.xml 和 Google Java 代碼規(guī)范 google_checks.xml
執(zhí)行 Checkstyle 工具生成檢查報告的方法如下:
$ java -jar checkstyle-8.8/checkstyle-8.8-all.jar com.puppycrawl.tools.checkstyle.Main -c checkstyle_config/google_checks.xml module/src/main/java -f xml -o checkstyle-result.xml
Checkstyle 工具的 -c
參數(shù)用于指定代碼風格的定義文件,-f
參數(shù)用于指定用于指定輸出檢查報告文加的格式咖杂,-o
參數(shù)用于指定輸出報告文件的文件名庆寺,同時需要為 Checkstyle 指定項目的 Java 源代碼路徑。上面的命令中 Checkstyle 將輸出文件名為 checkstyle-result.xml
格式為 xml 的檢查報告诉字。
將 Checkstyle 工具集成進 Python 的工程構(gòu)建腳本的方法如下:
def run_checkstyle(wrapper_module_name, target_module_name):
if "CHECKSTYLE_ROOT_PATH" not in os.environ.keys():
print("Cannot find Checkstyle")
return
jar_path = os.environ["CHECKSTYLE_ROOT_PATH"] + os.path.sep + "checkstyle-8.8-all.jar"
checkstyle_cmd = "java -jar " + jar_path + " com.puppycrawl.tools.checkstyle.Main"
script_path = __file__
config_file_path = os.path.dirname(script_path) + os.path.sep + "checkstyle_config/google_checks.xml"
checkstyle_cmd = checkstyle_cmd + " -c " + config_file_path
src_dir = " " + wrapper_module_name + os.path.sep + target_module_name + os.path.sep + "src/main/java"
checkstyle_cmd = checkstyle_cmd + src_dir + " -f xml -o checkstyle-result.xml"
print(checkstyle_cmd)
os.system(checkstyle_cmd)
Jenkins 在工程構(gòu)建結(jié)束之后懦尝,掃描 Checkstyle 的檢查報告,并展示出來:
Checkstyle 更詳細的用法可以參考其主頁 和它的 命令行用法說明文檔壤圃。
Android Lint
將 Android Lint 集成進 Jenkins 的過程陵霉,與前面的那些 PMD、FindBugs 和 Checkstyle 的過程類似伍绳,只是需要安裝的 Jenkins 插件為 Android Lint Plugin踊挠,需要為 Jenkins 工程添加的 post-build action 為 Publish Android Lint results
。
更為簡單的是冲杀,Android Lint 是 Android Sdk 中的工具效床,因而無需單獨下載安裝睹酌。對于 Gradle 工程而言,甚至無需單獨運行 Android lint 工具扁凛,而只需運行 lintDebug
或 lintRelease
gradle 任務(wù)即可忍疾,它們將在模塊的 build/reports/lint-results*.xml
處生成 檢查報告。
在 Python 的 Jenkins 工程構(gòu)建腳本中生成 Android Lint 檢查報告的方法如下:
def run_android_lint(target_module_name):
lint_task_name = ":%s:lintDebug" % target_module_name
os.system("./gradlew " + lint_task_name)
Android Lint 的檢查結(jié)果類似于下面這樣:
SonaQube Scanner
SonaQube 是一個開源的代碼質(zhì)量分析管理平臺谨朝,它專注于持續(xù)地分析和測量技術(shù)方面的質(zhì)量卤妒,從項目組合到方法。通過插件字币,它可以支持包括 Java则披,C#,C/C++洗出,PL/SQL士复,Cobol,JavaScrip翩活,Groovy 等在內(nèi)的 20 多種編程語言 的代碼質(zhì)量檢測與管理阱洪。
SonaQube 對代碼質(zhì)量的管理通過 Web 服務(wù) SonaQube 提供,代碼質(zhì)量檢測通過 SonaQube Scanner 完成菠镇。通常的流程是冗荸,SonaQube Scanner 執(zhí)行代碼的靜態(tài)檢查分析,然后將檢查的結(jié)果傳給 SonaQube 服務(wù)利耍,SonaQube 服務(wù)解析并展示分析結(jié)果蚌本。
SonaQube Scanner 可以集成進 MSBuild,Maven隘梨,Gradle程癌,Ant 等構(gòu)建系統(tǒng)中,當然也可以集成進 Jenkins 或在命令行上運行轴猎。
安裝 SonaQube 服務(wù)
在 Jenkins 中集成 SonaQube Scanner嵌莉,分析結(jié)果依然需要由 SonaQube 服務(wù)來解析與展示,因而首先需要安裝 SonaQube 服務(wù)捻脖。在 SonarQube 的下載頁面 選擇需要的版本并下載锐峭,如 SonarQube 6.7.2 (LTS *) 。
下載完成后郎仆,執(zhí)行如下命令安裝并啟動 SonaQube 服務(wù):
$ unzip sonarqube-6.7.2.zip
$ sonarqube-6.7.2/bin/linux-x86-64/sonar.sh start
SonarQube 自帶數(shù)據(jù)庫和 Web 服務(wù)器只祠,因而通過上面簡單的兩條命令,就可以將 SonaQube 服務(wù)運行起來了扰肌。默認情況下抛寝,SonaQube 服務(wù)運行于 9000 端口上:
但需要注意不能以 root 用戶啟動 SonaQube 服務(wù),否則將啟動失敗。通過 sonarqube-6.7.2/logs/
目錄下的 ElasticSearch 日志文件 es.log 和 SonaQube 日志文件 sonar.log 可以看到這一點盗舰。為了獲得更好的性能和穩(wěn)定性晶府,可以使用外部的數(shù)據(jù)庫服務(wù), SonaQube 服務(wù)對此提供了良好的支持钻趋。關(guān)于 SonaQube 服務(wù)安裝配置更詳細的過程川陆,可以參考 SonaQube 的官方文檔 Installing the Server。
命令行運行 SonaQube Scanner
SonaQube Scanner 可以集成進 MSBuild蛮位,Maven较沪,Gradle,Ant 及 Jenkins 等工具中失仁,也可以在命令上獨立運行尸曼。首先下載并安裝 SonaQube Scanner:
$ wget https://sonarsource.bintray.com/Distribution/sonar-scanner-cli/sonar-scanner-cli-3.1.0.1141-linux.zip
$ unzip sonar-scanner-cli-3.1.0.1141-linux.zip
然后為要檢查的工程編寫屬性配置文件 sonar-project.properties,如:
java-module.sonar.projectName=Java Module
java-module.sonar.language=java
# .表示projectBaseDir指定的目錄
java-module.sonar.sources=study-project/lib-module-question/src/main/java
java-module.sonar.projectBaseDir=study-project/lib-module-question
sonar.binaries=classes
sonar.projectKey=study-project
sonar.sources=study-project/lib-module-question/src/main/java
sonar.java.binaries=study-project/lib-module-question/build/intermediates/bundles/debug/classes.jar
上面的配置中萄焦,sonar.projectKey
用于指定工程名稱控轿,工程名稱標識一個工程,SonaQube Scanner 在檢查結(jié)束之后向 SonaQube 服務(wù)發(fā)布檢查結(jié)果拂封,SonaQube 服務(wù)以工程為單位展示檢查結(jié)果茬射。sonar.sources
用于指定要檢查的源碼的路徑。sonar.java.binaries
用于指定編譯生成的 jar 文件的路徑冒签。
在命令行中在抛,在 sonar-project.properties 文件的相同目錄下,執(zhí)行如下命令:
$ sonar-scanner-3.1.0.1141-linux/bin/sonar-scanner
它將根據(jù) sonar-project.properties 配置文件的內(nèi)容靜態(tài)分析源碼镣衡,并將結(jié)果發(fā)布給 SonaQube 服務(wù)霜定。默認情況下档悠,分析結(jié)果將發(fā)布給位于 http://localhost:9000
的 SonaQube 服務(wù)廊鸥。但可以通過如下配置項來進行定制:
sonar.host.url=http://localhost:9000
sonar.login=apitoken/username
sonar.password=blank/passwd
關(guān)于 SonaQube Scanner 執(zhí)行、配置更詳細的信息辖所,可以參考官方文檔 Analyzing with SonarQube Scanner惰说、Advanced SonarQube Scanner Usages
和 Analysis Parameters。
在 Jenkins 中集成 SonaQube Scanner
同樣需要先為 SonaQube Scanner 安裝插件缘回,這次為 SonarQube Scanner for Jenkins
吆视。然后以管理員身份登錄 Jenkins,并進入 Manage Jenkins > Configure System酥宴。向下滾動到 SonarQube configuration 的部分啦吧,點擊 Add SonarQube,然后按提示輸入對應(yīng)的值拙寡,如下圖這樣:
其中 Name
一欄輸入 SonaQube 的名稱授滓,名稱任意取。Server URL
一欄輸入 SonaQube 服務(wù)的 Url。Server authentication token
輸入用戶認證 token般堆,這個 token 是由 SonaQube 服務(wù)生成的在孝。
登錄 SonaQube 服務(wù)(如第一次以 admin(用戶名)/admin(密碼)登錄 SonaQube 服務(wù))之后,點擊右上角的用戶圖標淮摔,選擇 My Account私沮,打開賬戶主頁,并選擇 Security:
在 Generate New Token: 輸入框中輸入 token 名稱和橙,token 名稱可任意選擇仔燕,然后點擊 Generate 生成 token。如 SonaQube 服務(wù)給出的提示魔招,生成的 token 需要復(fù)制出去涨享,這個 token 將無法被再次看到。這個 token 即是前面需要提供給 Jenkins 的 Server authentication token
仆百。
然后執(zhí)行 Jenkins 全局的一些配置厕隧,具體而言,是添加 SonarQube Scanner:
- 以管理員身份登錄 Jenkins俄周,然后進入 Manage Jenkins -> Global Tool Configuration吁讨。
- 滾動到 SonarQube Scanner 配置部分,并點擊 Add SonarQube Scanner峦朗。它基于典型的 Jenkins 工具自動安裝建丧。當然也可以選擇指向一個已經(jīng)安裝的 SonarQube Scanner 版本(反選 'Install automatically')。
最后是 Jenkins 工程的配置:
- 打開 Jenkins 工程的配置頁面波势,滾動到 Build 部分翎朱。
- 為 Jenkins 工程的構(gòu)建添加 SonarQube Scanner 構(gòu)建步驟。
- 配置 SonarQube 分析屬性尺铣。也可以指向一個已有的 sonar-project.properties 文件或直接在 Analysis properties 字段設(shè)置分析屬性拴曲,如下圖:
然后點擊左下角的 Save
,保存并結(jié)束配置凛忿。后面在執(zhí)行 Jenkins Project 的構(gòu)建任務(wù)時澈灼,SonarQube Scanner 將執(zhí)行,生成分析報告并發(fā)送給 SonaQube 服務(wù)店溢,報告有 SonaQube 解析并展示叁熔。更多內(nèi)容請參考 Analyzing with SonarQube Scanner for Jenkins。
參考文檔
Getting started with the Guided Tour
Tomcat - Jenkins - Jenkins Wiki
Analyzing with SonarQube Scanner for Jenkins
使用 Jenkins 與 Sonar 集成對代碼進行持續(xù)檢測
SonarQube代碼質(zhì)量管理平臺安裝與使用
Analyzing Source Code
Dong.