基于PipeLine实现JAVA项目集成SonarQube代码检测通知Jenkins(钉钉版)

#准备相关服务器,并实现各个服务器的DNS解析

在服务器主机上进行DNS解析配置
tee /etc/hosts <<-'EOF'
10.0.0.100   gitlab.zhang.org
10.0.0.110   jenkins.zhang.org
10.0.0.120   harbor.zhang.org
10.0.0.130   sonarqube.zhang.org
EOF

1 安装 GitLab 和准备项目

1.1 将代码从Gitee迁移到GitLab
1. 在GitLab中创建项目:
   - 访问 `http://gitlab.zhang.org`,创建新项目 `spring-boot-helloworld`。
2. 从Gitee导入代码:
   #创建新项目时选择导入项目
   https://gitee.com/lbtooth/spring-boot-helloworld.git

2 安装 Harbor 并配置 Jenkins 连接 Harbor

2.1 安装Harbor
# 在10.0.0.120服务器上操作
wget https://github.com/goharbor/harbor/releases/download/v2.12.2/harbor-offline-installer-v2.12.2.tgz
mkdir /apps && tar xvf harbor-offline-installer-v2.12.2.tgz -C /apps/
cd /apps/harbor*
cp /apps/harbor/harbor.yml.tmpl /apps/harbor/harbor.yml

2.2 配置Harbor
vim /apps/harbor/harbor.yml
hostname: harbor.zhang.org
http:
  port: 80
harbor_admin_password: 123456
data_volume: /data/harbor

#如果不使用https,还需要将下面行注释掉
#https:
# port: 443
# certificate: /your/certificate/path
# private_key: /your/private/key/path

2.3 启动Harbor
#先安装python
apt -y install python3
#安装docker harbor 
/apps/harbor/install.sh
docker ps

2.4 配置Docker客户端
在Jenkins服务器(10.0.0.110)上执行:
# 配置Docker镜像加速和不安全注册表
tee /etc/docker/daemon.json <<EOF
{
  "registry-mirrors": ["https://docker.tbedu.top"],
  "insecure-registries": ["harbor.zhang.org"]
}
EOF

systemctl restart docker

# 测试登录Harbor
docker login harbor.zhang.org -u admin -p 123456
测试成功后在浏览器上登录harbor.zhang.org,登录后创建example项目仓库

3 安装 Jenkins 并安装相关插件

3.1 安装Jenkins
# 在10.0.0.110服务器上操作
apt install openjdk-11-jdk
wget https://mirrors.tuna.tsinghua.edu.cn/jenkins/debian-stable/jenkins_2.462.3_all.deb
dpkg -i jenkins_2.462.3_all.deb

3.2 安装Jenkins插件
1. 访问 `http://jenkins.zhang.org:8080`,
默认内置用户admin,其密码为随机字符,可以从如下文件中查到密码
cat /var/lib/jenkins/secrets/initialAdminPassword
初始化Jenkins并安装以下插件:
   - Localization: Chinese (Simplified): Jenkins Core 及其插件的简体中文语言包
   - GitLab、GitLab Authentication、GitLab Logo:GitLab仓库的集成、用户认证以及品牌定制。
   - Pipeline:支持声明式流水线。
   - Docker-build-stepVersion:用于Docker操作。
   - Docker-Pipeline: Docker集成
   - Maven Integration:支持Maven构建。
   - Blue Ocean:可视化流水线界面。
   - DingTalk:钉钉通知插件。

3.3 配置Jenkins全局工具
1. 进入 Manage Jenkins → Global Tool Configuration:
   - JDK:选择已安装的Java版本(如 `java-11-openjdk`)。

4 在 Jenkins 创建凭据连接 Harbor

在 Manage Jenkins → Credentials → System 下添加:
   - GitLab凭证:用户名和密码(如 `gitlab-admin/password`)。
   - Harbor凭证:用户名和密码(如 `admin/ 123456`)。

