Jenkins集成SonarQube代码质量检测

news2024/9/24 23:33:21

上一篇文章> Jenkins发布Kubernetes(K8s)集群(基于containerd)

一、SonarQube简介


1、简介

SonarQube是管理代码质量一个开放平台,可以快速的定位代码中潜在的或者明显的错误

2、下载

https://www.sonarsource.com/products/sonarqube/downloads/

在这里插入图片描述

二、实验环境


1、k8s环境

版本v1.26.5,容器为containerd
二进制安装Kubernetes(K8s)集群(基于containerd)—从零安装教程(带证书)

主机名IP系统版本安装服务
master0110.10.10.21rhel7.5nginx、etcd、api-server、scheduler、controller-manager、kubelet、proxy
master0210.10.10.22rhel7.5nginx、etcd、api-server、scheduler、controller-manager、kubelet、proxy
master0310.10.10.23rhel7.5nginx、etcd、api-server、scheduler、controller-manager、kubelet、proxy
node0110.10.10.24rhel7.5nginx、kubelet、proxy
node0210.10.10.25rhel7.5nginx、kubelet、proxy

2、jenkins环境

jenkins入门与安装
容器为docker

主机IP系统版本
jenkins10.10.10.10rhel7.5

三、SonarQube安装


1、下载镜像

[root@jenkins ~]# docker pull postgres
[root@jenkins ~]# docker pull sonarqube:9.9.1-community

2、启动

[root@jenkins ~]# mkdir sonarqube
[root@jenkins ~]# cd sonarqube
[root@jenkins sonarqube]# cat docker-compose.yaml
version: "3.1"
services:
  db:
    image: postgres
    container_name: db
    ports:
      - 5432:5432
    networks:
      - sonarnet
    environment:
      POSTGRES_USER: sonar
      POSTGRES_PASSWORD: sonar
  sonarqube:
    image: sonarqube:9.9.1-community
    container_name: sonarqube
    depends_on:
      - db
    ports:
      - "9000:9000"
    networks:
      - sonarnet
    environment:
      SONAR_JDBC_URL: jdbc:postgresql://db:5432/sonar
      SONAR_JDBC_USERNAME: sonar
      SONAR_JDBC_PASSWORD: sonar
    privileged: true
networks:
  sonarnet:
    driver: bridge

[root@jenkins sonarqube]# docker-compose up -d

3、报错处理

添加privileged: true即可

[root@jenkins sonarqube]# docker logs -f sonarqube
[0.056s][warning][os,thread] Failed to start thread "VM Thread" - pthread_create failed (EPERM) for attributes: stacksize: 1024k, guardsize: 4k, detached.
Error occurred during initialization of VM

4、浏览器访问

http://10.10.10.10:9000/
默认账号密码:admin/admin

在这里插入图片描述
在这里插入图片描述

5、配置中文字体

(1)下载字体
在这里插入图片描述
在这里插入图片描述
(2)重启sonarqube

[root@jenkins sonarqube]# docker restart sonarqube

(3)重新登录查看

在这里插入图片描述

四、sonarqube测试代码


1、Maven(方式一)

(1)配置setting

[root@jenkins ~]# vim /usr/local/maven/conf/settings.xml
    <profile>
        <id>sonar</id>
        <activation>
            <activeByDefault>true</activeByDefault>
        </activation>
        <properties>
            <sonar.login>admin</sonar.login>
            <sonar.password>1</sonar.password>
            <sonar.host.url>http://10.10.10.10:9000</sonar.host.url>
        </properties>
    </profile>

在这里插入图片描述

(2)测试

这里是有个之前的项目,进入自己对应的项目中即可

[root@jenkins ~]# docker exec -it jenkins /bin/bash
root@67460f5b7c78:/# cd /var/jenkins_home/workspace/java-k8s
root@67460f5b7c78:/var/jenkins_home/workspace/java-k8s# ls
Dockerfile  Jenkinsfile  LICENSE  README.md  db  pipeline.yaml  pom.xml  src  target
root@67460f5b7c78:/var/jenkins_home/workspace/java-k8s# /usr/local/maven/bin/mvn sonar:sonar

在这里插入图片描述
(3)查看结果

在这里插入图片描述

2、sonar-scanner(方式二)

(1)生成token

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

(2)下载文件

下载地址:https://docs.sonarqube.org/latest/analyzing-source-code/scanners/sonarscanner/

[root@jenkins ~]# unzip sonar-scanner-cli-4.8.0.2856-linux.zip
[root@jenkins ~]# mv sonar-scanner-4.8.0.2856-linux /usr/local/sonar-scanner

(3)重启jenkins

