8. 在Jenkins中集成Sonar Qube和Sonar Scanner

1 SonarQube和SonarScan的安裝配置

1.1 Windows環(huán)境下的安裝和使用

1.1.1 啟動sonarqube服務

image.png
image.png
image.png
image.png

1.1.2 在mysql里面創(chuàng)建一個存儲掃描結果的庫(比如sonarDB)

image.png

1.1.3 配置sonar qube的sonar.properties

image.png
sonar.jdbc.url=jdbc:mysql://localhost:3306/sonarDB?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true&useConfigs=maxPerformance&useSSL=false

sonar.jdbc.username=root  

sonar.jdbc.password=root

sonar.sorceEncoding=UTF-8

1.1.4 重啟sonar qube(使用ctrl + c)

停止sonar qube(使用ctrl + c)

image.png

然后重新啟動sonar qube...

1.1.5 Sonar Scanner插件配置

image.png
sonar.jdbc.url=jdbc:mysql://localhost:3306/sonarDB?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true&useConfigs=maxPerformance

sonar.jdbc.username=root

sonar.jdbc.password=root

# 如果測試項目與服務器不在同一臺機子析孽,則需要添加SonarQube服務器的IP:
sonar.host.url=http://localhost:9000

1.1.6 運行Sonar scanner

注意:需要提前把sonar qube運行起來

1.1.6.1 下載代碼到本地

1.1.6.2 創(chuàng)建一個sonar-project.properties


sonar.projectKey=yay:project

# this is the name displayed in the SonarQube UI

sonar.projectName=whatproject.0project

sonar.projectVersion=1.0

# Path is relative to the sonar-project.properties file. Replace "\" by "/" on Windows.

# Since SonarQube 4.2, this property is optional if sonar.modules is set.

# If not set, SonarQube starts looking for source code from the directory containing

# the sonar-project.properties file.

sonar.sources=personrecord

sonar.java.binaries=newtarget

sonar.language=java

# Encoding of the source code. Default is default system encoding

sonar.sourceEncoding=UTF-8
image.png

1.1.6.3 運行sonar-scanner執(zhí)行代碼掃描

D:\svncode>D:\softwareback\devops\sonar\sonar-scanner-3.0.3.778-windows\bin\sonar-scanner
image.png

注意,在執(zhí)行過程中很可能會遇到這種錯誤:
image.png

這主要是由于生產(chǎn)的報告大于mysql允許的最大包大小(比如默認值只允許4M)。
解決方法為修改mysql根目錄里面的my.ini文件,增加一行:max_allowed_packet= 100M
我們可以查看mysql現(xiàn)有的包大小配置:
SHOW VARIABLES LIKE 'max_allowed_packet';


image.png
 [mysqld]
#設置3306端口
port = 3306

# 設置mysql的安裝目錄
basedir=D:/softwareback/db/mysql-5.7.26

# 設置mysql數(shù)據(jù)庫的數(shù)據(jù)的存放目錄
datadir=D:/softwareback/db/mysql-5.7.26/data


# 服務端使用的字符集默認為8比特編碼的latin1字符集
character-set-server=utf8

default-storage-engine=INNODB
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES

# 解決sonarscanner插件允許時候出錯:ERROR: Failed to upload report - 500: An error has occurred. Please contact your administrator
max_allowed_packet= 100M

[mysql]
# 設置mysql客戶端默認字符集
default-character-set=utf8

1.1.7 查看掃描結果

image.png

1.2 Centeros環(huán)境下的安裝和使用

1.2.1 大多數(shù)安裝環(huán)境和windows差不多

。。吱殉。

2. 和Jenkins集成

2.1 Mysql和Sonarqube加入到PATH中

image.png

2.2 SonarScanner Jenkins插件的安裝

注意SonarScanner仍然需要在本地環(huán)境現(xiàn)安裝好


image.png

image.png

image.png

2.3 在Jenkins上某個task上增加這個步驟

2.3.1 直接在Jenkins上配置

