在Jenkins中使用sonar进行静态代码检查

要解决的问题

jenkins自动构建完成后,希望能通过sonar静态代码检查生成一份报告,给与开发人员对当前代码的做一个质量评估和修改意见

1.安装并配置sonar服务器

懒得说,跟着官方文档走就行,这边主要的开发语言是.net core 和 typescript,所以在sonar server中的应用市场搜索对应语言安装就完事 安装参考地址:https://docs.sonarqube.org/display/SONAR/Setup+and+Upgrade

2.jenkins机器下载sonar扫描器

.net core 扫描器:https://docs.sonarqube.org/display/SCAN/Scanning+on+Linux+or+macOS+with+Scanner+4.0.x typescript 扫描器:https://docs.sonarqube.org/display/PLUG/SonarTS

路径地址替换自己的 .net core :/opt/sonar-scanner-netcore/sonar-scanner-3.1.0.1141/conf 默认扫描器:/opt/sonar-scanner/conf 该路径下有配置文件:sonar-scanner.properties 修改该配置文件中的sonar.host.url=http://192.168.1.133:9000 为自己的sonar server服务器地址。

3.创建jenkins构建任务

选择创建流水线任务,也就是pipeline。因为我们有一个自动化流程管理工具,所以job的触发构建动作是在自动化工具中实现的。这里只是怎么调用sonar-scanner。 自动化流程工具传递参数(需要扫描的站点名称,类型),进入jenkins的sonar扫描任务, 脚本做这么几个事情: 1.根据传入的站点名称,获取当前站点名称在jenkins的配置,然后从配置文件中获取源代码地址, 2.拉取源代码 3.sonar-scanner。 jenkins 内部对象api文档地址:http://javadoc.jenkins-ci.org/allclasses-noframe.html jenkins pipeline参考地址:https://jenkins.io/doc/book/pipeline/syntax/ pipeline script脚本如下:

//@NonCPS 标记当前方法的返回值不需要序列话,因为 def job,这里的job对象不能被序列化。
@NonCPS
def getUrl(){
    def job=jenkins.model.Jenkins.getInstanceOrNull().getItem("${site_name}");
    if(job==null){
        throw new hudson.AbortException("not found jenkins job ${site_name}")
    }
    def jobScmUrl=job.getScm().getUserRemoteConfigs().get(0).getUrl(); 
//获得站点的git源代码地址
    return jobScmUrl;
}
node {  
//typescript扫描器需要运行tsc命令,但是我们的项目是全局安装的typescript,所以这里要指定NODE_PATH
    environment {
        NODE_PATH = '/usr/local/node/lib/node_modules';
    }
    stage('checkout') {
        deleteDir();//删除当前构建的workspace
        def scmUrl=getUrl();
    // git 拉取代码到workspace,指定分支为master,并指定git使用的SSH证书id(3e6da11b-9f1d-42e2-8cb0-e8616ec0709e)
        def scmOut=checkout([
            $class: 'GitSCM', 
            branches: [[name: 'master']], 
            doGenerateSubmoduleConfigurations: false, 
            extensions: [], 
            submoduleCfg: [], 
            userRemoteConfigs: [[
                credentialsId: '3e6da11b-9f1d-42e2-8cb0-e8616ec0709e', 
                url: scmUrl]]]);
    }
     if("${language}" == "netcore"){
        //如果是.net core 类型的站点
        stage('sonar-begin') { 
            sh script: "dotnet /opt/sonar-scanner-netcore/SonarScanner.MSBuild.dll begin /k:\"${site_name}\" /d:sonar.exclusions=/**/*.js"
        }
        stage('sonar-build') { 
            sh script: 'dotnet build';
        }
        stage('sonar-end') { 
            sh script: 'dotnet /opt/sonar-scanner-netcore/SonarScanner.MSBuild.dll end';
        }
    } else if("${language}" == "nodejs"){
        stage('sonar-scanner') { 
            sh script: 'echo "------------$NODE_PATH"'
            sh script: "sh /opt/sonar-scanner/bin/sonar-scanner  -Dsonar.projectKey=${site_name} -Dsonar.sources=."
        }
    }
    else{
        echo 'not support language ${language}';
        throw new hudson.AbortException("not support language ${language}")
    }
}

4.成果展示

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏黄子玥的专栏

Websocket 基础篇

WebSocket 规范定义了一种API,可在网络浏览器和服务器之间建立“套接字”连接。简单地说,客户端和服务器之间存在持久的连接,而且双方都可以随时开始发送数...

2.4K10
来自专栏云计算教程系列

如何在一个Ubuntu 16.04服务器上将Nginx配置为Web服务器和Apache的反向代理

Apache和Nginx是两种常用的PHP开源Web服务器。当托管具有不同要求的多个网站时,在同一虚拟机上运行它们会很有用。在单个系统上运行两个Web服务器的一...

28130
来自专栏三杯水

系统重启后nginx reload不生效原因分析

这是一种比较少见,困扰我很久的问题,虽然这个问题很简单,但是找到根本原因还是费了不少时间,现在把分析过程分享如下。

42920
来自专栏FreeBuf

如何在安卓移动终端进行一次渗透实验?

下面的实验将通过使用一个虚拟Android系统作为实验主体来进行展示。在这个实验中,通过使用虚拟Android系统,模拟移动终端的操作,来帮助我们逐步实现使用一...

36460
来自专栏iKcamp

iKcamp|基于Koa2搭建Node.js实战(含视频)☞ 代码分层

视频地址:https://www.cctalk.com/v/15114923889408 文章 在前面几节中,我们已经实现了项目中的几个常见操作:启动服务器、路...

32760
来自专栏云计算教程系列

如何在一个Ubuntu 18.04服务器上将Nginx配置为Web服务器和Apache的反向代理

Apache和Nginx是目前比较流行的两种常用于PHP的开源Web服务器。当托管具有不同要求的多个网站时,在同一虚拟机上运行它们会很有用。在单个系统上运行两个...

78400
来自专栏猛牛哥的博客

debian使用LVM扩展第二块硬盘

19040
来自专栏运维

系统重启后ngix reload不生效原因分析

这是一种比较少见,困扰我很久的问题,虽然这个问题很简单,但是找到根本原因还是费了不少时间,现在把分析过程分享如下。

9620
来自专栏CaiRui

linux+Nginx+Mysql+Php

LNMP简介 LAMP(Linux apache mysql php)---比较早的web服务。 LNMP(Linux nginx mysql php)---比...

35490
来自专栏云计算教程系列

如何在Ubuntu 14.04上使用Pydio托管文件共享服务器

随着云的采用增加,越来越多的数据被远程存储。从音乐到图片再到个人文档,很多人都将文件上传到他们不管理的服务器上。如果您希望将文件保存在您控制的服务器上,则可以使...

41900

扫码关注云+社区

领取腾讯云代金券