基于sonar 的C#静态代码扫描使用总结

1.原理简介

C#语言接入Sonar代码静态扫描相较于Java、Python来说,相对麻烦一些。Sonar检测C#代码时需要预先编译,而且C#代码必须用MSbuid进行编译,如果需要使用SonarQube对C#进行代码质量分析,则需要Sonar-Scanner-MSBuild和MSBuild,其中要求MSBuild在V14.0以上。

1.1 java8需要的安装包

链接:https://pan.baidu.com/s/1lp85mfmX_0W7t6MyWgn0JQ?pwd=abcd
提取码:abcd

Sonarqube-7.8是sonar的部署包;
sonar-scanner-msbuild是代码扫描的包;
还需要msbuild,这个是需要安装Microsoft Visual Studio 会自动安装 没有需要自行安装;
sonar-|10n-zh-plugin-1.28.jar为汉化包。

2.sonar安装

2.1基于windows安装sonarqube

环境参数
software
version
JDK
1.8
SonarQube
SonarQube-7.8
sonar-runner
sonar-runner-dist-2.4
汉化插件
sonar-|10n-zh-plugin-1.28.jar
mysql
mysql-5.7 有版本限制 5.7 最新8.0以上版本不支持

一、数据库配置

root登录数据库,执行以下命令:

  1. 创建sonar数据库
  2. 创建sonar 用户
  3. 给sonar 赋予权限
  4. 密码是sonar
  5. 刷新权限
CREATE DATABASE sonar CHARACTER SET utf8 COLLATE utf8_general_ci;
CREATE USER 'sonar' IDENTIFIED BY 'sonar';
GRANT ALL ON sonar.* TO 'sonar'@'%' IDENTIFIED BY 'sonar';
GRANT ALL ON sonar.* TO 'sonar'@'localhost' IDENTIFIED BY 'sonar';
FLUSH PRIVILEGES;

打开sonar/conf目录下的sonar.properties,加入以下配置项:

#数据库连接url
sonar.jdbc.url=jdbc:mysql://localhost:3306/sonar?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true&useConfigs=maxPerformance&useSSL=false
#数据库用户
sonar.jdbc.username=sonar
#数据库密码
sonar.jdbc.password=sonar
sonar.sorceEncoding=UTF-8
sonar.login=admin
sonar.password=admin

url是数据库连接地址,username是数据库用户名,jdbc.password是数据库密码,login是sonarqube的登录名,sonar.password是sonarqube的密码
sonar默认的登陆名和密码都是admin,默认端口是http://localhost:9000/

二、启动sonarqube

直接打开bin\windows-x86-64\StartSonar.bat 即可运行;如需汉化提前将汉化包放入到
\sonarqube-7.8\sonarqube-7.8\extensions\plugins 下

注:汉化包下载地址:https://github.com/xuhuisheng/sonar-l10n-zh/releases/tag/sonar-l10n-zh-plugin-1.28

基于sonar 的C#静态代码扫描使用总结_第1张图片表示执行安装成功。本地连接 访问地址:http://localhost:9000/未修改文件情况下初始账户密码为 admin admin

3.windows本地C#代码扫描插件环境安装

3.1安装 sonar-scanner-msbuild

下载对应版本的sonar scanner插件 并解压
基于sonar 的C#静态代码扫描使用总结_第2张图片

将解压后路径配置到环境变量 path中 D:\soft\sonar-scanner-msbuild-4.3.1.1372-net46
基于sonar 的C#静态代码扫描使用总结_第3张图片

3.2 msbuild C#编译环境配置

msbuild在安装vs后会自动安装,路径为
C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\MSBuild\15.0\Bin
将此路径配置到环境变量。
基于sonar 的C#静态代码扫描使用总结_第4张图片

4.本地执行扫描操作

msbuild常用编译命令:

