一. Linux服务器搭建sonar
https://www.digitalocean.com/community/tutorials/how-to-ensure-code-quality-with-sonarqube-on-ubuntu-16-04
官网下载sonar的zip包
我是mac本地以前下好的,也可以在服务器上从官网直接获取:
sudo wget https://sonarsource.bintray.com/Distribution/sonarqube/sonarqube-7.0.zip
从本地scp到服务器/home/hehetc/software/sonar目录下,并解压到/opt/sonar目录下:
scp sonarqube-7.1.zip [email protected]:/home/hehetc/software/sonar
要解压,需下载zip:sudo apt-get install unzip
配置环境变量
把sonar安装目录(到/bin)加入环境变量
这里加入hehetc这个用户的.bashrc
vi ~/.bashrc
最后面加上:
SONAR_HOME=/opt/sonar/sonarqube-7.1
SONAR_SCANNER_HOME=/opt/sonar/sonar-scanner-4.0.0.1744-linux
export PATH=$PATH:$SONAR_HOME/bin:$SONAR_SCANNER_HOME/bin
这里已经把后面sonar-scanner的也加了
改完后source ~/.bashrc
配置sonar的配置文件
配置文件:/opt/sonar/sonarqube-7.1/conf/sonar.properties
主要配置数据库地址、用户名、密码
SonarQube server配置服务
创建一个文件: sudo vi /etc/systemd/system/sonarqube.service
文件内容:
[Unit]
Description=SonarQube service
After=syslog.target network.target
[Service]
Type=forking
ExecStart=/opt/sonar/sonarqube-7.1/bin/linux-x86-64/sonar.sh start
ExecStop=/opt/sonar/sonarqube-7.1/bin/linux-x86-64/sonar.sh stop
User=sonarqube
Group=sonarqube
Restart=always
[Install]
WantedBy=multi-user.target
作为服务启动
创建非root系统用户
Linux系统中创建一个sonarqube用户,来运行SonarQube services
sudo adduser --system --no-create-home--group --disabled-loginsonarqube
让新建的sonarqube用户拥有我们安装目录的权限:
sudo chown -Rsonarqube:sonarqube/opt/sonar
mysql中建sonar数据库
mysql -u root -p
CREATE DATABASE sonarqube;
EXIT;
创建一个mysql用户,用于sonar来访问,并赋予sonarqube库下的权限(可修改数据):
CREATE USER sonarqube@'localhost'IDENTIFIED BY'sonarqube';
GRANT ALL ON sonarqube.* to sonarqube@'localhost';
这里我设置用户名密码都是sonarqube
FLUSH PRIVILEGES;
EXIT;
启动sonar
sudo service sonarqube start
看状态:service sonarqube status
登陆sonar
http://47.93.250.185:9000/
登陆默认用户名密码都是admin
初次登陆:
hehetc: e1914d433997e40b4d0ebfe0db75f13a622bf6e9
登陆后菜单会多出administration。在market下搜索Chinese Pack安装中文包。
新建用户:新建了hehetc用户密码yc123456
生成了令牌:hehetc:a5ef52df04c1df7c7b7744ab72bd8e7114cb097c
配置权限:设为必须登陆才能访问
二. 安装并运行sonar-scanner
下载解压
下载安装包解压到sonar同一个目录即可:
hehetc@iZ2zefiv0zhc0j39v6bod6Z:/opt/sonar$ ls
__MACOSX sonarqube-7.1 sonar-scanner-4.0.0.1744-linux
配置环境变量
见sonar配置环境变量,已配置好
修改配置文件
修改conf/sonar-scanner.properties,配上sonar地址:
cd /opt/sonar/sonar-scanner-4.0.0.1744-linux/conf
sudo vi sonar-scanner.properties
#----- Default SonarQube server
sonar.host.url=http://localhost:9000
#----- Default source code encoding
#sonar.sourceEncoding=UTF-8
这里都在一台服务器上,localhost即可
sudo chmod +x sonar-scanner-3.0.3.778-linux/bin/sonar-scanner
建立命令链接
把sonar-scanner安装目录下的bin目录和系统命令bin目录链接起来,以便无前缀随处都可使用命令
sudo ln -s /opt/sonar/sonar-scanner-3.0.3.778-linux/bin/sonar-scanner/usr/local/bin/sonar-scanner
此时应该可以sonar-scanner –h看到结果了
运行sonar-scanner
在/home/hehetc/sonar-scanner-workspace目录下新建了这个workspace。在里面下载一个sonar的示例工程:
wget https://github.com/SonarSource/sonar-scanning-examples/archive/master.zip
解压:
unzip master.zip
rm master.zip
cdsonar-scanning-examples-master/sonarqube-scanner
命令行直接调用sonar-scanner
运行命令:
sonar-scanner -D
sonar.login=your_token_here (网页中生成的hehetc的token)
访问sonar页面,可看到扫描结果了:
Jenkins中集成sonar
https://www.jianshu.com/p/b35674bd2fad
Jenkins中下载sonarqube-scanner 插件
Jenkins系统配置:配置sonar服务器
token是提前新建好的访问sonar的token(在sonar页面为用户名生成的)
sonar中的token:
maven配置settings.xml
主要是配置sonar数据库和服务器地址
进入服务器上maven安装位置,vi setting.xml
找到服务器maven安装目录:mvn –v可以看到
复制setting配置文件到用户自己目录下,这样改了不会影响全局(修改自己的也不要sudo):
cp /usr/share/maven/conf/settings.xml
~/.m2/settings.xml
分别把标黄部分加到对应标签下(注意看setting文件中是否已经放开了这俩标签,放开的话,必须放进去,不能直接复制到末尾,否则会重复):
修改maven工程的pom文件
这里我直接到github上meeting-server这个springboot工程的pom文件里修改了:
添加一个sonar依赖,用于下载sonar的maven插件。
jenkins中配置sonar服务器
系统管理-系统设置:
token用在sonar的web页面中生成的token
建一个jenkins job
构建步骤:调用顶层maven目标
sonar:sonar-Dsonar.java.binaries=target/sonar -Dmaven.test.skip=true
发现报错:
经查错,发现是因为sonar web中配置了不允许非登陆访问。放开之后就好了。
另一种办法是,在maven的setting文件配置中加上sonar登陆的用户名密码:
Jenkins中配置sonar-scanner
目前部门前端扫描才需要sonar-scanner
在系统管理-全局工具配置(注意不在系统配置)
把服务器上装sonar-scanner的目录配上:/opt/sonar/sonar-scanner-4.0.0.1744-linux
使用sonar-scanner插件扫描job
创建一个自由风格的项目:配置构建,选sonar scanner插件
其中sonar.projectKey对应工程pom文件里的tool
sonar.projectName是sonar里显示的名称,改为了tool-for-show,下面sonar里显示的就变了。
pipeline job中加sonar
创建一个pipeline job:
脚本:
pipeline1
pipeline{
agent any
// tools{
// maven 'maven-3.6.0'
// }
stages{
stage('Build'){
steps{
checkout([$class: 'GitSCM',branches: [[name: '*/master']], doGenerateSubmoduleConfigurations: false,extensions: [], submoduleCfg: [], userRemoteConfigs: [[credentialsId: '22fb3725-0e8c-4619-94d8-2b05a0af0369',url: 'https://github.com/hehetc/meeting-server.git']]])
sh ' mvn clean install'
}
}
stage('SonarCheck'){
steps{
sh ' mvnorg.codehaus.mojo:sonar-maven-plugin:3.6.0.1398:sonar-DprojectName="project-name" -U '
}
}
}
credentialsId: 填入的是jenkins 系统配置里的github的credentialID
pipeline2:
pipeline{
agent any
// tools{
// maven 'maven-3.6.0'
// }
stages{
stage('Build'){
steps{
checkout([$class: 'GitSCM',branches: [[name: '*/master']], doGenerateSubmoduleConfigurations: false,extensions: [], submoduleCfg: [], userRemoteConfigs: [[credentialsId:'22fb3725-0e8c-4619-94d8-2b05a0af0369', url:'https://github.com/hehetc/meeting-server.git']]])
sh ' mvn clean compile'
}
}
stage('SonarCheck'){
steps{
echo "starting codeAnalyzewith SonarQube......"
withSonarQubeEnv('sonarqube7.1'){
sh "mvnsonar:sonar"
}
}
}
}
withSonarQubeEvn里面填的是jenkins系统配置里sonar服务器名称,主要用于有多个sonar服务器时指定一个。
看日志每一步做了什么:
maven clean compile:
Building tool 0.0.1-SNAPSHOT
[INFO] Deleting/var/lib/jenkins/workspace/pipeline-sonar/target
[INFO] Compiling 8 source files to/var/lib/jenkins/workspace/pipeline-sonar/target/classes
mvn sonar:sonar
sonar-maven-plugin:3.6.0.1398:sonar
[INFO] Base dir: /var/lib/jenkins/workspace/pipeline-sonar[INFO] Working dir: /var/lib/jenkins/workspace/pipeline-sonar/target/sonar
pipeline3——加入质量门:
pipeline{
agent any
// tools{
// maven 'maven-3.6.0'
// }
stages{
stage('Build'){
steps{
checkout([$class: 'GitSCM',branches: [[name: '*/master']], doGenerateSubmoduleConfigurations: false,extensions: [], submoduleCfg: [], userRemoteConfigs: [[credentialsId:'22fb3725-0e8c-4619-94d8-2b05a0af0369', url: 'https://github.com/hehetc/meeting-server.git']]])
sh ' mvn clean compile'
}
}
stage('SonarCheck'){
steps{
echo "starting codeAnalyzewith SonarQube......"
withSonarQubeEnv('sonarqube7.1'){
sh "mvnsonar:sonar"
}
script {
timeout(10) {
//利用sonar
webhook功能通知pipeline代码检测结果,未通过质量阈,pipeline将会fail
def qg =waitForQualityGate()
if (qg.status != 'OK'){
error "未通过Sonarqube的代码质量阈检查,请及时修改!failure: ${qg.status}"
}
}
}
}
}
}
}
目前还没有配置质量门,所以是通过了的。
在sonar中加入质量门:
此时再运行,报错质量门未通过:
修改质量门为警告不通过,但还没达到error,则日志里failure:qg.status显示为warn。
*47.93.250.185服务器上的jenkins
home:/var/lib/Jenkins
进入home:
job存放位置:/var/lib/jenkins/jobs
每个job一个config.xml对应job的配置
每个job下一个builds文件夹存放构建历史。
builds下,每次构建一个文件夹:
每此构建下有构建结果
build.xml changelog.xml log
构建的工程存放位置:
/var/lib/jenkins/workspace