全链路 DevOps 实战:基于 Jenkins、GitLab、Prometheus 与 SonarQube 的持续集成、部署、监控与优化

1.在 Linux 系统上安装 Jenkins 2.528.2,并完成基本的初始化配置,包括管理员密码的设置、插件的安装和用户权限的配置。

想要安装Jenkins就必须先安装Java

apt update && apt -y install openjdk-21-jdk

查看java -version

然后去拉取安装包

wget https://mirrors.tuna.tsinghua.edu.cn/jenkins/debian-stable/jenkins_2.528.2_all.deb

然后安装

安装完成后查看状态

systemctl status jenkins.service

浏览器访问一下本机地址

去它给的文件中获取密码

登录

前者会安装大量的插件,对于我们学习测试来说,先选择后者

点击后者后,依旧会有一些推荐插件,先不安装。

点击上方的"无",然后点击最下面的"安装"

由于会有一个默认admin用户,所以先使用默认

不用填写,点击下方"使用admin账户继续"

下一步,保存并完成

然后开始使用

由于没有安装任何插件,所以界面简洁

我们进行更改密码的操作

点击右上角的人头,再点击倒数第三行的security

下滑,就看到密码(为了加密,所以不管多长的密码都是一大串,删除,然后写自己的密码,点击"save"即可)

修改后,会直接让你重新登陆,写自己的密码

已经重新回来了

接下进行安装插件的操作

点击右上角的齿轮

然后点击plugins

然后点击左边的"avaliable plugins"

搜索我们需要的插件,并点击安装

以中文插件为例子

下载完成

然后点击下方的重启,就会生效

可以看出来,比之前多了一点中文

修改权限

修改 Jenkins 的启动用户为 root

#基于 Ubuntu安装修改下面文件