MSBuild MyApp.sln /t:Rebuild /p:Configuration=Release
MSBuild MyApp.csproj /t:Clean /p:Configuration=Debug;/p:Platform=x86;TargetFrameworkVersion=v3.5

编译为 Release 代码 -p:configuration=“release”
清理项目 -t:clean
重新编译 -t:rebuild
编译项目 -t:build 默认可以忽略这个参数
发布 -t:Publish
注意:这里的 -t 和 /t 作用是相同的。

4.1 配置sonar项目,创建token (注意token只展示一次,记着赋值备份)

基于sonar 的C#静态代码扫描使用总结_第5张图片
基于sonar 的C#静态代码扫描使用总结_第6张图片
基于sonar 的C#静态代码扫描使用总结_第7张图片
基于sonar 的C#静态代码扫描使用总结_第8张图片
基于sonar 的C#静态代码扫描使用总结_第9张图片

以上步骤完成生成三个对应阶段命令,直接赋值依次执行即为 4.2 、4.3、 4.4的步骤。

4.2 开启scanner-for-msbuild begin

注意执行scanner-for-msbuild begin 命令前先将路径切换到C#路径

基于sonar 的C#静态代码扫描使用总结_第10张图片

4.3 开始编译C#代码

执行 MsBuild.exe /t:Rebuild 命令 编译代码
基于sonar 的C#静态代码扫描使用总结_第11张图片

4.4 扫描结束上传报告

执行

SonarScanner.MSBuild.exe end /d:sonar.login="xxxxxxxxxxxx"

上传报告
上传中。。
基于sonar 的C#静态代码扫描使用总结_第12张图片

上传成功图

基于sonar 的C#静态代码扫描使用总结_第13张图片

4.5 报告分析

以上步骤执行成功后,报告上传到本地sonar成功,查看项目展示缩略信息
基于sonar 的C#静态代码扫描使用总结_第14张图片

进入项目展示详细信息
基于sonar 的C#静态代码扫描使用总结_第15张图片

5.如何导出报告

下载sonar-pdf-plugin插件
下载地址:https://gitee.com/zzulj/sonar-pdf-plugin/releases
暂时无法在飞书文档外展示此内容

把下载好的插件放到Sonarqube安装目录的extensions/plugins目录下,重启Sonarqube服务即可。
pdf生成配置 :

基于sonar 的C#静态代码扫描使用总结_第16张图片

重新执行代码扫描后会生成pdf文件 ,下载pdf文件位置

6.VS ide 使用SonarLint

待完善。

7.通过jenkins集成 sonar 做静态代码扫描注意事项及方式

一、插件方式

1.Jenkins安装插件及插件配置

下载插件sonarqube scanner,用来集成sonarqube,在配置任务的时候才有sonarscanner的选项。
基于sonar 的C#静态代码扫描使用总结_第17张图片

全局工具配置windows本地的msbuild和sonarscanner for msbuild
基于sonar 的C#静态代码扫描使用总结_第18张图片

2.系统配置sonar server

基于sonar 的C#静态代码扫描使用总结_第19张图片

基于sonar 的C#静态代码扫描使用总结_第20张图片

3任务配置

限制运行节点为windows的几点,关于windows机器怎么设置为代理节点 在8.2章节介绍
基于sonar 的C#静态代码扫描使用总结_第21张图片

基于sonar 的C#静态代码扫描使用总结_第22张图片
基于sonar 的C#静态代码扫描使用总结_第23张图片
基于sonar 的C#静态代码扫描使用总结_第24张图片

二、pipline脚本方式