5 在 Jenkins 安装 Maven 工具

[root@ubuntu2204 ~]#apt update && apt -y install maven
[root@ubuntu2204 ~]#vim /etc/maven/settings.xml
......
	<mirror>
		<id>nexus-aliyun</id>
		<mirrorOf>*</mirrorOf>
		<name>Nexus aliyun</name>
		<url>http://maven.aliyun.com/nexus/content/groups/public</url>
	</mirror>
  </mirrors>
.....

6 在 Jenkins 上配置 Maven 环境

1. 进入 Manage Jenkins → Global Tool Configuration:
   - Maven:填写路径 `/usr/share/maven`。

7 在 Jenkins 创建连接 GitLab 的凭据

在 Manage Jenkins → Credentials → System 下添加:(第4步已提前添加)
   - GitLab凭证:用户名和密码(如 `gitlab-admin/password`)。

8 在 Jenkins 上修改 Docker 的 socket 文件权限

#默认Jenkins以Jenkins用户启动,无法访问Docker,构建时会提示错误
解决错误:
[root@jenkins ~]#ll /var/run/docker.sock
srw-rw---- 1 root docker 0 1月 31 17:20 /var/run/docker.sock=
[root@jenkins ~]#id jenkins
uid=114(jenkins) gid=119(jenkins) groups=119(jenkins)
[root@ubuntu2204 ~]#usermod -G docker jenkins
[root@jenkins ~]#id jenkins
uid=114(jenkins) gid=119(jenkins) groups=119(jenkins),999(docker)
[root@jenkins ~]#systemctl restart jenkins.service

9 安装 SonarQube 并创建用户和令牌

为了操作方便可以安装中文插件:

安装完后,点 Restart Server

给用户分配置"执行分析"和"置备项目"权限

10 在 SonarQube 添加 Jenkins 的回调接口

在SonarQube上添加webhook(网络调用),以便于Jenkins通过SonarQube Quality Gate插件调用其"质量阈"信息,决定是否继续执行下面的构建步骤
配置 --- webhook --- 创建

输入名称和下面 Jenkins的URL地址
注意:
密码防止攻击使用, 可以随意输入
此处的密码没有复杂度和长度要求,但建议使用符合安全的密码

范例: 生成Secret
http://jenkins.zhang.org:8080/sonarqube-webhook
#生成Secet
[root@jenkins ~]#openssl rand -base64 21
GEbRaThruIhFVsXWcVvVsLh4LXoQ

11 在 Jenkins 安装 SonarQube Scanner 插件

Jenkins—系统管理--插件管理
安装插件 SonarQube Scanner

12 在 Jenkins 创建访问 Sonarqube的令牌凭据

用前面小节生成的Sonarqube中用户令牌,在Jenkins 创建凭据
#添写前面创建的Sonarqube中用户令牌
secret:squ_525c4b8a8ca58eb5d8862d0b3c09484ad71790fc
#指定凭据的ID
ID:sonarqube-jenkins-token

13 在 Jenkins 上配置系统的 SonarQube 服务器信息

Manage Jenkins -- Configure System
注意:Name名称区分大小写
注意:http://sonarqube.zhang.org:9000 地址最后不能加/
否则会报错误 hudson.remoting.ProxyException: net.sf.json.JSONException: Invalid JSON String

14 在 Jenkins 上安装 SonarQube Scanner

Jenkins 上安装 SonarQube Scanner 以便在构建任务中调用,有两种方式
1. 在 Jenkins 手动安装 sonarqube-scanner
2. Jenkins 全局工具配置中配置安装 sonar-scanner
Manage Jenkins >全局工具配置

15 准备钉钉机器人

1. 在钉钉群组中添加自定义机器人,获取Webhook URL和加签密钥(Secret)。
2. 在Jenkins中配置钉钉通知参数:
   - 进入 Manage Jenkins → Configure System → DingTalk
   - 添加钉钉机器人配置,填写Webhook URL和Secret。

