0.先说软件开发流水线

既然是学习devops 运维流水线构建
开发

测试
测试这个环节,这里仅是学习自动化测试框架之一,sonnarqube
更多的测试工作,以
开发(自己做代码的 单元测试,测代码逻辑是否有bug)
测试工程师(专门的测试工作任务,如测试也要使用jenkins,实现自己日常任务的反复搭建环境,反复测试功能,)

运维


华为devops软件开发流水线文档什么是软件开发流水线_ 软件开发流水线_ 流水线CloudPipeline-华为云

gitlab
jenkins

1.什么是SonarQube

        ‌SonarQube‌ 是一个用于持续检查和管理‌代码质量‌的开源平台,广泛应用于软件开发流程中,帮助团队在早期发现并修复代码中的问题。        

核心功能

  • 静态代码分析‌:无需运行代码即可分析源码,识别潜在问题。
  • 多语言支持‌:支持 Java、C#、Python、JavaScript、C/C++ 等超过 20 种编程语言 ‌28。
  • 问题分类‌:
    • Bug‌:可能导致程序崩溃或异常的错误。
    • Vulnerability(安全漏洞)‌:可能被攻击者利用的安全风险。
    • Code Smell(代码异味)‌:影响可读性、可维护性的不良编码实践。
  • 质量指标统计‌:
    • 代码重复率
    • 复杂度(圈复杂度、认知复杂度)
    • 单元测试覆盖率
    • 注释密度
  • CI/CD 集成‌:可与 Jenkins、GitLab CI、GitHub Actions 等工具无缝集成,实现自动化代码质量门禁 ‌57。
  • AI 增强功能‌(最新版本):
    • AI CodeFix‌:基于大语言模型(LLM)生成上下文感知的修复建议,一键修复问题 ‌1。
  • 可视化 Web 界面‌:提供仪表盘,展示项目健康状况、风险等级(A~E)和趋势变化 ‌11。

典型工作流程

  1. 开发者在 IDE 中编码(可搭配 SonarLint 实时反馈)。
  2. 代码提交至版本控制系统(如 Git)。
  3. CI/CD 流水线触发 SonarScanner 执行代码分析。
  4. 分析结果上传至 SonarQube Server。
  5. 开发者在 Web 界面查看报告,并在 Pull Request 中获得质量门禁反馈。
  6. 问题修复后重新扫描,直至达标。

2.SonarQube部署

在jenkins机器上,安装sonnarqube

1. 手工代码测试,直接执行sonnarqube命令即可,可以扫描具体目录下的代码bug

2. 集成jenkins 和 sonnarqube 工具,来实现,再构建任务中,添加一个测试的环节

2.1 mysql安装

当前安装SonarQube软件的机器,已经有了数据库

1. 下载

wget https://downloads.mysql.com/archives/get/p/23/file/mysql-5.7.28-linux-glibc2.12-x86_64.tar.gz 

tar zxf mysql-5.7.28-linux-glibc2.12-x86_64.tar.gz -C /opt/
[root@jenkins-100 /opt]#ln -s /opt/mysql-5.7.28-linux-glibc2.12-x86_64/   /opt/mysql5.7.28 


2.配置PATH变量,启动服务即可
echo 'export PATH=$PATH:/opt/mysql5.7.28/bin/' >> /etc/profile
# source 命令读取该文件,会加载该PATH变量的新数据,再当前bash环节中
# . 点命令和source一个意思

.   /etc/profile


[root@jenkins-100 /opt]#echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/opt/mysql5.7.28/bin/


3.验证mysql是否可用
[root@jenkins-100 /opt]#mysql -V
mysql  Ver 14.14 Distrib 5.7.28, for linux-glibc2.12 (x86_64) using  EditLine wrapper
[root@jenkins-100 /opt]#


4.卸载mariadb的依赖,防止运行mysql5.7冲突
yum remove mariadb-libs -y
# 删除默认的配置文件 ,自建新的
rm -rf /etc/my.cnf

5. mysql5.7运行需要有一个依赖,底层性能库的依赖
yum install -y libaio-devel