image.png

接下來是這個步驟的配置:
image.png
sonar.projectKey=HGARCH1.0.01:project
sonar.projectName=HGARCH1.0.01.0project
sonar.projectVersion=1.0.01
sonar.sources=.
sonar.java.binaries=output
sonar.language=java
sonar.sourceEncoding=UTF-8

然后到sonar系統(tǒng)修改一個地方,否則在運行Jenkins的job時候會出錯


image.png

然后重啟sonar
image.png

然后運行厘托,注意上一步配置如果不做可能會出錯:


image.png

運行成功后可以在Jenkins看到sonar上相關工程執(zhí)行結果鏈接:


image.png

image.png

2.3.2 在pipeline腳本里面配置

image.png
pipeline{
    agent any
     tools {
        //工具名稱必須在Jenkins 管理Jenkins → 全局工具配置中預配置友雳。
        maven 'maven3'
    }

    environment{     
        def SRCCODE_DIR = "/var/jenkins_home/workspace/${env.JOB_NAME}"
        def DAILYCI_DIR = "/var/ciOutput/dailyCiOutput"
        def SVN_FOLD = "personrecord"  
    }
    

    options { 
        //pipeline保持構建的最大個數(shù)
        buildDiscarder(logRotator(numToKeepStr: '28')) 
    }

    triggers { cron('H 0,12 * * *') }

    stages{     
        stage('Checkout'){
             steps{
    
                checkout([
                      $class: 'SubversionSCM', 
                      additionalCredentials: [], 
                      excludedCommitMessages: '', 
                      excludedRegions: '', 
                      excludedRevprop: '', 
                      excludedUsers: '', 
                      filterChangelog: false, 
                      ignoreDirPropChanges: false, 
                      includedRegions: '', 
                      locations: [[credentialsId: '6aab1014-b1c9-4a8a-adba-f1cd0d27a483', 
                                   depthOption: 'infinity', 
                                   ignoreExternalsOption: true,                                    
                                   remote: "https://10.xxx.xxx.xxx/svn/ZYN/xxx/branch/V1.0/code/personrecord"]], 
                      workspaceUpdater: [$class: 'UpdateUpdater']])
            }
        }

        stage('Build'){
            steps{
                compileAllFiles()                                          
            }           
        }

        stage('Backend Unit Test') {
            steps {
                sh 'mvn -f $SVN_FOLD/algorithm/pom.xml test'
                sh 'mvn -f $SVN_FOLD/pom.xml test'

                //junit '**/target/surefire-reports/TEST-*.xml'
                //archive 'target/*.jar'                    
            }
        }


        stage('SonarQube Analysis') {
            steps {
                withSonarQubeEnv('snoar-6.7.7') {
                    script {
                        def sonarScanner = tool name: 'sonarscanner', type: 'hudson.plugins.sonar.SonarRunnerInstallation'
                        sh "${sonarScanner}/bin/sonar-scanner " +
                        "-Dsonar.projectKey=HGARCHMain:project " +
                        "-Dsonar.projectName=HGARCHMainProject " +
                        "-Dsonar.projectVersion=1 " +
                        "-Dsonar.sources=$SVN_FOLD " +
                        "-Dsonar.java.binaries=$SVN_FOLD/output " +                     
                        "-Dsonar.sourceEncoding=UTF-8"
                    }
                }
                //timeout(time: 15, unit: 'MINUTES') {
                //    script {
                //        def qg = waitForQualityGate()
                //        if (qg.status != 'OK') {
                            error "代碼不滿足Pipelin中Sonar設定的質量門限: ${qg.status}"
                //        }
                //    }
               // }             
            }
        }


        stage('UploadToRepository'){
            steps{                  
                    rmDailyCIOutputFiles() 
                    copyJarsToDailyCIOutoutDir()               
            }   
        }
        
        stage('copy to 118'){
            steps{              
            sshPublisher(publishers: [sshPublisherDesc(configName: 'fornanjing118', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: '', execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: 'dailyOutput', remoteDirectorySDF: false, removePrefix: 'personrecord/output', sourceFiles: 'personrecord/output/**/*')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)])
            }
        }

        stage('Deploy to 117'){
            steps{
                //調用Publish Over SSH插件,上傳docker-compose.yaml文件并且執(zhí)行deploy腳本
            sshPublisher(publishers: [sshPublisherDesc(configName: 'forchongqing117', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: 'sh /root/hgarchDevops/redeploy.sh', execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: 'dailyOutput', remoteDirectorySDF: false, removePrefix: 'personrecord/output', sourceFiles: 'personrecord/output/**/*')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)])

            //sh /root/hgarchDevops/redeploy.sh
            //remoteDirectory: '/root/hgarchDevops/dailyOutput'
            //flatten: true會避免copy過來的jar包在personrecord/output中
            //personrecord/output/*.jar

            //. ./hgarchDevops/dailyOutput/redeploy.sh
            }
        }       
    }

    post {      
        failure
            {
                sh '$mail'
            }       
    }
}
def compileAllFiles()
{
    //執(zhí)行shell命令
    sh 'mvn -f $SVN_FOLD/algorithm/pom.xml clean scala:compile compile package -DskipTests=true'
    sh 'mvn -f $SVN_FOLD/pom.xml clean package' 
}