16 创建任务使用 Pipeline Script

根据前面的相信配置创建Pipeline的任务
直接使用流水线
任务名:pipeline-sonarqube-docker-spring-boot-helloWorld

范例:
pipeline {
    agent any
    tools {
        maven 'maven-3.9.6' // 与全局工具配置中Name一致
    }
    environment {
        codeRepo = "http://gitlab.zhang.org/dev/spring-boot-helloworld" 
        harborServer = 'harbor.zhang.org' 
        credential = '70d041cb-4d17-426e-8e05-7218b92c9b50'
        projectName = 'spring-boot-helloworld' 
        imageUrl = "${harborServer}/example/${projectName}" 
        imageTag = "${BUILD_ID}-${env.BUILD_TIMESTAMP}" 
        SONARQUBE_SERVER_NAME = 'SonarQube-server' 
        HARBOR_CREDENTIAL_ID = '87429a30-b6cf-4309-bdd9-c35a7ec32d56' 
        DINGTALK_ROBOT_ID = 'dingtalk' 
        EMAIL_RECEIVER = '3089641828@qq.com' 
    }
    stages {
        stage('拉取代码') {
            steps {
                git(
                    branch: 'main',
                    credentialsId: "${credential}",
                    url: "${codeRepo}"
                )
            }
        }
        stage('代码质量分析') {
            steps {
                withSonarQubeEnv("${SONARQUBE_SERVER_NAME}") {
                    sh "${tool 'maven-3.9.6'}/bin/mvn sonar:sonar -Dsonar.java.binaries=target/"
                }
            }
        }
        stage('质量门禁检查') {
            steps {
                timeout(time: 30, unit: 'MINUTES') {
                    waitForQualityGate abortPipeline: true
                }
            }
        }
        stage('项目构建') {
            steps {
                sh "${tool 'maven-3.9.6'}/bin/mvn -B -DskipTests clean package"
            }
        }
        stage('单元测试') {
            steps {
                sh "${tool 'maven-3.9.6'}/bin/mvn test"
            }
        }
        stage('构建Docker镜像') {
            steps {
                sh "docker build -t ${imageUrl}:${imageTag} ."
            }
        }
        stage('推送Docker镜像') {
            steps {
                withCredentials([
                    usernamePassword(
                        credentialsId: "${HARBOR_CREDENTIAL_ID}",
                        passwordVariable: 'harborPassword',
                        usernameVariable: 'harborUserName'
                    )
                ]) {
                    sh "docker login -u ${harborUserName} -p ${harborPassword} ${harborServer}"
                    sh "docker push ${imageUrl}:${imageTag}"
                }
            }
        }
        stage('运行Docker容器') {
            steps {
                script {
                    def servers = ['10.0.0.150:2375', '10.0.0.160:2375'] 
                    servers.each { server ->
                        sh "docker -H ${server} rm -f ${projectName} || true"
                        sh "docker -H ${server} run --name ${projectName} -p 80:8888 -d ${imageUrl}:${imageTag}"
                    }
                }
            }
        }
    }
    post {
        success {
            mail(
                to: "${EMAIL_RECEIVER}",
                subject: "流水线成功: ${currentBuild.fullDisplayName}",
                body: "构建 ${env.BUILD_URL} 已成功完成。"
            )
            dingtalk(
                robot: "${DINGTALK_ROBOT_ID}",
                type: 'MARKDOWN',
                title: "流水线成功通知",
                text: [
                    "项目 **${projectName}** 构建成功!",
                    "详情:${env.BUILD_URL}"
                ]
            )
        }
        failure {
            dingtalk(
                robot: "${DINGTALK_ROBOT_ID}",
                type: 'MARKDOWN',
                title: "流水线失败通知",
                text: [
                    "项目 **${projectName}** 构建失败!",
                    "错误日志:${env.BUILD_URL}/console"
                ]
            )
        }
    }
}

17 执行构建验证结果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值