0 实验环境
服务器 | IP |
---|---|
Jenkins服务器 | 192.168.1.155 |
Gitlab服务器 | 192.168.3.159 |
Sonarqube服务器 | 192.168.1.151 |
1 Docker安装SonarQube
- 在宿主机上新建目录,挂载docker数据卷
# 进入数据卷的目录
cd /home/jenkins/docker_volume
# 新建文件夹
mkdir postgresql sonarqube
cd sonarqube
mkdir data extensions logs
复制代码
- docker启动postgresql数据库
# 拉取postgresql数据库镜像
docker pull postgres
# 进入数据卷
cd /home/jenkins/docker_volume
# 启动一个postgressql的实例 创建sonar数据库
docker run -itd --name postgresql -e POSTGRES_USER=sonar -e POSTGRES_PASSWORD=sonar -p 5432:5432 -v $PWD/postgresql:/var/lib/postgresql/data postgres
复制代码
- 编辑/etc/sysctl.conf,设置vm.max_map_count=262144,执行sysctl -p
- docker启动sonarqube镜像,使用-v参数映射数据卷,实现数据持久化
# 拉取sonarqube镜像
docker pull sonarqube
# 启动sonarqube
docker run -itd --name sonarqube -p 9000:9000 --link postgresql:db \
-e SONARQUBE_JDBC_USERNAME=sonar -e SONARQUBE_JDBC_PASSWORD=sonar -e SONARQUBE_JDBC_URL=jdbc:postgresql://db:5432/sonar \
-v $PWD/sonarqube/data:/opt/sonarqube/data -v $PWD/sonarqube/extensions:/opt/sonarqube/extensions -v $PWD/sonarqube/logs:/opt/sonarqube/logs sonarqube
复制代码
2 Sonar Scanner配置
配置/etc/profile
export SONAR_HOME=/home/software/sonar-scanner
export PATH=$PATH:$SONAR_HOME/bin
复制代码
source /etc/profile 使之生效
3 pipeline添加自动化代码扫描
3.1 配置Java语言
这里使用的SonarQube是8.9版本的,不需要额外安装Java的插件,点击配置 > 通用配置 > 语言 > 选择Java
3.2 编写pipeline
在共享库中编写sonarqube.groovy
package org.devops
// scan
def SonarScan(projectName, projectDesc, projectPath) {
def sonarHome = "/home/software/sonar-scanner"
def sonarServer = "http://192.168.1.151:9000/"
def sonarDate = sh returnStdout: true, script: 'date +%Y%m%d%H%M%S'
sonarDate = sonarDate - "\n"
sh """
${sonarHome}/bin/sonar-scanner -Dsonar.host.url="${sonarServer}" \
-Dsonar.projectKey=${projectName} \
-Dsonar.login=admin \
-Dsonar.password=123456 \
-Dsonar.projectName=${projectName} \
-Dsonar.projectVersion=${sonarDate} \
-Dsonar.ws.timeout=30 \
-Dsonar.projectDescription=${projectDesc} \
-Dsonar.sources=${projectPath} \
-Dsonar.sourceEncoding=UTF-8 \
-Dsonar.java.binaries=target/classes \
-Dsonar.java.test.binaries=target/test-classes \
-Dsonar.java.surefire.report=target/surefire-reports
"""
}
复制代码
在jenkinsfile中增加一个新的阶段,命名为QA,调用共享库中定义的方法。
stage("QA") {
steps {
script {
tools.PrintMes('代码扫描', "green")
sonar.SonarScan("${JOB_NAME}","${JOB_NAME}","src")
}
}
}
复制代码
3.3 执行pipeline
流水线执行成功:
QA成功的效果:
添加一句不符合sonarlint规范的语句,测试sonarqube的代码扫描效果
// 测试一下Sonarqube质量扫描
private final String message = "test sonarqube";
复制代码
3.4 遇到的问题
Jenkins shell执行sonar-scanner提示命令存在的问题
原因:jenkins编译项目,不继承linux环境变量 ~/.bash_profile ~/.bashrc /etc/profile,导致在执行shell脚本,提示命令找不到!
解决方法:在服务器执行ln -sv /home/software/sonar-scanner/bin/sonar-scanner /usr/local/bin/sonar-scanner
几台服务器IP互相ping通的问题
这个问题还不知道原因是什么,有些IP不能实现3者互相ping通(偶尔能ping通,偶尔不能ping通),防火墙也都关了,都在同一网段,最后改了好几次IP,才互相可以ping通。
4 优化pipeline
安装Jenkins的插件SonarQube Scanner
在SonarQube上生成Jenkins使用的令牌:我的账号 > 安全 > 令牌
在Jenkins上配置SonarQube的信息,这里配置的name之后需要在写pipeline的时候使用。
使用Jenkins插件执行QA,Jenkins项目管理页面会显示QA的结果,还会在执行的流水线项旁边加一个SonarQube的图标,链接到SonarQube中可以直接查看结果。