def rmDailyCIOutputFiles()
{   
    sh 'rm -rf $DAILYCI_DIR.'
}
def copyJarsToDailyCIOutoutDir()
{
    if (isUnix())
    {
        sh 'cp -r $SVN_FOLD/output/* $DAILYCI_DIR'              
    }
    else
    {       
        bat 'cp -r $SVN_FOLD/output/* $DAILYCI_DIR'
    }   
}

def mail=
{
    emailext body: emailBody(),//"${env.DEFAULT_CONTENT}",
    recipientProviders: [ //[$class: 'CulpritsRecipientProvider'],
    //[$class: 'DevelopersRecipientProvider'],
    //[$class: 'RequesterRecipientProvider'],
    //[$class: 'FailingTestSuspectsRecipientProvider'],
    [$class: 'FirstFailingBuildSuspectsRecipientProvider'],
    [$class: 'UpstreamComitterRecipientProvider']
    ],
    subject: '構建失敗',
    mimeType: "text/html"
}

def emailBody()
{
    return '''<!DOCTYPE html>    
    <html>    
    <head>    
    <meta charset="UTF-8">    
    <title>${ENV, var="JOB_NAME"}-第${BUILD_NUMBER}次構建日志</title>    
    </head>    
        
    <body leftmargin="8" marginwidth="0" topmargin="8" marginheight="4"    
        offset="0">    
        <table width="95%" cellpadding="0" cellspacing="0"  style="font-size: 11pt; font-family: Tahoma, Arial, Helvetica, sans-serif">    
            <tr>    
                本郵件由系統(tǒng)自動發(fā)出铅匹,無需回復押赊!<br/>            
                各位同事,大家好包斑,以下為${PROJECT_NAME }項目構建信息</br> 
                <td><font color="#CC0000">構建結果 - ${BUILD_STATUS}</font></td>   
            </tr>    
            <tr>    
                <td><br />    
                <b><font color="#0B610B">構建信息</font></b>    
                <hr size="2" width="100%" align="center" /></td>    
            </tr>    
            <tr>    
                <td>    
                    <ul>    
                        <li>項目名稱 : ${PROJECT_NAME}</li>    
                        <li>構建編號 : 第${BUILD_NUMBER}次構建</li>    
                        <li>觸發(fā)原因: ${CAUSE}</li>    
                        <li>構建狀態(tài): ${BUILD_STATUS}</li>    
                        <li>構建日志: <a href="${BUILD_URL}console">${BUILD_URL}console</a></li>    
                        <li>構建  Url : <a href="${BUILD_URL}">${BUILD_URL}</a></li>    
                        <li>工作目錄 : <a href="${PROJECT_URL}ws">${PROJECT_URL}ws</a></li>    
                        <li>項目  Url : <a href="${PROJECT_URL}">${PROJECT_URL}</a></li>    
                    </ul>    

    <h4><font color="#0B610B">失敗用例</font></h4>
    <hr size="2" width="100%" />
    $FAILED_TESTS<br/>

    <h4><font color="#0B610B">最近提交(#$SVN_REVISION)</font></h4>
    <hr size="2" width="100%" />
    <ul>
    ${CHANGES_SINCE_LAST_SUCCESS, reverse=true, format="%c", changesFormat="<li>%d [%a] %m</li>"}
    </ul>
    詳細提交: <a href="${PROJECT_URL}changes">${PROJECT_URL}changes</a><br/>

                </td>    
            </tr>    
        </table>    
    </body>    
    </html>'''
}
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末流礁,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子罗丰,更是在濱河造成了極大的恐慌崇棠,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,968評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件丸卷,死亡現(xiàn)場離奇詭異,居然都是意外死亡询刹,警方通過查閱死者的電腦和手機谜嫉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來凹联,“玉大人沐兰,你說我怎么就攤上這事”文樱” “怎么了住闯?”我有些...
    開封第一講書人閱讀 153,220評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長澳淑。 經(jīng)常有香客問我比原,道長,這世上最難降的妖魔是什么杠巡? 我笑而不...
    開封第一講書人閱讀 55,416評論 1 279
  • 正文 為了忘掉前任量窘,我火速辦了婚禮,結果婚禮上氢拥,老公的妹妹穿的比我還像新娘蚌铜。我一直安慰自己锨侯,他們只是感情好,可當我...
    茶點故事閱讀 64,425評論 5 374
  • 文/花漫 我一把揭開白布冬殃。 她就那樣靜靜地躺著囚痴,像睡著了一般。 火紅的嫁衣襯著肌膚如雪审葬。 梳的紋絲不亂的頭發(fā)上深滚,一...
    開封第一講書人閱讀 49,144評論 1 285
  • 那天,我揣著相機與錄音耳璧,去河邊找鬼成箫。 笑死,一個胖子當著我的面吹牛旨枯,可吹牛的內容都是我干的蹬昌。 我是一名探鬼主播,決...
    沈念sama閱讀 38,432評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼攀隔,長吁一口氣:“原來是場噩夢啊……” “哼皂贩!你這毒婦竟也來了?” 一聲冷哼從身側響起昆汹,我...
    開封第一講書人閱讀 37,088評論 0 261
  • 序言:老撾萬榮一對情侶失蹤明刷,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后满粗,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體辈末,經(jīng)...
    沈念sama閱讀 43,586評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,028評論 2 325
  • 正文 我和宋清朗相戀三年映皆,在試婚紗的時候發(fā)現(xiàn)自己被綠了挤聘。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,137評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡捅彻,死狀恐怖组去,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情步淹,我是刑警寧澤从隆,帶...
    沈念sama閱讀 33,783評論 4 324
  • 正文 年R本政府宣布,位于F島的核電站缭裆,受9級特大地震影響键闺,放射性物質發(fā)生泄漏。R本人自食惡果不足惜幼驶,卻給世界環(huán)境...
    茶點故事閱讀 39,343評論 3 307
  • 文/蒙蒙 一艾杏、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦购桑、人聲如沸畅铭。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽硕噩。三九已至,卻和暖如春缭贡,著一層夾襖步出監(jiān)牢的瞬間炉擅,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評論 1 262
  • 我被黑心中介騙來泰國打工阳惹, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留谍失,地道東北人。 一個月前我還...
    沈念sama閱讀 45,595評論 2 355
  • 正文 我出身青樓莹汤,卻偏偏與公主長得像快鱼,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子纲岭,可洞房花燭夜當晚...
    茶點故事閱讀 42,901評論 2 345