说在前面的话: 从接到任务到完成共用了7天的时间。正常人用不到这个时间。 此时的功能表现是: 登录本地JenKins对项目进行构建,能够自动从SVN读取最新代码并按照Maven项目构建,构建完成能够自动使用SonarQube分析代码质量,并将构建的War包部署到指定容器中。
版权声明:此博客纯手打,个人创作,转载请注明出处
导图:
环境准备:MySQL5.7、 Tomcat7.0.93、Tomcat8.5.30、JenKins2.160、SonarQube7.6+Sonar Scanner3.3.0、Maven3.3.3、SVN1.8.22、Window10
环境需要注意的地方:SonarQube对数据库的版本要求相对比较严格,请配置版本对应的SonararQube+MySQL,其他的版本搭建过程中暂没有发现异常。
查看SonarQube支持的MySQL版本:在SonarQube的解压缩文件夹中的conf文件夹中打开sonar.properties配置文件,找到带有MySQL字样的注释,会看到“#----- MySQL >=5.6 && <8.0” 或者 “#----- MySQL 5.6 or greater”。 意思是版本在5.6和8.0或者5.6以上。 这里建议尽量将MySQL版本靠近但不是下限的版本,我的之前装的8.3的后来不能用又卸载重新安装的5.7; 如果自己不想装数据库,SonarQube自带的有MySQL数据库,自带的没有用过,过程请另找资料。 其他数据库与此类似。
MySQL配置
第一步:用工具或者控制台创建MySQL用户并给权限(表和视图的创建、用户的创建、索引的创建等权限,这里推荐使用Navicat工具比较方便)。
第二步:用第一步创建的用户登录MySQL并创建名为sonar(可以自定义)的数据库。
至此MySQL配置完成!
SonarQube安装
第一步:进入SonarQube解压缩文件夹的bin文件夹运行StartSonar.bat文件,打开浏览器输入localhost:9000 出现如下图表示安装成功
下面就是配置SonarQube
SonarQube配置
第一步:配置SonarQube数据库连接参数--> 在SonarQube解压缩的conf文件夹中找到sonar.properties配置文件,在有MySQL注释的下方添加如下配置
sonar.jdbc.url=jdbc:mysql://192.168.163.120:3306/sonar?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true&useConfigs=maxPerformance sonar.jdbc.username=sonar sonar.jdbc.password=sonar sonar.sorceEncoding=UTF-8 sonar.login=admin sonar.password=admin
sonar.jdbc.url是数据库了解的驱动;其中的sonar指的是上面创建的MySQL数据库的数据库,其他参数不变
sonar.jdbc.username和sonar.jdbc.userpassword指的是上面创建的数据库用户和密码, 注意:不要试图去用MySQL数据库的root用户配置连接参数,这里告诉你行不通。
sonar.login和sonar.password指的是一会儿启动SonarQube之后登陆用的账号密码;可以自定义
第二步:进入SonarQube解压缩文件夹下的bin目录找到对应系统的文件夹进去之后分别执行 InstallNTService.bat(以管理员身份运行)、StartNTService.bat(以管理员身份运行)、StartSonar.bat对数据库进行初始化;第一次运行StartSonar.bat时可能会秒退,如果没有秒退那就更好;如果秒退那么进入SonarQube解压缩文件夹下的logs文件夹打开sonar.log日志文件看是否有报错,如果没有报错那么说明SonarQube已经启动,接下来查看MySQL数据库SonarQube连接的用户下是否有一下表
如果上述一切正常,这时候就可以打开浏览器输入地址 localhost:9000 来登录SonarQube了。第一次登录时需要初始化数据库需要等待一会儿。
常见异常说明:在启动SonarQube的时候,如果有异常控制台也会秒退,这个时候就要去sonar.log文件查看异常信息,如果异常是“远程主机断开了一个连接”, 那就是SonarQube初始化数据库的时候有异常,这时候就去解压缩文件夹下的logs文件夹中的web.log文件查看具体的报错信息; 我见到的异常是SonarQube执行的SQL语法不对,开什么玩笑sonarqube作者还能把sql写错了?。 实际就是MySQL版本不对导致的。这个时候就要考虑换MySQL了。
第三步:安装常用插件按照下图
搜索chinese Pack,安装中文语言包, 有的war包已经默认的有中文插件包,那么此步就可以略过了。装完插件重启JenKins即可
重启方法: 在启动的控制台按ctrl+c输入y回车即可停止SonarQube ,再次运行StartSonar.bat文件即可。
第四步:进行项目分析
说明: SonarQube项目分析分为两种,一种是用SonarQube本身的命令; 另一种是用SonarQube的Sonar Scanner扫描仪进行分析; 前一种配置太繁琐,我就没有深究;我用的第二种;
1. 下载Sonar Scanner扫描仪
将文件解压缩,可以放置到任意目录下。
2. 配置Sonar Scanner环境变量
在path中添加 D:Desktopsonar-scanner-cli-3.3.0.1492-windowssonar-scanner-3.3.0.1492-windowsin 此目录指的是Sonar Scanner解压缩文件夹的bin目录。
3. 在要分析的项目中与pom.xml同级目录中创建sonar-project.properties配置文件,文件内容如下
# must be unique in a given SonarQube instance
sonar.projectKey=personnel-data-sys-1
# this is the name and version displayed in the SonarQube UI. Was mandatory prior to SonarQube 6.1.
sonar.projectName=personnel-data-sys
sonar.projectVersion=1.0
# Path is relative to the sonar-project.properties file. Replace "/" by "/" on Windows.
# This property is optional if sonar.modules is set.
sonar.sources=web.dao/src,web.pojo/src,web.service/src,web.vo/src
sonar.java.binaries=D:/Eclipse-jee-2018-09/WorkSpace/HuiMeng(HeNan)/trunk/personnel-data-sys/personnel-data-sys/personnel-data-sys/web.dao/target/classes,
D:/Eclipse-jee-2018-09/WorkSpace/HuiMeng(HeNan)/trunk/personnel-data-sys/personnel-data-sys/personnel-data-sys/web.pojo/target/classes,
D:/Eclipse-jee-2018-09/WorkSpace/HuiMeng(HeNan)/trunk/personnel-data-sys/personnel-data-sys/personnel-data-sys/web.service/target/classes,
D:/Eclipse-jee-2018-09/WorkSpace/HuiMeng(HeNan)/trunk/personnel-data-sys/personnel-data-sys/personnel-data-sys/web.vo/target/classes
# Encoding of the source code. Default is default system encoding
sonar.sourceEncoding=UTF-8
参数说明:
sonar.projectKey: 指的是分析的项目上传到SonarQube之后的唯一凭证, 自定义。
sonar.projectName: 指的是分析的项目上传到SonarQube之后的名称,自定义。
sonar.projectVersion: 版本号,自定义
sonar.sources: 被分析的源码的位置,切记这个路径只能是相对路径,相对此配置文件的路径。 多个路径用英文逗号隔开
sonar.java.binaries: 被分析的源码的class文件的路径。这个可以是绝对路径。就是本地从svn检下来的项目的路径。如果没有,用maven命令编译一下项目生成即可。或者用eclipse编译也行。只要把class文件弄出来就行
sonar.sourceEncoding: 编码
上述参数配置完之后, 打开控制台,将路径切换到项目的pom.xml所在的目录下,执行 sonar-scanner 命令提示成功之后, 登录SonarQube就会看到分析的结果。
其他的扫描仪的用法请参见官方文档: https://docs.sonarqube.org/display/SCAN/Analyzing+with+SonarQube+Scanner
至此单独的SonarQube就可以使用了。
JenKins篇
JenKins下载安装配置
JenKins的安装有两种形式, 一种是安装包的形式,另一种是war包的形式,这里介绍war包的形式。
从登录官网下载JenKins.war; 将war包原封不动的拷贝到Tomcat的webapps文件夹下,启动Tomcat。访问localhost:8080/jenkins,出现下图即可以正常使用jenkins了
第一次登录jenkins时需要解锁jenkins。 就是找到上图红色字体路径的文件复制里面的密匙。到下方文本框,点击ok即进入插件安装界面,如下图。
点击安装推荐的插件,进行插件的安装,如果是刚入门难,建议安装推荐的插件。如果不想安装推荐的,那么就选择右边这个自己选择安装的插件。如果安装推荐的插件会进入下图
一般情况下推荐的插件中就有中文包,如果没有那么就去“系统管理-->插件管理-->可选插件(第二个),搜索Localization: Chinese(不同版本的jenkins可能名字不同), 选择Localization: Chinese (Simplified)安装即可,”等待所有的插件安装完成,进入创建用户的界面,如下图
创建完用户之后,就进入了首页, 下面开始常用工具的配置, 进行工具配置的前提是要安装了相应的插件, 如Maven等,否则就不会有相应的选项
在“系统管理-->插件管理”的“可选插件”中搜索 Maven Integration plugin 点击进行maven插件的安装。 JDK就搜索 JDK Tools plugin进行JDK插件的安装
点击JDK安装
填写参数
往下找,找到maven配置项,如下图
点击maven安装
暂时先配置这两个工具。
JenKins的使用
点击新建任务
如果没有“构建maven项目 ”这个选项,说明Maven Integration plugin这个maven插件没有安装,去装一下maven插件即可。
下面进行参数配置,各个参数的详解如下图。
参数填写完成,保存之后,回到首页, 构建项目,如下
在此处查看日志输出。
到最后提示 SUCCESS 成功之后,标识项目构建完成,恭喜你jenkins可以正常使用,当然了仅仅完成构建是没有任何意义的,下面要让Jenkins构建完成后可以自动将war包部署到tomcat容器
JenKins自动部署war包到Tomcat配置
思路:在构建之前运行windows命令停掉tomcat,;在构建完成之后,将构建生成的war包拷贝到目标tomcat的webapps目录下,再执行windows命令启动tomcat
说明:这个时候不能把war包部署到jenkins所在的tomcat了,因为在构建之前要停掉tomcat如果与jenkins配置同一个tomcat,那么Jenkins的tomcat停了jenkins就无法工作了
这个时候就要再用一个tomcat,但这时会有一个问题就是,两个tomcat的启动和停止脚本不能各自识别自己的tomcat,会出现运行任一个停止的脚本,就会把启动着的tomcat停掉,而不作区分;如果执行启动脚本,那么第二个启动的会端口冲突。解决办法如下
1. 配置环境变量为:CATALINA_HOME1=D:Desktopapache-tomcat-7.0.93(部署war包的tomcat的解压缩文件夹根目录)
CATALINA_BASE1=D:Desktopapache-tomcat-7.0.93(部署war包的tomcat的解压缩文件夹根目录), 与CATALINA_HOME1的值相同,
并且要为jenkins所在的tomcat配置CATALINA_BASE=D:Tomcatapache-tomcat-8.5.30
所在就会有如下环境环境变量
jenkins所在的tomcat
CATALINA_BASE=D:Tomcatapache-tomcat-8.5.30
CATALINA_HOME=D:Tomcatapache-tomcat-8.5.30
部署项目的tomcat
CATALINA_BASE1=D:Desktopapache-tomcat-7.0.93
CATALINA_HOME1=D:Desktopapache-tomcat-7.0.93
找到部署项目的tomcat的bin文件夹下的startup.bat和shutdown.bat文件,将其中的CATALINA_HOME替换为CATALINA_HOME1
找到部署项目的tomcat的bin文件夹下的catalina.bat文件,将其中的CATALINA_HOME替换为CATALINA_HOME1移机CATALINA_BASE替换为CATALINA_BASE1保存即可,
这时候即可同时启动两个,并且停的时候也只停相应的。
在path环境变量中添加 %CATALINA_HOME1%in 因为jenkins所在的tomcat不需要经常的启动和停止,如果需要停止和启动,手动就行了, 所以这里配成了部署项目的tomcat
JenKins配置如下;
项目构建之前执行命令
项目构建完成后执行命令
配置完命令,之后再去配置 构建参数如下图
配置此参数的原因是,如果单单的配置构建完成之后执行启动tomcat的命令,那么jenkins就会以衍生线程来开启控制台执行命令,但是当jenkins构建完成,默认就会把当前线程和所有的衍生线程全部杀掉,那么这时候就会导致启动的tommcat被杀掉,那么tomcat还是没有启动起来。 添加此参数的作用就是,改变衍生线程的ID, 让jenkins在构建完成之后,无法识别启动tomcat的线程是自己的衍生线程就可以了。 此参数不能再“系统管理-->节点管理”添加环境变量中配置,在那配置的话会导致jenkins一直等待启动tomcat的线程结束,并且Jenkins认为这个不是衍生线程也不会杀掉,就会一直等待,直到构建失败。
只是做这些还是不够,如果编译报出 此处不应有=2048"" 字样,原因是jenkins执行脚本的时候把一个双引号会转义为两个双引号。 打开tomcat下的bin目录中的catalina.bat文件,搜索2048, 将2048的引号去掉,如下
由
if not "%JSSE_OPTS%" == "" goto gotJsseOpts
set JSSE_OPTS="-Djdk.tls.ephemeralDHKeySize=2048"
:gotJsseOpts
set "JAVA_OPTS=%JAVA_OPTS% %JSSE_OPTS%"
变为
if not '%JSSE_OPTS%' == '' goto gotJsseOpts
set JSSE_OPTS=-Djdk.tls.ephemeralDHKeySize=2048
:gotJsseOpts
set JAVA_OPTS=%JAVA_OPTS% %JSSE_OPTS% 即可。
如果没有报错,那就不用做此修改。
到此jenkins自动部署项目完成。
JenKins集成SonarQube
集成之后的效果是,当构建完成之后,自动检测代码质量,并上传检测结果到sonarqube。这里也使用Sonar Scanner扫描仪进行集成
登录sonarqube生成token
点击Administrator->security->user,点击token按钮,输入key后再点击generate进行生成, 并保存好。
安装SonarQube Scanner for Jenkins 插件
对jenkins进行配置
安装完成后,在 系统管理->系统设置中,找到SonarQube servers模块,填写服务器信息:
其中Server authentication token 就是上面登录sonarqube生成的token. 拷贝进来即可。
“系统管理-->全局工具配置”
点击安装,如下图
注意配置的是Sonar Scanner扫描仪的路径,可不是Sonarqube的路径。
对项目进行配置
配置完成之后,保存。 构建项目,如下
构建成功之后,如下图点击即可查看检测结果,如果没有这个选项,说明集成失败。