程序猿的进阶屋

jenkins+docker+sonar实现容器化构建

2018-07-12  本文已影响281人  荒原_狼

背景

上一篇文章,我们知道可以通过jenkins的docker插件,实现jenkins的动态slave,构建时创建容器节点,构建结束,销毁容器节点,任务的工作空间也不会保留在服务器上,而是随容器销毁。本篇文章介绍具体怎么使用jenkins和docker的这个特性,来实现sonar代码扫描的动态构建。

工具准备

具体步骤

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"
                        }
                    }
                }
                    
                }
            }    
    }
    }
}
}
``
上一篇下一篇

猜你喜欢

热点阅读