pipeline {

    agent {
        label 'windowssonar'
    }
    parameters {
        string(name: 'BRANCHNAME', defaultValue: 'develop', description: '代码分支名称')
    }

    environment {
        JENKINS_NODE_COOKIE = 'dontKillMe'

    }
    stages {
        stage("任务参数检测") {
            steps {
                println "JobName: " + env.JOB_NAME
                println "BuildNumber: " + env.BUILD_NUMBER
                println "BranchName: " + "${BRANCHNAME}"
                

                script {
                    echo "任务参数检测"
                }
            }
        }

        stage("清理测试环境") {
            steps {
                script {

                    echo "删除之前代码库代码"
                }
            }
        }


        stage("下载平台代码") {
            steps {
                script {
                    echo "开始克隆代码"
                }
            }
        }


                
                stage("开启扫描") {
            steps {
                script {
                    dir('D:\\cproject\\miautomationv1.0\\code\\LineControlSln'){
                                            echo "begin"
                                            cmd_begin='SonarScanner.MSBuild.exe begin /k:"miautomationv1.0-01" /d:sonar.host.url="http://10.221.129.75:9000" /d:sonar.login="768ea2749c6151843e6dc113cf86ae2c2ba48fca"'
                                            echo cmd_begin
                                            
                                            bat "cd D:\\cproject\\miautomationv1.0\\code\\LineControlSln"
                                            
                                            bat "cd"
                                            bat "${cmd_begin}"
    
                                            
                                            echo "编译"
                                            bat "MsBuild.exe /t:Rebuild"
                                            
                                            echo "end"
                                            bat 'SonarScanner.MSBuild.exe end /d:sonar.login="768ea2749c6151843e6dc113cf86ae2c2ba48fca"'
                    }                    
                                        
                }
            }
        }
   

    }
}

8.引申 jenkins代理节点配置方式

代理节点机器大概分为linux、windows两种,linux机器必须是静态密码方式验证所以linux机器必须是运行静态密码登录的机器;windows机器则不需要,以下是两种代理节点的配置方式。

8.1linux

一、配置凭据

Manage Jenkins → Manage Credentials→Jenkins
基于sonar 的C#静态代码扫描使用总结_第25张图片

点击“全局凭据”

基于sonar 的C#静态代码扫描使用总结_第26张图片

添加凭证
基于sonar 的C#静态代码扫描使用总结_第27张图片

输入对应服务器的用户名和密码,设置对应的id,用于识别
基于sonar 的C#静态代码扫描使用总结_第28张图片

二、配置节点

Manage Jenkins →Manage Nodes and Clouds→新建节点
基于sonar 的C#静态代码扫描使用总结_第29张图片

填写linux节点名称,勾选Permanent Agent,点击Create
基于sonar 的C#静态代码扫描使用总结_第30张图片

填写对应的远程工作目录
/var/jenkins/workspace
填写标签,用于构建时,根据标签选择节点构建
基于sonar 的C#静态代码扫描使用总结_第31张图片

根据截图,选择对应的选项,填写服务器的ip,以及选择刚才配置的凭证,点击高级
基于sonar 的C#静态代码扫描使用总结_第32张图片

查询远程服务器的java路径,在对应linux服务器输入命令:
echo $JAVA_HOME
输入对应的端口和完整的java路径,注意:不止是JAVA_HOME,需要具体到对应的java上
/usr/local/jdk-16.0.1/bin/java
基于sonar 的C#静态代码扫描使用总结_第33张图片

点击“保存”,成功
基于sonar 的C#静态代码扫描使用总结_第34张图片

详细教程http://www.inspinia.net/a/16029.html?action=onClick

8.2windows

配置节点信息
节点页面新建节点
基于sonar 的C#静态代码扫描使用总结_第35张图片

输入节点名称
基于sonar 的C#静态代码扫描使用总结_第36张图片

设置节点远程工作路径和标签名等信息
基于sonar 的C#静态代码扫描使用总结_第37张图片

远程工作目录: windows机器的工作路径命名空间
标签:随便设置个名称,注意 后边选择机器时填写哪个标签就用哪台机器

设置完成后点击上线节点
基于sonar 的C#静态代码扫描使用总结_第38张图片
基于sonar 的C#静态代码扫描使用总结_第39张图片

你可能感兴趣的:(c#,开发语言)