6.创建授权用户,运行mysql服务端


useradd -s /sbin/nologin -M mysql

# 创建mysql的数据目录
mkdir -p /linux0224_mysql_db/
chown -R mysql.mysql /linux0224_mysql_db/

# 给mysql的安装目录,授权
chown -R mysql.mysql /opt/mysql*

7.初始化,生成mysql的基础数据,如mysql自带的库,存储mysql用户信息等
# --basedir mysql的二进制命令在哪个目录
#  --datadir mysql的初始化数据,放哪


mysqld --initialize-insecure --user=mysql --basedir=/opt/mysql5.7.28/ --datadir=/linux0224_mysql_db/


8.## 查看mysql生成的初始数据
[root@jenkins-100 /opt]#
[root@jenkins-100 /opt]#ls /linux0224_mysql_db/
auto.cnf    ca.pem           client-key.pem  ibdata1      ib_logfile1  performance_schema  public_key.pem   server-key.pem
ca-key.pem  client-cert.pem  ib_buffer_pool  ib_logfile0  mysql        private_key.pem     server-cert.pem  sys

9.创建mysql配置文件

cat> /etc/my.cnf <<'EOF'
[mysqld]
user=mysql
basedir=/opt/mysql5.7.28/
datadir=/linux0224_mysql_db/
socket=/tmp/mysql.sock

[mysql]
socket=/tmp/mysql.sock
EOF


10.复制mysql5.7提供的脚本,放入 /etc/init.d/目录,交给systemctl去管理使用
[root@jenkins-100 /opt]#cp /opt/mysql5.7.28/support-files/mysql.server   /etc/init.d/mysqld




9. 启动,登录mysql

基于该脚本名,启动mysql

让systemctl 重新加载,你创建的 /etc/init.d/mysqld 该脚本

[root@jenkins-100 /opt]#systemctl daemon-reload


systemctl start mysqld # 调用 /etc/init.d/mysqld
[root@jenkins-100 /opt]#systemctl stop mysqld
[root@jenkins-100 /opt]#
[root@jenkins-100 /opt]#systemctl start mysqld 
[root@jenkins-100 /opt]#
[root@jenkins-100 /opt]#
[root@jenkins-100 /opt]#netstat -tunlp|grep 3306
tcp6       0      0 :::3306                 :::*                    LISTEN      130110/mysqld       
[root@jenkins-100 /opt]#
[root@jenkins-100 /opt]## 至此,mysqld可以正常重启,脚本配置完毕,基于pid可以看出结果
[root@jenkins-100 /opt]#



2.2 待会需要导入sonnarqube的各种离线插件

[root@jenkins-100 /opt]#cd sonarqube-all/
[root@jenkins-100 /opt/sonarqube-all]#
[root@jenkins-100 /opt/sonarqube-all]#ll
total 237684
-rw-r--r-- 1 root root    171714 Jul 22 18:22 publish-over-ssh.hpi
-rw-r--r-- 1 root root  45106788 Jul 22 18:22 sonar_plugins.tar.gz
-rw-r--r-- 1 root root 155709573 Jul 22 18:22 sonarqube-7.0.zip
-rw-r--r-- 1 root root  42392358 Jul 22 18:22 sonar-scanner-cli-4.0.0.1744-linux.zip
[root@jenkins-100 /opt/sonarqube-all]#

3.安装SonarQube

# 1.安装java环境,该程序是java开发的,需要jdk环境
[root@jenkins-100 /opt/sonarqube-all]#java -version
java version "1.8.0_181"
Java(TM) SE Runtime Environment (build 1.8.0_181-b13)
Java HotSpot(TM) 64-Bit Server VM (build 25.181-b13, mixed mode)
[root@jenkins-100 /opt/sonarqube-all]#
[root@jenkins-100 /opt/sonarqube-all]#


# 2.解压缩软件源码,授权等配置
[root@jenkins-100 /opt/sonarqube-all]#unzip sonarqube-7.0.zip


