团队多人协作开发,每个人都可独立提交代码,持续集成可通过自动构建(包括编译,发布,自动化测试)来验证,从而迟早地发现集成错误。
代码管理工具->SVN、打包编译工具->maven[nodejs]、自动发布工具jenkins、代码静态扫描->sonar、自动检测工具(单元测试框架Java 开发的 JUnit)
基础技术:
jdk下载:https://www.oracle.com/java/technologies/downloads/archive/ (当前案例下载的是jdk-8u261-linux-x64.tar.gz版本)
sonarqube下载:https://www.sonarqube.org/downloads/ (当前案例下载的是sonarqube-6.7.7.zip版本)
sonar-scanner下载:https://binaries.sonarsource.com/Distribution/sonar-scanner-cli/ (当前案例下载的是sonar-scanner-cli-3.3.0.1492-linux.zip)
tomcat 下载:https://tomcat.apache.org/ (当前实例下载的是apache-tomcat-8.5.72.tar.gz)
jenkins下载:http://updates.jenkins-ci.org/download/war/ (当前实例下载的是2.315)
nodejs下载:https://nodejs.org/en/download/ (本案例中使用的是12.1.版本)14.18.1版本)
yum list installed |grep java
或是
rpm -qa |grep jdk
如果安装可以使用命令:
yum -y remove jdk-package-name
或是
rpm -e jdk-package-name
tar -zxvf jdk-8u261-linux-x64.tar.gz -C /usr/local/java
echo '''
#JDK全局变量配置
export JAVA_HOME=/usr/local/java
export PATH=$PATH:$JAVA_HOME/bin
''' >> /etc/profile
source /etc/profile
#java -version
java version “1.8.0_261”
Java™ SE Runtime Environment (build 1.8.0_261-b12)
Java HotSpot™ 64-Bit Server VM (build 25.261-b12, mixed mode)
#-------创建目录、用户、用户组及分配权限-------------------
mkidr web #创建目录:web
cd web #进入安装目录
unzip sonarqube-6.7.7.zip #解压上传文件
groupadd sonarqube #创建sonarqube组
useradd sonarqube -g sonarqube -p sonarqube #创建一个用户名为sonarqube密码为sonarqube属于一sonarqube组的用户
chown -R sonarqube:sonarqube /web/sonarqube-6.7.7 #为该用户分配文件夹权限
#-----------------在mysql创建持久化数据库----------------------------------
mysql> create database sonar default character set utf8; -- 创建数据库sonar
mysql>creat user sonar@"%" identified by "Sonar9.1"; -- 创建用户sonar,密码为Sonar9.1
mysql> grant all privileges on sonar.* to sonar; -- 给用户sonar分配sonar数据库操作权限
mysql>flush privileges; -- 刷新权限
mysql> update mysql.user set authentication_string=password('Sonar9.1') where user='sonar' and host='%'; -- 修改用户密码
vi /web/sonarqube-6.7.7.zip/conf/sonar.properties
#设置jvm使用的内存大小,Xms最小使用内存,Xmx最大使用内存,可以根据实际情况自行设置,我目前的系统运行内存为8G
sonar.web.javaOpts=-server -Xms1G -Xmx1G -XX:+HeapDumpOnOutOfMemoryError
#配置持久化数据库的账户密码
sonar.jdbc.username=sonar
sonar.jdbc.password=Sonar9.1
#配置url,我此处使用的mysql, 7.1版本后不再支持mysql
sonar.jdbc.url=jdbc:mysql://172.16.20.51:3306/sonar?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true&useConfigs=maxPerformance&useSSL=false
vim /web/sonarqube-6.7.7/bin/linux-86-64(此处根据系统内存自行选择)/sonar.sh
修改RUN_AS_USER=sonarqube
即我们之前创建的用户
#下面设定访问网址为 http://centos:9000/sonar
sonar.web.host=172.16.20.51
sonar.web.port=9000
sonar.web.context=/sonar
#先切换到sonarqube用户
su sonarqube
#执行启动命令
cd /web/sonarqube-6.7.7/bin/linux-86-64/
sh sonar.sh start
附sonar启动命令:
sh sonar.sh start #启动sonar
sh sonar.sh stop #安全停止sonar
sh sonar.sh console #控制台启动sona
r
#查看日志
cd ../../logs
日志分为sonar.log,es.log,web.log,若不明原因启动失败,可依次查看这几个日志。
启动后,若日志文件均无报错,即可访问http://localhost:9000/sonar,若顺利,则会出现如下界面
启动时报错(原因:版本不兼容,因当前系统已经安装有jdk1.8,所以sonar版本由9.1降低到6.7.7版本):
现象一:
Launching a JVM…
JVM exited while loading the application.
Unrecognized option: --add-exports=java.base/jdk.internal.ref=ALL-UNNAMED
Error: Could not create the Java Virtual Machine.
Error: A fatal exception has occurred. Program will exit.
JVM Restarts disabled. Shutting down.
<-- Wrapper Stopped
现象二:
–> Wrapper Started as Daemon
Launching a JVM…
Wrapper (Version 3.2.3) http://wrapper.tanukisoftware.org
Copyright 1999-2006 Tanuki Software, Inc. All Rights Reserved.
WrapperSimpleApp: Unable to locate the class org.sonar.application.App: java.lang.ClassNotFoundException: org.sonar.application.App
WrapperSimpleApp Usage:
java org.tanukisoftware.wrapper.WrapperSimpleApp {app_class} [app_arguments]
Where:
app_class: The fully qualified class name of the application to run.
app_arguments: The arguments that would normally be passed to the
application.
<-- Wrapper Stopped
在浏览器输入“http://172.16.20.51:9000/sonar”默认用户名密码是“admin/admin”
用户名密码(admin/admin)登录
Administration->Marketplace->搜索“chinese”->Install ,安装汉化插件
如果出现“Error while downloading plugin ‘l10nzhtw’ with version ‘1.0’. No compatible plugin found.”错误,那说明版本不兼容,可到网上查找对应版本的插件放到…/…/extensions/plugins目录下,重新启动sonar服务【使用命令…/…/sonar.sh start 也可以通过页面操作“配置->系统->重启服务器”】,即可生效。但如果安装的插件比当前版本低的话,会出现部分显示还是英文。
上图为安装了插件“sonar-l10n-zh-plugin-1.10.jar”,但sonarqube6.7.7版本对应的汉化插件版本是sonar-l10n-zh-plugin-1.19.jar。下图为更新插件后的显示。
上传sonar-scanner-cli-3.3.0.1492-linux.zip到服务器并解压到指定目录/web/下
unzip sonar-scanner-cli-3.3.0.1492-linux.zip -d /web/
vi sonar-scanner-3.3.0.1492-linux/conf/sonar-scanner.properties
#----- sonar服务url及登录的用户名密码信息,为保证安全也可以用令牌登录
sonar.host.url=http://172.16.20.51:9000\/sonar
sonar.login=3e83c03c0946102e0106386e7716392293c33625
#sonar.login=admin
#sonar.password=admin
#----- Default source code encoding
#sonar.sourceEncoding=UTF-8
#项目配置sonar.projectKey在sonar中唯一值
sonar.projectKey=demo
#sonar.projectName在sonar中项目显示的名字
sonar.projectName=HelloWorld
sonar.projectVersion=1.0
#扫描代码的路径,如果配置文件在项目中可以是相对路径,如果在sonar-scanner的conf中刚是绝对路径
sonar.sources=/root\/demo\/src
#扫描代码编译存放的路径
sonar.java.binaries=target\/classes
echo '''
#sonar-scanner全局变量配置
export SONAR_RUNNER_HOME=/web/sonar-scanner-3.3.0.1492-linux
export PATH=$PATH:$SONAR_RUNNER_HOME/bin
''' >>/etc/profile
source /etc/profile
sonar-scanner
配置文件sonar-scanner.properties要放在扫描代码的要目录下.
#配置sonar登录可以用用户名密码[也可用令牌sonar.login=token令牌]
sonar.login=admin
sonar.password=admin
#下面设定访问网址为 http://centos:9000/sonar
sonar.web.host=172.16.20.51:9000/sonar
#sonar的项目关键字
sonar.projectKey=demo
#在sonar上显示的项目名称
sonar.projectName=demo
#在sonar上显示的版本号
sonar.projectVersion=1.0
#包含pom.xml的maven项目相对目录
sonar.sources=src
#java编译后的文件目录
sonar.java.binaries=target/classes
sonar-scanner
如果项目配置中使用的是令牌,则需要在sonar服务平台上生成令牌。
登录账号右键->我的账号->安全->输入生成新令牌令牌如“aa”点击生成->复制,新生成的令牌如aa的令牌是“fad3cd550c27c1fe225332ca5b96c9ae9eab878a”,则复制令牌到配置文件的“sonar.login=fad3cd550c27c1fe225332ca5b96c9ae9eab878a”即可,一旦离开此页面则自成的令牌就不可见
出现的问题:
ERROR: SonarQube server [http://172.16.20.51:9000] can not be reached
原因:地址配置不对,服务器的url地址为http://172.16.20.51:9000/sonar,而sonar-scanner.properites里配置的url缺省了"sonar".
解决方法:把url地址修改为“http://172.16.20.51:9000/sonar”即可。
注意事项,执行扫描代码的路径及项目代码的路径。执行时优先使用环境变量里的配置文件即%SONAR_RUNNER_HOME%conf/下的sonar-scanner.properties的配置文件,如果没有再使用当前执行目录下的配置文件。
注意,tomcat不要使用最新版本,否则会出现与jenkins版本不兼容容器启动失败的问题。当前使用的是tomcat8版本。
tar -zxvf apache-tomcat-8.5.72.tar.gz -C /usr/local/
mv apache-tomcat-8.5.72 jenkins
添加jdk路径及tomcat启动文件的路径:
export JAVA_HOME=/usr/local/java
export JAVA_BIN=$JAVA_HOME/bin
export PATH=$PATH:$JAVA_HOME/bin
export CATALINA_HOME=/usr/local/jenkins
"8890" shutdown="SHUTDOWN">
"8888" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
#Server port 服务端口,Connector port客户端访问端口。
#先修改执行文件的权限,否则会启动失败
chmod +X /usr/local/jenkins/bin/*.sh
#启动tomcat
cd /usr/local/jenkins/bin
./start.sh
<tomcat-users>
<role rolename="tomcat"/>
<role rolename="admin-gui"/>
<role rolename="admin-script"/>
<role rolename="manager"/>
<role rolename="manager-gui"/>
<role rolename="manager-script"/>
<role rolename="manager-jmx"/>
<role rolename="manager-status"/>
<user name="tomcat" password="tomcat" roles="tomcat,admin-gui,admin-script,manager,manager-gui,manager-script,manager-jmx,manager-status" />
tomcat-users>
注:如果tomcat是8+版本的,还需要在…/conf/Catalina/localhost,创建manager.xml文件,内容:
<Context privileged="true" antiResourceLocking="false"
docBase="${catalina.home}/webapps/manager">
<Valve className="org.apache.catalina.valves.RemoteAddrValve" allow="^.*$" />
Context>
因前面已经安装了tomcat,所以jenkins安装配对比较简单了。
使用此命令“tail -n 200 …/logs/catalina.out”在tomcat的日志文件中查看输出日志即下图中信息“aa18093a36614952bf67c3d486c90c30”
下一步,自动安装推荐的插件
按照提示进行下一步操作直到完成。
svn插件:搜索“Subversion”,选中后选安装最后一起启动jenkins所以点击“Install without restart”
maven插件:搜索“maven”,选中后选安装最后一起启动jenkins所以点击“Install without restart”
sonar插件:搜索“sonar”,选中"SonarQube Scanner"后选安装最后一起启动jenkins所以点击“Install without restart”
yum install subversion -y
NodeJs插件:搜索“node”,选中"NodeJs"后选安装最后一起启动jenkins所以点击“Install without restart”
新建任务->创建一个自由风格的软件项目
源码管理选择subversion
添加svn账号,Local module directory 选择当前目录".“此目录为jenkins空间任务的相对目录,如空间目录为”/root/.jenkins/jobs/mvn-bpc/workspace",Repository depth 选择“infinity”默认的就行全量更新。
第一次构造要Check-out Strategy 要选择“Always check out a fresh copy”,否则会报错
#!/bin/bash
echo "重命名war包名"
mv ${WORKSPACE}/bpc-core/target/bpc-core-0.0.1-SNAPSHOT.war ${WORKSPACE}/bpc-core/target/bpc.war
echo "复制war包"
cp -f ${WORKSPACE}/bpc-core/target/bpc.war /app/home/bpc/apache-tomcat-8.0.53/webapps/bpc.war
wait
#停止中台服务
bpc_pid=`ps -ef | grep "home/bpc/apache-tomcat-8.0.53" | grep -v grep | awk '{print $2}'`
for id in $bpc_pid
do
kill -9 $id
echo "killed pid=$id"
done
echo "执行tomcat启动shell"
export BUILD_ID=dontkillMe
sh /app/home/bpc/apache-tomcat-8.0.53/bin/startup.sh
在jenkins里配置nodejs的全局变量
系统管理->系统配置->全局属性“环境变量”增加NODE_HOME的环境变量
系统管理->全局工具配置->NodeJS
创建工程任务
# 查看版本信息
npm -v
# 解决存放在Github上的sass无法下载的问题
SASS_BINARY_SITE=https://npm.taobao.org/mirrors/node-sass/ npm install node-sass
# 将镜像源替换为淘宝的加速访问
npm config set registry https://registry.npm.taobao.org
# 安装项目依赖
npm install
# 项目打包
npm run build
# 备份原执行文件
mv /app/home/bpc/apache-tomcat-8.0.53/webapps/ROOT /app/home/bpc/apache-tomcat-8.0.53/webapps/ROOT`date +%Y%m%d%H%M`
#一定要加上export BUILD_ID,否则会中断shell执行,看似返回结果是成功的,实际上shell执行被中断并没有真正执行生效。
export BUILD_ID=node-bpc
# 复制打包文件到执行目录下
cp -rf ${
workspace}ROOT /app/home/bpc/apache-tomcat-8.0.53/webapps/
# 恢复以前执行的配置
cp -f /app/home/bpc/apache-tomcat-8.0.53/webapps/serveUrl.yml /app/home/bpc/apache-tomcat-8.0.53/webapps/ROOT
注:如果工程中某些文件中的配置参数需要修改,可以用sed,添加到shell脚本中,如修改工程项目下的package.json文件中的vue-router版本号:由3.0.7改为3.5.2。这个根据具体项目来定。
sed -i "/vue-router/[email protected]@3.5.2@" package.json