root@jenkins \~\]#vim /lib/systemd/system/jenkins.service #User=jenkins #Group=jenkins User=root Group=root \[root@jenkins \~\]#systemctl daemon-reload \[root@jenkins \~\]#systemctl restart jenkins.service ## 2.创建一个自由风格任务,使用 Ansible 实现对远程服务器的参数化构建,要求能够通过 Jenkins 参数动态指定目标服务器的 IP 地址和构建任务。 在服务器主机上安装ansible:apt install ansible -y ![](https://i-blog.csdnimg.cn/direct/5a1364c7b9b74cbfb34122945259712c.png) 查看版本 ![](https://i-blog.csdnimg.cn/direct/6ee02fa1a10d45ceb8196acf35edbf2e.png) 确保 Jenkins 服务器可以通过 SSH 无密码访问目标服务器: 生成公钥 ![](https://i-blog.csdnimg.cn/direct/1d556b4efcf44c578e8fa8ff26e279ea.png) 传递到目标服务器 ![](https://i-blog.csdnimg.cn/direct/f141954ebd8e4f9898ddffc37aa544d2.png) 创建 Ansible Inventory 文件 创建一个基础的主机清单文件: ![](https://i-blog.csdnimg.cn/direct/d34b3e064d3248b194a3c2e70cc7d1dc.png) 在 Jenkins 中安装必要插件 **Ansible**​ 插件 ![](https://i-blog.csdnimg.cn/direct/322d9736baa94ad1be61e331db677efe.png) **Parameterized Trigger**​ 插件 ![](https://i-blog.csdnimg.cn/direct/a6c8a729b9ba464188d068d772c8706c.png) **SSH Agent**​ 插件 创建参数化构建项目 新建任务 返回 Jenkins 首页 点击 "新建任务" ![](https://i-blog.csdnimg.cn/direct/9c51aed229b44696bf5fc337e7bda8f9.png) 输入任务名称,例如:`ansible-test` ![](https://i-blog.csdnimg.cn/direct/403b13dbff8a4c50b39091aed7c60b99.png) 选择 "自由风格项目" 点击 "确定" ![](https://i-blog.csdnimg.cn/direct/4d7d601d165e4a41aa5b6ba704b92c49.png) 配置项目参数 在项目配置页面,勾选 "参数化构建过程" ![](https://i-blog.csdnimg.cn/direct/a9afcafdeeac4242a001f932437c959d.png) 添加第一个参数: 点击 "添加参数" 选择 "字符串参数" ![](https://i-blog.csdnimg.cn/direct/01d30d92ce3945fb9fad30ced65df3f5.png) 配置如下: ![](https://i-blog.csdnimg.cn/direct/3731a6233ca44f2d9b77ddedeb0c95e9.png) 添加第二个参数: 点击 **"添加参数"** 选择 **"选项参数"** ![](https://i-blog.csdnimg.cn/direct/f142f73fe85b427281f63a78f8751109.png) 配置如下:![](https://i-blog.csdnimg.cn/direct/77da2b908a5246cd8da0b0a6e444e9a1.png) 添加第三个参数(条件参数): 点击 **"添加参数"** 选择 **"字符串参数"** 配置如下 名称: SERVICE_NAME 默认值: nginx 描述: 请输入要重启的服务名称 ![](https://i-blog.csdnimg.cn/direct/056eaea8a58e42a8ae2d6dca6379850b.png) 添加第四个参数: 点击 **"添加参数"** 选择 **"字符串参数"** 配置如下: 名称: CUSTOM_CMD 默认值: date 描述: 请输入要执行的自定义命令 ![](https://i-blog.csdnimg.cn/direct/2606b547ddc84433b020b18085fc4442.png) 创建 Ansible Playbook 文件 在 Jenkins 工作空间中创建 Playbook 在项目配置页面的 "构建"​ 部分,先添加一个 "执行shell"​ 步骤 #!/bin/bash # 创建临时 Ansible Playbook mkdir -p $WORKSPACE/ansible-playbooks # 根据选择的任务类型生成不同的 playbook cat > $WORKSPACE/ansible-playbooks/execute_task.yml << EOF --- - name: 执行远程服务器任务 hosts: "{{ target_host }}" gather_facts: no vars: service_name: "{{ service_name | default('nginx') }}" custom_cmd: "{{ custom_cmd | default('date') }}" tasks: EOF # 根据任务类型添加相应的任务 case $TASK_TO_RUN in "system_info") cat >> $WORKSPACE/ansible-playbooks/execute_task.yml << 'EOF' - name: 收集系统信息 setup: register: system_info - name: 显示系统信息 debug: msg: "主机名: {{ ansible_hostname }}, IP: {{ ansible_default_ipv4.address }}, 系统: {{ ansible_distribution }} {{ ansible_distribution_version }}" EOF ;; "update_system") cat >> $WORKSPACE/ansible-playbooks/execute_task.yml << 'EOF' - name: 更新系统软件包 package: name: "*" state: latest when: ansible_pkg_mgr == 'yum' - name: 更新系统软件包(apt) apt: upgrade: dist update_cache: yes when: ansible_pkg_mgr == 'apt' EOF ;; "restart_service") cat >> $WORKSPACE/ansible-playbooks/execute_task.yml << 'EOF' - name: 重启服务 systemd: name: "{{ service_name }}" state: restarted enabled: yes register: result - name: 显示重启结果 debug: msg: "服务 {{ service_name }} 重启{{ '成功' if result.changed else '失败' }}" EOF ;; "custom_command") cat >> $WORKSPACE/ansible-playbooks/execute_task.yml << 'EOF' - name: 执行自定义命令 command: "{{ custom_cmd }}" register: cmd_result - name: 显示命令输出 debug: var: cmd_result.stdout_lines EOF ;; esac ![](https://i-blog.csdnimg.cn/direct/cd6667c26cd04c7fb72536f9f28069ab.png) 创建动态的 Ansible Playbook: #!/bin/bash # 创建临时 inventory 文件 cat > $WORKSPACE/inventory.ini << EOF [target_server] ${TARGET_IP} [target_server:vars] ansible_ssh_user=root ansible_ssh_private_key_file=/root/.ssh/id_rsa EOF # 显示 inventory 内容 echo "===== 生成的 Inventory 文件 =====" cat $WORKSPACE/inventory.ini echo "=================================" ![](https://i-blog.csdnimg.cn/direct/2892bb268f3a4cdeb6b7fd8637960863.png) 创建动态的 Inventory 文件 在 **"构建"** ​ 部分,再添加一个 **"执行shell"**​ 步骤: #!/bin/bash # 设置参数 export TARGET_IP="${TARGET_IP}" export TASK="${TASK_TO_RUN}" export SERVICE="${SERVICE_NAME}" export CMD="${CUSTOM_CMD}" echo "=============================================" echo "开始执行 Ansible 任务" echo "目标服务器: ${TARGET_IP}" echo "执行任务: ${TASK_TO_RUN}" echo "服务名称: ${SERVICE_NAME}" echo "自定义命令: ${CUSTOM_CMD}" echo "=============================================" # 执行 Ansible Playbook ansible-playbook \ -i $WORKSPACE/inventory.ini \ $WORKSPACE/ansible-playbooks/execute_task.yml \ --extra-vars "target_host=target_server service_name=${SERVICE_NAME} custom_cmd=${CUSTOM_CMD}" \ -v # 检查执行结果 if [ $? -eq 0 ]; then echo "✅ Ansible 任务执行成功!" else echo "❌ Ansible 任务执行失败!" exit 1 fi ![](https://i-blog.csdnimg.cn/direct/9ad402804eb54bd5be807940963bb172.png) 添加第三个 **"执行shell"**​ 步骤: ![](https://i-blog.csdnimg.cn/direct/4a2c1cbcede54f269b9f8a05665656d2.png) 测试任务 保存配置 点击页面底部的 **"保存"**​ 按钮 ![](https://i-blog.csdnimg.cn/direct/4960413ea0f54761bc71fc43033352a0.png) 执行构建 返回项目页面 点击左侧的 **"立即构建"** ![](https://i-blog.csdnimg.cn/direct/1650ea4849164a899cb51df46ce73cc6.png) ![](https://i-blog.csdnimg.cn/direct/9b189ee8b9404a4cac6708d7801b013f.png) 点击构建,之后成功 ![](https://i-blog.csdnimg.cn/direct/ba352c7a003d4740b9ed2bb389e072bb.png) ## 3.使用 Jenkins 2.528.2 和 GitLab 插件,基于 HTTP 和 SSH 协议配置一个自由风格任务,实现从 GitLab 仓库拉取代码并进行构建。 要实现从gitlab上拉取代码,首先我们需要安装一些插件 **Git Plugin** 作用:是 Jenkins 拉取 Git 仓库代码的基础插件,支持通过 HTTPS/SSH 方式克隆 Git 仓库。 ![](https://i-blog.csdnimg.cn/direct/fb58cc26e2c24632ac4620458b5ab1ec.png) **GitLab Plugin** 作用:实现 Jenkins 与 GitLab 的深度集成,支持: 从 GitLab 仓库拉取代码; 通过 GitLab WebHook 触发 Jenkins 自动构建; 向 GitLab 反馈构建状态(成功 / 失败)。 ![](https://i-blog.csdnimg.cn/direct/2c0d09725968481b8922ed78fa125f1e.png) #### 步骤一:创建 GitLab 个人访问令牌(HTTP 推荐,比密码安全) GitLab 网页端操作: 登录 GitLab → 右上角头像 →「Edit profile」→「Access Tokens」;![](https://i-blog.csdnimg.cn/direct/3af611be4ca7427189132c1fc917b6cd.png) 填写令牌信息: Name:`jenkins-http-token`(自定义); Expires at:可选设置过期时间; Scopes:勾选 `read_repository`(仅读仓库,最小权限原则); ![](https://i-blog.csdnimg.cn/direct/e633561dc52945d5900243dd0af17c50.png) 点击「Create personal access token」→ 复制生成的令牌 glpat-CRCpWN371fCr__CFqoB_IG86MQp1OjEH.01.0w1dh7k86 ![](https://i-blog.csdnimg.cn/direct/b130088e4aac4f33b65b2c574ca55386.png) #### 步骤 2:Jenkins 中创建自由风格任务 登录 Jenkins 后台 → 左侧「New Item」; 输入任务名称:`GitLab-HTTP-Pull`(自定义); 选择「Freestyle project」→ 点击「OK」。 ![](https://i-blog.csdnimg.cn/direct/68616eb20a6f4e2ebadd84fed3d53076.png) #### 步骤 3:配置任务的「源码管理」(核心:HTTP 拉取) 找到「Source Code Management」模块 → 勾选「Git」; 「Repository URL」:粘贴 GitLab 仓库的 HTTP 地址 ![](https://i-blog.csdnimg.cn/direct/72977b3f3ac04de9ba9f437eb4f63400.png) 「Credentials」(凭证): 点击右侧「Add」→ 选择「Jenkins」; 弹出的凭证配置框: Kind:选择「Username with password」; Username:填写 GitLab 登录用户名(如 `root`); Password:填写步骤 1 生成的「个人访问令牌」(或 GitLab 登录密码); ID:自定义(如 `gitlab-http-cred`),方便识别; Description:可选填写「GitLab HTTP 拉取凭证」; ![](https://i-blog.csdnimg.cn/direct/36567ba196a642b39636feea167662c8.png) 点击「Add」保存凭证 → 回到源码管理,在「Credentials」下拉框选择刚创建的凭证; ![](https://i-blog.csdnimg.cn/direct/98105cd8da3348c3a31a31437da94827.png) 「Branches to build」:默认 `*/main`(或 `*/master`,和 GitLab 仓库主分支一致)。 ![](https://i-blog.csdnimg.cn/direct/c809aff2f63b4134b5a0117900576a4e.png) #### 步骤 4:配置「构建步骤」(验证拉取 + 简单构建) 1.找到「Build Steps」模块 → 点击「Add build step」→ 选择「Execute shell」(Linux/Mac)/「Execute Windows batch command」(Windows); ![](https://i-blog.csdnimg.cn/direct/314470aca9644ea09f81dd02d6a2ca63.png) 2.在命令框中输入极简构建命令(验证代码拉取成功,并模拟构建): # 查看拉取的文件(验证代码是否拉取成功) ls -l cat test.py # 模拟简单构建(比如输出构建成功日志) echo "===== HTTP 协议拉取代码并构建成功 =====" ![](https://i-blog.csdnimg.cn/direct/ab333526328d49ad89e970c13d1af670.png) #### 步骤 5:保存并执行构建 点击页面底部「Save」保存任务; 回到任务主页 → 点击左侧「Build Now」(立即构建); ![](https://i-blog.csdnimg.cn/direct/6352a3e4f95a4785897ad38d851893c0.png) 等待构建完成(页面下方「Build History」会显示构建编号,如 #1)。 ![](https://i-blog.csdnimg.cn/direct/35b8dce1853f48cfab9a536c0a54a6c9.png) #### 步骤 6:验证构建结果 点击「Build History」中的构建编号(如 #1)→ 选择「Console Output」(控制台输出); 查看输出日志,能看到以下内容即成功:plaintext ![](https://i-blog.csdnimg.cn/direct/ba2e488a6c4f48b3943aac91c63e1204.png) ![](https://i-blog.csdnimg.cn/direct/fffe0ced12d1416b803b2f39de6f6b62.png) ## 4.编写一个 Jenkins Pipeline 脚本,实现以下功能:从 GitLab 拉取代码、编译代码、运行单元测试,并在测试通过后将构建结果部署到指定的服务器。 ### 一、前置准备(必做,决定实验成败) #### 1.1 安装 Jenkins 必需插件 登录 Jenkins → 「Manage Jenkins」→「Plugins」→「Available plugins」,安装以下插件: | 插件名称 | 作用 | |-------------------------------|-----------------------------| | Pipeline | 核心 Pipeline 支持 | | Pipeline: Nodes and Processes | 支持 Pipeline 执行 shell/SSH 命令 | | GitLab Plugin | 与 GitLab 集成,拉取代码 | | Maven Integration Plugin | 支持 Maven 编译 / 测试(Java 项目必需) | | Publish Over SSH | 通过 SSH 部署文件到目标服务器 | | JUnit Plugin | 解析单元测试报告,展示测试结果 | 安装后重启 Jenkins:`sudo systemctl restart jenkins`。 #### 1.2 配置 Jenkins 全局工具(JDK/Maven) Jenkins 编译 Java 代码需要 JDK 和 Maven,需提前配置: 1. 「Manage Jenkins」→「Global Tool Configuration」; 2. **JDK 配置** : * 点击「Add JDK」→ 取消「Install automatically」(若手动装了 JDK); * Name:`JDK21`(自定义,后续脚本要引用); * JAVA_HOME:填写 Jenkins 主机 JDK 路径(如 `/usr/lib/jvm/java-21-openjdk-amd64`);![](https://i-blog.csdnimg.cn/direct/e0e28c3b01f043b8a7ef408fc4e2ad6b.png) 3. **Maven 配置** : * 点击「Add Maven」→ 取消「Install automatically」; * Name:`Maven3.8.7`(自定义,后续脚本要引用); * MAVEN_HOME:填写 Maven 路径(如 `/usr/local/maven/apache-maven-3.8.7`);![](https://i-blog.csdnimg.cn/direct/52f40ef6613a49a1923d5cf765d896e3.png) 4. 点击「Save」保存。 #### 1.3 配置 Jenkins 凭证(3 类凭证) 「Manage Jenkins」→「Credentials」→「System」→「Global credentials (unrestricted)」→「Add Credentials」,添加以下 3 类凭证:![](https://i-blog.csdnimg.cn/direct/7d485817f47c43fab8fcd20cb27daf01.png) ##### (1)GitLab 拉取代码凭证(HTTP 方式) * Kind:`Username with password`; * Username:GitLab 用户名(如 `root`); * Password:GitLab 个人访问令牌(需勾选 `read_repository` 权限); * ID:`gitlab-http-creds`(自定义,脚本要引用); * Description:`GitLab拉取代码凭证`。![](https://i-blog.csdnimg.cn/direct/fc10c5ab426d42baa04aa4684a8f87e4.png) ##### (2)部署服务器 SSH 凭证(推送构建产物) * Kind:`SSH Username with private key`; * Username:部署服务器的登录用户名(如 `ubuntu`); * Private Key:粘贴 Jenkins 主机的私钥(或直接输入,推荐提前生成 Jenkins 到部署服务器的 SSH 免密); * ID:`deploy-server-ssh`(自定义,脚本要引用); * Description:`部署服务器SSH凭证`。![](https://i-blog.csdnimg.cn/direct/abe1edd3b2d34b69bdfdd6f36de1ec7c.png) #### 1.4 部署服务器准备 假设部署服务器 IP:`192.168.1.200`,需完成: 1. 创建部署目录,授权: ![](https://i-blog.csdnimg.cn/direct/ee7103a170a24c46b34ec30dc897fdbe.png) 2. 确保 Jenkins 主机能通过 SSH 连接部署服务器(配置免密更佳): ![](https://i-blog.csdnimg.cn/direct/a03ad48f66d2460391544824ef3e4732.png) #### 1.5 GitLab 仓库准备(上传带编译 / 测试的 Java 代码) ###### 步骤 1:在 GitLab 网页端创建新仓库(可选,也可命令行创建) 登录 GitLab(`http://10.0.0.100`)→ 「New Project」→ 填写: 1. Project name:`test-project-java21` 2. Visibility Level:Public/Private(选 Private)→ 点击「Create project」。![](https://i-blog.csdnimg.cn/direct/f5d4926a5d99488d95de5464aabb2ac4.png) ###### 步骤 2:在 GitLab 主机(10.0.0.100)创建 Maven 项目文件 克隆新建的空仓库到GitLab主机本地 ![](https://i-blog.csdnimg.cn/direct/5cffdcf041f64b3985514dc951214be8.png) 创建标准Maven目录结构(一键创建) ![](https://i-blog.csdnimg.cn/direct/b8634beb81e644d893150c4c4e58cdf5.png) 创建pom.xml(适配JDK21 + Maven3.8.7,极简配置) 4.0.0 com.demo test-project-java21 1.0-SNAPSHOT 21 21 UTF-8 5.10.1 org.junit.jupiter junit-jupiter-api ${junit.version} test org.junit.jupiter junit-jupiter-engine ${junit.version} test org.apache.maven.plugins maven-compiler-plugin 3.11.0 21 21 org.apache.maven.plugins maven-surefire-plugin 3.2.2 创建极简业务代码(src/main/java/com/demo/HelloDemo.java) package com.demo; /** * 极简业务代码(仅返回字符串,满足编译+测试需求) */ public class HelloDemo { // 核心方法:返回固定字符串 public String getMessage() { return "JDK21 + Maven3.8.7 测试成功"; } // 主方法(可选,方便本地测试) public static void main(String[] args) { HelloDemo demo = new HelloDemo(); System.out.println(demo.getMessage()); } } 创建极简单元测试代码 package com.demo; import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.assertEquals; /** * 极简单元测试(仅验证getMessage方法返回值) */ public class HelloDemoTest { @Test public void testMessage() { HelloDemo demo = new HelloDemo(); // 断言:返回值等于预期字符串 assertEquals("JDK21 + Maven3.8.7 测试成功", demo.getMessage()); } } ###### 步骤 3:提交并推送到 GitLab 新仓库 ![](https://i-blog.csdnimg.cn/direct/7505c3d1664e4f7cafbe7dbb2ef7abdb.png) ![](https://i-blog.csdnimg.cn/direct/dc7ec11d4dd94b4982d1ce951f8a5cea.png) ![](https://i-blog.csdnimg.cn/direct/bf183a16c20945e1a107ae3c30e231a0.png) ![](https://i-blog.csdnimg.cn/direct/4a1efb6f97f843939abad28d1620c468.png) ### 编写 Jenkins Pipeline 脚本 创建流水线任务 在**Pipeline模块**中写脚本 pipeline { agent any // 任意Jenkins节点执行 tools { // 关联全局配置的JDK和Maven(名称必须和全局配置一致) jdk 'JDK21' maven 'Maven3.8.7' } environment { // 专属变量(已适配你的环境) GITLAB_REPO_URL = 'http://10.0.0.100/root/test-project-java21.git' // GitLab新仓库地址 DEPLOY_SERVER_IP = '10.0.0.102' // 部署主机IP DEPLOY_DIR = '/opt/jenkins-deploy/test-project-java21' // 部署目录 GIT_CRED_ID = 'gitlab-http-cred' // GitLab凭证ID(需和你配置的一致) SSH_CRED_ID = 'deploy-server-ssh' // 部署服务器SSH凭证ID(需和你配置的一致) } stages { // 阶段1:拉取GitLab代码 stage('Checkout Code') { steps { echo "===== 开始拉取GitLab新仓库代码 =====" git( url: env.GITLAB_REPO_URL, credentialsId: env.GIT_CRED_ID, branch: 'main' // 若GitLab分支是master,改为master ) } } // 阶段2:编译代码 stage('Compile Code') { steps { echo "===== 开始编译JDK21代码 =====" sh 'mvn clean compile -U' } post { failure { echo "===== 代码编译失败,终止流程 =====" error('编译失败') } } } // 阶段3:运行单元测试 stage('Run Unit Tests') { steps { echo "===== 开始运行单元测试 =====" sh 'mvn test' } post { always { junit 'target/surefire-reports/*.xml' // 展示测试报告 } failure { echo "===== 单元测试失败,终止流程 =====" error('单元测试失败') } } } // 阶段4:部署到目标服务器 stage('Deploy to Server') { when { success() // 仅测试成功时部署 } steps { echo "===== 开始部署到服务器 ${env.DEPLOY_SERVER_IP} =====" // 打包生成JAR包 sh 'mvn package -DskipTests' // SSH推送JAR包到部署主机 sshPublisher( publishers: [ sshPublisherDesc( configName: env.SSH_CRED_ID, transfers: [ sshTransfer( sourceFiles: 'target/test-project-java21-1.0-SNAPSHOT.jar', remoteDirectory: env.DEPLOY_DIR, cleanRemote: false, flatten: true, removePrefix: 'target' ) ], // 部署后验证 postTransfer: [ sshCommand( command: "echo 'JAR包已部署到${env.DEPLOY_DIR}'", configName: env.SSH_CRED_ID, runInBackground: false ) ] ) ] ) // 验证部署结果 echo "===== 验证部署结果 =====" sh "ssh -o StrictHostKeyChecking=no ${env.DEPLOY_SERVER_IP} 'ls ${env.DEPLOY_DIR}/test-project-java21-1.0-SNAPSHOT.jar'" } post { success { echo "===== 部署成功!JAR包路径:${env.DEPLOY_SERVER_IP}:${env.DEPLOY_DIR} =====" } failure { echo "===== 部署失败 =====" error('部署失败') } } } } // 全局后置操作 post { always { echo "===== Pipeline流程执行完成 =====" } success { echo "===== 全流程成功:拉取→编译→测试→部署 =====" } failure { echo "===== 全流程失败,请检查日志 =====" } } } 保存 进行构建 构建成功但是不稳定 ![](https://i-blog.csdnimg.cn/direct/d13c3519af5349959eda1404d2f59d21.png) ![](https://i-blog.csdnimg.cn/direct/73d24f6c915f4486a356385d1776b039.png) **验证代码拉取 + 编译**: ![](https://i-blog.csdnimg.cn/direct/83d49a6251c94a488a4be983e576b910.png) 102也推送成功 ![](https://i-blog.csdnimg.cn/direct/88964a3305714d448c8080d3cae5caab.png) ## 5.配置 Jenkins 2.528.2 的分布式工作机制,使用 JNLP 协议设置一个远程 agent,实现基于 Docker 容器化构建 Java 项目。 ### 阶段 1:前置环境准备(主节点 + Agent 节点) #### 1.1 主节点(10.0.0.101)环境配置 ##### 1.1.1 安装必要插件 Jenkins 主节点→「Manage Jenkins」→「Plugins」→「Available plugins」,搜索并安装以下插件(需重启 Jenkins): * **Docker Plugin**:Docker 容器管理 * **Docker Pipeline**:Pipeline 中操作 Docker * **JNLP Agent Protocol**:JNLP 协议支持(Jenkins 2.528.2 默认自带,验证是否启用) * **Maven Integration Plugin**:Maven 构建支持 * **Publish Over SSH**(可选,保留部署功能) ##### 1.1.2 验证主节点 JDK/Maven 配置 「Manage Jenkins」→「Global Tool Configuration」: * JDK:名称`JDK21`,路径指向主节点 JDK21 安装目录(如`/usr/lib/jvm/java-21-openjdk-amd64`);![](https://i-blog.csdnimg.cn/direct/8f623b8a905d478588949d0d68aa798b.png) * Maven:名称`Maven 3.8.7`,路径指向 Maven 安装目录(如`/usr/share/maven`);![](https://i-blog.csdnimg.cn/direct/d0699557a75948e09f7d768de7bf528a.png) * Docker:无需配置,由 Agent 节点提供 Docker 环境。 #### Agent 节点(10.0.0.102)环境配置 安装 JDK21 ![](https://i-blog.csdnimg.cn/direct/5710d6f3e0b7496aad4f420f4cd62600.png) 安装 Docker + 配置权限 ![](https://i-blog.csdnimg.cn/direct/0affa862616543ccaf2b087cb7bc3a01.png) 安装 Docker Compose ![](https://i-blog.csdnimg.cn/direct/45d8c1e7045e4f779a817e37a8f33ac6.png) ### 阶段 2:Jenkins 主节点配置远程 Agent(JNLP 协议) #### 2.1 开启 JNLP 通信端口 「Manage Jenkins」→「Configure Global Security」: * 找到「Agents」区域: * 勾选「Enable security」; * 「TCP port for inbound agents」:选择「Fixed」,填写端口(如`50000`); * 「Agent protocols」:确保勾选「JNLP4-connect」(核心协议,Jenkins 2.528.2 推荐); * 点击「Save」保存。 #### 2.2 创建远程 Agent 节点 1. 「Manage Jenkins」→「Manage Nodes and Clouds」→「New Node」; 2. 节点配置: * **Node name** :`agent-102-docker`(自定义,标识 Agent 节点); * **Type** :选择「Permanent Agent」(永久节点);![](https://i-blog.csdnimg.cn/direct/4683ad2852e14276941390040a4c883e.png) * 点击「OK」进入详细配置: * **Number of executors** :填写`2`(并发构建数,根据 Agent 节点性能调整); * **Remote root directory** :`/home/jenkins/agent`(Agent 工作目录,需提前在 102 节点创建); * **Labels** :填写`docker java21`(标签,后续 Pipeline 通过标签指定该节点); * **Usage**:选择「Use this node as much as possible」; * **Launch method**:选择「Launch agent by connecting it to the master」(JNLP 方式,Agent 主动连接主节点); * **Availability** :选择「Keep this agent online as much as possible」;![](https://i-blog.csdnimg.cn/direct/6a7f504c5dbd4bd3a9460ee70a229ede.png) 3. 点击「Save」,进入 Agent 节点详情页,记录以下信息(后续 Agent 启动用): * **Secret**:Agent 连接密钥(页面显示「Agent secret」); * **Agent URL** :主节点地址 + JNLP 端口(如`http://10.0.0.101:8080`); * **Agent Jar 下载地址** :页面显示「Download agent.jar」(或主节点地址`http://10.0.0.101:8080/jnlpJars/agent.jar`)。 ### 阶段 3:Agent 节点(10.0.0.102)启动 JNLP Agent 准备 Agent 工作目录 ![](https://i-blog.csdnimg.cn/direct/520c5a620a704c24b78a8f11de9feea8.png) 下载 agent.jar 并启动 Agent ![](https://i-blog.csdnimg.cn/direct/23fc94732ed64376977ec2c8507bac0b.png) ![](https://i-blog.csdnimg.cn/direct/bc5ba3c703b64205bc4b3dfa40af9ba5.png) #### 3.3 验证 Agent 连接状态 * 主节点→「Manage Jenkins」→「Manage Nodes and Clouds」: * 节点`agent-102-docker`状态显示「Online」(绿色),说明连接成功; * 若显示「Offline」,检查防火墙(主节点 50000 端口是否开放)、Secret 是否正确 ![](https://i-blog.csdnimg.cn/direct/825c314fbbbd4d0e946f45f31bfe546b.png) #### 3.4 配置 Agent 后台运行 ![](https://i-blog.csdnimg.cn/direct/f98c81b490084f7786d7e52e71a8721f.png) ![](https://i-blog.csdnimg.cn/direct/b7a02dcf4efc46ffab727b2bc4637c38.png) ### 阶段 4:编写 Docker 容器化构建 Pipeline 脚本 #### 4.1 在 GitLab 仓库添加 Dockerfile(10.0.0.100) 进入`test-project-java21`仓库,添加`Dockerfile`(适配 Java21): ![](https://i-blog.csdnimg.cn/direct/904244eec4da414c88db29441e1cf88d.png) ![](https://i-blog.csdnimg.cn/direct/91d742039bbe4d998c2fbc166134e00c.png) #### 4.2 编写 Pipeline 脚本(指定 Agent 节点 + 容器化构建) 在 Jenkins 中创建新 Pipeline 任务(或修改原有任务),脚本如下 pipeline { // 指定Agent节点(通过标签匹配102节点) agent { node { label 'docker java21' // 匹配agent-102-docker的标签 } } tools { jdk 'JDK21' maven 'Maven 3.8.7' } environment { GITLAB_REPO_URL = 'http://10.0.0.100/root/test-project-java21.git' DOCKER_IMAGE_NAME = 'test-project-java21:v1.0' DEPLOY_DIR = '/opt/jenkins-deploy/test-project-java21' } stages { // 阶段1:拉取GitLab代码(Agent节点执行) stage('Checkout Code') { steps { echo "===== Agent节点拉取代码 =====" git( url: env.GITLAB_REPO_URL, credentialsId: 'gitlab-http-cred', branch: 'main' ) } } // 阶段2:Maven编译打包(Agent节点执行) stage('Maven Build') { steps { echo "===== Agent节点编译代码 =====" sh 'mvn clean package -DskipTests' } } // 阶段3:Docker构建镜像(Agent节点执行,利用本地Docker环境) stage('Docker Build') { steps { echo "===== Agent节点构建Docker镜像 =====" sh "docker build -t ${DOCKER_IMAGE_NAME} ." } } // 阶段4:Docker运行容器(部署到Agent节点) stage('Docker Run') { steps { echo "===== Agent节点启动容器 =====" // 停止旧容器(若存在) sh "docker rm -f test-project-java21 || true" // 启动新容器(挂载部署目录,方便查看文件) sh "docker run -d --name test-project-java21 -v ${DEPLOY_DIR}:/app/deploy ${DOCKER_IMAGE_NAME}" } } // 阶段5:验证容器运行 stage('Verify Container') { steps { echo "===== 验证容器状态 =====" sh "docker ps | grep test-project-java21" sh "docker exec test-project-java21 java -jar app.jar" // 执行容器内JAR包 } } } post { success { echo "===== 容器化构建部署成功! =====" echo "Docker镜像:${DOCKER_IMAGE_NAME}" echo "容器名称:test-project-java21" } failure { echo "===== 构建部署失败 =====" error('构建失败') } } } #### 5.1 执行 Pipeline 任务 * 点击「Build Now」,Jenkins 会将任务调度到`agent-102-docker`节点执行; * 查看 Console Output,确认各阶段: * 代码拉取:在 Agent 节点`/home/jenkins/agent/workspace/`目录; * Maven 构建:在 Agent 节点完成,生成 JAR 包; * Docker 构建:在 Agent 节点生成镜像; * 容器启动:在 Agent 节点运行容器。 #### 5.2 验证结果 1. Agent 节点(10.0.0.102)验证: # 查看Docker镜像 docker images | grep test-project-java21 # 查看运行中的容器 docker ps | grep test-project-java21 # 查看容器日志 docker logs test-project-java21 2. 验证容器内 JAR 包功能: docker exec test-project-java21 java -jar app.jar # 输出:JDK21 + Maven3.8.7 测试成功 ## 6.在 Linux 系统上安装 GitLab 18.5.2,完成备份操作后,模拟数据丢失场景,进行数据恢复,并验证恢复后的数据完整性。 首先我们要有一个项目 ![](https://i-blog.csdnimg.cn/direct/48164d0e34c4444bb4d06e16319e59ae.png) ![](https://i-blog.csdnimg.cn/direct/9dac0ec4deea4183a81bcecd5d0dd2eb.png) 在ctl执行备份命令 ![](https://i-blog.csdnimg.cn/direct/2dccf050daec4ba4b9d8b6f0718c72fd.png) 查看是否有备份文件生成 ![](https://i-blog.csdnimg.cn/direct/3e9a7391eb484fc585d74800f33f91ea.png) 模拟数据丢失场景,直接删除 ![](https://i-blog.csdnimg.cn/direct/266a6550515e47e5908e574b6cb0e456.png) 执行数据恢复操作 停止 GitLab 核心服务 ![](https://i-blog.csdnimg.cn/direct/358cbbd5f3cc449ba8f95531e012daab.png) 执行恢复命令 ![](https://i-blog.csdnimg.cn/direct/7e58b96dec8b4b78b802a306a83b810e.png) 重新启动后查看 ![](https://i-blog.csdnimg.cn/direct/92e6f3795f9d450e996c9c6bba69f889.png) ![](https://i-blog.csdnimg.cn/direct/47951632f0e941d1b8baa27eeb68b0c1.png) ![](https://i-blog.csdnimg.cn/direct/1f12cffa0bd742d7a24a7ec0543fde99.png) 登录网页查看:恢复成功 ![](https://i-blog.csdnimg.cn/direct/9984d0ba84a5431e870cc67002af3cf8.png) ## 7.配置 GitLab 的 HTTPS 安全设置,为 GitLab 服务器生成并安装 SSL 证书。同时,实现对 GitLab 用户的权限管理,包括创建用户组、分配角色和设置访问权限。 创建 GitLab 证书目录并赋予权限 ![](https://i-blog.csdnimg.cn/direct/428d590a70174da4bdd2f27b8df13b78.png) 生成私钥 ![](https://i-blog.csdnimg.cn/direct/d5f758ad723b47d0be9de79ff11051f3.png) 生成证书签名请求并填写信息 执行后会提示填写信息,核心填: # Common Name (e.g. server FQDN or YOUR name) → 输入GitLab服务器的IP(如192.168.1.100) # 其他信息(国家、组织等)可随意填写 ![](https://i-blog.csdnimg.cn/direct/654dedd0d6824d68ac2a0dfd0ca6a42b.png)生成证书 ![](https://i-blog.csdnimg.cn/direct/eb558b5d06cc418b9c9c47d522c9243d.png) 修正权限 ![](https://i-blog.csdnimg.cn/direct/612f755b5618410c949b27a99971adca.png) 配置 GitLab 启用 HTTPS 编辑 GitLab 核心配置文件 ![](https://i-blog.csdnimg.cn/direct/bd81088672e04d35ba64e9dfe560b328.png) 修改相关配置 ![](https://i-blog.csdnimg.cn/direct/d8924bc0a0134ba9a88511c6c9ada84f.png) 应用配置并重启 ![](https://i-blog.csdnimg.cn/direct/bdb146ce9ae54dad827383d840990d12.png) 在浏览器验证测试,因为是私人证书,不安全但是能访问 ![](https://i-blog.csdnimg.cn/direct/389296ffea39493c85c235dedb3d00e7.png) 二、GitLab 用户权限管理(用户组、角色、访问权限) 以**GitLab 管理员账号(初始 root 账号)** 操作,核心是 "创建用户组→创建用户→将用户加入组→给组分配仓库权限"。 (一)步骤 1:创建用户组 用户组用于统一管理多个用户的权限(避免单独分配)。 1. 登录 GitLab 后,点击顶部导航栏的`Groups` → `New group`; 2. 填写组信息: * `Group name`:输入组名(如`dev-team`,标识开发团队); * `Group URL`:自动生成(或自定义,如`dev-team`,作为组的访问路径); * `Visibility Level`:选择`Private`(仅组内成员可见,实验环境推荐);![](https://i-blog.csdnimg.cn/direct/7479b3e098494a2ca5f8a07f0e83927e.png) 3. 点击`Create group`完成创建。 (二)步骤 2:创建新用户 1. 点击顶部导航栏的`Admin`(扳手图标)→ `Users` → `New user`; 2. 填写用户信息(实验环境可填虚拟数据): * `Username`:用户名(如`user1`); * `Email`:邮箱(如`user1@example.com`,无需真实邮箱); * `Password`:设置密码(需符合复杂度:至少 8 位,含字母 / 数字 / 符号); * `Name`:用户全名(如`User One`); 3. 点击`Create user`完成创建。![](https://i-blog.csdnimg.cn/direct/7f4ac49510884705b3c8b7a6084d8efb.png)![](https://i-blog.csdnimg.cn/direct/28cbdfa2ab054a02a16f2a749c37d004.png) (三)步骤 3:将用户添加到用户组![](https://i-blog.csdnimg.cn/direct/e53ccb2168e141af9926dce09ec1fcfc.png) 1. 进入刚创建的用户组(如`dev-team`); 2. 点击左侧导航栏的`Members` → `Add members`; 3. 在`Select members or groups`输入框中搜索目标用户(如`user1`); 4. 选择`Access level`(用户组角色,核心权限说明): | 角色 | 核心权限 | |------------|----------------------------| | Owner | 组所有者:可管理组、添加 / 删除成员、修改组权限 | | Maintainer | 可管理组内项目、推送代码、创建分支 / 标签 | | Developer | 可推送代码、创建分支,但不能删除项目 / 修改组配置 | | Reporter | 只能查看项目、提交 Issue,不能推送代码 | | Guest | 只能查看公开项目内容,无提交 / 推送权限 | 5. 实验环境推荐选`Developer`,点击`Add to group`完成添加![](https://i-blog.csdnimg.cn/direct/724751c4e68c4a99b6ccf9225dce31b0.png) (四)步骤 4:为用户组分配仓库访问权限 将用户组关联到目标仓库(如之前的`test-project`),实现批量权限分配: 1. 进入目标仓库(`test-project`); 2. 点击左侧导航栏的`Settings` → `Members`; 3. 点击`Add group`; 4. 在`Select a group`输入框中搜索用户组(如`dev-team`); 5. 选择`Access level`(仓库角色,同用户组角色权限); 6. 点击`Invite group`完成权限分配。![](https://i-blog.csdnimg.cn/direct/aa4fa51f71fd43ae9ceafd9aab9e1b15.png) (五)步骤 5:验证权限生效 1. 退出管理员账号,用新用户(如`user1`)登录 GitLab; 2. 权限验证操作: * 若角色是`Developer`:尝试克隆`test-project`并推送新代码,能成功即权限生效; * 若角色是`Reporter`:尝试推送代码会提示 "权限不足",仅能查看仓库内容; 3. 切换不同角色(如将`user1`改为`Guest`),重复验证对应权限范围。 ## 8.在 Linux 系统上安装 Prometheus 3.5.0 和 Node Exporter 1.10.2,配置 Prometheus 以监控本地服务器的 CPU、内存和磁盘使用情况,并将监控数据存储到 Prometheus 数据库。 前期准备 确保安装依赖工具 ![](https://i-blog.csdnimg.cn/direct/392372196a9f42f3940fcb0fea1bf38e.png) 检查端口占用 ![](https://i-blog.csdnimg.cn/direct/19586d7a39d34f9885189c7cc9731800.png) 创建专用用户 ![](https://i-blog.csdnimg.cn/direct/2b33ccb5e04c452ea1b019ea5354a764.png) #### 下载 Prometheus 3.5.0 安装包 # 查看系统架构 arch # 输出x86_64则执行以下下载命令 wget https://github.com/prometheus/prometheus/releases/download/v3.5.0/prometheus-3.5.0.linux-amd64.tar.gz -P /tmp/ ![](https://i-blog.csdnimg.cn/direct/cdebe39c87334cdca258b82dcbfd1bbc.png) 解压并部署 解压 ![](https://i-blog.csdnimg.cn/direct/a7b819ed2eb9452089da74303266825c.png) 创建核心目录并移动 ![](https://i-blog.csdnimg.cn/direct/a7ec305203c04612801d7f9600d67cc4.png) 设置目录权限 ![](https://i-blog.csdnimg.cn/direct/c6938ddae61043319d9695dc9754de2e.png) 安装并下载Node Exporter 1.10.2 ![](https://i-blog.csdnimg.cn/direct/590b760aa652499aa4e2bdb65a82bcca.png) 解压并部署 ![](https://i-blog.csdnimg.cn/direct/d6b45eff84d0475bb850373fff3ef29a.png) sudo vim /etc/prometheus/prometheus.yml ![](https://i-blog.csdnimg.cn/direct/5d73acdf8772440d8cbbb3f44199e602.png) 验证配置的语法 ![](https://i-blog.csdnimg.cn/direct/605512a2340e4976bae2ebb3e0d42a68.png) 配置系统服务vim /etc/systemd/system/node_exporter.service ![](https://i-blog.csdnimg.cn/direct/e35a8309d8ce408b9606cb0874f221c8.png) 创建 Prometheus 系统服务文件(注意将注释换行) vim /etc/systemd/system/prometheus.service ![](https://i-blog.csdnimg.cn/direct/0bb55952400b491f9a728172d64ab592.png) 重载系统并设置开机自启动 ![](https://i-blog.csdnimg.cn/direct/7f55e0dd049d404eb6d1a0d8b9353db4.png) 查看状态 ![](https://i-blog.csdnimg.cn/direct/1c5d743f953f4682bcfba04fb91ae8d7.png) ![](https://i-blog.csdnimg.cn/direct/285409b6ef694cc4af40f58a5d7687e3.png) ### 验证 Prometheus 监控数据与存储 访问10.0.0.102:9090 ![](https://i-blog.csdnimg.cn/direct/92bbbae4f21e45fb8890a1aae7497945.png) #### 验证抓取目标(Node Exporter) 1. 点击 Web UI 顶部的`Status` → `Targets`; 2. 查看`node_exporter`任务的`State`列,显示`UP`(绿色),说明 Prometheus 已成功连接 Node Exporter; 3. 若显示`DOWN`,检查 Node Exporter 是否运行、9100 端口是否放行、`prometheus.yml`配置是否正确。![](https://i-blog.csdnimg.cn/direct/e2884efd86074464990b8032f8e2508e.png) #### 查询核心监控指标(CPU / 内存 / 磁盘) 在 Web UI 的`Expression`输入框中输入以下指标,点击`Execute`查询数据: | 监控指标 | 指标含义 | 查询表达式 | |----------|---------------|----------------------------------------------------------------------------------------------------------| | CPU 使用率 | 单核心 CPU 平均使用率 | `100 - (avg by (cpu) (irate(node_cpu_seconds_total{mode="idle"}[1m])) * 100)` | | 内存使用率 | 总内存使用率 | `100 - (node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes * 100)` | | 根目录磁盘使用率 | / 目录的磁盘使用率 | `100 - (node_filesystem_avail_bytes{mountpoint="/"} / node_filesystem_size_bytes{mountpoint="/"} * 100)` | | 磁盘 IO(读) | 每秒磁盘读字节数 | `irate(node_disk_read_bytes_total[1m])` | * 预期结果:查询后下方会显示 "图表" 和 "表格" 数据,有数值且随时间变化,说明指标采集与存储正常。 ![](https://i-blog.csdnimg.cn/direct/edaa5e5a197e4469b40e972dd460044d.png) ![](https://i-blog.csdnimg.cn/direct/48dffba910cf42d597c55635895d327a.png) ## 9.安装 Grafana 12.2.2,并将其与 Prometheus 集成。创建一个 Grafana 仪表板,展示 Node Exporter 收集的系统指标,包括 CPU 使用率、内存使用率、磁盘 I/O 等。 准备环境 ![](https://i-blog.csdnimg.cn/direct/e5ee2b38eba9418faede33940d20dc9d.png) 安装 apt install grafana=12.2.2 -y ![](https://i-blog.csdnimg.cn/direct/ac6212bf8f724d3abce60cc717e07acd.png) #### 配置 Grafana 服务 ![](https://i-blog.csdnimg.cn/direct/cfdb35c481a9430b828ed3c8e2f6c680.png) ### 二、访问 Grafana Web UI 并初始化 #### 步骤 1:登录 Grafana 在浏览器中输入:`http://你的服务器IP:3000`,进入 Grafana 登录页: * 初始账号:`admin` * 初始密码:`admin` 首次登录会提示 "修改初始密码",按提示设置新密码(记好新密码)。![](https://i-blog.csdnimg.cn/direct/77c28a4e07324786b6ccd2fd2463a454.png) ### 三、集成 Prometheus 数据源 Grafana 需关联 Prometheus(数据源)才能读取监控指标,步骤如下: #### 步骤 1:进入数据源配置页面 1. 登录 Grafana 后,点击左侧导航栏的**(Connections)** → 选择**Data Sources**; 2. 点击右上角**Add data source** 。![](https://i-blog.csdnimg.cn/direct/9f468d2947e24b919da8b4dea73df24a.png) #### 步骤 2:选择 Prometheus 数据源 在 "Search by name" 输入框中搜索 "Prometheus",点击**Prometheus**图标进入配置页。 #### 步骤 3:配置 Prometheus 连接信息 在配置页填写以下核心参数(同主机部署,参数简化): * **HTTP \> URL** :输入`http://localhost:9090`(Prometheus 默认地址);![](https://i-blog.csdnimg.cn/direct/932c12abdaff4256a013a39de307f816.png) * 其他参数保持默认,滚动到页面底部点击**Save \& test**。 若提示 "Data source is working",说明 Prometheus 与 Grafana 集成成功。![](https://i-blog.csdnimg.cn/direct/bb64a5b2a2ed4fc384c2c8fb14382a9e.png) ### 四、创建系统指标仪表板(导入 Node Exporter 模板) 手动创建 CPU、内存、磁盘 I/O 面板效率低,推荐使用 Grafana 官方的**Node Exporter Full**模板(ID:1860),该模板已包含所有 Node Exporter 采集的系统指标。 #### 步骤 1:导入仪表板模板 1. 点击右上方导航栏的**加号图标(+)** → 选择**Import**; 2. 在 "Import via [grafana.com](https://grafana.com/ "grafana.com")" 输入框中填写模板 ID:`1860`,点击**Load** 。![](https://i-blog.csdnimg.cn/direct/fd6d09cb50b44e5f83754c67a05b25c2.png) #### 步骤 2:关联 Prometheus 数据源 模板加载后,在 "Options" 区域: * 点击**Import**完成导入。 ### 五、验证仪表板数据(核心指标展示) 导入完成后,会自动进入 "Node Exporter Full" 仪表板,可看到以下系统指标面板(数据实时更新): #### 1. CPU 指标面板 * 显示**CPU 核心使用率**(每个 CPU 核心的负载); * 显示**CPU 平均负载**(1 分钟 / 5 分钟 / 15 分钟负载); * 显示**CPU 状态占比**(idle/used/system 等状态的时间占比)。 #### 2. 内存指标面板 * 显示**内存总容量 / 已用 / 可用**(以 GB 为单位); * 显示**内存使用率趋势图**; * 显示**Swap 内存使用情况**(若开启 Swap)。 #### 3. 磁盘指标面板 * 显示**磁盘总容量 / 已用 / 可用** (按挂载点分类,如`/`根目录); * 显示**磁盘 I/O 速率**(读 / 写字节数 / 秒); * 显示**磁盘 IOPS** (每秒读写操作数)。![](https://i-blog.csdnimg.cn/direct/829eafb46bf7426a952e22c173bd3983.png) ## 10.安装 SonarQube 9.9.8.100196 和 sonar-scanner 7.3.0.5189。配置 Jenkins 2.528.2 与 SonarQube 集成,实现对 Java 项目的代码扫描,分析代码质量并生成报告,展示代码中的漏洞、代码异味和测试覆盖率等指标 **前期准备** 安装适配的JDK17 ![](https://i-blog.csdnimg.cn/direct/c2b01e172a60424db846693d4d244618.png) 创建专属用户 ![](https://i-blog.csdnimg.cn/direct/283fff27cc504013b335847202dea26f.png) 调整系统内核参数 ![](https://i-blog.csdnimg.cn/direct/b557bb7d2a4f44fbbf37d5c4f3f471ba.png) ### 安装并配置 SonarQube 9.9.8.100196 创建专属目录 ![](https://i-blog.csdnimg.cn/direct/9d65d80606454b30802d32f8a72b3ca4.png) 下载 ![](https://i-blog.csdnimg.cn/direct/ab3d0630c38a4815a615aa02a6965bba.png) 解压 ![](https://i-blog.csdnimg.cn/direct/abb4d772b20f4676bfe3ddbfefd9551b.png) 重命名目录并赋予权限 ![](https://i-blog.csdnimg.cn/direct/17aba63bb37341c8abfeabb953cf7561.png) 配置系统服务vim /etc/systemd/system/sonarqube.service ![](https://i-blog.csdnimg.cn/direct/3377eecae0a54e60b99c69e9ba7d6c05.png) **启动 SonarQube 并设置开机自启** 登陆网站查看 ![](https://i-blog.csdnimg.cn/direct/d37a623ba39f4a1f916f3441b3c136b0.png) #### 2.6 验证 SonarQube Web UI 访问 在浏览器中输入:`http://服务器IP:9000`,等待页面加载完成: * 初始账号:`admin` * 初始密码:`admin`首次登录会提示修改初始密码,按提示设置新密码(记好新密码)。 ![](https://i-blog.csdnimg.cn/direct/6bf810195bfc4007811d666fdec5d348.png) ### SonarQube 初始化(生成访问令牌) Jenkins 集成 SonarQube 需要通过令牌认证,步骤如下: 1. 登录 SonarQube Web UI(`http://服务器IP:9000`); 2. 点击右上角头像 → **My Account** → **Security**; 3. 在 "Tokens" 区域,填写: * **Token Name**:jenkins-token(自定义名称); * **Expires In** :留空(永久有效,实验环境);![](https://i-blog.csdnimg.cn/direct/afcf76bf73d24669947644a75ea1f18a.png) 4. 点击**Generate**生成令牌; 5. 复制生成的令牌(如`sqp_xxxxxxxxxxxxxxxxxxxx`),保存到本地(仅显示一次,丢失需重新生成)。![](https://i-blog.csdnimg.cn/direct/60cafa7e818749bcae5cecfe76e8bdb4.png) *** ** * ** *** ### Jenkins 集成 SonarQube 配置 #### 安装 SonarQube Scanner 插件 1. 登录 Jenkins Web UI(`http://服务器IP:8080`); 2. 点击左侧**Manage Jenkins** → **Plugins** → **Available plugins**; 3. 在搜索框中输入 "SonarQube Scanner",勾选插件; 4. 点击**Install without restart**(安装完成后建议重启 Jenkins); 5. 验证插件:安装完成后,进入**Manage Jenkins** → **Plugins** → **Installed plugins** ,搜索 "SonarQube Scanner",确认状态为 "Installed"。![](https://i-blog.csdnimg.cn/direct/1d5a19d3ef3e4f5c91daa267527ec870.png) #### 配置 Jenkins 关联 SonarQube 服务器 1. 进入 Jenkins → **Manage Jenkins** → **System**; 2. 滚动到 "SonarQube servers" 区域,点击**Add SonarQube** ;![](https://i-blog.csdnimg.cn/direct/88a874bc8c5c45748a9543b2531bad4c.png) 3. 配置参数: * **Name**:SonarQube-9.9.8; * **Server URL** :`http://服务器IP:9000`(SonarQube 地址); * **Server Authentication Token** :点击**Add** → 选择 "Jenkins" 凭证类型: * **Kind**:Secret text; * **Secret**:粘贴步骤四生成的 SonarQube 令牌; * **ID**:sonarqube-token(自定义 ID); * **Description**:SonarQube Jenkins Token; * 点击**Add**保存凭证,然后在下拉框中选择该凭证; 4. 点击**Apply** → **Save** 保存配置。![](https://i-blog.csdnimg.cn/direct/68c8e129e8cb45289dd0691b24c5199a.png) #### 准备 Java 测试项目 # 拉取Maven示例项目到Jenkins工作目录 sudo git clone https://github.com/SonarSource/sonar-scanning-examples.git /var/lib/jenkins/workspace/sonar-java-maven # 赋予Jenkins用户权限 sudo chown -R jenkins:jenkins /var/lib/jenkins/workspace/sonar-java-maven ![](https://i-blog.csdnimg.cn/direct/95109730208245f4b3e8a467a62bfbfd.png) ##### 创建 Jenkins 任务 1. 登录 Jenkins → 左侧「New Item」→ 输入项目名(如 sonar-java-scan-no-scanner)→ 选择「Freestyle project」→「OK」; 2. 配置源码(可选,若已手动拉取可跳过): * 「Source Code Management」→ 选择 Git → Repository URL:`https://github.com/SonarSource/sonar-scanning-examples.git`; * 「Branches to build」:`*/master`; ![](https://i-blog.csdnimg.cn/direct/eb295c845f664618bfecbcb586f0abec.png) 配置构建步骤(核心:调用 Jenkins 插件的扫描能力): * 滚动到「Build」→ 点击「Add build step」→ 选择「Invoke top-level Maven targets」; * 配置 Maven 参数(直接调用 SonarQube 扫描): * 「Goals」:填写 `clean verify sonar:sonar`; * 「Properties」:填写(替换为你的 SonarQube 地址和令牌): sonar.host.url=http://10.0.0.101:9000 sonar.login=sqa_93c70096615a2950aa3f50815a67ae2b55aea919 sonar.projectKey=jenkins-java-demo-no-scanner sonar.projectName=Jenkins-Java-Demo-No-Scanner sonar.java.source=11 sonar.java.target=11 ##### 执行 Jenkins 构建,完成扫描 1. 点击任务左侧「Build Now」→ 等待构建完成(状态为 SUCCESS); 2. 查看构建日志:点击构建记录(如 #1)→「Console Output」,确认日志中有 "SonarQube analysis finished: SUCCESS"。 ##### 验证实验效果(SonarQube 查看报告) 1. 登录 SonarQube Web UI(`http://10.0.0.101:9000`); 2. 首页会显示新项目「Jenkins-Java-Demo-No-Scanner」,点击进入: * 查看「Vulnerabilities」(漏洞):如 SQL 注入、空指针等; * 查看「Code Smells」(代码异味):如冗余代码、格式不规范; * 查看「Coverage」(测试覆盖率):示例项目自带测试代码,会显示覆盖率数值; * 查看「Duplications」(代码重复率)、「Metrics」(代码复杂度)等指标。