创建用户,目录授权
useradd sonar -M -s /sbin/nologin
chown -R sonar.sonar /opt/sonarqube-all/sonarqube-7.0

添加个软连接,便于查找

ln -s /opt/sonarqube-all/sonarqube-7.0  /opt/sonarqube

3. 修改sonar软件的配置文件,链接mysql,存储数据

设置mysql密码
mysqladmin -uroot -p   password linux0224
测试mysql是否可登录
[root@jenkins-100 ~]#mysql -uroot -plinux0224  -e "select user();"
mysql: [Warning] Using a password on the command line interface can be insecure.
+----------------+
| user()         |
+----------------+
| root@localhost |
+----------------+




#  java的配置文件
# 该语法就是,远程链接 10.0.0.51:3306端口下的 sonar这个数据库
# 因此下一步,得创建一个数据库,叫 sonar
# 看懂22222

# sonar.jdbc.url=jdbc:mysql://10.0.0.51:3306/sonar?
cat > /opt/sonarqube/conf/sonar.properties << 'EOF'
sonar.jdbc.username=root
sonar.jdbc.password=linux0224
sonar.jdbc.url=jdbc:mysql://localhost:3306/sonar?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true&useConfigs=maxPerformance&useSSL=false
EOF

4.创建sonar数据库

mysql -uroot -plinux0224 -e "create database sonar;"



4.1 修改sonnar的运行用户,否则权限对不上了

修改48行的用户设置
48 RUN_AS_USER=sonar



5.创建sonar脚本

# 为了让systemctl去帮你管理,sonar程序
# 指向sonar的运行命令,或者运行脚本

cat >/usr/lib/systemd/system/sonar.service<<'EOF'
[Unit]
Description=sonar

[Service]
ExecStart=/opt/sonarqube/bin/linux-x86-64/sonar.sh start
ExecStop=/opt/sonarqube/bin/linux-x86-64/sonar.sh stop
Type=forking
User=sonar
Group=sonar

[Install]
WantedBy=multi-user.target
EOF


6.重新加载脚本服务
systemctl daemon-reload 
systemctl start sonar

7.检查sonar的运行状态,检查sonar的web界面端口,9000

[root@jenkins-100 /opt/sonarqube]#netstat -tunlp|grep 9000
tcp6       0      0 :::9000                 :::*                    LISTEN      1376/java  


确保可以访问sonar页面

4.初始化SonarQube

输入关键字jenkins,点击生成token

jenkins: 8815efcc4df85fa259aa8a846233e36e3c8bb7f2

4.1 登录

admin
admin

4.2 生成token

4.3 选择项目类型(开发语言)

sonar-scanner \
  -Dsonar.projectKey=linux0224 \
  -Dsonar.sources=. \
  -Dsonar.host.url=http://10.0.0.100:9000 \
  -Dsonar.login=8815efcc4df85fa259aa8a846233e36e3c8bb7f2
  

5.安装SonarQube中文插件

导入离线插件

1. 备份sonar现有插件
[root@jenkins-100 /opt/sonarqube-all]#cp -a  /opt/sonarqube/extensions/plugins/ /opt/sonarqube/extensions/plugins_bak



2. 导入我们自定义的插件
[root@jenkins-100 /opt/sonarqube-all]#tar xf sonar_plugins.tar.gz -C /opt/sonarqube/extensions/
[root@jenkins-100 /opt/sonarqube-all]#
[root@jenkins-100 /opt/sonarqube-all]#


重启,查看是否有中文
[root@jenkins-100 /opt/sonarqube-all]#systemctl restart sonar

[root@jenkins-100 /opt/sonarqube-all]#
[root@jenkins-100 /opt/sonarqube-all]#free -m
              total        used        free      shared  buff/cache   available
Mem:           3773        2043        1047          44         681        1417
Swap:          3967          22        3945

删除一个插件,再次启动

[root@jenkins-100 /opt/sonarqube/extensions/plugins]#rm -f /opt/sonarqube/extensions/plugins/sonar-java-plugin-5.1.0.13090.jar 
[root@jenkins-100 /opt/sonarqube/extensions/plugins]#
[root@jenkins-100 /opt/sonarqube/extensions/plugins]#
[root@jenkins-100 /opt/sonarqube/extensions/plugins]#
[root@jenkins-100 /opt/sonarqube/extensions/plugins]#tail -