[root@jenkins ~]# docker stop jenkins
[root@jenkins ~]# docker rm jenkins
[root@jenkins ~]# docker run -d --name jenkins -p 8080:8080 -p 50000:50000 -u root \
-v /opt/jenkins_home:/var/jenkins_home \
-v /usr/local/maven:/usr/local/maven \
-v /usr/local/jdk:/usr/local/jdk \
-v /etc/localtime:/etc/localtime \
-v /usr/bin/docker:/usr/bin/docker \
-v /var/run/docker.sock:/var/run/docker.sock \
-v /usr/local/sonar-scanner:/usr/local/sonar-scanner \
--restart=always \
jenkins/jenkins:2.361.4-lts-jdk11

(4)配置sonar-scanner.properties

[root@jenkins ~]# cat /usr/local/sonar-scanner/conf/sonar-scanner.properties
#Configure here general information about the environment, such as SonarQube server connection details for example
#No information about specific project should appear here

#----- Default SonarQube server
sonar.host.url=http://10.10.10.10:9000

#----- Default source code encoding
sonar.sourceEncoding=UTF-8

(5)测试

[root@jenkins ~]# cd /opt/jenkins_home/workspace/java-k8s
[root@jenkins java-k8s]# ls
db  Dockerfile  Jenkinsfile  LICENSE  pipeline.yaml  pom.xml  README.md  src  target
[root@jenkins java-k8s]# /usr/local/sonar-scanner/bin/sonar-scanner -Dsonar.source=./ -Dsonar.projectname=java-k8s -Dsonar.login=sqa_596d6ea2c88ab661eb56afcf72bfb48ef80bd8f2 -Dsonar.projectKey=java-k8s -D sonar.java.binaries=./target/

在这里插入图片描述

五、Jenkins安装sonar-scanner


1、下载sonar-scanner

在这里插入图片描述
然后重启jenkins

2、配置sonar-scanner

(1)系统配置

系统管理–>系统配置

在这里插入图片描述

由于卡顿点不了,重新再次进入然后配置token

在这里插入图片描述
在这里插入图片描述

(2)全局工具配置

系统管理–>全局工具配置

在这里插入图片描述

3、创建项目测试

(1)创建项目
在这里插入图片描述
(2)git配置
在这里插入图片描述
(3)sonarqube配置

JAVA_HOME=/usr/local/jdk
PATH=$PATH:$JAVA_HOME/bin
/usr/local/maven/bin/mvn clean package -Dmaven.test.skip=true
sonar.source=./
sonar.projectname=${JOB_NAME}
sonar.projectKey=${JOB_NAME}
sonar.java.binaries=./target/

在这里插入图片描述
在这里插入图片描述

(4)查看结果

在这里插入图片描述
在这里插入图片描述

六、通过流水线测试


1、创建流水线项目

在这里插入图片描述

2、查看文件

在这里插入图片描述
Dockerfile:

