jenkins+docker+sonar实现容器化构建
2018-07-12 本文已影响281人
荒原_狼
背景
上一篇文章,我们知道可以通过jenkins的docker插件,实现jenkins的动态slave,构建时创建容器节点,构建结束,销毁容器节点,任务的工作空间也不会保留在服务器上,而是随容器销毁。本篇文章介绍具体怎么使用jenkins和docker的这个特性,来实现sonar代码扫描的动态构建。
工具准备
- jenkins工具
配置docker插件,sonar插件 - sonarqube工具
具体步骤
step 1:配置动态容器节点
如何配置动态容器,请看上一篇,这里不细述。要注意的一点是,需要为动态容器指定java安装包的路径。如下图所示,笔者节点所用的镜像JAVA_HOME及Jdk安装包的路径,若不设置这块信息,容器启动后,运行sonar-scanner工具时默认会去找jenkins服务器的Jdk路径,而容器的Jdk路径与Jenkins服务器的又不一致,故会报错。
确认容器Jdk安装路径,可通过容器构建一个简单工程,用"whereis java"命令输出路径即可,如前一篇文章所述。
step 2:Jenkins中配置sonar扫描任务
方式一:非pipeline模式
指定节点机
配置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
执行sonar扫描
查看扫描结果
step5:查看远端sonar扫描的报告
方式二,调整为pipeline模式
pipeline视图
pipeline内部配置
pipeline脚本
def call(Map map,String type){
if(type == "Java"){
pipeline {
agent {label 'wu'}
parameters {
//单元测试代码覆盖率要求,各项目视要求调整参数
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 {
//保持构建的最大个数
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"
}
}
}
}
}
}
}
}
}
``