确认启动了
[root@jenkins-100 ~]#netstat -tunlp|grep 9000
tcp6       0      0 :::9000                 :::*                    LISTEN      4866/java           
[root@jenkins-100 ~]#
[root@jenkins-100 ~]## 看懂日志 111
[root@jenkins-100 ~]#

5.1 导入提前准备好的插件

官网地址:Homepage | SonarQube Server | Sonar Documentation

确认可访问了

6.安装客户端

sonar工具

2玩法

1. 手工测代码bug

2 .集成jenkins实现检测

6.1 手工测试代码扫描结果

1.需要先安装sonar的扫描器客户端,软件

解压缩,配置环境变量即可
[root@jenkins-100 /opt/sonarqube-all]#unzip sonar-scanner-cli-4.0.0.1744-linux.zip 

[root@jenkins-100 /opt/sonarqube-all/sonar-scanner-4.0.0.1744-linux/bin]#tail -1 /etc/profile
export PATH=$PATH:/opt/mysql5.7.28/bin/:/opt/sonarqube-all/sonar-scanner-4.0.0.1744-linux/bin





添加path变量,快捷使用该扫描器脚本
[root@jenkins-100 /opt/sonarqube-all/sonar-scanner-4.0.0.1744-linux/bin]#sonar-scanner --help
INFO: 
INFO: usage: sonar-scanner [options]
INFO: 
INFO: Options:
INFO:  -D,--define <arg>     Define property
INFO:  -h,--help             Display help information
INFO:  -v,--version          Display version information
INFO:  -X,--debug            Produce execution debug output




使用扫描器,扫描代码即可

sonar-scanner 
  -Dsonar.projectKey=linux0224 \
  -Dsonar.sources=. \
  -Dsonar.host.url=http://10.0.0.100:9000 \
  -Dsonar.login=8815efcc4df85fa259aa8a846233e36e3c8bb7f2
  
  
  
# 下载源代码,用sonar去扫描,看有多少bug
# 周末自己试试,部署腾讯的项目
https://gitee.com/Tencent-BlueKing/bk-PaaS/blob/master/docs/install/ce_paas_install.md


git clone https://gitee.com/Tencent-BlueKing/bk-PaaS.git

进入该源码项目,用sonar扫描试试
不一定好使,sonar想扫描各种语言的,话,还得下载扫描器插件

[root@jenkins-100 /tmp/bk-PaaS]#
[root@jenkins-100 /tmp/bk-PaaS]#

sonar-scanner \
  -Dsonar.projectKey=linux0224 \
  -Dsonar.sources=. \
  -Dsonar.host.url=http://10.0.0.100:9000 \
  -Dsonar.login=8815efcc4df85fa259aa8a846233e36e3c8bb7f2


sonar会解析扫描js代码,需要有node解释器的开发环境
给jenkins机器安装

# 解压即用node环境
cat > install_node12-13.sh <<'EOF'
cd /opt/
wget https://nodejs.org/dist/v12.13.0/node-v12.13.0-linux-x64.tar.xz
tar xf node-v12.13.0-linux-x64.tar.xz
mv node-v12.13.0-linux-x64 node
echo 'export PATH=$PATH:/opt/node/bin' >> /etc/profile
source /etc/profile
npm -v
node -v
EOF

再次重启sonar

[root@jenkins-100 /var/lib/jenkins/workspace/linux0224_html]#systemctl restart sonar


再次尝试
sonar-scanner \
  -Dsonar.projectKey=linux0224 \
  -Dsonar.sources=. \
  -Dsonar.host.url=http://10.0.0.100:9000 \
  -Dsonar.login=8815efcc4df85fa259aa8a846233e36e3c8bb7f2
  

Packet for query is too large (14777376 > 4194304)

你上传的数据,sonnar  > mysql
14777376

