背景
上一篇文章,我們知道可以通過jenkins的docker插件,實現(xiàn)jenkins的動態(tài)slave,構(gòu)建時創(chuàng)建容器節(jié)點,構(gòu)建結(jié)束,銷毀容器節(jié)點,任務的工作空間也不會保留在服務器上,而是隨容器銷毀。本篇文章介紹具體怎么使用jenkins和docker的這個特性,來實現(xiàn)sonar代碼掃描的動態(tài)構(gòu)建。
工具準備
- jenkins工具
配置docker插件,sonar插件 - sonarqube工具
具體步驟
step 1:配置動態(tài)容器節(jié)點
如何配置動態(tài)容器,請看上一篇,這里不細述。要注意的一點是,需要為動態(tài)容器指定java安裝包的路徑。如下圖所示,筆者節(jié)點所用的鏡像JAVA_HOME及Jdk安裝包的路徑,若不設置這塊信息,容器啟動后,運行sonar-scanner工具時默認會去找jenkins服務器的Jdk路徑,而容器的Jdk路徑與Jenkins服務器的又不一致,故會報錯。
確認容器Jdk安裝路徑,可通過容器構(gòu)建一個簡單工程,用"whereis java"命令輸出路徑即可,如前一篇文章所述。

step 2:Jenkins中配置sonar掃描任務
方式一:非pipeline模式
指定節(jié)點機

配置scm

刪除.svn文件

腳本如下:
#!/bin/bash
# rm svn file
echo ${WORKSPACE}
if [[ ! -d ${WORKSPACE} ]]; then
echo "not dir"
return
fi
SAVEIFS=$IFS;
IFS=$'\n'
rmDirSvn(){
cd ${WORKSPACE};
countF=`ls -A | wc -l`
if [[ $countF -eq 0 ]]; then
cd ./../
echo ${WORKSPACE} is null
return;
fi
countF=`find . -name ".svn" -mindepth 1 -maxdepth 7`
echo $countF
for fileD in $countF; do
if [[ -d $fileD ]]; then
echo $fileD
rm -rf $fileD
elif [[ ! -e $fileD ]]; then
echo $fileD not exist
fi
done
}
rmDirSvn ${WORKSPACE};
IFS=$SAVEIFS
執(zhí)行sonar掃描


查看掃描結(jié)果

step5:查看遠端sonar掃描的報告

方式二,調(diào)整為pipeline模式
pipeline視圖

pipeline內(nèi)部配置

pipeline腳本
def call(Map map,String type){
if(type == "Java"){
pipeline {
agent {label 'wu'}
parameters {
//單元測試代碼覆蓋率要求,各項目視要求調(diào)整參數(shù)
string(name:'Svn_url', defaultValue: "${map.Svn_url}", description: '')
string(name:'Email', defaultValue: "${map.Email}", description: '郵件')
string(name:'PROJ_NA', defaultValue: "${map.PROJ_NA}", description: '項目名')
}
tools {
maven 'apache-maven-3.1.1'
jdk 'jdk1.8.0_66'
}
environment{
sonarHome = tool name: 'SonarQube Scanner', type: 'hudson.plugins.sonar.SonarRunnerInstallation'
}
options {
//保持構(gòu)建的最大個數(shù)
buildDiscarder(logRotator(numToKeepStr: '5'))
}
stages{
stage('checkout svn') {
steps{
FecthCode()
}
}
stage('SonarQube analysis') {
steps{
JavaAnalysis()
}
}
stage('Quality Get'){
steps{
script{
timeout(10){
sleep time:1,unit:'MINUTES'
def qg=waitForQualityGate()
if(qg.status!="OK"){
SendSonarEmail()
error "Pipeline aborted due to quality gate failure: ${qg.status}"
}else{
echo "SUCCESS"
}
}
}
}
}
}
}
}
}
``