FROM harbor.wielun.com/library/tomcat:8.5.59
MAINTAINER Wielun
RUN rm -rf /usr/local/tomcat/webapps/*
ADD target/*.war /usr/local/tomcat/webapps/ROOT.war

pipeline.yaml:

apiVersion: apps/v1
kind: Deployment
metadata:
  namespace: test
  name: pipeline
  labels:
    app: pipeline
spec:
  replicas: 2
  selector:
    matchLabels:
      app: pipeline
  template:
    metadata:
      labels:
        app: pipeline
    spec:
      containers:
      - name: pipeline
        image: harbor.wielun.com/library/java-k8s:latest
        imagePullPolicy: Always
        ports:
        - containerPort: 8080
---
apiVersion: v1
kind: Service
metadata:
  namespace: test
  name: pipeline
  labels:
    app: pipeline
spec:
  ports:
  - port: 8081
    targetPort: 8080
  selector:
    app: pipeline
  type: NodePort
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  namespace: test
  name: pipeline
spec:
  ingressClassName: nginx
  rules:
  - host: "harbor.wielun.com"
    http:
      paths:
      - pathType: Prefix
        path: /
        backend:
          service:
            name: pipeline
            port:
              number: 8081

3、修改Jenkinsfile

在这里插入图片描述

pipeline {
    agent any
	environment {
		harborUser = 'admin'
		harborPasswd = 'Harbor12345'
		HarborAddress = 'harbor.wielun.com'
		harborRepo = 'library'
	}
    stages {
        stage('git拉取代码') {
            steps {
				git credentialsId: '0c71c0f9-8277-xxxx-bb31-540a9324cf08', url: 'https://jihulab.com/xxxx/java-demo.git'
            }
        }
    
        stage('maven编译') { 
           steps {
                    sh '''JAVA_HOME=/usr/local/jdk
                    PATH=$PATH:$JAVA_HOME/bin
                    /usr/local/maven/bin/mvn clean package -Dmaven.test.skip=true'''
                }
        }
        stage('通过SonarQube完成代码质量检测') { 
           steps {
                    sh '/usr/local/sonar-scanner/bin/sonar-scanner -Dsonar.source=./ -Dsonar.projectname=${JOB_NAME} -Dsonar.projectKey=${JOB_NAME} -Dsonar.java.binaries=./target/ -Dsonar.login=sqa_596d6ea2c88ab661eb56afcf72bfb48ef80bd8f2'
                }
        }
        stage('生成自定义镜像') { 
           steps {
                    sh '''docker build -t ${JOB_NAME}:latest .'''
                }
        }
        stage('上传自定义镜像到harbor') { 
           steps {
                    sh '''docker login -u ${harborUser} -p ${harborPasswd} ${HarborAddress}
                    docker tag ${JOB_NAME}:latest ${HarborAddress}/${harborRepo}/${JOB_NAME}:latest
                    docker push ${HarborAddress}/${harborRepo}/${JOB_NAME}:latest'''
                }
        }
        stage('发送yaml到k8s-master并部署') { 
           steps {
					sshPublisher(publishers: [sshPublisherDesc(configName: 'k8s-master', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: '''
					/usr/local/bin/kubectl apply -f /tmp/${JOB_NAME}/pipeline.yaml''', execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: '${JOB_NAME}', remoteDirectorySDF: false, removePrefix: '', sourceFiles: 'pipeline.yaml')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)])
                }
        } 
    }
}

4、查看结果

在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/672422.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Spring Boot请求处理-常用参数注解

PathVariable 路径变量RequestParam 获取请求参数RequestHeader 获取请求头RequestBody 获取请求体【Post】CookieValue 获取Cookie值RequestAttribute 获取request域属性ModelAttribute 1. PathVariable 该注解主要用于rest风格的搭配使用&#xff0c;请求路径中不再以k:v的…

软考高级系统架构设计师(四) 计算机网络2磁盘阵列

目录 磁盘阵列RAID RAID级别 ​IPV6 网络接入技术 综合布线 磁盘阵列RAID 磁盘阵列&#xff08;Redundant Arrays of Independent Disks&#xff0c;RAID&#xff09;&#xff0c;有"数块独立磁盘构成具有冗余能力的阵列”之意。 磁盘阵列是由很多块独立的磁盘&#…

全新形态骨传导,久戴不疼,南卡OE骨传导耳机

随着生活品质的提高&#xff0c;科技的发展&#xff0c;人们对于日常用的耳机可以说是要求越来越高&#xff0c;越来越挑剔了。从耳机的外在设计&#xff0c;内在音质&#xff0c;佩戴的舒适及安全性上都有更高的追求。当然&#xff0c;耳机的设计者们也不遗余力的发挥着他们的…

华为OD机试真题 JavaScript 实现【高矮个子排队】【2023Q2 100分】,附详细解题思路

一、题目描述 现在有一队小朋友&#xff0c;他们高矮不同&#xff0c;我们以正整数数组表示这一队小朋友的身高&#xff0c;如数组{5,3,1,2,3}。 我们现在希望小朋友排队&#xff0c;以“高”“矮”“高”“矮”顺序排列&#xff0c;每一个“高”位置的小朋友要比相邻的位置高…

PHP学习笔记第四天

前言 作者简介&#xff1a;不知名白帽&#xff0c;网络安全学习者。 博客主页&#xff1a;不知名白帽的博客_CSDN博客-网络安全,CTF,内网渗透领域博主 网络安全交流社区&#xff1a;https://bbs.csdn.net/forums/angluoanquan 目录 PHP超级全局变量 PHP $_GLOBALS PHP $_SER…

在 Navicat Premium 中管理 MySQL 用户 | 第 3 部分:配置用户权限

第 3 部分&#xff1a;配置用户权限 在本系列中&#xff0c;我们一直在探索如何使用 Navicat 的旗舰产品 Navicat Premium 执行常见的用户管理任务。在 第 1 部分 中&#xff0c;我们学习了如何使用 Navicat Premium 用户管理工具保护 MySQL root 帐号。而 第 2 部分 重点介绍…

csrf入门

一.CSRF是什么&#xff1f; CSRF&#xff08;Cross-site request forgery&#xff09;&#xff0c;中文名称&#xff1a;跨站请求伪造&#xff0c;也被称为&#xff1a;one click attack/session riding&#xff0c;缩写为&#xff1a;CSRF/XSRF。 二.CSRF可以做什么&#xff…

uniapp webview H5跳转微信小程序

第一步&#xff1a;manifest.json 第二步&#xff1a;index.html <!DOCTYPE html> <html lang"zh-CN"><head><meta charset"utf-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><title>…

Unity编辑器扩展-第六集-创建窗口/批量填图

第五集链接&#xff1a;Unity编辑器扩展-第五集-撤回操作/禁止操作/加快捷键_菌菌巧乐兹的博客-CSDN博客 一、本节目标效果展示 1.创建窗口 2.图片批量赋值到物体上 二、创建窗口 这个功能其实也很好理解&#xff0c;我们之前学了点击选择&#xff0c;但我们难免会遇见需要…

python学习——Matplotlib数据可视化基础

目录 Matplotlib数据可视化基础1.基础语法与折线图rc参数调整中文显示的问题 2.散点图3.条形图案例一&#xff1a;横向条形图案例二&#xff1a;多个条形图案例三&#xff1a;最后一个刻度 4.直方图实例1 频率分布直方图和频数分布直方图 5.饼图6.箱线图综合案例&#xff1a;直…

Centos7 上的sqlite3安装及升级

一.wget升级 yum install -y wget 二.sqlite3安装 sudo yum install sqlite-devel 查看sqlite3的版本 sqlite3 -version 三.sqlite3升级 下载源码 wget https://www.sqlite.org/2023/sqlite-autoconf-3420000.tar.gz 版本可去官网选择 SQLite Download Page 解压、编译 tar z…

类的真正形态

问题 经过不停地改进&#xff0c;结构体 struct 变得越来越不像它在 C 语言中的样子了&#xff01;&#xff01;&#xff01; struct 在 C 语言中已经有了自己的含义&#xff0c;必须继续兼容 在 C 中提供了新的关键字 class 用于类定义 class 和 struct 的用法是完全相同的…

微信接口测试拓展

背景 最近收到一个SRC提交的漏洞&#xff0c;泄露了微信小程序的appkey和appSecret&#xff1b;于是乎为了搞清楚影响&#xff0c;漏洞风险和利用方式&#xff0c;便有了这篇文章&#xff1b; 在了解漏洞风险之前先来了解一下微信的几个平台&#xff1b; 微信公众号平台 微…

进行压力测试的目的是什么?重要性体现在哪?

进行压力测试的目的是什么&#xff1f;重要性体现在哪&#xff1f;压力测试是通过施加一定压力或负荷于测试对象&#xff0c;以评估其结构、性能和可靠性的过程。它可以是静态压力测试&#xff0c;即施加一定压力并持续一段时间&#xff0c;也可以是动态压力测试&#xff0c;即…

十四.EtherCAT开发之ST MCU STM32F407ZGt6+ AX58100的开发FOE应用

十四.EtherCAT开发之ST MCU STM32F407ZGt6 AX58100的开发FOE应用 STM32F407ZGt6与AX58100是 SPI连接&#xff0c;工作在SPI模式。 FoE(File Access over EtherCAT)可实现EtherCAT节点之间的文件传输。 14.1 SSC TOOL配置 boot mode与FOE支持 FOE 说是要在状态机的boot mod…

本地同城美食小程序软件开发

以下是同城美食小程序软件的一些常见需求&#xff1a; 餐厅列表和搜索&#xff1a;提供详细的餐厅信息&#xff0c;包括店铺地址、联系方式、特色菜品等&#xff0c;并让用户可以通过关键字或地理位置搜索并筛选餐厅。 菜单浏览&#xff1a;展示每个餐厅的菜单&#xf…

控制您的数据:Web3私有链为数据主权带来的突破性变革

在数字化时代&#xff0c;数据已经成为企业和个人最宝贵的资产之一。然而&#xff0c;随着大规模数据泄露和滥用事件的频发&#xff0c;数据主权和隐私保护成为了备受关注的问题。在这个背景下&#xff0c;Web3私有链的出现为数据主权带来了一场突破性的变革。 首先&#xff0c…

基于51单片机的数字电子钟

目录 摘 要 1.课程设计任务 1.1课程设计题目 1.2设计的要求 2.设计总体方案 2.1初步设计方案 2.2芯片的选型 2.2.1时钟芯片的选择 2.2.2温度传感器的选择 2.2.3显示电路的选择 2.2.4输入按键的选择 2.2.5控制电路芯片的选择 2.3总体方案 3.单元模块设计 3.1显…

端午佳节|展望现代科技下的传统佳节

目录 引言 一、利用代码传承端午节文化 1. 编写端午节的相关小程序或网页应用 2. 开发端午节主题的应用程序或游戏 二、科技让传统更便捷 1. 线上购物与送礼 2. 线上分享与互动 结语&#xff1a; 引言 加入CSDN已经是6个端午的年头了。今年端午正好是第6年&#xff0c…