相关推荐
Leinwin8 小时前
OpenClaw 多 Agent 协作框架的并发限制与企业化规避方案痛点直击
java·运维·数据库
2401_865382508 小时前
信息化项目运维与运营的区别
运维·运营·信息化项目·政务信息化
漠北的哈士奇8 小时前
VMware Workstation导入ova文件时出现闪退但是没有报错信息
运维·vmware·虚拟机·闪退·ova
如意.7598 小时前
【Linux开发工具实战】Git、GDB与CGDB从入门到精通
linux·运维·git
运维小欣9 小时前
智能体选型实战指南
运维·人工智能
yy55279 小时前
Nginx 性能优化与监控
运维·nginx·性能优化
爱吃土豆的马铃薯ㅤㅤㅤㅤㅤㅤㅤㅤㅤ10 小时前
Linux 查询某进程文件所在路径 命令
linux·运维·服务器
05大叔11 小时前
网络基础知识 域名,JSON格式,AI基础
运维·服务器·网络
安当加密11 小时前
无需改 PAM!轻量级 RADIUS + ASP身份认证系统 实现 Linux 登录双因子认证
linux·运维·服务器
dashizhi201511 小时前
服务器共享禁止保存到本地磁盘、共享文件禁止另存为本地磁盘、移动硬盘等
运维·网络·stm32·安全·电脑