Jenkins+SonarQube实现C#代码质量检查
环境准备
- SonarQube 项目创建
- jenkins Windows构建节点配置
- 安装与SonarQube服务端相同版本jdk
- 安装sonar-scanner 并配置环境变量
- 安装Visual Studio 并配置环境变量
- jenkins 任务创建
SonarQube 配置
创建项目


创建令牌


复制令牌内容分析项目需要用到
获取分析项目方法

jenkins Windows构建节点配置
解压相关文件并复制到C:\DevOps_tools\


添加系统环境变量path
C:\DevOps_tools\sonar-scanner-msbuild-5.2.1.31210-net46\
添加vs MSBuild.exe 到系统环境变量path中

sonar-scanner节点配置完成
jenkins 配置
jenkins 任务创建




pipeline
pipeline {
agent any
environment {
gitlab_tokenid = 'a6710614-3bbd-4efb-acc2-63aa8b615290' //gitlab令牌
sonar_tokenid = 'a3e55c8b9b39c05be659b44efef4d632b8764195' //前面创建的令牌
}
triggers{
GenericTrigger(
genericVariables:[
[key:'event_name',value:'$.event_name'], //触发动作 pubat or tag_pubat
[key:'user_email',value:'$.user_email'], //GitLab公共邮箱需要自行配置否则获取不到
[key:'project_name',value:'$.project.name'], //项目名称 DevOps_Test
[key:'git_url',value:'$.project.git_http_url'], //git_url
[key:'ref',value:'$.ref'], //分支或tag信息
[key:'group_name',value:'$.project.namespace'], //GITLAB_GROUP
[key:'commits_id',value:'$.commits[0].id']
],
token:"qazwsx",
causeString:'Triggered on $ref',
printContributedVariables:true,
printPostContent:true
)
}
stages {
stage('Clean') {
steps{
cleanWs(
cleanWhenAborted: true,
cleanWhenFailure: true,
cleanWhenNotBuilt: true,
cleanWhenSuccess: true,
cleanWhenUnstable: true,
cleanupMatrixParent: true,
disableDeferredWipeout: true,
deleteDirs: true
)
}
}
stage('init') {
steps {
git credentialsId: "$gitlab_tokenid", url: "$git_url"
script {
tagname = ref.tokenize('/')[2]
bat "git checkout $tagname"
// 从文件中读取 JSON 字符串
projectsjson = readJSON file: 'projects.json'
}
}
}
stage('SonarScanner') {
steps {
script{
for(j in projectsjson.projects){
if (j.sonar == "yes"){
if (j.sln_path != "./"){
// MsBuild.exe /t:Rebuild 需要找到*.sln 所以这里进行CD 切换目录
bat "cd $j.sln_path && SonarScanner.MSBuild.exe begin /k:$project_name /d:sonar.host.url=\"http://SonarQube:9000\" /d:sonar.login=$sonar_tokenid"
bat "cd $j.sln_path && MsBuild.exe /t:Rebuild"
bat "cd $j.sln_path && SonarScanner.MSBuild.exe end /d:sonar.login=$sonar_tokenid"
}else{
bat "SonarScanner.MSBuild.exe begin /k:$project_name /d:sonar.host.url=\"http://SonarQube:9000\" /d:sonar.login=$sonar_tokenid"
bat "MsBuild.exe /t:Rebuild"
bat "SonarScanner.MSBuild.exe end /d:sonar.login=$sonar_tokenid" //引用上面令牌
}
}else{
echo "已跳过$j.name项目sonar代码扫描。"
}
}
}
}
}
}
post {
always {
bat ""
echo '构建结束...'
}
success {
echo '恭喜您,构建成功!!!'
mail subject: "'${env.JOB_NAME} [${env.BUILD_NUMBER}]' 执行成功",
body: """
<div id="content">
<h1>CI报告</h1>
<div id="sum2">
<h2>Jenkins 运行结果</h2>
<ul>
<li>jenkins的执行结果 : <a>jenkins 执行成功</a></li>
<li>jenkins的Job名称 : <a id="url_1">${env.JOB_NAME} [${env.BUILD_NUMBER}]</a></li>
<li>jenkins的URL : <a href='${env.BUILD_URL}'>${env.BUILD_URL}</a></li>
<li>jenkins项目名称 : <a>${env.JOB_NAME}</a></li>
<li>Job URL : <a href='${env.BUILD_URL}'>${env.BUILD_URL}</a></li>
<li>构建日志:<a href="${BUILD_URL}console">${BUILD_URL}console</a></li>
</ul>
</div>
<div id="sum0">
<h2>GIT 信息</h2>
<ul>
<li>GIT项目的地址 : <a>${git_url}</a></li>
<li>GIT项目当前的分支名 : ${ref}</li>
<li>GIT最后一次提交的commitID : ${commits_id}</li>
</ul>
</div>
</div>
""",
charset: 'utf-8',
from: 'IBM_nmc@naura.local',
mimeType: 'text/html',
to: "$user_email"
//to : "${Recipient}"
}
failure {
echo '抱歉,构建失败!!!'
mail subject: "'${env.JOB_NAME} [${env.BUILD_NUMBER}]' 执行失败",
body: """
<div id="content">
<h1>CI报告</h1>
<div id="sum2">
<h2>Jenkins 运行结果</h2>
<ul>
<li>jenkins的执行结果 : <a>jenkins 执行失败</a></li>
<li>jenkins的Job名称 : <a id="url_1">${env.JOB_NAME} [${env.BUILD_NUMBER}]</a></li>
<li>jenkins的URL : <a href='${env.BUILD_URL}'>${env.BUILD_URL}</a></li>
<li>jenkins项目名称 : <a>${env.JOB_NAME}</a></li>
<li>Job URL : <a href='${env.BUILD_URL}'>${env.BUILD_URL}</a></li>
<li>构建日志:<a href="${BUILD_URL}console">${BUILD_URL}console</a></li>
</ul>
</div>
<div id="sum0">
<h2>GIT 信息</h2>
<ul>
<li>GIT项目的地址 : <a>${git_url}</a></li>
<li>GIT项目当前的分支名 : ${ref}</li>
<li>GIT最后一次提交的commitID : ${commits_id}</li>
</ul>
</div>
</div>
""",
charset: 'utf-8',
from: 'IBM_nmc@naura.local',
mimeType: 'text/html',
to: "$user_email"
}
unstable {
echo '该任务已经被标记为不稳定任务....'
}
changed {
echo ''
}
}
}
Jenkins+SonarQube实现C#代码质量检查的更多相关文章
- jenkins+sonarqube进行代码质量检测
JavaNeverGiveUp教程篇 用jenkins+sonarqube去检查代码是非常方便的,它能检查出代码中可能存在的一些问题,比如io流未关闭.空指针异常.死循环.代码不规范等问题. 1. 搭 ...
- Jenkins系列——使用SonarQube进行代码质量检查
1.目标 之前已经写过一篇关于Jenkins和SonarQube的一篇博客<jenkins集成sonar>,本文在参考前文的基础上,做了详细的补充. 使用SonarQube进行代码质量检查 ...
- jenkins集成sonarQube实现代码质量检查
1.sonarQube的简介 SonarQube是一款自动化代码审查工具,用于检测代码中的错误.漏洞和代码异味.它可以与你现有的工作流集成,以支持跨项目分支和拉取请求的连续代码检查. 其工作流程如下: ...
- 在 k8s 中的 jenkins 集成 sonarqube 实现代码质量检查
不乱于心,不困于情,不畏将来,不念过往,如此安好 --<不宠无惊过一生>丰子恺 概述 关于在 k8s 中安装 jenkins 和 sornarqube 可以查看下面的文章: 在 k8s 中 ...
- 自动代码质量分析(GitLab+JenKins+SonarQube)
自动代码质量分析(GitLab+JenKins+SonarQube) 1.需求场景 开发提交代码自动执行代码质量分析. 2.所需应用 GitLab,JenKins,SonarQube 3.架构图 4. ...
- git jenkins SonarQube手动代码质检
SonarQube代码质检:1.提交代码-->gitlab-->jenkins抓取-->sonarqube质量检测-->maven编译-->shell-->web集 ...
- 持续集成工具之jenkins+sonarqube做代码扫描
上一篇我们主要聊了下代码质量管理平台sonarqube的安装部署以及它的工作方式做了简单的描述和代码扫描演示:回顾请参考https://www.cnblogs.com/qiuhom-1874/p/13 ...
- 手把手教你用SonarQube+Jenkins搭建--前端项目--代码质量管理平台 (Window系统)
前言 网上教程大多介绍的是Linux系统下SonarQube+Jenkins如何使用,这是因为这两款软件一般都是部署在服务器上,而大多数服务器,采用的都是Linux系统.大多数服务器用Linux的原因 ...
- gitlab-ci集成SonarQube代码质量检查
SonarQube是管理代码质量一个开放平台,可以快速的定位代码中潜在的或者明显的错误. docker安装 1.拉取 postgres:docker pull postgres:10 2.拉取sona ...
随机推荐
- 基础知识:DFRduino UNO R3最全资料详解
一.概述篇:1. 什么是DFRduino UNO R3?DFRduino UNO R3是一块基与开放原始代码的Simple i/o平台,並且具有使用类似java,C语言的开发环境.让您可以快速使用Ar ...
- [转载]屏幕PPI、分辨率到底需要多大才能满足?
屏幕PPI.分辨率到底需要多大才能满足? 郝蛋儿 江湖骗子 13 人赞同了该文章 最近想买一个43寸的电视,720P和1080P差了500大洋.我不禁纠结了起来.看网上争得面红耳赤,有的人说不如108 ...
- 855 gpu强 730 3倍
骁龙730G的GPU规模只有骁龙835的GPU规模的一半,Adreno 618是128 ALUs,而Adreno 540是256 ALUs. 根据GFXBench的数据,对GPU负载比较大的曼哈顿3. ...
- 《Java架构师的最佳实践》生产环境JVM调优之空间担保失败引起的FullGC
1 问题现象 应用prod-xxx-k8s,在内存足够的情况下,仍然会产生偶发FullGC的问题. JVM配置如下: -Xmx8192m -Dhsf.server.max.poolsize=2500 ...
- 荷小鱼 x mPaaS | 借助 H5 容器改善 App 白屏、浏览器兼容等问题
随着5G.大数据.人工智能技术的应用,各类传统行业纷纷大力推进数字化转型升级. 而受疫情的影响,教育行业也在大幅加速线上化转型进程,各类在线教育应用也在借助各种力量拓张自己的移动端市场领域. 「荷 ...
- springmvc自定义的拦截器以及拦截器的配置
一.自定义拦截器 Spring MVC也可以使用拦截器对请求进行拦截处理,用户可以自定义拦截器来实现特定的功能,自定义的拦截器必须实现HandlerInterceptor接口. 二.HandlerIn ...
- Django(64)频率认证源码分析与自定义频率认证
前言 有时候我们发送手机验证码,会发现1分钟只能发送1次,这是做了频率限制,限制的时间次数,都由开发者自己决定 频率认证源码分析 def check_throttles(self, request): ...
- python中json.dump()与json.dumps()的区别
1.将python数据结构转换为json字符串(json.dumps()) >>> import json >>> data={'name':'pipi','age ...
- PTA题目集总结
PTA题目集1-3总结 一:前言 我认为题目集一的有八个题目,题量可能稍微有点多,但是题型较为简单,基本为入门题:题集二有五道题,题量适度,难度也适中:题集三虽然只有三道题,但是难度却骤然提升,前两题 ...
- 详解Apache Dubbo的SPI实现机制
一.SPI SPI全称为Service Provider Interface,对应中文为服务发现机制.SPI类似一种可插拔机制,首先需要定义一个接口或一个约定,然后不同的场景可以对其进行实现,调用方在 ...