二.基于jenkins与gitlab的CI/CD及DevOps实战 4.3 SonarQube部署、插件管理、代码自动扫描案例
代码质量测试工具sonarqube介绍;
SonarQube介绍:
SonarQube 是一个用于代码质量管理的开放平台,通过插件机制实现对不同语言的源代码质量扫描,如go、python、java、python等代码扫描并生成扫描报告,官方网站:http://www.sonarqube.org。
下载地址:
https://www.sonarqube.org/downloads
支持25种以上的常见编程语言,如java、pyhton、go、c、JavaScript等。
插件化,便于后期功能扩展。
可视化展示代码分析结果。
SonarQube代码扫描流程:(见图,略)
Sonarqube部署、插件管理、实现代码扫描;
环境简介:(见图)
环境依赖:
软件依赖:
https://docs.sonarqube.org/8.9/requirements/requirements/
7.9.x 版本开始不再支持MySQL
MySQL No Longer Supported
SonarQube no longer supports MySQL. To migrate from MySQL to a supported database, see the free MySQLMigrator tool.
不能使用root用户启动SonarQube
SonarQube cannot be run as root on Unix-based systems, so create a dedicated user account for SonarQube ifnecessary.
硬件依赖:
https://docs.sonarqube.org/8.9/requirements/hardware-recommendations/
CPU、内存、磁盘、网卡、数据库
部署PostgreSQL 14.x:(192.168.106.196)
PostgreSQL安装:
# sudo apt update
# apt-cache madison postgresql
# apt install postgresql
PostgreSQL环境初始化:
# sudo pg_createcluster --start 14 mycluster #指定版本为PostgreSQL 14
# vim /etc/postgresql/14/mycluster/pg_hba.conf
96 # IPv4 local connections:
97 host all all 0.0.0.0/0 scram-sha-256
# vim /etc/postgresql/14/mycluster/postgresql.conf
60 listen_addresses = '*' #defaults to 'localhost'; use '*' for all
PostgreSQL端口验证:
# lsof -i:5432
• COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
• postgres 4259 postgres 5u IPv4 54944 0t0 TCP *:postgresql (LISTEN)
• postgres 4259 postgres 6u IPv6 54945 0t0 TCP *:postgresql (LISTEN)
创建数据库及账户授权:
# su - postgres #切换到postgres普通用户
# psql -U postgres #进入到postgresql命令行敞口
psql (14.5 (Ubuntu 14.5-0ubuntu0.22.04.1))
Type "help" for help.
postgres=# CREATE DATABASE sonar; #创建sonar数据库
CREATE DATABASE
postgres=# CREATE USER sonar WITH ENCRYPTED PASSWORD '123456'; #创建sonar用户密码为123456
CREATE ROLE
postgres=# GRANT ALL PRIVILEGES ON DATABASE sonar TO sonar; #授权用户访
GRANT
postgres=# ALTER DATABASE sonar OWNER TO sonar; #执行变更
ALTER DATABASE
postgres=# \q #退出
~$ exit
部署SonarQube Server 8.9.x:(192.168.106.196)
安装jdk 11:
# apt install -y openjdk-11-jdk
内核参数:
# vim /etc/sysctl.conf
vm.max_map_count = 262144
fs.file-max = 65536
部署SonarQube 8.9.x:
# mkdir /apps && cd /apps/
# unzip sonarqube-8.9.10.61524.zip
# ln -sv /apps/sonarqube-8.9.10.61524 /apps/sonarqube
# useradd -r -m -s /bin/bash sonarqube && chown sonarqube.sonarqube /apps/ -R && su - sonarqube
~$ vim /apps/sonarqube/conf/sonar.properties
18 sonar.jdbc.username=sonar
19 sonar.jdbc.password=123456
37 sonar.jdbc.url=jdbc:postgresql://192.168.106.196/sonar
~$ /apps/sonarqube/bin/linux-x86-64/sonar.sh --help
~$ /apps/sonarqube/bin/linux-x86-64/sonar.sh start
验证SonarQube:
~$ tail /apps/sonarqube/logs/*.log
2022.11.08 10:48:22 INFO app[][o.s.a.SchedulerImpl] Process[ce] is up
2022.11.08 10:48:22 INFO app[][o.s.a.SchedulerImpl] SonarQube is up
~$ lsof -i:9000
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
java 6159 sonarqube 14u IPv6 81413 0t0 TCP *:9000 (LISTEN)
访问web界面:
默认账户: admin
默认密码:admin #首次登录需要修改密码
插件管理:
Administration--> Marketplace--> I understand the risk(首次需要点击我理解风险)-->all
Administration--> System--> Restart Server #新插件安装成功后需要重启SonarQube server
认证管理:
配置--> 权限--> Force user authentication
service 文件:
# cat /etc/systemd/system/sonarqube.service
[Unit]
Description=SonarQube service
After=syslog.target network.target
[Service]
Type=simple
User=sonarqube
Group=sonarqube
PermissionsStartOnly=true
ExecStart=/bin/nohup /usr/bin/java -Xms1024m -Xmx1024m -Djava.net.preferIPv4Stack=true -jar
/apps/sonarqube/lib/sonar-application-8.9.10.61524.jar
StandardOutput=syslog
LimitNOFILE=131072
LimitNPROC=8192
TimeoutStartSec=5
Restart=always
SuccessExitStatus=143
[Install]
WantedBy=multi-user.target
部署扫描器sonar-scanner:(安装到了jenkins192.168.106.190)
sonar-scanner会访问指定的SonarQube Server,以下载执行代码质量扫描的时候所需要的分析器、质量配置文件等资源,以实现代码分析和结果上传。
在jenkins或其它需要进行代码指令扫描的服务器部署sonar-scanner:
下载地址:https://binaries.sonarsource.com/?prefix=Distribution/sonar-scanner-cli
官方文档:https://docs.sonarqube.org/latest/analysis/scan/sonarscanner
# unzip sonar-scanner-cli-4.7.0.2747.zip
# ln -sv /apps/sonar-scanner-4.7.0.2747 /apps/sonar-scanner
# vim /apps/sonar-scanner/conf/sonar-scanner.properties
#----- Default SonarQube server
sonar.host.url=http://192.168.106.196:9000
#----- Default source code encoding
sonar.sourceEncoding=UTF-8
在sonar-scanne节点测试代码质量扫描:
配置参数:
root@jenkins:/opt/python-test# ll
drwxr-xr-x 2 root root 48 Nov 8 20:21 .scannerwork/
-rw-r--r-- 1 root root 284 Nov 8 20:20 sonar-project.properties
drwxr-xr-x 2 root root 21 Nov 8 20:07 src/
# cat sonar-project.properties
# Required metadata
sonar.projectKey=laimiya-python //#项目key,项目唯一标识、通常使用项目名称
sonar.projectName=laimiya-python-app1 #项目名称,当前的服务名称
sonar.projectVersion=1.0 #当前的代码版本
# Comma-separated paths to directories with sources (required)
sonar.sources=./src #源代码路径、sonar-scanner会扫描./src 下的代码
# Language
sonar.language=py #编程语言类型
# Encoding of the source files
sonar.sourceEncoding=UTF-8 #字符集
执行扫描:
1.基于配置文件执行扫描:
root@jenkins:/opt/python-test# pwd
/opt/python-test
root@jenkins:/opt/python-test# /apps/sonar-scanner/bin/sonar-scanner
2. 基于传递扫描参数:
root@jenkins:/opt/app2# pwd
/opt/app2
root@jenkins:/opt/app2# /apps/sonar-scanner/bin/sonar-scanner -Dsonar.projectKey=laimiya -Dsonar.projectName=laimiya-python-app2 -Dsonar.projectVersion=1.1 -Dsonar.sources=./src -Dsonar.language=py -Dsonar.sourceEncoding=UTF-8
验证扫描结果:
Jenkins结合sonarqube实现代码自动扫描;
sonarqube实现python代码扫描:(基于pipeline)
#######
pipeline {
agent { label 'jenkins-slave1' }#jenkins-slave1 需要安装sonarqube scaner
parameters {
string(name: 'BRANCH', defaultValue: 'develop', description: '分支选择') //字符串参数,会配置在jenkins的参数化构建过程中
choice(name: 'DEPLOY_ENV', choices: ['develop', 'production'], description: '部署环境选择') //选项参数,会配置在jenkins的参数化构建过程中
}
stages {
stage('变量测试1') {
steps {
sh "echo $env.WORKSPACE" //JOB的工作目录,可用于后期目录切换
sh "echo $env.JOB_URL" //JOB的URL
sh "echo $env.NODE_NAME" //节点名称,master 名称显示built-in
sh "echo $env.NODE_LABELS" //节点标签
sh "echo $env.JENKINS_URL" //jenkins的URL地址
sh "echo $env.JENKINS_HOME" //jenkins的家目录路径
}
}
stage("code clone"){
//#agent { label 'master' } //具体执行的步骤节点,非必须
steps {
deleteDir() //删除workDir当前目录
script {
if ( env.BRANCH == 'main' ) {
git branch: 'main', credentialsId: '4648de7f-3f27-4701-8b20-98fee3a3bcbf', url: 'git@192.168.106.200:laimiya/app2.git'
} else if ( env.BRANCH == 'develop' ) {
git branch: 'develop', credentialsId: '4648de7f-3f27-4701-8b20-98fee3a3bcbf', url: 'git@192.168.106.200:laimiya/app2.git'
} else {
echo '您传递的分支参数BRANCH ERROR,请检查分支参数是否正确'
}
GIT_COMMIT_TAG = sh(returnStdout: true, script: 'git rev-parse --short HEAD').trim() //获取clone完成的分支tagId,用于做镜像做tag
}
}
}
stage('python源代码质量扫描') {
steps {
sh "cd $env.WORKSPACE && /apps/sonar-scanner/bin/sonar-scanner -Dsonar.projectKey=laimiya3 -Dsonar.projectName=laimiya-python-app3 -Dsonar.projectVersion=1.0 -Dsonar.sources=./src -Dsonar.language=py -Dsonar.sourceEncoding=UTF-8"
}
}
}
}
3. jenkins 安装sonarqube scanner插件 方式(很少用这种方式)
jenkins安装Sonarqube Scanner插件、配置sonarqube server地址、基于jenkins配置代码扫描参数实现代码质量扫描
Execute SonarQube Scanner
应用,保存
创建新任务
在jenkins master执行
应用,保存
应用,保存,执行构建
本文来自博客园,作者:梳碧湖砍柴少年,转载请注明原文链接:https://www.cnblogs.com/pang-lu/p/16943269.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通