SonarQube®是一种自动代码审查工具,用于检测代码中的错误,漏洞和代码异味。它可以与您现有的工作流程集成,以便在项目分支和拉取请求之间进行连续的代码检查。SonarQube 官网:https://www.sonarqube.org/https://www.sonarqube.org/ https://www.sonarsource.com/products/sonarqube/downloads/ https://github.com/SonarSource/sonarqube7.2 Sonar Qube 环境搭建在 Jenkins 集成 SonarQube 对代码的质量进行检测,sonarque就是一个开源的代码检测平台,支持java,javascript,css,python等25种语言,他可以帮你分析,他能帮你检测出代码是否有重复的内容,是否有魔法值,是否有漏洞等,我们只需要在检测之后,对代码再去进行一个更正修改就可以了。并且可以基于很多种软件去整合,比如 maven grade,IDE,gitlab,jenkins等这里我们就把SonarQube安装一下,在这里我们采用 docker 来安装。SonarQube 他还要依赖一个数据库,我们一般使用MySQL或者使用PostgreSQL1, SonarQube安装 Release 26.4.0.121862拉取两个最基础的镜像 postgres 和 sonarqube ~: cd /usr/local/docker ~: docker pull postgres ~: docker pull sonarqube:8.9.6-community ~: docker pull sonarqube:latest ~: docker pull sonarqube:26.4.0.121862 ~: docker pull sonarqube:26.4.0.121862-community ~: mkdir sonarqube_docker ~: cd sonaeqube_docker ~: pwd /usr/local/docker/sonarqube_docker ~: vim /usr/local/docker/sonarqube_docker/docker-compose.yml ~: docker-compose up -d vim docker-compose.yml 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:10.4.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 networks: sonarnet: driver: bridge 启动容器 docker-compose up -d 查看容器日志 docker logs -f sonarqube 可以看到 sonarqube 容器启动失败,因为vm.max_map_count=65530 太小 去 /etc/sysctl.conf 文件 添加 vm.max_map_count=262144 为了让修改 /etc/sysctl.conf 文件生效 执行 sysctl -p 再次重新启动容器 ~:docker restart sonarqube ~:docker-compose up -d db is up-to-date Starting sonarqube ... done 停止容器运行 docker stop cf13786565a5 删除容器 docker rm cf13786565a5 访问: http://192.168.222.134:9000 登录: 账号: admin 密码: adminvim /usr/local/docker/sonarqube_docker/docker-compose.ymlversion: '3.1' services: db: image: postgres container_name: db ports: - 5432:5432 networks: - sonarnet environment: POSTGRES_USER: sonar POSTGRES_PASSWORD: sonar sonarqube: image: sonarqube:latest image: sonarqube:8.9.6-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 networks: sonarnet: driver: bridge ====== 代码解释: ports: - 5432:5432 作用:指定数据库 postgresql 的默认端口 ports: - 9000:9000 作用:指定 sonarqube 的默认端口 depends_on: - db 作用: 我希望在sonarqube启动之前,让db先启动起来,因为 sonarqube他要去连接db数据库 networks: - sonarnet 作用:指定网络 sonarnet ,保证两服务都在一个容器里面 networks: sonarnet: driver: bridge 作用: 两个服务使用用一个网络,指定为桥接问题解决问题的方法 去 /etc/sysctl.conf 文件 添加 vm.max_map_count=262144 为了让修改 /etc/sysctl.conf 文件生效 执行 sysctl -p老师的在sonarqube启动之前,让db先启动起来,因为 sonarqube他要去连接db数据库完整的 sonar 与 postres 的容器启动文件 docker-compose.yml启动容器 docker-compose up -d访问 http://192.168.122.13:9000/maintenance?return_to=%2F登录进来的页面第一次登录成功,系统让你重新修改密码正式进入sonarqube的首页总结:接下来我们去下载一个插件,然后再通过几种方式,通过 sonarqube对我们的代码进行检测,最终在把 sonarqube 整合到 jenkins 服务器中,就可以了1, Sonarqube 的基本使用找到 'Administration' 点击进去 如下图所示在 搜索框输入 'Chinese'找到 'Chinese Pack ...' 如项目蓝色部分所示要下载这个插件,点击 'I understand the risk 我同意(我明白其中的风险)' 这个插件就下载好了点击之后这个插件就直接下载,插件下载好了需要重启项目,插件才能生效已经将插件安装好了,他会告诉我们重新启动,点击'Restart Server'点击 'Restart'重启成功,再次重新登录进去进来后我们发现首页内容都变成中文了紧接着我们使用 SonarQube来测试我们的mytest项目,我们这里采用两种方式去测试第一种 SonarQube 对Maven是用支持的我们可以通过 Maven 命令对当前代码进行测试,同时也可以使用 SonarQube Scanners 提供命令行扫描工具,进行代码的静态扫描。我们先采用 Maven 去做一个测试。直接在 maven里面的settings.xml文件添加如下内容就可以实现Sonarqube的代码检测profile idsonar/id activation activeByDefaulttrue/activeByDefault sonar.password123456789/sonar.password sonar.host.urlhttp://192.168.11.12:9000/sonar.host.url /activation properties sonar.login/sonar.login /properties /profilesonar配置profile idsonar/id activation activeByDefaulttrue/activeByDefault sonar.password123456789/sonar.password sonar.host.urlhttp://192.168.11.12:9000/sonar.host.url /activation /profile阿里云公共仓库配置mirror idaliyunmaven/id mirrorOf*/mirrorOf name阿里云公共仓库/name urlhttps://maven.aliyun.com/repository/public/url /mirrorjdk配置profile idjdk8/id activation activeByDefaulttrue/activeByDefault jdk1.8/jdk /activation properties maven.compiler.source1.8/maven.compiler.source maven.compiler.target1.8/maven.compiler.target maven.compiler.compilerVersion1.8/maven.compiler.compilerVersion /properties /profile开启配置activeProfiles activeProfilejdk8/activeProfile activeProfilesonar/activeProfile /activeProfiles老师的maven的配置文件 settings.xml使用一下 sonarqube代码检测点击 '异味'点击 '异味'回到代码添加一个注解添加结束后又把他删除,但是导包还在,没有使用我们此时再使用 sonar 检测代码 输入命令 mvn sonar:sonar检测结果如下此时多出一个问题新增一个异味,点击进去检测提示: 导入一个包,你并未使用可以移除总结: sonar 使用 Maven 对代码进行质量检测一般异味对代码是没有影响的可以通过 maven 对代码进行一波质量检测 检测命令 mvn sonar:sonar第二种 使用SonarQube的 SonarQube Scanners 进行检测使用 SonarQube Scanners 对代码进行检测,并且后期对 jenkins 进行整合就会采用 SonnarQube Scanners 来对代码进行一波检测。SonarQube Scanners 安装 下载~: yum -y install unzip ~: pwd ~: ls anaconda-ks.cfg docker-compose-linux-x86_64_v5.1.3 jdk-21_linux-x64_bin.tar.gz original-ks.cfg sonar-scanner-cli-4.6.0.2311-linux.zip apache-maven-3.6.3-bin.tar.gz initial-setup-ks.cfg jdk-8u231-linux-x64.tar.gz sonarqube-6.7.5.zip sonar-scanner-cli-4.6.1.2450-linux.zip ~: pwd /root ~: unzip sonar-scanner-cli-4.6.1.2450-linux.zip ~: ls anaconda-ks.cfg initial-setup-ks.cfg original-ks.cfg sonar-scanner-cli-4.6.0.2311-linux.zip apache-maven-3.6.3-bin.tar.gz jdk-21_linux-x64_bin.tar.gz sonarqube-6.7.5.zip sonar-scanner-cli-4.6.1.2450-linux.zip docker-compose-linux-x86_64_v5.1.3 jdk-8u231-linux-x64.tar.gz sonar-scanner-4.6.1.2450-linux (解压包) ~:mv sonar-scanner-4.6.1.2450-linux sonar-scanner ~: cd /usr/local/docker/jenkins_docker ~: ls data docker-compose.yml ~: cd data/ ~: pwd /usr/local/docker/jenkins_docker/data ~: cd ~ 回到用户目录 ~:ls sonar-scanner ~: mv sonar-scanner /usr/local/docker/jenkins_docker/data/ ~: cd sonar-scanner ~: ls bin conf jre lib 在使用之前要在conf里面追加一些配置 ~:cd conf ~: ls sonar-scanner.properties ~: vim sonar-scanner.properties ~: cat sonar-scanner.properties sonar.host.url=http://192.168.222.134:9000 sonar.sourceEncoding=UTF-8 ~: cd /usr/local/docker/jenkins_docker/data/workspace ~: ls hotel ~: cd ../sonar-scanner ~: ls bin conf jre lib ~: cd bin ~: ls sonar-scanner sonar-scanner-debug 此时我们可以看到 sonar-scanner 命令 ~: pwd /usr/local/docker/jenkins_docker/data/sonar-scanner/bin/sonar-scanner ~: cd ../../workspace ~: ls hotel ~: cd hotel ~: ls docker pom.xml src target ~: pwd /usr/local/docker/jenkins_docker/data/workspace/hotel sonarqube 检测代码完整命令: 下面是老自己的完整代码检测命令 ~: /usr/local/docker/jenkins_docker/data/sonar-scanner/bin/sonar-scanner -Dsonar.source=./ -Dsonar.projectname=hotel -Dsonar.login=生成的令牌 -Dsonar.projectKey=hotel -Dsonar.java.binaries=./target/ 下面是老师的完整代码检测命令 实践无误 ~: /usr/local/docker/jenkins_docker/data/sonar-scanner/bin/sonar-scanner -Dsonar.source=./ -Dsonar.projectname=mytest -Dsonar.login=生成的令牌 -Dsonar.projectKey=linux-test -Dsonar.java.binaries=./target/ 我要检测的代码在我当前目录下 -D指定要检测的项目名 此时需要的全部参数就写完了 === 参数代码解释 /usr/local/docker/jenkins_docker/data/sonar-scanner/bin/sonar-scanner 绝对路径下的 sonar-scanner 命令 -Dsonar.source=./ 要检测的代码在我当前目录下 -Dsonar.projectname=mytest 指定项目名称 -Dsonar.login=生成的令牌 指定用户的token -Dsonar.projectKey=linux-test 编译后的地址设置 标识 -Dsonar.java.binaries=./target/ 编译后的内容在 target 里面 设置一下你编译后的内容在哪里解决 下面的错误 添加 -Dsonar.projectKey=linux.test 编译后的地址设置 标识问题解决错误原因:通过 sonar.java.binaries 设置一下你编译后的内容在哪里编译后的内容在 target 里面 -Dsonar.java.binaries=./target所有参数都准备结束执行代码检测命令回到web页面 刷新去首页查看检查结果里面多了一个 linux-test 然后点击 'linux-test'sonarqube 检测代码完整命令:准备工作: ~: cd ../../workspace ~: ls hotel ~: cd hotel ~: ls docker pom.xml src target ~: pwd /usr/local/docker/jenkins_docker/data/workspace/hotel sonarqube 检测代码完整命令: 下面是老自己的完整代码检测命令 ~: /usr/local/docker/jenkins_docker/data/sonar-scanner/bin/sonar-scanner -Dsonar.source=./ -Dsonar.projectname=hotel -Dsonar.login=生成的令牌 -Dsonar.projectKey=hotel -Dsonar.java.binaries=./target/ 下面是老师的完整代码检测命令 实践无误 ~: /usr/local/docker/jenkins_docker/data/sonar-scanner/bin/sonar-scanner -Dsonar.source=./ -Dsonar.projectname=mytest -Dsonar.login=生成的令牌 -Dsonar.projectKey=linux-test -Dsonar.java.binaries=./target/ 我要检测的代码在我当前目录下 -D指定要检测的项目名 此时需要的全部参数就写完了 === 参数代码解释 /usr/local/docker/jenkins_docker/data/sonar-scanner/bin/sonar-scanner 绝对路径下的 sonar-scanner 命令 -Dsonar.source=./ 要检测的代码在我当前目录下 -Dsonar.projectname=mytest 指定项目名称 -Dsonar.login=生成的令牌 指定用户的token -Dsonar.projectKey=linux-test 编译后的地址设置 标识 -Dsonar.java.binaries=./target/ 编译后的内容在 target 里面 设置一下你编译后的内容在哪里问题 没有用户名,密码 或者可以使用用户的 token ,给 sonarqube 分配一个token 解决权限问题给 sonarqube 分配一个token 解决权限问题 找到 'Administrator'点击 '我的账户'点击 '安全'在 生成令牌里面填写 "admin"点击 '生成'