文章目录
- [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项目构建的第三篇。
在开始阅读之前,需要你的环境实现以下内容:
- 已经自己部署了gitea,jenkins,sonarqube且三个容器以及对应的数据库容器,并且都已经正常运行。
- 已经配置好gitea和jenkins的关联,可以在jenkins中正常拉取gitea的代码。
- 已经配置好jenkins和sonarqube的关联,可以实现简单的代码全量扫描的功能;
- 项目内已经有一个Jenkinsfile用于实现全量扫描;同时jenkins已经部署一个sonarqube项目,成功进行过一次代码扫描。
说明
在本文中,如无特殊说明,所有需要输入指令的地方都为docker.desktop终端的terminal(其实就是powerShell),下图红框处点一下即可打开。输入docker,没有出现报错时,就算准备完成了。如果出现报错,检查一下你的环境变量是否有把docker加进去,这部分请百度解决。

1. 总体逻辑链路
想要实现增量编译功能,需要gitea,jenkins,sonarqube三个容器的通力配合。
- gitea负责给jenkins提供代码 ,特别是commit之间或者分支间的代码差异关系,毕竟增量编译需要有个代码基线。同时,我们还需要实现gitea在特定条件下的主动通知jenkins场景。
- jenkins负责链接代码仓库和sonarqube,实现扫描功能的构建和结果的通知。
- sonarqube是代码扫描专门的容器。
所以我们的文章流程如下:
-
先实现gitea推送之后通知jenkins进行扫描的功能。
-
再实现jenkins扫描完成之后主动通知用户的功能。
-
最后再将全量编译的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 分析"
}
}
}
}
同样,你只需要填写其中的这几个字段,填写规则和上篇文章一样:
- withSonarQubeEnv('my-sonarqube')
- -Dsonar.projectKey=test
- -Dsonar.projectName="测试项目"
填写完成之后,随便改一点代码,然后commit后触发自动扫描,就能得到最终的结果。
5. 结尾
我们在这一篇完成了
- 最简单的webhook模型。
- 最简单的邮箱通知功能。
- 最简单的增量编译功能。
通过这三个最简单的模型,我们打通了三个容器互相通知的链路,同时完成了最简单的自动化构建流程,后续就可以以现在的知识点为基础,举一反三去完成复杂的现实项目场景了。
参考资料
deepseek