从一开始部署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

相关推荐
七夜zippoe9 小时前
CANN Runtime任务描述序列化与持久化源码深度解码
大数据·运维·服务器·cann
金刚猿9 小时前
01_虚拟机中间件部署_root 用户安装 docker 容器,配置非root用户权限
docker·中间件·容器
JH_Kong9 小时前
解决 WSL 中 Docker 权限问题:从踩坑到完整修复
docker·容器
忆~遂愿10 小时前
GE 引擎与算子版本控制:确保前向兼容性与图重写策略的稳定性
大数据·开发语言·docker
Fcy64810 小时前
Linux下 进程(一)(冯诺依曼体系、操作系统、进程基本概念与基本操作)
linux·运维·服务器·进程
袁袁袁袁满10 小时前
Linux怎么查看最新下载的文件
linux·运维·服务器
代码游侠11 小时前
学习笔记——设备树基础
linux·运维·开发语言·单片机·算法
Harvey90311 小时前
通过 Helm 部署 Nginx 应用的完整标准化步骤
linux·运维·nginx·k8s
珠海西格电力科技12 小时前
微电网能量平衡理论的实现条件在不同场景下有哪些差异?
运维·服务器·网络·人工智能·云计算·智慧城市
释怀不想释怀12 小时前
Linux环境变量
linux·运维·服务器