步骤1:在jenkins服务器中,下载git和部署,并在jenkins中安装git插件,并在系统管理--全局工具配置中配置git路径(如下图)
步骤2:jenkins服务器中,安装和部署mysql(自行百度,也可以采用docker 容器部署),并启动
参考资料:https://www.cnblogs.com/yoyotl/p/5752437.html
步骤3:docker 安装和运行SonarQube server
(1):在docker 远程库中下载SonarQube server容器(命令:docker pull sonarqube)
(2):docker运行sonarqube容器
命令:
~: docker run -d -p 9000:9000 -p 9092:9092 --restart=always -e SONARQUBE_JDBC_USERNAME=数据库用户名 -e SONARQUBE_JDBC_PASSWORD=数据库密码 -e SONARQUBE_JDBC_URL='jdbc:mysql://ip:3306/sonar?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true&useConfigs=maxPerformance&useSSL=false' --name sonarqube sonarqube
(3):将sonarqube容器对外访问端口,添加到防火墙中.
命令:
~:firewall-cmd --zone=public --add-port=9000/tcp --permanent
~:firewall-cmd --zone=public --add-port=9092/tcp --permanent
~: firewall-cmd --reload
(4):jenkins中安装sonar相关插件(Sonar Quality Gates Plugin和SonarQube Scanner for Jenkins),并在系统管理--系统设置--SonarQube servers中,配置路径、SonarQube servers的访问地址、token(注:token配置,见问题1)
注:
1、sonar首次启动时,有点慢,而且有可能出现失败,如果出现无法请求,可以多次刷新浏览器试试,如还不行,可以telnet端口试试或者查看一下sonar server的日志
步骤4:jenkins服务器中,SonarQube Scanner安装和配置
(1):手工下载(注意兼容SonarQube server版本问题),并解压,配置环境变量【命令1:vi /etc/profile(如下图,保存后) 命令2:source /etc/profile(重启环境变量)】:
下载地址:https://docs.sonarqube.org/latest/analysis/scan/sonarscanner/
(2):jenkins中系统管理--全局工具配置--Sonar Scanner中,配置路径
步骤5:jenkins Pipeline项目创建和脚本编写
- 创建流水线项目(自行百度,或者参考我上一篇博客)
- Git打包和sonar扫描代码编写,当前采用直接Pipeline script,没有采用Jenkinsfile文件方式,代码如下:
def getHost(){
def remote = [:]
remote.name = 'server02'
//远程部署服务器
remote.host = '192.168.0.67'
remote.user = 'root'
remote.port = 22
remote.password = '123456'
remote.allowAnyHosts = true
return remote
}
pipeline {
agent any
environment{
def server = ''
}
stages {
stage('gitcheckout') {
steps {
echo 'This is a gitcheckout step'
checkout([$class: 'GitSCM', branches: [[name: '*/master']], doGenerateSubmoduleConfigurations: false, extensions: [], submoduleCfg: [], userRemoteConfigs: [[credentialsId: '31cd5e49-9019-4a26-8325-9989ae9d6289', url: 'http://ip/Develop/zd_api.git']]])
}
}
stage('sonar') {
steps {
echo 'This is a sonar step'
withSonarQubeEnv('sonar') {
//sonar-scanner部署路径下shell运行配置扫描项目信息
sh "/usr/local/sonar/sonar-scanner3.3.0.1492/bin/sonar-scanner -X "+
"-Dsonar.host.url=${SONAR_HOST_URL} " +
"-Dsonar.language=php " +
"-Dsonar.projectKey=zd " +
"-Dsonar.projectName=zd " +
"-Dsonar.projectVersion=$BUILD_NUMBER " +
"-Dsonar.sources=. " +
"-Dsonar.sourceEncoding=UTF-8 "
}
}
}
stage("QualityGate") {
steps {
echo 'QualityGate'
/*
script {
timeout(time: 1, unit: "HOURS") { // 防止获取回调出现异常情况,设置超时时间
def qg = waitForQualityGate('jenkins') //利用sonar webhook功能通知pipeline代码检测结果,未通过质量阈,pipeline将会fail
//注意:这里waitForQualityGate()中的参数也要与之前SonarQube servers中Name的配置相同
if (qg.status != 'OK') {
error "未通过Sonarqube的代码质量阈检查,请及时修改!failure: ${qg.status}"
}
}
}
*/
}
}
stage('init-server'){
steps {
script {
server = getHost()
}
}
}
stage('remote server pull image') {
steps {
script {
//远程连接服务器
sshCommand remote: server, command: """
//获取镜像ID为192.168.0.68:5000/tomcat_jdk7
image_name='docker images|grep -i 192.168.0.68:5000/tomcat_jdk7|awk '{print \$1}'';
if [ \$image_name ];then
docker rmi \$image_name;
fi;
//192.168.0.68:5000/tomcat_jdk7镜像ID不存在,就从私库服务器拉取
docker pull 192.168.0.68:5000/tomcat_jdk7:latest;
"""
}
}
}
stage('remote server docker run'){
steps {
script {
sshCommand remote: server, command: """
//获取镜像name为test1
container_name=`docker ps -a -f name=test1 -q`;
if [ \$container_name ];then
docker rm --force \$container_name;
fi;
//镜像name为test1不存在,就远程运行镜像
docker run -d -p 8081:8080 --name test1 192.168.0.68:5000/tomcat_jdk7:latest;
"""
}
}
}
}
}
注:1、在jenkins项目-配置-流水线中,有一个“流水线语法”,可以根据配置,自动生成Pipeline script,到时copy出来就可以直接用,无需手写。
问题1:jenkins系统配置中配置SonarQube servers时,遇到添加凭证中Secret和id输入什么值的问题(网上很少有资料显示)。
解决方法:凭证中Secret和id都是为sonar服务中配置的是token值,获取方法,很简单,百度搜索即可。
问题2:SonarQube Scanner扫描项目时,如果扫描项目内容较多时,容易出现上报失败
解决方法:
步骤1:在linux系统中,找到mysql的my.cnf配置文件(默认安装mysql的,一般在/etc路径下),将max_allowed_packet值改到事宜大小。
步骤2:重启mysql(命令:service mysqld restart)
步骤3:重启sonar sever(如果sonar是容器,执行命令:docker restart容器id/name)
问题3:docker容器中,出现ipv4 forwarding is disabled. networking will not work
解决方法:https://www.cnblogs.com/atuotuo/p/7092700.html
问题4:jenkins Pipeline 使用的centos版本、jdk版本、jenkins版本问题
1、Centos版本为7.2以上(最好是最新版本)
2、jenkins建议安装最新版本,且jdk安装jdk8
参考资料:
1、http://192.168.0.69:8080/jenkins/job/test/pipeline-syntax/globals(此地址,是jenkins内部地址,安装好Pipeline插件后,就可以查看了)
2、https://blog.csdn.net/weixin_40816738/article/details/90111803
3、https://blog.csdn.net/qq_36663951/article/details/82115086
4、https://docs.sonarqube.org/latest/analysis/scan/sonarscanner-for-jenkins/ (此地址是官方地址,有多个方式进行sonar操作)
5、https://www.cnblogs.com/cay83/p/7537850.html
6、https://www.cnblogs.com/luolizhi/p/5697021.html (此地址中有sonar 扫描不通语言方式配置方式借鉴)
7、https://www.58jb.com/html/184.html (pipeline实现多个代码分支打包)