从一开始部署Android项目Sonarqube的自动化扫码+通知+增量扫描功能(Win环境、Docker,基于Jenkins)

文章目录

  • [1. 总体逻辑链路](#1. 总体逻辑链路)
  • [2. gitea到jenkins:基于webhook的代码即时通知](#2. gitea到jenkins:基于webhook的代码即时通知)
    • [2.1 jenkins配置](#2.1 jenkins配置)
    • [2.2 gitea配置](#2.2 gitea配置)
  • [3. 扫描完成后的通知功能:Email](#3. 扫描完成后的通知功能:Email)
  • [4. Jenkinsfile:从全量编译到增量编译](#4. Jenkinsfile:从全量编译到增量编译)
  • [5. 结尾](#5. 结尾)
  • 参考资料

环境和要求

系统环境:win11

配置要求:能跑得动文中服务总和的内存

软件环境:Docker desktop。https://www.docker.com/products/docker-desktop/

网络环境:有办法上外网下载容器和所需要的服务。

注意

本文是从零开始部署Android项目的代码质量检测工具Sonarqube(Win环境、Docker,基于Jenkins)的后续文章,也是docker项目构建的第三篇。

在开始阅读之前,需要你的环境实现以下内容:

  1. 已经自己部署了gitea,jenkins,sonarqube且三个容器以及对应的数据库容器,并且都已经正常运行。
  2. 已经配置好gitea和jenkins的关联,可以在jenkins中正常拉取gitea的代码。
  3. 已经配置好jenkins和sonarqube的关联,可以实现简单的代码全量扫描的功能;
  4. 项目内已经有一个Jenkinsfile用于实现全量扫描;同时jenkins已经部署一个sonarqube项目,成功进行过一次代码扫描。

说明

在本文中,如无特殊说明,所有需要输入指令的地方都为docker.desktop终端的terminal(其实就是powerShell),下图红框处点一下即可打开。输入docker,没有出现报错时,就算准备完成了。如果出现报错,检查一下你的环境变量是否有把docker加进去,这部分请百度解决。

1. 总体逻辑链路

想要实现增量编译功能,需要gitea,jenkins,sonarqube三个容器的通力配合。

  1. gitea负责给jenkins提供代码 ,特别是commit之间或者分支间的代码差异关系,毕竟增量编译需要有个代码基线。同时,我们还需要实现gitea在特定条件下的主动通知jenkins场景。
  2. jenkins负责链接代码仓库和sonarqube,实现扫描功能的构建和结果的通知。
  3. sonarqube是代码扫描专门的容器。

所以我们的文章流程如下:

  1. 先实现gitea推送之后通知jenkins进行扫描的功能。

  2. 再实现jenkins扫描完成之后主动通知用户的功能。

  3. 最后再将全量编译的jenkinsfile改成增量编译的形式,完成整个链路的闭合。

2. gitea到jenkins:基于webhook的代码即时通知

2.1 jenkins配置

想要实现通知的功能,要先实现jenkins被通知的api。

打开jenkins网页,右上角用户头像,下方的安全(Security)。

在apitoken这一栏新增一个,名称可以自己定,然后把token复制下来,就是类似这样的格式。

接下来进入我们之前设置好的sonarqube扫描项目,点击配置,在触发器这里勾选触发远程构建,然后里面的令牌随便填入一些内容即可。

配置保存之后,我们要先测试一下远程触发构建的功能是否可以正常运行。

先把我们的URL编辑好:

xml 复制代码
进入jenkins你的sonarqube项目中,把网页地址复制下来,大概是这样:
http://192.168.31.39:8080/job/sonarqube/
然后在//后面加上[你的用户名:你的apiToken@],地址的末尾加上[build?token=你的构建token]

整体格式:
http://你的用户名:你的apiToken@你的jenkins容器的地址/job/jenkins项目名/build?token=你的构建token

例:
http://root:110e96d74aadcb1c5e5c59764cf900d0@192.168.31.39:8080/job/sonarqube/build?token=my-token

在你的浏览器输入框直接输入这个地址(当然你有条件有postman也行),看一下能否触发jenkins的构建,能的话就算第一步成功。

2.2 gitea配置

当然这一步如果你是gitlab啥的其实也差不多的流程就是了。

进入到代码仓库,右上角的仓库设置,进入webhook(中文就是web钩子),类型选git就行。

在目标url中把我们刚刚的url复制进去,然后事件类型选择推送事件,其他的全都不需要改,直接保存即可。

接下来在你的项目本体随便推一点代码到gitea上去,能触发jenkins的项目自动构建就算成功。

到此,我们就完成了一个最简单的通知模型:只要gitea这边一推送代码,jenkins那边就会自动触发一次sonarqube的全量扫描。

3. 扫描完成后的通知功能:Email

由于不同的项目代码量不一样,我们也不能在这傻等着看他扫描代码,所以接下来我们需要实现一个代码扫描完成之后主动通知的功能。

插件安装

jenkins->系统管理->插件管理:安装Email Extension这个插件->重启jenkins。

  • 如果你在第一次进入jenkins时选择了推荐安装,一般是已经有了,在已安装的插件里面确认一下就可以跳过这一步了。

系统配置

我们以QQ邮箱为例,进入你的邮箱网页的设置页,找到SMTP服务,按照邮箱的要求进行服务的开启和设置,总之你最后会拿到一个授权码。

jenkins->系统管理->系统配置->系统管理员邮件地址,不然邮件发送功能无法使用,会报501的错误。

jenkins->系统管理->系统配置,页面下滑到最下面的邮件通知,把高级点开我们开始填参数。

  • SMTP服务器:不同的邮箱系统不一样,QQ的话是smtp.qq.com。这个需要你自己去百度
  • 用户名:你的邮箱账号
  • 密码:不是你的邮箱密码,而是授权码。
  • 然后勾选SSL协议。

这样就算设置好了,然后 勾选通过发送测试邮件测试配置,在输入框里面输入一个邮箱地址,点击右下角的测试按钮(Test Configuration)。调试到通过之后保存,邮箱发送功能就算弄好了。

项目配置(Jenkinsfile)

回到项目文件的Jenkinsfile中,在末尾增加以下内容。

c 复制代码
	post {
        always {
            mail to: 'recipient@company.com',
                subject: "构建通知: ${env.JOB_NAME} - ${currentBuild.result ?: 'SUCCESS'}",
                body:"""
                     <h2>Jenkins 构建通知</h2>
                     <p><b>项目:</b> ${env.JOB_NAME}</p>
                     <p><b>状态:</b> ${currentBuild.result ?: 'SUCCESS'}</p>
                     <p><b>详情:</b> <a href="${env.BUILD_URL}">查看构建详情</a></p>
                     """
        }
    }

把to的部分修改掉,改成我们的目标邮箱。

然后提交一个commit,再push到服务端。

不出意外的话,gitea会通知jenkins开始构建,而jenkins构建结束之后,又会触发邮箱通知功能将结果告诉给我们。至此我们的三容器通信和通知功能的基本模板就完成了。

4. Jenkinsfile:从全量编译到增量编译

最后就是实现一个基本的增量编译效果,

将Jenkinsfile中的stage('SonarQube Analysis') 进行如下修改:

xml 复制代码
		stage('SonarQube Analysis') {
            environment {
                scanner = tool 'default-sonar-scanner'
            }
            steps {
                script {
                    // 获取当前和上一次提交
                    def currentCommit = sh(returnStdout: true, script: 'git rev-parse HEAD').trim()
                    def previousCommit = sh(returnStdout: true, script: 'git rev-parse HEAD~1').trim()

                    // 获取变更的 Java/XML 文件(根据您的项目类型调整)
                    def changedFiles = sh(returnStdout: true, script: "git diff --name-only ${previousCommit} ${currentCommit} -- '*.java' '*.kt' '*.xml'").trim()

                    if (changedFiles.trim()) {
                        echo "分析变更文件:\n${changedFiles}"

                        withSonarQubeEnv('my-sonarqube') {
                            sh """
                                ${scanner}/bin/sonar-scanner \
                                -Dsonar.projectKey=test\
                                -Dsonar.projectName="测试项目" \
                                -Dsonar.sources=. \
                                -Dsonar.scm.revision=${currentCommit} \
                                -Dsonar.scm.previousRevision=${previousCommit} \
                                -Dsonar.scm.provider=git \
                                -Dsonar.inclusions=${changedFiles.replaceAll('\n', ',')}
                            """
                        }
                    } else {
                        echo "没有检测到相关的代码变更,跳过 SonarQube 分析"
                    }
                }
            }
        }

同样,你只需要填写其中的这几个字段,填写规则和上篇文章一样:

  1. withSonarQubeEnv('my-sonarqube')
  2. -Dsonar.projectKey=test
  3. -Dsonar.projectName="测试项目"

填写完成之后,随便改一点代码,然后commit后触发自动扫描,就能得到最终的结果。

5. 结尾

我们在这一篇完成了

  1. 最简单的webhook模型。
  2. 最简单的邮箱通知功能。
  3. 最简单的增量编译功能。

通过这三个最简单的模型,我们打通了三个容器互相通知的链路,同时完成了最简单的自动化构建流程,后续就可以以现在的知识点为基础,举一反三去完成复杂的现实项目场景了。

参考资料

deepseek

相关推荐
豆沙沙包?3 小时前
2025年--Lc216- 400. 第 N 位数字(找规律)-Java版
1024程序员节
shepherd1263 小时前
破局延时任务(上):为什么选择Spring Boot + DelayQueue来自研分布式延时队列组件?
java·spring boot·后端·1024程序员节
Lethehong3 小时前
以LIS为突破口的全栈信创实践——浙江省人民医院多院区多活架构建设样本
lis·1024程序员节·kingbase·kes·kfs
通往曙光的路上3 小时前
day18_菜单查询 合并servlet
1024程序员节
勤匠3 小时前
Linux服务器设置免密登录
1024程序员节
粉末的沉淀3 小时前
vue3:uniapp全局颜色变量配置思路:使用js变量
1024程序员节
蒙奇D索大3 小时前
【数据结构】数据结构核心考点:AVL树删除操作详解(附平衡旋转实例)
数据结构·笔记·考研·学习方法·改行学it·1024程序员节
开心-开心急了3 小时前
Flask入门教程——李辉 第5章: 数据库 关键知识梳理
笔记·后端·python·flask·1024程序员节
路在脚下@4 小时前
C++ 知识体系
c++·1024程序员节