mysql的变量max_allowed_packet 值4194304

查一查

解决办法

修改mysql临时变量,或者修改配置文件,永久生效

max_allowed_packet = 100M 

配置如下
[root@jenkins-100 ~]#cat /etc/my.cnf 
[mysqld]
max_allowed_packet = 100M
user=mysql
basedir=/opt/mysql5.7.28/
datadir=/linux0224_mysql_db/
socket=/tmp/mysql.sock

[mysql]
socket=/tmp/mysql.sock


systemctl restart mysqld




[root@jenkins-100 ~]#mysql -uroot -plinux0224 -e "show variables like 'max_allowed_packet';"
mysql: [Warning] Using a password on the command line interface can be insecure.
+--------------------+-----------+
| Variable_name      | Value     |
+--------------------+-----------+
| max_allowed_packet | 104857600 |
+--------------------+-----------+
[root@jenkins-100 ~]#python
Python 2.7.5 (default, Apr 11 2018, 07:36:10) 
[GCC 4.8.5 20150623 (Red Hat 4.8.5-28)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> 104857600 / 1024 
102400
>>> 104857600 / 1024 /1024
100
>>> 
>>> 
>>> 
[root@jenkins-100 ~]#

再次尝试sonar检查

注意还得重启sonar

[root@jenkins-100 /var/lib/jenkins/workspace/linux0224_html]#systemctl restart sonar



sonar-scanner \
  -Dsonar.projectKey=linux0224 \
  -Dsonar.sources=. \
  -Dsonar.host.url=http://10.0.0.100:9000 \
  -Dsonar.login=8815efcc4df85fa259aa8a846233e36e3c8bb7f2


终于好了。。
INFO: 6 files had no CPD blocks
INFO: Calculating CPD for 155 files
WARN: Too many duplication groups on file 智慧运维/大数据运维总览图/citystore.js. Keep only the first 100 groups.
INFO: CPD calculation finished
INFO: Analysis report generated in 821ms, dir size=42 MB
INFO: Analysis reports compressed in 1515ms, zip size=13 MB
INFO: Analysis report uploaded in 636ms
INFO: ANALYSIS SUCCESSFUL, you can browse http://10.0.0.100:9000/dashboard/index/linux0224
INFO: Note that you will be able to access the updated dashboard once the server has processed the submitted analysis report
INFO: More about the report processing at http://10.0.0.100:9000/api/ce/task?id=AYIl0p-txMd9QSYDagrm
INFO: Task total time: 37.208 s
INFO: ------------------------------------------------------------------------
INFO: EXECUTION SUCCESS
INFO: ------------------------------------------------------------------------
INFO: Total time: 38.291s
INFO: Final Memory: 14M/54M
INFO: ------------------------------------------------------------------------
[root@jenkins-100 /var/lib/jenkins/workspace/linux0224_html]#

访问sonnar页面,查看扫描结果

7.SonarQube集成jenkins

手工去各种源码目录下 去扫描代码

gitlab 拉去代码  ----------开发

jenkins的 job的工作区里 (sonarqube对该代码扫描,上传bug结果,到平台)-------测试

构建部署的操作。--------运维

7.1 jenkins里添加SonarQube的凭证

1. 再jenkins中,添加链接sonar的身份临牌
找到你安装sonar时生成的令牌

8815efcc4df85fa259aa8a846233e36e3c8bb7f2



2. 再具体的job中,添加构建动作,添加扫描的动作

sonar需要设置扫描器的命令
再jenkins中,设定扫描器脚本的路径

最后一个环节,cicd全流程

开发

测试

运维发布

7.2 添加Sonar客户端的家目录 也就是代码检测的目录,待会要和jenkins的工作区对应上。

7.3 给job添加sonar构建动作 构建的同时进行代码扫描

7.4 最后注意细节 软件开发流程是

开发、测试、运维上线。

调整jenkins的devops流程构建步骤。

8.最终测试

  1. 开发推送代码,触发gitlab的webhook,执行jenkins任务

  2. 构建动作里,先sonnar代码扫描,然后进行脚本发布

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