Jenkins 在 Tomcat 中的部署及代碼靜態(tài)檢查工具集成

Jenkins 的簡單部署

在安裝了 Jenkins 運行所需的依賴(主要是 JDK)之后,可以通過如下步驟簡單快速地部署 Jenkins:

  1. 下載 Jenkins.

  2. 打開終端并切換至下載目錄吸申。

  3. 運行命令 java -jar jenkins.war --httpPort=8080肋杖。
    --httpPort 參數(shù)用于指定 Jenkins 服務(wù)運行的端口丽柿。這條命令將運行 Jenkins 服務(wù)滋早。

  4. 打開瀏覽器并輸入網(wǎng)址 http://localhost:8080妇垢。
    URL 中的端口需要與上面運行 Jenkins 時指定的端口一致妓笙。在瀏覽器中我們能看到 Jenkins 的頁面了夭委。

  5. 按照指示完成安裝過程幅狮。
    安裝插件,并對 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é)果,并展示出來:

截圖_2018-04-03_11-00-44.png

點進去可以查看更詳細的找到的問題:

關(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 的檢查報告,并展示出來:

截圖_2018-04-03_11-34-05.png

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 工具扁凛,而只需運行 lintDebuglintRelease 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:

  1. 以管理員身份登錄 Jenkins俄周,然后進入 Manage Jenkins -> Global Tool Configuration吁讨。
  2. 滾動到 SonarQube Scanner 配置部分,并點擊 Add SonarQube Scanner峦朗。它基于典型的 Jenkins 工具自動安裝建丧。當然也可以選擇指向一個已經(jīng)安裝的 SonarQube Scanner 版本(反選 'Install automatically')。

最后是 Jenkins 工程的配置:

  1. 打開 Jenkins 工程的配置頁面波势,滾動到 Build 部分翎朱。
  2. 為 Jenkins 工程的構(gòu)建添加 SonarQube Scanner 構(gòu)建步驟。
  3. 配置 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.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末床牧,一起剝皮案震驚了整個濱河市荣回,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌戈咳,老刑警劉巖心软,帶你破解...
    沈念sama閱讀 206,311評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件革砸,死亡現(xiàn)場離奇詭異,居然都是意外死亡糯累,警方通過查閱死者的電腦和手機算利,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來泳姐,“玉大人效拭,你說我怎么就攤上這事∨置耄” “怎么了缎患?”我有些...
    開封第一講書人閱讀 152,671評論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長阎肝。 經(jīng)常有香客問我挤渔,道長,這世上最難降的妖魔是什么风题? 我笑而不...
    開封第一講書人閱讀 55,252評論 1 279
  • 正文 為了忘掉前任判导,我火速辦了婚禮,結(jié)果婚禮上沛硅,老公的妹妹穿的比我還像新娘眼刃。我一直安慰自己,他們只是感情好摇肌,可當我...
    茶點故事閱讀 64,253評論 5 371
  • 文/花漫 我一把揭開白布擂红。 她就那樣靜靜地躺著,像睡著了一般围小。 火紅的嫁衣襯著肌膚如雪昵骤。 梳的紋絲不亂的頭發(fā)上对碌,一...
    開封第一講書人閱讀 49,031評論 1 285
  • 那天鳄炉,我揣著相機與錄音,去河邊找鬼商玫。 笑死疹娶,一個胖子當著我的面吹牛伴栓,可吹牛的內(nèi)容都是我干的伦连。 我是一名探鬼主播雨饺,決...
    沈念sama閱讀 38,340評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼惑淳!你這毒婦竟也來了额港?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,973評論 0 259
  • 序言:老撾萬榮一對情侶失蹤歧焦,失蹤者是張志新(化名)和其女友劉穎移斩,沒想到半個月后肚医,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,466評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡向瓷,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,937評論 2 323
  • 正文 我和宋清朗相戀三年肠套,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片猖任。...
    茶點故事閱讀 38,039評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡你稚,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出朱躺,到底是詐尸還是另有隱情刁赖,我是刑警寧澤,帶...
    沈念sama閱讀 33,701評論 4 323
  • 正文 年R本政府宣布长搀,位于F島的核電站宇弛,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏源请。R本人自食惡果不足惜枪芒,卻給世界環(huán)境...
    茶點故事閱讀 39,254評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望谁尸。 院中可真熱鬧病苗,春花似錦、人聲如沸症汹。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽背镇。三九已至咬展,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間瞒斩,已是汗流浹背破婆。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留胸囱,地道東北人祷舀。 一個月前我還...
    沈念sama閱讀 45,497評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像烹笔,于是被迫代替她去往敵國和親裳扯。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,786評論 2 345

推薦閱讀更多精彩內(nèi)容