Jenkins 部署与 SonarQube 代码质量平台搭建

公司内网环境要搭一套 CI,外网源一律不通,所有安装包都得先下载好再传进去。这种”离线两件套”(Jenkins + SonarQube)我装过两遍:第一遍边查文档边试,踩了权限和字体两个坑;第二遍顺手多了,这篇把完整流程整理出来。

一、为什么是 Jenkins

Jenkins 是基于 Java 的开源持续集成工具,监控持续重复的工作——拉代码、编译、测试、打包、部署,把这些动作从”人肉按顺序敲”变成”点一下按钮”。

它的定位是调度中心:自己不做具体的事,靠插件和脚本串联起 GitLab、SonarQube、构建机、部署目标。这也是它装完之后第一件事是装插件的原因。

二、部署:从 JDK 到启动

Jenkins 2.4xx 之后的版本需要 JDK 11 以上,我用的 JDK 17。

1
2
3
4
5
6
7
# 1. 安装 JDK
rpm -ivh jdk-17_linux-x64_bin.rpm
java -version
rpm -qa | grep jdk # 确认装上了,输出 jdk-17-17.0.11-7.x86_64

# 2. 安装 Jenkins(官网下载 rpm 后上传内网)
rpm -ivh jenkins-2.405-1.1.noarch.rpm

安装完先别急启动,有两个配置要改:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 3. 调整端口与启动用户
# 改端口(默认 8080,和别的服务冲突时改掉)
sed -i 's/JENKINS_PORT=".*"/JENKINS_PORT="8082"/' /etc/sysconfig/jenkins

# 改启动用户:/etc/sysconfig/jenkins 里确认 JENKINS_USER="root"
# 同时改 systemd 单元里的 User/Group,两处必须一致
vim /usr/lib/systemd/system/jenkins.service
# User=root
# Group=root
systemctl daemon-reload

# 4. 安装字体(生成构建报告、图表时要用,不装会出方块乱码)
yum -y install fontconfig

# 5. 启动并设为开机自启
systemctl start jenkins
systemctl enable jenkins

这里有个我踩过的坑:只改了 JENKINS_USER 没改 systemd 单元里的 User=,结果服务表面启动成功,但工作目录还是落在旧用户家目录,构建产物找不到。两个地方都改、然后 daemon-reload,缺一不可。

三、初始化与插件离线安装

启动后用浏览器访问 http://10.0.8.201:8082,第一步是解锁,初始密码在:

1
cat /var/lib/jenkins/secrets/initialAdminPassword

解锁后按向导创建管理员账号。用默认账号 admin 改完密码会要求重新登录,属正常流程。

内网环境装插件是另一个坎:在线插件市场连不上,只能用离线包。

1
2
3
4
5
6
7
# 手动插件包:上传压缩包到 Jenkins 家目录,解压进 plugins 目录
cd /var/lib/jenkins/
# 上传 jenkins_plugins.tar.gz(约 250MB,内网离线包)
tar xf jenkins_plugins.tar.gz -C plugins/

# 重启生效
systemctl restart jenkins

离线包是提前在外网环境按”要用的插件清单”装好整套目录打包的。注意插件之间有依赖,一个个单独下很容易漏依赖,直接整目录打包最稳。

四、第一个测试项目:看懂 workspace

创建第一个自由风格项目,构建步骤里执行 pwd,就能看到 Jenkins 的工作目录机制:

1
2
3
# 项目构建一次后,看看工作目录
ls /var/lib/jenkins/workspace/
# 输出里出现以项目名命名的目录,比如 test_job

规则很简单:每个项目在 /var/lib/jenkins/workspace/ 下有自己的目录,代码、构建产物都在里面。后面”Jenkins 拉取 GitLab 代码”就是把仓库内容拉到这个目录里,理解了这个目录,后面所有构建问题都有了排查起点。

五、SonarQube:代码质量检测平台

CI 光跑通还不够,还得有人管代码质量。SonarQube 就是干这个的:扫描代码,标出 bug、漏洞、坏味道。部署前先看要求:

  • 基于 Java,这个版本需要 JDK 8;
  • 依赖 MySQL,5.6 以上;
  • 小型实例至少 4G 内存,团队用建议 8G 起。

服务端部署

1
2
3
4
5
6
7
8
9
10
# 1. 运行环境
rpm -ivh jdk-8u181-linux-x64.rpm

# 2. 数据库(用官方源装 MySQL)
yum -y install mysql-community-server
systemctl start mysqld
# 设置 root 密码
mysqladmin -uroot password 'Sonar@2024'
# 创建 sonar 库,字符集 utf8
mysql -uroot -p'Sonar@2024' -e "CREATE DATABASE sonar DEFAULT CHARACTER SET utf8;"
1
2
3
4
5
6
7
8
9
10
11
12
13
# 3. 安装 SonarQube
cd /usr/local/
unzip sonarqube-7.0.zip
ln -s sonarqube-7.0 sonarqube # 软链接方便升级切换

# 4. 替换插件(离线包,删掉自带的)
rm -rf /usr/local/sonarqube/extensions/plugins/*
tar xf sonar_plugins.tar.gz -C /tmp/sonar_plugins/
mv /tmp/sonar_plugins/plugins/* /usr/local/sonarqube/extensions/plugins/

# 5. 创建专用运行用户并授权
useradd sonar
chown -R sonar:sonar /usr/local/sonarqube/
1
2
3
4
# 6. 配置数据库连接:/usr/local/sonarqube/conf/sonar.properties
sonar.jdbc.username=root
sonar.jdbc.password=Sonar@2024
sonar.jdbc.url=jdbc:mysql://localhost:3306/sonar?useUnicode=true&characterEncoding=utf8&useSSL=false
1
2
# 7. 启动(SonarQube 不允许 root 运行,必须普通用户)
su - sonar -c "/usr/local/sonarqube/bin/linux-x86-64/sonar.sh start"

“不能用 root 启动”这条要特别记住,我第一次直接 root 跑,日志里一句含糊的报错,查了半天才定位到是启动用户的问题。生产上这类中间件都应该建专用账号跑。

启动后访问 http://10.0.8.203:9000,默认账号密码都是 admin,第一次登录强制改密码。然后去”我的账号 → 安全”生成一个 Token——Token 只显示一次,当场复制保存,扫描客户端要用它认证。

扫描客户端:sonar-scanner

sonar-scanner 装在 Jenkins 服务器上,让它能主动把代码推给 SonarQube 扫描:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 1. 解压并做软链接
cd /usr/local/
unzip sonar-scanner-cli-4.2.0.1873-linux.zip
ln -s sonar-scanner-4.2.0.1873-linux sonar

# 2. 加入 PATH(写进 /etc/profile 永久生效)
echo 'export PATH="$PATH:/usr/local/sonar/bin/"' >> /etc/profile
source /etc/profile

# 3. 拿一个项目试扫:进到代码目录执行
cd /var/lib/jenkins/workspace/game_job/
sonar-scanner \
-Dsonar.projectKey=html \
-Dsonar.sources=. \
-Dsonar.host.url=http://10.0.8.203:9000 \
-Dsonar.login=<你的Token>

执行完去 SonarQube 的”项目”页面就能看到这次扫描的结果。到这一步,Jenkins 和 SonarQube 还是两个独立的系统,后面把它们串进同一条流水线,才算完整的质量门禁。

收尾

这套平台搭建的核心经验其实就三条:内网环境提前备好离线安装包、启动用户和权限按规矩配、SonarQube 这类组件用专用账号运行。装完只是开始,让它稳定跑在生产上,靠的是后面插件管理和流水线的持续维护。