美文网首页程序猿的进阶屋
jenkins+docker+sonar实现容器化构建

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

作者: 荒原_狼 | 来源:发表于2018-07-12 15:25 被阅读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"
                            }
                        }
                    }
                        
                    }
                }    
        }
        }
    }
    }
    ``

    相关文章

      网友评论

        本文标题:jenkins+docker+sonar实现容器化构建

        本文链接:https://www.haomeiwen.com/subject/sublpftx.html