- 1. 创建`SonaQube`的账户`token`
- 2. 将`token`保存到`Jenkins`凭据中
- 3. 在`Jenkins`中安装插件`sonarqube scanner`
- 3.1 配置`sonar`服务器
- 3.2 全局配置`SonarQube Scanner`
- 3.3 并关闭`sonar`的审查结果上传到`SCM`功能
- 4. 创建自定义项目验证
- 5. 创建流水线项目验证
- 6. Jenkins添加Sonar结果分析
- 6.1 `sonar`添加网络调用(`webhook`)
- 6.2 修改`Jenkinsfile`脚本
- 6.3 检测不通过测试
- 6.4 检测通过测试
jenkins
安装文档地址- 地址 http://jenkins.tophant.wang
- 账号密码
admin/www19930327
1. 创建
sonar
安装文档地址- 地址 http://sonar.tophant.wang
- 账号密码
admin/admin
SonaQube
的账户token
202af9f3321b30c5e1c4e216ce5e6fbc2477fdae
token
保存到Jenkins
凭据中
3. 在Jenkins
中安装插件sonarqube scanner
3.1 配置sonar
服务器
点击【系统管理】->【系统配置】,向下滚动到SonarQube
配置部分,单击Add SonarQube
,添加服务器,选择凭据。
SonarQube Scanner
3.3 并关闭sonar
的审查结果上传到SCM
功能
4. 创建自定义项目验证
以之前创建的Maven
项目为例,添加构建步骤,并加入Sonar
执行配置参数
全局工具配置 安装 jdk8
安装jdk
需要oracle
账号
全局工具配置 安装 maven3.8.5
添加构建,选择maven
添加构建,选择SonarQube Scaner
配置文件具体内容如下:
sonar.projectKey=istio-demo
sonar.projectName=istio-demo
sonar.projectVersion=1.0
sonar.sources=.
sonar.sourceEncoding=UTF-8
sonar.language=java
sonar.java.binaries=target/classes
说明:
sonar.projectKey
:定义唯一的关键字sonar.projectName
:定义项目名称sonar.projectVersion
:定义项目的版本信息sonar.sources
:指定扫描代码的目录位置(多个逗号分隔,java项目源代码一般在src目录下面)sonar.sourceEncoding
:执行项目编码sonar.language
:指定扫描java语言,如果不指定,则扫描目录下存在的全部sonar.java.binaries
:扫描java项目时,指定编译文件所在目录,不指定该目录会报错
也可以将配置好的
sonar-project.properties
文件放置在代码目录中,在Path to project properties
配置相应的文件名
立即构建开始扫描,速度太慢,下面用流水线项目测试
5. 创建流水线项目验证
6. Jenkins添加Sonar结果分析 6.1代码扫描成功,但是发现即使代码扫描错误,
Jenkins
流水线也不会停止,没有结果回调
sonar
添加网络调用(webhook
)
在代码扫描成功后,扫描结果需要回调
jenkins
,添加的Jenkins
的webhook
结构为:http://[jenkins_url]/sonarqube-webhook/
sonar
点击【配置】 -> 【配置】 -> 【网络调用】
Jenkinsfile
脚本
def label = "slave-${UUID.randomUUID().toString()}"
def helmLint(String chartDir) {
println "校验 chart 模板"
sh "helm lint ${chartDir}"
}
def helmDeploy(Map args) {
if (args.dry_run) {
println "Debug 应用 ${args.profile} 环境"
sh "helm upgrade --install --dry-run --debug --install ..."
} else {
println "部署应用 到 ${args.profile} 环境"
sh "helm upgrade --install --set global.pullPolicy=Always --set global.javaOpts='-Xms256m -Xmx1024m -Xss512k -XX:+PrintGC' \
--set global.imagePullSecrets=${args.imagePullSecrets} --set global.imageHub.server=${args.imageHubServer}\
--set global.imageHub.project=${args.imageHubProject} --set global.version=${args.imageTag} \
--set global.nacos.host=${args.nacosHost} --set global.nacos.port=${args.nacosPort} --set global.nacos.namespace=${args.nacosNamespace} \
--set global.nacos.username=${args.nacosUsername} --set global.nacos.password=${args.nacosPassword} \
--set global.profiles=${args.profile} --set global.namespace=${args.namespace} ${args.name} ${args.chartDir}"
echo "应用 ${args.name} 部署成功. 可以使用 helm status ${args.name} 查看应用状态"
}
}
podTemplate(label: label,
// 容器镜像
containers: [
containerTemplate(name: 'maven', image: 'registry.cn-shanghai.aliyuncs.com/wanfei/maven:3.6-alpine-aliyun', command: 'cat', ttyEnabled: true),
containerTemplate(name: 'docker', image: 'docker', command: 'cat', ttyEnabled: true),
containerTemplate(name: 'helm', image: 'hypnoglow/kubernetes-helm:3.0.2', command: 'cat', ttyEnabled: true)],
// 挂载
volumes: [
persistentVolumeClaim(mountPath: '/root/.m2', claimName: 'maven-pvc'),
hostPathVolume(mountPath: '/root/.kube', hostPath: '/root/.kube'),
hostPathVolume(mountPath: '/var/run/docker.sock', hostPath: '/var/run/docker.sock')
]) {
node(label) {
// checkout scm 下载代码
def myRepo = checkout scm
def gitCommit = myRepo.GIT_COMMIT
def gitBranch = myRepo.GIT_BRANCH
def imageHubServer = "registry.cn-shanghai.aliyuncs.com"
def imageHubProject = "wanfei"
def imageTag = "1.0.0-dev"
stage('代码编译打包') {
try {
container('maven') {
echo "1. 代码编译打包阶段"
echo "当前commit: ${gitCommit}, 分支: ${gitBranch}"
sh """
ls -la
mvn clean package -Dmaven.test.skip=true
"""
}
} catch (exc) {
println "构建失败 - ${currentBuild.fullDisplayName}"
throw(exc)
}
}
stage('代码扫描') {
echo "2. 代码扫描阶段"
// jenkins配置的 sonar-server name
withSonarQubeEnv('sonar') {
def SCANNER_HOME = tool 'sonar-scan'
sh """
${SCANNER_HOME}/bin/sonar-scanner \
-Dsonar.projectKey=${JOB_NAME} \
-Dsonar.projectName=${JOB_NAME} \
-Dsonar.projectVersion=1.0 \
-Dsonar.sourceEncoding=UTF-8 \
-Dsonar.language=java \
-Dsonar.sources=portal-common/portal-common-api/src,portal-common/portal-common-core/src,portal-gateway/src,portal-platform/src \
-Dsonar.java.binaries=portal-common/portal-common-api,portal-common/portal-common-core,portal-gateway,portal-platform
"""
}
}
stage('检查结果分析') {
echo "3. 检查结果分析阶段"
timeout(5) {
// 等待sonarqube结果回调过来
def qg = waitForQualityGate()
echo "结果状态: ${qg.status}"
if (qg.status != 'OK') {
error "未通过Sonarqube的代码质量阈检查,请及时修改!failure: ${qg.status}"
}
}
}
stage('构建 Docker 镜像') {
container('docker') {
echo "4. 构建 Docker 镜像阶段"
sh """
ls -la
sh ./script/deploy/buildImage.sh -v "${imageTag}" -s "${imageHubServer}" -p "${imageHubProject}"
"""
}
}
stage('运行 Helm') {
container('helm') {
echo "5. [INFO] 开始 Helm 部署"
helmDeploy(
dry_run : false,
imagePullSecrets : "",
imageHubServer : "${imageHubServer}",
imageHubProject : "${imageHubProject}",
imageTag : "${imageTag}",
nacosHost : "nacos-141",
nacosPort : "8848",
nacosNamespace : "335ad58a-876b-4d74-b27a-4ea0e253b746",
nacosUsername : "nacos",
nacosPassword : "nacos",
profile : "dev",
namespace : "default",
name : "portal-api",
chartDir : "./script/deploy/chart/"
)
echo "[INFO] Helm 部署应用成功..."
}
}
}
}
6.3 检测不通过测试
添加一个错误的代码
立即构建
查看详细日志
查看sonar
报告
查看Bug
删除错误的哪一行代码,提交
立即构建
流水线通过
查看检查分析日志
查看sonar
报告
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)